130fdc8d8SChris Lattner //===-- SBThread.cpp --------------------------------------------*- C++ -*-===// 230fdc8d8SChris Lattner // 330fdc8d8SChris Lattner // The LLVM Compiler Infrastructure 430fdc8d8SChris Lattner // 530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source 630fdc8d8SChris Lattner // License. See LICENSE.TXT for details. 730fdc8d8SChris Lattner // 830fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 930fdc8d8SChris Lattner 104c5de699SEli Friedman #include "lldb/API/SBThread.h" 1130fdc8d8SChris Lattner 1230fdc8d8SChris Lattner #include "lldb/API/SBSymbolContext.h" 1330fdc8d8SChris Lattner #include "lldb/API/SBFileSpec.h" 14dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 156611103cSGreg Clayton #include "lldb/Core/Debugger.h" 1630fdc8d8SChris Lattner #include "lldb/Core/Stream.h" 1730fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 186611103cSGreg Clayton #include "lldb/Interpreter/CommandInterpreter.h" 1930fdc8d8SChris Lattner #include "lldb/Target/Thread.h" 2030fdc8d8SChris Lattner #include "lldb/Target/Process.h" 2130fdc8d8SChris Lattner #include "lldb/Symbol/SymbolContext.h" 2230fdc8d8SChris Lattner #include "lldb/Symbol/CompileUnit.h" 23f4b47e15SGreg Clayton #include "lldb/Target/StopInfo.h" 2430fdc8d8SChris Lattner #include "lldb/Target/Target.h" 2530fdc8d8SChris Lattner #include "lldb/Target/ThreadPlan.h" 2630fdc8d8SChris Lattner #include "lldb/Target/ThreadPlanStepInstruction.h" 2730fdc8d8SChris Lattner #include "lldb/Target/ThreadPlanStepOut.h" 2830fdc8d8SChris Lattner #include "lldb/Target/ThreadPlanStepRange.h" 2930fdc8d8SChris Lattner #include "lldb/Target/ThreadPlanStepInRange.h" 3030fdc8d8SChris Lattner 3130fdc8d8SChris Lattner 324c5de699SEli Friedman #include "lldb/API/SBAddress.h" 334c5de699SEli Friedman #include "lldb/API/SBFrame.h" 344c5de699SEli Friedman #include "lldb/API/SBSourceManager.h" 354c5de699SEli Friedman #include "lldb/API/SBDebugger.h" 364c5de699SEli Friedman #include "lldb/API/SBProcess.h" 3730fdc8d8SChris Lattner 3830fdc8d8SChris Lattner using namespace lldb; 3930fdc8d8SChris Lattner using namespace lldb_private; 4030fdc8d8SChris Lattner 4130fdc8d8SChris Lattner SBThread::SBThread () : 426611103cSGreg Clayton m_opaque_sp () 4330fdc8d8SChris Lattner { 44*ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE); 45*ceb6b139SCaroline Tice 46*ceb6b139SCaroline Tice if (log) 47*ceb6b139SCaroline Tice log->Printf ("SBThread::SBThread () ==> this = %p", this); 4830fdc8d8SChris Lattner } 4930fdc8d8SChris Lattner 5030fdc8d8SChris Lattner //---------------------------------------------------------------------- 5130fdc8d8SChris Lattner // Thread constructor 5230fdc8d8SChris Lattner //---------------------------------------------------------------------- 5330fdc8d8SChris Lattner SBThread::SBThread (const ThreadSP& lldb_object_sp) : 546611103cSGreg Clayton m_opaque_sp (lldb_object_sp) 5530fdc8d8SChris Lattner { 56*ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE); 57*ceb6b139SCaroline Tice 58*ceb6b139SCaroline Tice if (log) 59*ceb6b139SCaroline Tice log->Printf ("SBThread::SBThread (const ThreadSP &lldb_object_sp) lldb_object_sp.get() = %p ==> this = %p", 60*ceb6b139SCaroline Tice lldb_object_sp.get(), this); 6130fdc8d8SChris Lattner } 6230fdc8d8SChris Lattner 6330fdc8d8SChris Lattner SBThread::SBThread (const SBThread &rhs) 6430fdc8d8SChris Lattner { 65*ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE); 66*ceb6b139SCaroline Tice 67*ceb6b139SCaroline Tice if (log) 68*ceb6b139SCaroline Tice log->Printf ("SBThread::SBThread (const SBThread &rhs) rhs.m_opaque_sp.get() = %p ==> this = %p", 69*ceb6b139SCaroline Tice rhs.m_opaque_sp.get(), this); 70*ceb6b139SCaroline Tice 716611103cSGreg Clayton m_opaque_sp = rhs.m_opaque_sp; 7230fdc8d8SChris Lattner } 7330fdc8d8SChris Lattner 7430fdc8d8SChris Lattner //---------------------------------------------------------------------- 7530fdc8d8SChris Lattner // Destructor 7630fdc8d8SChris Lattner //---------------------------------------------------------------------- 7730fdc8d8SChris Lattner SBThread::~SBThread() 7830fdc8d8SChris Lattner { 7930fdc8d8SChris Lattner } 8030fdc8d8SChris Lattner 8130fdc8d8SChris Lattner bool 8230fdc8d8SChris Lattner SBThread::IsValid() const 8330fdc8d8SChris Lattner { 846611103cSGreg Clayton return m_opaque_sp != NULL; 8530fdc8d8SChris Lattner } 8630fdc8d8SChris Lattner 8748e42549SGreg Clayton void 8848e42549SGreg Clayton SBThread::Clear () 8948e42549SGreg Clayton { 9048e42549SGreg Clayton m_opaque_sp.reset(); 9148e42549SGreg Clayton } 9248e42549SGreg Clayton 9348e42549SGreg Clayton 9430fdc8d8SChris Lattner StopReason 9530fdc8d8SChris Lattner SBThread::GetStopReason() 9630fdc8d8SChris Lattner { 97*ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 98*ceb6b139SCaroline Tice 99*ceb6b139SCaroline Tice if (log) 100*ceb6b139SCaroline Tice log->Printf ("SBThread::GetStopReason ()"); 101*ceb6b139SCaroline Tice 102*ceb6b139SCaroline Tice StopReason reason = eStopReasonInvalid; 1036611103cSGreg Clayton if (m_opaque_sp) 10430fdc8d8SChris Lattner { 105b15bfc75SJim Ingham StopInfoSP stop_info_sp = m_opaque_sp->GetStopInfo (); 106b15bfc75SJim Ingham if (stop_info_sp) 107*ceb6b139SCaroline Tice reason = stop_info_sp->GetStopReason(); 10830fdc8d8SChris Lattner } 109*ceb6b139SCaroline Tice 110*ceb6b139SCaroline Tice if (log) 111*ceb6b139SCaroline Tice log->Printf ("SBThread::GetStopReason ==> %s", Thread::StopReasonAsCString (reason)); 112*ceb6b139SCaroline Tice 113*ceb6b139SCaroline Tice return reason; 11430fdc8d8SChris Lattner } 11530fdc8d8SChris Lattner 11630fdc8d8SChris Lattner size_t 11730fdc8d8SChris Lattner SBThread::GetStopDescription (char *dst, size_t dst_len) 11830fdc8d8SChris Lattner { 119*ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 120*ceb6b139SCaroline Tice 121*ceb6b139SCaroline Tice if (log) 122*ceb6b139SCaroline Tice log->Printf ("SBThread::GetStopDescription (char *dst, size_t dst_len)"); 123*ceb6b139SCaroline Tice 1246611103cSGreg Clayton if (m_opaque_sp) 12530fdc8d8SChris Lattner { 126b15bfc75SJim Ingham StopInfoSP stop_info_sp = m_opaque_sp->GetStopInfo (); 127b15bfc75SJim Ingham if (stop_info_sp) 12830fdc8d8SChris Lattner { 129b15bfc75SJim Ingham const char *stop_desc = stop_info_sp->GetDescription(); 13030fdc8d8SChris Lattner if (stop_desc) 13130fdc8d8SChris Lattner { 132*ceb6b139SCaroline Tice if (log) 133*ceb6b139SCaroline Tice log->Printf ("SBThread::GetStopDescription ==> %s", stop_desc); 13430fdc8d8SChris Lattner if (dst) 13530fdc8d8SChris Lattner return ::snprintf (dst, dst_len, "%s", stop_desc); 13630fdc8d8SChris Lattner else 13730fdc8d8SChris Lattner { 13830fdc8d8SChris Lattner // NULL dst passed in, return the length needed to contain the description 13930fdc8d8SChris Lattner return ::strlen (stop_desc) + 1; // Include the NULL byte for size 14030fdc8d8SChris Lattner } 14130fdc8d8SChris Lattner } 14230fdc8d8SChris Lattner else 14330fdc8d8SChris Lattner { 14430fdc8d8SChris Lattner size_t stop_desc_len = 0; 145b15bfc75SJim Ingham switch (stop_info_sp->GetStopReason()) 14630fdc8d8SChris Lattner { 14730fdc8d8SChris Lattner case eStopReasonTrace: 14830fdc8d8SChris Lattner case eStopReasonPlanComplete: 14930fdc8d8SChris Lattner { 15030fdc8d8SChris Lattner static char trace_desc[] = "step"; 15130fdc8d8SChris Lattner stop_desc = trace_desc; 15230fdc8d8SChris Lattner stop_desc_len = sizeof(trace_desc); // Include the NULL byte for size 15330fdc8d8SChris Lattner } 15430fdc8d8SChris Lattner break; 15530fdc8d8SChris Lattner 15630fdc8d8SChris Lattner case eStopReasonBreakpoint: 15730fdc8d8SChris Lattner { 15830fdc8d8SChris Lattner static char bp_desc[] = "breakpoint hit"; 15930fdc8d8SChris Lattner stop_desc = bp_desc; 16030fdc8d8SChris Lattner stop_desc_len = sizeof(bp_desc); // Include the NULL byte for size 16130fdc8d8SChris Lattner } 16230fdc8d8SChris Lattner break; 16330fdc8d8SChris Lattner 16430fdc8d8SChris Lattner case eStopReasonWatchpoint: 16530fdc8d8SChris Lattner { 16630fdc8d8SChris Lattner static char wp_desc[] = "watchpoint hit"; 16730fdc8d8SChris Lattner stop_desc = wp_desc; 16830fdc8d8SChris Lattner stop_desc_len = sizeof(wp_desc); // Include the NULL byte for size 16930fdc8d8SChris Lattner } 17030fdc8d8SChris Lattner break; 17130fdc8d8SChris Lattner 17230fdc8d8SChris Lattner case eStopReasonSignal: 17330fdc8d8SChris Lattner { 174b15bfc75SJim Ingham stop_desc = m_opaque_sp->GetProcess().GetUnixSignals ().GetSignalAsCString (stop_info_sp->GetValue()); 17530fdc8d8SChris Lattner if (stop_desc == NULL || stop_desc[0] == '\0') 17630fdc8d8SChris Lattner { 17730fdc8d8SChris Lattner static char signal_desc[] = "signal"; 17830fdc8d8SChris Lattner stop_desc = signal_desc; 17930fdc8d8SChris Lattner stop_desc_len = sizeof(signal_desc); // Include the NULL byte for size 18030fdc8d8SChris Lattner } 18130fdc8d8SChris Lattner } 18230fdc8d8SChris Lattner break; 18330fdc8d8SChris Lattner 18430fdc8d8SChris Lattner case eStopReasonException: 18530fdc8d8SChris Lattner { 18630fdc8d8SChris Lattner char exc_desc[] = "exception"; 18730fdc8d8SChris Lattner stop_desc = exc_desc; 18830fdc8d8SChris Lattner stop_desc_len = sizeof(exc_desc); // Include the NULL byte for size 18930fdc8d8SChris Lattner } 19030fdc8d8SChris Lattner break; 191c982c768SGreg Clayton 192c982c768SGreg Clayton default: 193c982c768SGreg Clayton break; 19430fdc8d8SChris Lattner } 19530fdc8d8SChris Lattner 19630fdc8d8SChris Lattner if (stop_desc && stop_desc[0]) 19730fdc8d8SChris Lattner { 198*ceb6b139SCaroline Tice if (log) 199*ceb6b139SCaroline Tice log->Printf ("SBThread::GetStopDescription ==> %s", stop_desc); 200*ceb6b139SCaroline Tice 20130fdc8d8SChris Lattner if (dst) 20230fdc8d8SChris Lattner return ::snprintf (dst, dst_len, "%s", stop_desc) + 1; // Include the NULL byte 20330fdc8d8SChris Lattner 20430fdc8d8SChris Lattner if (stop_desc_len == 0) 20530fdc8d8SChris Lattner stop_desc_len = ::strlen (stop_desc) + 1; // Include the NULL byte 20630fdc8d8SChris Lattner 20730fdc8d8SChris Lattner return stop_desc_len; 20830fdc8d8SChris Lattner } 20930fdc8d8SChris Lattner } 21030fdc8d8SChris Lattner } 21130fdc8d8SChris Lattner } 21230fdc8d8SChris Lattner if (dst) 21330fdc8d8SChris Lattner *dst = 0; 21430fdc8d8SChris Lattner return 0; 21530fdc8d8SChris Lattner } 21630fdc8d8SChris Lattner 21730fdc8d8SChris Lattner void 21830fdc8d8SChris Lattner SBThread::SetThread (const ThreadSP& lldb_object_sp) 21930fdc8d8SChris Lattner { 2206611103cSGreg Clayton m_opaque_sp = lldb_object_sp; 22130fdc8d8SChris Lattner } 22230fdc8d8SChris Lattner 22330fdc8d8SChris Lattner 22430fdc8d8SChris Lattner lldb::tid_t 22530fdc8d8SChris Lattner SBThread::GetThreadID () const 22630fdc8d8SChris Lattner { 227*ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 228*ceb6b139SCaroline Tice 229*ceb6b139SCaroline Tice if (log) 230*ceb6b139SCaroline Tice log->Printf ("SBThread::GetThreadID()"); 231*ceb6b139SCaroline Tice 232*ceb6b139SCaroline Tice lldb::tid_t id = LLDB_INVALID_THREAD_ID; 2336611103cSGreg Clayton if (m_opaque_sp) 234*ceb6b139SCaroline Tice id = m_opaque_sp->GetID(); 235*ceb6b139SCaroline Tice 236*ceb6b139SCaroline Tice if (log) 237*ceb6b139SCaroline Tice log->Printf ("SBThread::GetThreadID ==> %d", id); 238*ceb6b139SCaroline Tice 239*ceb6b139SCaroline Tice return id; 24030fdc8d8SChris Lattner } 24130fdc8d8SChris Lattner 24230fdc8d8SChris Lattner uint32_t 24330fdc8d8SChris Lattner SBThread::GetIndexID () const 24430fdc8d8SChris Lattner { 2456611103cSGreg Clayton if (m_opaque_sp) 2466611103cSGreg Clayton return m_opaque_sp->GetIndexID(); 24730fdc8d8SChris Lattner return LLDB_INVALID_INDEX32; 24830fdc8d8SChris Lattner } 24930fdc8d8SChris Lattner const char * 25030fdc8d8SChris Lattner SBThread::GetName () const 25130fdc8d8SChris Lattner { 252*ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 253*ceb6b139SCaroline Tice 254*ceb6b139SCaroline Tice if (log) 255*ceb6b139SCaroline Tice log->Printf ("SBThread::GetName ()"); 256*ceb6b139SCaroline Tice 2576611103cSGreg Clayton if (m_opaque_sp) 258*ceb6b139SCaroline Tice { 259*ceb6b139SCaroline Tice if (log) 260*ceb6b139SCaroline Tice log->Printf ("SBThread::GetName ==> %s", m_opaque_sp->GetName()); 2616611103cSGreg Clayton return m_opaque_sp->GetName(); 262*ceb6b139SCaroline Tice } 263*ceb6b139SCaroline Tice 264*ceb6b139SCaroline Tice if (log) 265*ceb6b139SCaroline Tice log->Printf ("SBThread::GetName ==> NULL"); 266*ceb6b139SCaroline Tice 26730fdc8d8SChris Lattner return NULL; 26830fdc8d8SChris Lattner } 26930fdc8d8SChris Lattner 27030fdc8d8SChris Lattner const char * 27130fdc8d8SChris Lattner SBThread::GetQueueName () const 27230fdc8d8SChris Lattner { 273*ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 274*ceb6b139SCaroline Tice 275*ceb6b139SCaroline Tice if (log) 276*ceb6b139SCaroline Tice log->Printf ("SBThread::GetQueueName ()"); 277*ceb6b139SCaroline Tice 2786611103cSGreg Clayton if (m_opaque_sp) 279*ceb6b139SCaroline Tice { 280*ceb6b139SCaroline Tice if (log) 281*ceb6b139SCaroline Tice log->Printf ("SBThread::GetQueueName ==> %s", m_opaque_sp->GetQueueName()); 2826611103cSGreg Clayton return m_opaque_sp->GetQueueName(); 283*ceb6b139SCaroline Tice } 284*ceb6b139SCaroline Tice 285*ceb6b139SCaroline Tice if (log) 286*ceb6b139SCaroline Tice log->Printf ("SBThread::GetQueueName ==> NULL"); 287*ceb6b139SCaroline Tice 28830fdc8d8SChris Lattner return NULL; 28930fdc8d8SChris Lattner } 29030fdc8d8SChris Lattner 29130fdc8d8SChris Lattner 29230fdc8d8SChris Lattner void 29330fdc8d8SChris Lattner SBThread::StepOver (lldb::RunMode stop_other_threads) 29430fdc8d8SChris Lattner { 295*ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 296*ceb6b139SCaroline Tice 297*ceb6b139SCaroline Tice if (log) 298*ceb6b139SCaroline Tice log->Printf ("SBThread::StepOver (lldb::RunMode stop_other_threads) stop_other_threads = %s)", 299*ceb6b139SCaroline Tice Thread::RunModeAsCString (stop_other_threads)); 300*ceb6b139SCaroline Tice 3016611103cSGreg Clayton if (m_opaque_sp) 30230fdc8d8SChris Lattner { 30330fdc8d8SChris Lattner bool abort_other_plans = true; 3046611103cSGreg Clayton StackFrameSP frame_sp(m_opaque_sp->GetStackFrameAtIndex (0)); 30530fdc8d8SChris Lattner 30630fdc8d8SChris Lattner if (frame_sp) 30730fdc8d8SChris Lattner { 30830fdc8d8SChris Lattner if (frame_sp->HasDebugInformation ()) 30930fdc8d8SChris Lattner { 31030fdc8d8SChris Lattner SymbolContext sc(frame_sp->GetSymbolContext(eSymbolContextEverything)); 3116611103cSGreg Clayton m_opaque_sp->QueueThreadPlanForStepRange (abort_other_plans, 31230fdc8d8SChris Lattner eStepTypeOver, 31330fdc8d8SChris Lattner sc.line_entry.range, 31430fdc8d8SChris Lattner sc, 315474966a4SGreg Clayton stop_other_threads, 316474966a4SGreg Clayton false); 31730fdc8d8SChris Lattner 31830fdc8d8SChris Lattner } 31930fdc8d8SChris Lattner else 32030fdc8d8SChris Lattner { 3216611103cSGreg Clayton m_opaque_sp->QueueThreadPlanForStepSingleInstruction (true, 32230fdc8d8SChris Lattner abort_other_plans, 32330fdc8d8SChris Lattner stop_other_threads); 32430fdc8d8SChris Lattner } 32530fdc8d8SChris Lattner } 32630fdc8d8SChris Lattner 3276611103cSGreg Clayton Process &process = m_opaque_sp->GetProcess(); 32830fdc8d8SChris Lattner // Why do we need to set the current thread by ID here??? 3292976d00aSJim Ingham process.GetThreadList().SetSelectedThreadByID (m_opaque_sp->GetID()); 3305d5028b5SGreg Clayton Error error (process.Resume()); 3315d5028b5SGreg Clayton if (error.Success()) 3325d5028b5SGreg Clayton { 3335d5028b5SGreg Clayton // If we are doing synchronous mode, then wait for the 3345d5028b5SGreg Clayton // process to stop yet again! 3355d5028b5SGreg Clayton if (process.GetTarget().GetDebugger().GetAsyncExecution () == false) 3365d5028b5SGreg Clayton process.WaitForProcessToStop (NULL); 3375d5028b5SGreg Clayton } 33830fdc8d8SChris Lattner } 33930fdc8d8SChris Lattner } 34030fdc8d8SChris Lattner 34130fdc8d8SChris Lattner void 34230fdc8d8SChris Lattner SBThread::StepInto (lldb::RunMode stop_other_threads) 34330fdc8d8SChris Lattner { 344*ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 345*ceb6b139SCaroline Tice 346*ceb6b139SCaroline Tice if (log) 347*ceb6b139SCaroline Tice log->Printf ("SBThread::StepInto (lldb::RunMode stop_other_threads) stop_other_threads =%s", 348*ceb6b139SCaroline Tice Thread::RunModeAsCString (stop_other_threads)); 349*ceb6b139SCaroline Tice 3506611103cSGreg Clayton if (m_opaque_sp) 35130fdc8d8SChris Lattner { 35230fdc8d8SChris Lattner bool abort_other_plans = true; 35330fdc8d8SChris Lattner 3546611103cSGreg Clayton StackFrameSP frame_sp(m_opaque_sp->GetStackFrameAtIndex (0)); 35530fdc8d8SChris Lattner 35630fdc8d8SChris Lattner if (frame_sp && frame_sp->HasDebugInformation ()) 35730fdc8d8SChris Lattner { 358474966a4SGreg Clayton bool avoid_code_without_debug_info = true; 35930fdc8d8SChris Lattner SymbolContext sc(frame_sp->GetSymbolContext(eSymbolContextEverything)); 3606611103cSGreg Clayton m_opaque_sp->QueueThreadPlanForStepRange (abort_other_plans, 36130fdc8d8SChris Lattner eStepTypeInto, 36230fdc8d8SChris Lattner sc.line_entry.range, 36330fdc8d8SChris Lattner sc, 364474966a4SGreg Clayton stop_other_threads, 365474966a4SGreg Clayton avoid_code_without_debug_info); 36630fdc8d8SChris Lattner } 36730fdc8d8SChris Lattner else 36830fdc8d8SChris Lattner { 3696611103cSGreg Clayton m_opaque_sp->QueueThreadPlanForStepSingleInstruction (false, 37030fdc8d8SChris Lattner abort_other_plans, 37130fdc8d8SChris Lattner stop_other_threads); 37230fdc8d8SChris Lattner } 37330fdc8d8SChris Lattner 3746611103cSGreg Clayton Process &process = m_opaque_sp->GetProcess(); 37530fdc8d8SChris Lattner // Why do we need to set the current thread by ID here??? 3762976d00aSJim Ingham process.GetThreadList().SetSelectedThreadByID (m_opaque_sp->GetID()); 3775d5028b5SGreg Clayton Error error (process.Resume()); 3785d5028b5SGreg Clayton if (error.Success()) 3795d5028b5SGreg Clayton { 3805d5028b5SGreg Clayton // If we are doing synchronous mode, then wait for the 3815d5028b5SGreg Clayton // process to stop yet again! 3825d5028b5SGreg Clayton if (process.GetTarget().GetDebugger().GetAsyncExecution () == false) 3835d5028b5SGreg Clayton process.WaitForProcessToStop (NULL); 3845d5028b5SGreg Clayton } 38530fdc8d8SChris Lattner } 38630fdc8d8SChris Lattner } 38730fdc8d8SChris Lattner 38830fdc8d8SChris Lattner void 38930fdc8d8SChris Lattner SBThread::StepOut () 39030fdc8d8SChris Lattner { 391*ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 392*ceb6b139SCaroline Tice 393*ceb6b139SCaroline Tice if (log) 394*ceb6b139SCaroline Tice log->Printf ("SBThread::StepOut ()"); 395*ceb6b139SCaroline Tice 3966611103cSGreg Clayton if (m_opaque_sp) 39730fdc8d8SChris Lattner { 39830fdc8d8SChris Lattner bool abort_other_plans = true; 39930fdc8d8SChris Lattner bool stop_other_threads = true; 40030fdc8d8SChris Lattner 4016611103cSGreg Clayton m_opaque_sp->QueueThreadPlanForStepOut (abort_other_plans, NULL, false, stop_other_threads, eVoteYes, eVoteNoOpinion); 40230fdc8d8SChris Lattner 4036611103cSGreg Clayton Process &process = m_opaque_sp->GetProcess(); 4042976d00aSJim Ingham process.GetThreadList().SetSelectedThreadByID (m_opaque_sp->GetID()); 4055d5028b5SGreg Clayton Error error (process.Resume()); 4065d5028b5SGreg Clayton if (error.Success()) 4075d5028b5SGreg Clayton { 4085d5028b5SGreg Clayton // If we are doing synchronous mode, then wait for the 4095d5028b5SGreg Clayton // process to stop yet again! 4105d5028b5SGreg Clayton if (process.GetTarget().GetDebugger().GetAsyncExecution () == false) 4115d5028b5SGreg Clayton process.WaitForProcessToStop (NULL); 4125d5028b5SGreg Clayton } 41330fdc8d8SChris Lattner } 41430fdc8d8SChris Lattner } 41530fdc8d8SChris Lattner 41630fdc8d8SChris Lattner void 41730fdc8d8SChris Lattner SBThread::StepInstruction (bool step_over) 41830fdc8d8SChris Lattner { 419*ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 420*ceb6b139SCaroline Tice 421*ceb6b139SCaroline Tice if (log) 422*ceb6b139SCaroline Tice log->Printf ("SBThread::StepInstruction (bool step_over) step_over = %s", (step_over ? "true" : "false")); 423*ceb6b139SCaroline Tice 4246611103cSGreg Clayton if (m_opaque_sp) 42530fdc8d8SChris Lattner { 4266611103cSGreg Clayton m_opaque_sp->QueueThreadPlanForStepSingleInstruction (step_over, true, true); 4276611103cSGreg Clayton Process &process = m_opaque_sp->GetProcess(); 4282976d00aSJim Ingham process.GetThreadList().SetSelectedThreadByID (m_opaque_sp->GetID()); 4295d5028b5SGreg Clayton Error error (process.Resume()); 4305d5028b5SGreg Clayton if (error.Success()) 4315d5028b5SGreg Clayton { 4325d5028b5SGreg Clayton // If we are doing synchronous mode, then wait for the 4335d5028b5SGreg Clayton // process to stop yet again! 4345d5028b5SGreg Clayton if (process.GetTarget().GetDebugger().GetAsyncExecution () == false) 4355d5028b5SGreg Clayton process.WaitForProcessToStop (NULL); 4365d5028b5SGreg Clayton } 43730fdc8d8SChris Lattner } 43830fdc8d8SChris Lattner } 43930fdc8d8SChris Lattner 44030fdc8d8SChris Lattner void 44130fdc8d8SChris Lattner SBThread::RunToAddress (lldb::addr_t addr) 44230fdc8d8SChris Lattner { 443*ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 444*ceb6b139SCaroline Tice 445*ceb6b139SCaroline Tice if (log) 446*ceb6b139SCaroline Tice log->Printf ("SBThread::RunToAddress (lldb:;addr_t addr) addr = %p", addr); 447*ceb6b139SCaroline Tice 4486611103cSGreg Clayton if (m_opaque_sp) 44930fdc8d8SChris Lattner { 45030fdc8d8SChris Lattner bool abort_other_plans = true; 45130fdc8d8SChris Lattner bool stop_other_threads = true; 45230fdc8d8SChris Lattner 45330fdc8d8SChris Lattner Address target_addr (NULL, addr); 45430fdc8d8SChris Lattner 4556611103cSGreg Clayton m_opaque_sp->QueueThreadPlanForRunToAddress (abort_other_plans, target_addr, stop_other_threads); 4566611103cSGreg Clayton Process &process = m_opaque_sp->GetProcess(); 4572976d00aSJim Ingham process.GetThreadList().SetSelectedThreadByID (m_opaque_sp->GetID()); 4585d5028b5SGreg Clayton Error error (process.Resume()); 4595d5028b5SGreg Clayton if (error.Success()) 4605d5028b5SGreg Clayton { 4615d5028b5SGreg Clayton // If we are doing synchronous mode, then wait for the 4625d5028b5SGreg Clayton // process to stop yet again! 4635d5028b5SGreg Clayton if (process.GetTarget().GetDebugger().GetAsyncExecution () == false) 4645d5028b5SGreg Clayton process.WaitForProcessToStop (NULL); 4655d5028b5SGreg Clayton } 46630fdc8d8SChris Lattner } 46730fdc8d8SChris Lattner 46830fdc8d8SChris Lattner } 46930fdc8d8SChris Lattner 47030fdc8d8SChris Lattner SBProcess 47130fdc8d8SChris Lattner SBThread::GetProcess () 47230fdc8d8SChris Lattner { 473*ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 474*ceb6b139SCaroline Tice 475*ceb6b139SCaroline Tice if (log) 476*ceb6b139SCaroline Tice log->Printf ("SBThread::GetProcess ()"); 477*ceb6b139SCaroline Tice 47830fdc8d8SChris Lattner SBProcess process; 4796611103cSGreg Clayton if (m_opaque_sp) 48030fdc8d8SChris Lattner { 48130fdc8d8SChris Lattner // Have to go up to the target so we can get a shared pointer to our process... 4826611103cSGreg Clayton process.SetProcess(m_opaque_sp->GetProcess().GetTarget().GetProcessSP()); 48330fdc8d8SChris Lattner } 484*ceb6b139SCaroline Tice 485*ceb6b139SCaroline Tice if (log) 486*ceb6b139SCaroline Tice { 487*ceb6b139SCaroline Tice SBStream sstr; 488*ceb6b139SCaroline Tice process.GetDescription (sstr); 489*ceb6b139SCaroline Tice log->Printf ("SBThread::GetProcess ==> SBProcess (this = %p, '%s')", &process, sstr.GetData()); 490*ceb6b139SCaroline Tice } 491*ceb6b139SCaroline Tice 49230fdc8d8SChris Lattner return process; 49330fdc8d8SChris Lattner } 49430fdc8d8SChris Lattner 49530fdc8d8SChris Lattner uint32_t 49630fdc8d8SChris Lattner SBThread::GetNumFrames () 49730fdc8d8SChris Lattner { 498*ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 499*ceb6b139SCaroline Tice 500*ceb6b139SCaroline Tice if (log) 501*ceb6b139SCaroline Tice log->Printf ("SBThread::GetNumFrames ()"); 502*ceb6b139SCaroline Tice 503*ceb6b139SCaroline Tice uint32_t num_frames = 0; 5046611103cSGreg Clayton if (m_opaque_sp) 505*ceb6b139SCaroline Tice num_frames = m_opaque_sp->GetStackFrameCount(); 506*ceb6b139SCaroline Tice 507*ceb6b139SCaroline Tice if (log) 508*ceb6b139SCaroline Tice log->Printf ("SBThread::GetNumFrames ==> %d", num_frames); 509*ceb6b139SCaroline Tice 510*ceb6b139SCaroline Tice return num_frames; 51130fdc8d8SChris Lattner } 51230fdc8d8SChris Lattner 51330fdc8d8SChris Lattner SBFrame 51430fdc8d8SChris Lattner SBThread::GetFrameAtIndex (uint32_t idx) 51530fdc8d8SChris Lattner { 516*ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 517*ceb6b139SCaroline Tice 518*ceb6b139SCaroline Tice if (log) 519*ceb6b139SCaroline Tice log->Printf ("SBThread::GetFrameAtIndex (uint32_t idx) idx = %d", idx); 520*ceb6b139SCaroline Tice 52130fdc8d8SChris Lattner SBFrame sb_frame; 5226611103cSGreg Clayton if (m_opaque_sp) 5236611103cSGreg Clayton sb_frame.SetFrame (m_opaque_sp->GetStackFrameAtIndex (idx)); 524*ceb6b139SCaroline Tice 525*ceb6b139SCaroline Tice if (log) 526*ceb6b139SCaroline Tice { 527*ceb6b139SCaroline Tice SBStream sstr; 528*ceb6b139SCaroline Tice sb_frame.GetDescription (sstr); 529*ceb6b139SCaroline Tice log->Printf ("SBThread::GetFrameAtIndex ==> SBFrame (this = %p, '%s')", &sb_frame, sstr.GetData()); 530*ceb6b139SCaroline Tice } 531*ceb6b139SCaroline Tice 53230fdc8d8SChris Lattner return sb_frame; 53330fdc8d8SChris Lattner } 53430fdc8d8SChris Lattner 53530fdc8d8SChris Lattner const lldb::SBThread & 53630fdc8d8SChris Lattner SBThread::operator = (const lldb::SBThread &rhs) 53730fdc8d8SChris Lattner { 538*ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 539*ceb6b139SCaroline Tice 540*ceb6b139SCaroline Tice if (log) 541*ceb6b139SCaroline Tice log->Printf ("SBThread::operator= (const lldb::SBThread &rhs) rhs.m_opaque_sp.get() = %p ==> this = %p", 542*ceb6b139SCaroline Tice rhs.m_opaque_sp.get(), this); 543*ceb6b139SCaroline Tice 5446611103cSGreg Clayton m_opaque_sp = rhs.m_opaque_sp; 54530fdc8d8SChris Lattner return *this; 54630fdc8d8SChris Lattner } 54730fdc8d8SChris Lattner 54830fdc8d8SChris Lattner bool 54930fdc8d8SChris Lattner SBThread::operator == (const SBThread &rhs) const 55030fdc8d8SChris Lattner { 5516611103cSGreg Clayton return m_opaque_sp.get() == rhs.m_opaque_sp.get(); 55230fdc8d8SChris Lattner } 55330fdc8d8SChris Lattner 55430fdc8d8SChris Lattner bool 55530fdc8d8SChris Lattner SBThread::operator != (const SBThread &rhs) const 55630fdc8d8SChris Lattner { 5576611103cSGreg Clayton return m_opaque_sp.get() != rhs.m_opaque_sp.get(); 55830fdc8d8SChris Lattner } 55930fdc8d8SChris Lattner 56030fdc8d8SChris Lattner lldb_private::Thread * 56130fdc8d8SChris Lattner SBThread::GetLLDBObjectPtr () 56230fdc8d8SChris Lattner { 5636611103cSGreg Clayton return m_opaque_sp.get(); 56430fdc8d8SChris Lattner } 56530fdc8d8SChris Lattner 56630fdc8d8SChris Lattner const lldb_private::Thread * 56730fdc8d8SChris Lattner SBThread::operator->() const 56830fdc8d8SChris Lattner { 5696611103cSGreg Clayton return m_opaque_sp.get(); 57030fdc8d8SChris Lattner } 57130fdc8d8SChris Lattner 57230fdc8d8SChris Lattner const lldb_private::Thread & 57330fdc8d8SChris Lattner SBThread::operator*() const 57430fdc8d8SChris Lattner { 5756611103cSGreg Clayton return *m_opaque_sp; 57630fdc8d8SChris Lattner } 57730fdc8d8SChris Lattner 57830fdc8d8SChris Lattner lldb_private::Thread * 57930fdc8d8SChris Lattner SBThread::operator->() 58030fdc8d8SChris Lattner { 5816611103cSGreg Clayton return m_opaque_sp.get(); 58230fdc8d8SChris Lattner } 58330fdc8d8SChris Lattner 58430fdc8d8SChris Lattner lldb_private::Thread & 58530fdc8d8SChris Lattner SBThread::operator*() 58630fdc8d8SChris Lattner { 5876611103cSGreg Clayton return *m_opaque_sp; 58830fdc8d8SChris Lattner } 589dde9cff3SCaroline Tice 590dde9cff3SCaroline Tice bool 591dde9cff3SCaroline Tice SBThread::GetDescription (SBStream &description) 592dde9cff3SCaroline Tice { 593dde9cff3SCaroline Tice if (m_opaque_sp) 59405faeb71SGreg Clayton { 59505faeb71SGreg Clayton StreamString strm; 59605faeb71SGreg Clayton description.Printf("SBThread: tid = 0x%4.4x", m_opaque_sp->GetID()); 59705faeb71SGreg Clayton } 598dde9cff3SCaroline Tice else 599dde9cff3SCaroline Tice description.Printf ("No value"); 600dde9cff3SCaroline Tice 601dde9cff3SCaroline Tice return true; 602dde9cff3SCaroline Tice } 603*ceb6b139SCaroline Tice 604*ceb6b139SCaroline Tice bool 605*ceb6b139SCaroline Tice SBThread::GetDescription (SBStream &description) const 606*ceb6b139SCaroline Tice { 607*ceb6b139SCaroline Tice if (m_opaque_sp) 608*ceb6b139SCaroline Tice { 609*ceb6b139SCaroline Tice StreamString strm; 610*ceb6b139SCaroline Tice description.Printf("SBThread: tid = 0x%4.4x", m_opaque_sp->GetID()); 611*ceb6b139SCaroline Tice } 612*ceb6b139SCaroline Tice else 613*ceb6b139SCaroline Tice description.Printf ("No value"); 614*ceb6b139SCaroline Tice 615*ceb6b139SCaroline Tice return true; 616*ceb6b139SCaroline Tice } 617