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/SBFileSpec.h" 13dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 14b9c1b51eSKate Stone #include "lldb/API/SBSymbolContext.h" 154e78f606SGreg Clayton #include "lldb/Breakpoint/BreakpointLocation.h" 166611103cSGreg Clayton #include "lldb/Core/Debugger.h" 1730fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 18a78bd7ffSZachary Turner #include "lldb/Core/ValueObject.h" 196611103cSGreg Clayton #include "lldb/Interpreter/CommandInterpreter.h" 2093749ab3SZachary Turner #include "lldb/Symbol/CompileUnit.h" 21b9c1b51eSKate Stone #include "lldb/Symbol/SymbolContext.h" 2230fdc8d8SChris Lattner #include "lldb/Target/Process.h" 23b9ffa98cSJason Molenda #include "lldb/Target/Queue.h" 24f4b47e15SGreg Clayton #include "lldb/Target/StopInfo.h" 25b9c1b51eSKate Stone #include "lldb/Target/SystemRuntime.h" 2630fdc8d8SChris Lattner #include "lldb/Target/Target.h" 27b9c1b51eSKate Stone #include "lldb/Target/Thread.h" 2830fdc8d8SChris Lattner #include "lldb/Target/ThreadPlan.h" 29b9c1b51eSKate Stone #include "lldb/Target/ThreadPlanStepInRange.h" 3030fdc8d8SChris Lattner #include "lldb/Target/ThreadPlanStepInstruction.h" 3130fdc8d8SChris Lattner #include "lldb/Target/ThreadPlanStepOut.h" 3230fdc8d8SChris Lattner #include "lldb/Target/ThreadPlanStepRange.h" 33b9c1b51eSKate Stone #include "lldb/Target/UnixSignals.h" 34d821c997SPavel Labath #include "lldb/Utility/State.h" 35bf9a7730SZachary Turner #include "lldb/Utility/Stream.h" 36f2a8bccfSPavel Labath #include "lldb/Utility/StructuredData.h" 3730fdc8d8SChris Lattner 384c5de699SEli Friedman #include "lldb/API/SBAddress.h" 394c5de699SEli Friedman #include "lldb/API/SBDebugger.h" 404f465cffSJim Ingham #include "lldb/API/SBEvent.h" 4173ca05a2SJim Ingham #include "lldb/API/SBFrame.h" 424c5de699SEli Friedman #include "lldb/API/SBProcess.h" 436a831436SKuba Brecka #include "lldb/API/SBThreadCollection.h" 442bdbfd50SJim Ingham #include "lldb/API/SBThreadPlan.h" 4573ca05a2SJim Ingham #include "lldb/API/SBValue.h" 465bfee5f1SAbhishek Aggarwal #include "lldb/lldb-enumerations.h" 4730fdc8d8SChris Lattner 4830fdc8d8SChris Lattner using namespace lldb; 4930fdc8d8SChris Lattner using namespace lldb_private; 5030fdc8d8SChris Lattner 51b9c1b51eSKate Stone const char *SBThread::GetBroadcasterClassName() { 524f465cffSJim Ingham return Thread::GetStaticBroadcasterClass().AsCString(); 534f465cffSJim Ingham } 544f465cffSJim Ingham 55cfd1acedSGreg Clayton //---------------------------------------------------------------------- 56cfd1acedSGreg Clayton // Constructors 57cfd1acedSGreg Clayton //---------------------------------------------------------------------- 58b9c1b51eSKate Stone SBThread::SBThread() : m_opaque_sp(new ExecutionContextRef()) {} 5930fdc8d8SChris Lattner 60b9c1b51eSKate Stone SBThread::SBThread(const ThreadSP &lldb_object_sp) 61b9c1b51eSKate Stone : m_opaque_sp(new ExecutionContextRef(lldb_object_sp)) {} 6230fdc8d8SChris Lattner 63b9c1b51eSKate Stone SBThread::SBThread(const SBThread &rhs) 64b9c1b51eSKate Stone : m_opaque_sp(new ExecutionContextRef(*rhs.m_opaque_sp)) {} 6530fdc8d8SChris Lattner 6630fdc8d8SChris Lattner //---------------------------------------------------------------------- 67cfd1acedSGreg Clayton // Assignment operator 68cfd1acedSGreg Clayton //---------------------------------------------------------------------- 69cfd1acedSGreg Clayton 70b9c1b51eSKate Stone const lldb::SBThread &SBThread::operator=(const SBThread &rhs) { 71cfd1acedSGreg Clayton if (this != &rhs) 727fdf9ef1SGreg Clayton *m_opaque_sp = *rhs.m_opaque_sp; 73cfd1acedSGreg Clayton return *this; 74cfd1acedSGreg Clayton } 75cfd1acedSGreg Clayton 76cfd1acedSGreg Clayton //---------------------------------------------------------------------- 7730fdc8d8SChris Lattner // Destructor 7830fdc8d8SChris Lattner //---------------------------------------------------------------------- 79b9c1b51eSKate Stone SBThread::~SBThread() {} 8030fdc8d8SChris Lattner 81b9c1b51eSKate Stone lldb::SBQueue SBThread::GetQueue() const { 82b9ffa98cSJason Molenda SBQueue sb_queue; 83b9ffa98cSJason Molenda QueueSP queue_sp; 84bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 85bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 86b9ffa98cSJason Molenda 87b9ffa98cSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 88b9c1b51eSKate Stone if (exe_ctx.HasThreadScope()) { 89b9ffa98cSJason Molenda Process::StopLocker stop_locker; 90b9c1b51eSKate Stone if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { 91b9ffa98cSJason Molenda queue_sp = exe_ctx.GetThreadPtr()->GetQueue(); 92b9c1b51eSKate Stone if (queue_sp) { 93b9ffa98cSJason Molenda sb_queue.SetQueue(queue_sp); 94b9ffa98cSJason Molenda } 95b9c1b51eSKate Stone } else { 96b9ffa98cSJason Molenda if (log) 97358cf1eaSGreg Clayton log->Printf("SBThread(%p)::GetQueue() => error: process is running", 98b9ffa98cSJason Molenda static_cast<void *>(exe_ctx.GetThreadPtr())); 99b9ffa98cSJason Molenda } 100b9ffa98cSJason Molenda } 101b9ffa98cSJason Molenda 102b9ffa98cSJason Molenda if (log) 103358cf1eaSGreg Clayton log->Printf("SBThread(%p)::GetQueue () => SBQueue(%p)", 104b9c1b51eSKate Stone static_cast<void *>(exe_ctx.GetThreadPtr()), 105b9c1b51eSKate Stone static_cast<void *>(queue_sp.get())); 106b9ffa98cSJason Molenda 107b9ffa98cSJason Molenda return sb_queue; 108b9ffa98cSJason Molenda } 109b9ffa98cSJason Molenda 110b9c1b51eSKate Stone bool SBThread::IsValid() const { 111bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 112bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1137fa7dc36SJim Ingham 1147fa7dc36SJim Ingham Target *target = exe_ctx.GetTargetPtr(); 1157fa7dc36SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 116b9c1b51eSKate Stone if (target && process) { 1177fa7dc36SJim Ingham Process::StopLocker stop_locker; 1187fa7dc36SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 1197fdf9ef1SGreg Clayton return m_opaque_sp->GetThreadSP().get() != NULL; 12030fdc8d8SChris Lattner } 1217fa7dc36SJim Ingham // Without a valid target & process, this thread can't be valid. 1227fa7dc36SJim Ingham return false; 1237fa7dc36SJim Ingham } 12430fdc8d8SChris Lattner 125b9c1b51eSKate Stone void SBThread::Clear() { m_opaque_sp->Clear(); } 12648e42549SGreg Clayton 127b9c1b51eSKate Stone StopReason SBThread::GetStopReason() { 1285160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 129ceb6b139SCaroline Tice 130ceb6b139SCaroline Tice StopReason reason = eStopReasonInvalid; 131bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 132bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1334fc6cb9cSJim Ingham 134b9c1b51eSKate Stone if (exe_ctx.HasThreadScope()) { 1357fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 136b9c1b51eSKate Stone if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { 13797d5cf05SGreg Clayton return exe_ctx.GetThreadPtr()->GetStopReason(); 138b9c1b51eSKate Stone } else { 139c9858e4dSGreg Clayton if (log) 140b9c1b51eSKate Stone log->Printf( 141b9c1b51eSKate Stone "SBThread(%p)::GetStopReason() => error: process is running", 142324a1036SSaleem Abdulrasool static_cast<void *>(exe_ctx.GetThreadPtr())); 143c9858e4dSGreg Clayton } 1447fdf9ef1SGreg Clayton } 145ceb6b139SCaroline Tice 146ceb6b139SCaroline Tice if (log) 147324a1036SSaleem Abdulrasool log->Printf("SBThread(%p)::GetStopReason () => %s", 148324a1036SSaleem Abdulrasool static_cast<void *>(exe_ctx.GetThreadPtr()), 149750cd175SCaroline Tice Thread::StopReasonAsCString(reason)); 150ceb6b139SCaroline Tice 151ceb6b139SCaroline Tice return reason; 15230fdc8d8SChris Lattner } 15330fdc8d8SChris Lattner 154b9c1b51eSKate Stone size_t SBThread::GetStopReasonDataCount() { 155bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 156bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1574fc6cb9cSJim Ingham 158b9c1b51eSKate Stone if (exe_ctx.HasThreadScope()) { 1597fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 160b9c1b51eSKate Stone if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { 1611ac04c30SGreg Clayton StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo(); 162b9c1b51eSKate Stone if (stop_info_sp) { 1634e78f606SGreg Clayton StopReason reason = stop_info_sp->GetStopReason(); 164b9c1b51eSKate Stone switch (reason) { 1654e78f606SGreg Clayton case eStopReasonInvalid: 1664e78f606SGreg Clayton case eStopReasonNone: 1674e78f606SGreg Clayton case eStopReasonTrace: 16890ba8115SGreg Clayton case eStopReasonExec: 1694e78f606SGreg Clayton case eStopReasonPlanComplete: 170f85defaeSAndrew Kaylor case eStopReasonThreadExiting: 171afdf842bSKuba Brecka case eStopReasonInstrumentation: 1724e78f606SGreg Clayton // There is no data for these stop reasons. 1734e78f606SGreg Clayton return 0; 1744e78f606SGreg Clayton 175b9c1b51eSKate Stone case eStopReasonBreakpoint: { 1764e78f606SGreg Clayton break_id_t site_id = stop_info_sp->GetValue(); 177b9c1b51eSKate Stone lldb::BreakpointSiteSP bp_site_sp( 178b9c1b51eSKate Stone exe_ctx.GetProcessPtr()->GetBreakpointSiteList().FindByID( 179b9c1b51eSKate Stone site_id)); 1804e78f606SGreg Clayton if (bp_site_sp) 1814e78f606SGreg Clayton return bp_site_sp->GetNumberOfOwners() * 2; 1824e78f606SGreg Clayton else 1834e78f606SGreg Clayton return 0; // Breakpoint must have cleared itself... 184b9c1b51eSKate Stone } break; 1854e78f606SGreg Clayton 1864e78f606SGreg Clayton case eStopReasonWatchpoint: 187290fa41bSJohnny Chen return 1; 1884e78f606SGreg Clayton 1894e78f606SGreg Clayton case eStopReasonSignal: 1904e78f606SGreg Clayton return 1; 1914e78f606SGreg Clayton 1924e78f606SGreg Clayton case eStopReasonException: 1934e78f606SGreg Clayton return 1; 1944e78f606SGreg Clayton } 1954e78f606SGreg Clayton } 196b9c1b51eSKate Stone } else { 1975160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 198c9858e4dSGreg Clayton if (log) 199b9c1b51eSKate Stone log->Printf("SBThread(%p)::GetStopReasonDataCount() => error: process " 200b9c1b51eSKate Stone "is running", 201324a1036SSaleem Abdulrasool static_cast<void *>(exe_ctx.GetThreadPtr())); 202c9858e4dSGreg Clayton } 2037fdf9ef1SGreg Clayton } 2044e78f606SGreg Clayton return 0; 2054e78f606SGreg Clayton } 2064e78f606SGreg Clayton 207b9c1b51eSKate Stone uint64_t SBThread::GetStopReasonDataAtIndex(uint32_t idx) { 208bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 209bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 2104fc6cb9cSJim Ingham 211b9c1b51eSKate Stone if (exe_ctx.HasThreadScope()) { 2127fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 213b9c1b51eSKate Stone if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { 2141ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 2151ac04c30SGreg Clayton StopInfoSP stop_info_sp = thread->GetStopInfo(); 216b9c1b51eSKate Stone if (stop_info_sp) { 2174e78f606SGreg Clayton StopReason reason = stop_info_sp->GetStopReason(); 218b9c1b51eSKate Stone switch (reason) { 2194e78f606SGreg Clayton case eStopReasonInvalid: 2204e78f606SGreg Clayton case eStopReasonNone: 2214e78f606SGreg Clayton case eStopReasonTrace: 22290ba8115SGreg Clayton case eStopReasonExec: 2234e78f606SGreg Clayton case eStopReasonPlanComplete: 224f85defaeSAndrew Kaylor case eStopReasonThreadExiting: 225afdf842bSKuba Brecka case eStopReasonInstrumentation: 2264e78f606SGreg Clayton // There is no data for these stop reasons. 2274e78f606SGreg Clayton return 0; 2284e78f606SGreg Clayton 229b9c1b51eSKate Stone case eStopReasonBreakpoint: { 2304e78f606SGreg Clayton break_id_t site_id = stop_info_sp->GetValue(); 231b9c1b51eSKate Stone lldb::BreakpointSiteSP bp_site_sp( 232b9c1b51eSKate Stone exe_ctx.GetProcessPtr()->GetBreakpointSiteList().FindByID( 233b9c1b51eSKate Stone site_id)); 234b9c1b51eSKate Stone if (bp_site_sp) { 2354e78f606SGreg Clayton uint32_t bp_index = idx / 2; 236b9c1b51eSKate Stone BreakpointLocationSP bp_loc_sp( 237b9c1b51eSKate Stone bp_site_sp->GetOwnerAtIndex(bp_index)); 238b9c1b51eSKate Stone if (bp_loc_sp) { 239b9c1b51eSKate Stone if (idx & 1) { 2404e78f606SGreg Clayton // Odd idx, return the breakpoint location ID 2414e78f606SGreg Clayton return bp_loc_sp->GetID(); 242b9c1b51eSKate Stone } else { 2434e78f606SGreg Clayton // Even idx, return the breakpoint ID 2444e78f606SGreg Clayton return bp_loc_sp->GetBreakpoint().GetID(); 2454e78f606SGreg Clayton } 2464e78f606SGreg Clayton } 2474e78f606SGreg Clayton } 2484e78f606SGreg Clayton return LLDB_INVALID_BREAK_ID; 249b9c1b51eSKate Stone } break; 2504e78f606SGreg Clayton 2514e78f606SGreg Clayton case eStopReasonWatchpoint: 252290fa41bSJohnny Chen return stop_info_sp->GetValue(); 2534e78f606SGreg Clayton 2544e78f606SGreg Clayton case eStopReasonSignal: 2554e78f606SGreg Clayton return stop_info_sp->GetValue(); 2564e78f606SGreg Clayton 2574e78f606SGreg Clayton case eStopReasonException: 2584e78f606SGreg Clayton return stop_info_sp->GetValue(); 2594e78f606SGreg Clayton } 2604e78f606SGreg Clayton } 261b9c1b51eSKate Stone } else { 2625160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 263c9858e4dSGreg Clayton if (log) 264b9c1b51eSKate Stone log->Printf("SBThread(%p)::GetStopReasonDataAtIndex() => error: " 265b9c1b51eSKate Stone "process is running", 266324a1036SSaleem Abdulrasool static_cast<void *>(exe_ctx.GetThreadPtr())); 267c9858e4dSGreg Clayton } 2687fdf9ef1SGreg Clayton } 2694e78f606SGreg Clayton return 0; 2704e78f606SGreg Clayton } 2714e78f606SGreg Clayton 272b9c1b51eSKate Stone bool SBThread::GetStopReasonExtendedInfoAsJSON(lldb::SBStream &stream) { 273afdf842bSKuba Brecka Stream &strm = stream.ref(); 274afdf842bSKuba Brecka 275b2e7d28eSJim Ingham std::unique_lock<std::recursive_mutex> lock; 276b2e7d28eSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 277b2e7d28eSJim Ingham 278afdf842bSKuba Brecka if (!exe_ctx.HasThreadScope()) 279afdf842bSKuba Brecka return false; 280afdf842bSKuba Brecka 281afdf842bSKuba Brecka StopInfoSP stop_info = exe_ctx.GetThreadPtr()->GetStopInfo(); 282afdf842bSKuba Brecka StructuredData::ObjectSP info = stop_info->GetExtendedInfo(); 283afdf842bSKuba Brecka if (!info) 284afdf842bSKuba Brecka return false; 285afdf842bSKuba Brecka 286afdf842bSKuba Brecka info->Dump(strm); 287afdf842bSKuba Brecka 288afdf842bSKuba Brecka return true; 289afdf842bSKuba Brecka } 290afdf842bSKuba Brecka 2916a831436SKuba Brecka SBThreadCollection 292b9c1b51eSKate Stone SBThread::GetStopReasonExtendedBacktraces(InstrumentationRuntimeType type) { 2936a831436SKuba Brecka ThreadCollectionSP threads; 2946a831436SKuba Brecka threads.reset(new ThreadCollection()); 2956a831436SKuba Brecka 296b2e7d28eSJim Ingham std::unique_lock<std::recursive_mutex> lock; 297b2e7d28eSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 298b2e7d28eSJim Ingham 2996a831436SKuba Brecka if (!exe_ctx.HasThreadScope()) 3001aad8fb7SKuba Brecka return threads; 3016a831436SKuba Brecka 3026a831436SKuba Brecka ProcessSP process_sp = exe_ctx.GetProcessSP(); 3036a831436SKuba Brecka 3046a831436SKuba Brecka StopInfoSP stop_info = exe_ctx.GetThreadPtr()->GetStopInfo(); 3056a831436SKuba Brecka StructuredData::ObjectSP info = stop_info->GetExtendedInfo(); 3066a831436SKuba Brecka if (!info) 3076a831436SKuba Brecka return threads; 3086a831436SKuba Brecka 309b9c1b51eSKate Stone return process_sp->GetInstrumentationRuntime(type) 310b9c1b51eSKate Stone ->GetBacktracesFromExtendedStopInfo(info); 3116a831436SKuba Brecka } 3126a831436SKuba Brecka 313b9c1b51eSKate Stone size_t SBThread::GetStopDescription(char *dst, size_t dst_len) { 3145160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 315ceb6b139SCaroline Tice 316bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 317bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 3184fc6cb9cSJim Ingham 319b9c1b51eSKate Stone if (exe_ctx.HasThreadScope()) { 3207fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 321b9c1b51eSKate Stone if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { 3227fdf9ef1SGreg Clayton 3231ac04c30SGreg Clayton StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo(); 324b9c1b51eSKate Stone if (stop_info_sp) { 325b15bfc75SJim Ingham const char *stop_desc = stop_info_sp->GetDescription(); 326b9c1b51eSKate Stone if (stop_desc) { 327ceb6b139SCaroline Tice if (log) 328b9c1b51eSKate Stone log->Printf( 329b9c1b51eSKate Stone "SBThread(%p)::GetStopDescription (dst, dst_len) => \"%s\"", 330b9c1b51eSKate Stone static_cast<void *>(exe_ctx.GetThreadPtr()), stop_desc); 33130fdc8d8SChris Lattner if (dst) 33230fdc8d8SChris Lattner return ::snprintf(dst, dst_len, "%s", stop_desc); 333b9c1b51eSKate Stone else { 334b9c1b51eSKate Stone // NULL dst passed in, return the length needed to contain the 335b9c1b51eSKate Stone // description 33630fdc8d8SChris Lattner return ::strlen(stop_desc) + 1; // Include the NULL byte for size 33730fdc8d8SChris Lattner } 338b9c1b51eSKate Stone } else { 33930fdc8d8SChris Lattner size_t stop_desc_len = 0; 340b9c1b51eSKate Stone switch (stop_info_sp->GetStopReason()) { 34130fdc8d8SChris Lattner case eStopReasonTrace: 342b9c1b51eSKate Stone case eStopReasonPlanComplete: { 34330fdc8d8SChris Lattner static char trace_desc[] = "step"; 34430fdc8d8SChris Lattner stop_desc = trace_desc; 345b9c1b51eSKate Stone stop_desc_len = 346b9c1b51eSKate Stone sizeof(trace_desc); // Include the NULL byte for size 347b9c1b51eSKate Stone } break; 34830fdc8d8SChris Lattner 349b9c1b51eSKate Stone case eStopReasonBreakpoint: { 35030fdc8d8SChris Lattner static char bp_desc[] = "breakpoint hit"; 35130fdc8d8SChris Lattner stop_desc = bp_desc; 35230fdc8d8SChris Lattner stop_desc_len = sizeof(bp_desc); // Include the NULL byte for size 353b9c1b51eSKate Stone } break; 35430fdc8d8SChris Lattner 355b9c1b51eSKate Stone case eStopReasonWatchpoint: { 35630fdc8d8SChris Lattner static char wp_desc[] = "watchpoint hit"; 35730fdc8d8SChris Lattner stop_desc = wp_desc; 35830fdc8d8SChris Lattner stop_desc_len = sizeof(wp_desc); // Include the NULL byte for size 359b9c1b51eSKate Stone } break; 36030fdc8d8SChris Lattner 361b9c1b51eSKate Stone case eStopReasonSignal: { 362b9c1b51eSKate Stone stop_desc = 363b9c1b51eSKate Stone exe_ctx.GetProcessPtr()->GetUnixSignals()->GetSignalAsCString( 364b9c1b51eSKate Stone stop_info_sp->GetValue()); 365b9c1b51eSKate Stone if (stop_desc == NULL || stop_desc[0] == '\0') { 36630fdc8d8SChris Lattner static char signal_desc[] = "signal"; 36730fdc8d8SChris Lattner stop_desc = signal_desc; 368b9c1b51eSKate Stone stop_desc_len = 369b9c1b51eSKate Stone sizeof(signal_desc); // Include the NULL byte for size 37030fdc8d8SChris Lattner } 371b9c1b51eSKate Stone } break; 37230fdc8d8SChris Lattner 373b9c1b51eSKate Stone case eStopReasonException: { 37430fdc8d8SChris Lattner char exc_desc[] = "exception"; 37530fdc8d8SChris Lattner stop_desc = exc_desc; 37630fdc8d8SChris Lattner stop_desc_len = sizeof(exc_desc); // Include the NULL byte for size 377b9c1b51eSKate Stone } break; 378c982c768SGreg Clayton 379b9c1b51eSKate Stone case eStopReasonExec: { 38090ba8115SGreg Clayton char exc_desc[] = "exec"; 38190ba8115SGreg Clayton stop_desc = exc_desc; 38290ba8115SGreg Clayton stop_desc_len = sizeof(exc_desc); // Include the NULL byte for size 383b9c1b51eSKate Stone } break; 38490ba8115SGreg Clayton 385b9c1b51eSKate Stone case eStopReasonThreadExiting: { 386f85defaeSAndrew Kaylor char limbo_desc[] = "thread exiting"; 387f85defaeSAndrew Kaylor stop_desc = limbo_desc; 388f85defaeSAndrew Kaylor stop_desc_len = sizeof(limbo_desc); 389b9c1b51eSKate Stone } break; 390c982c768SGreg Clayton default: 391c982c768SGreg Clayton break; 39230fdc8d8SChris Lattner } 39330fdc8d8SChris Lattner 394b9c1b51eSKate Stone if (stop_desc && stop_desc[0]) { 395ceb6b139SCaroline Tice if (log) 396b9c1b51eSKate Stone log->Printf( 397b9c1b51eSKate Stone "SBThread(%p)::GetStopDescription (dst, dst_len) => '%s'", 398b9c1b51eSKate Stone static_cast<void *>(exe_ctx.GetThreadPtr()), stop_desc); 399ceb6b139SCaroline Tice 40030fdc8d8SChris Lattner if (dst) 401b9c1b51eSKate Stone return ::snprintf(dst, dst_len, "%s", stop_desc) + 402b9c1b51eSKate Stone 1; // Include the NULL byte 40330fdc8d8SChris Lattner 40430fdc8d8SChris Lattner if (stop_desc_len == 0) 40530fdc8d8SChris Lattner stop_desc_len = ::strlen(stop_desc) + 1; // Include the NULL byte 40630fdc8d8SChris Lattner 40730fdc8d8SChris Lattner return stop_desc_len; 40830fdc8d8SChris Lattner } 40930fdc8d8SChris Lattner } 41030fdc8d8SChris Lattner } 411b9c1b51eSKate Stone } else { 4125160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 413c9858e4dSGreg Clayton if (log) 414b9c1b51eSKate Stone log->Printf( 415b9c1b51eSKate Stone "SBThread(%p)::GetStopDescription() => error: process is running", 416324a1036SSaleem Abdulrasool static_cast<void *>(exe_ctx.GetThreadPtr())); 417c9858e4dSGreg Clayton } 4187fdf9ef1SGreg Clayton } 41930fdc8d8SChris Lattner if (dst) 42030fdc8d8SChris Lattner *dst = 0; 42130fdc8d8SChris Lattner return 0; 42230fdc8d8SChris Lattner } 42330fdc8d8SChris Lattner 424b9c1b51eSKate Stone SBValue SBThread::GetStopReturnValue() { 4255160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 42673ca05a2SJim Ingham ValueObjectSP return_valobj_sp; 427bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 428bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 4294fc6cb9cSJim Ingham 430b9c1b51eSKate Stone if (exe_ctx.HasThreadScope()) { 4317fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 432b9c1b51eSKate Stone if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { 4331ac04c30SGreg Clayton StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo(); 434b9c1b51eSKate Stone if (stop_info_sp) { 43573ca05a2SJim Ingham return_valobj_sp = StopInfo::GetReturnValueObject(stop_info_sp); 43673ca05a2SJim Ingham } 437b9c1b51eSKate Stone } else { 438c9858e4dSGreg Clayton if (log) 439b9c1b51eSKate Stone log->Printf( 440b9c1b51eSKate Stone "SBThread(%p)::GetStopReturnValue() => error: process is running", 441324a1036SSaleem Abdulrasool static_cast<void *>(exe_ctx.GetThreadPtr())); 442c9858e4dSGreg Clayton } 4437fdf9ef1SGreg Clayton } 44473ca05a2SJim Ingham 44573ca05a2SJim Ingham if (log) 446324a1036SSaleem Abdulrasool log->Printf("SBThread(%p)::GetStopReturnValue () => %s", 447324a1036SSaleem Abdulrasool static_cast<void *>(exe_ctx.GetThreadPtr()), 448b9c1b51eSKate Stone return_valobj_sp.get() ? return_valobj_sp->GetValueAsCString() 44973ca05a2SJim Ingham : "<no return value>"); 45073ca05a2SJim Ingham 45173ca05a2SJim Ingham return SBValue(return_valobj_sp); 45273ca05a2SJim Ingham } 45373ca05a2SJim Ingham 454b9c1b51eSKate Stone void SBThread::SetThread(const ThreadSP &lldb_object_sp) { 4557fdf9ef1SGreg Clayton m_opaque_sp->SetThreadSP(lldb_object_sp); 45630fdc8d8SChris Lattner } 45730fdc8d8SChris Lattner 458b9c1b51eSKate Stone lldb::tid_t SBThread::GetThreadID() const { 4597fdf9ef1SGreg Clayton ThreadSP thread_sp(m_opaque_sp->GetThreadSP()); 46017a6ad05SGreg Clayton if (thread_sp) 4611ac04c30SGreg Clayton return thread_sp->GetID(); 4621ac04c30SGreg Clayton return LLDB_INVALID_THREAD_ID; 46330fdc8d8SChris Lattner } 46430fdc8d8SChris Lattner 465b9c1b51eSKate Stone uint32_t SBThread::GetIndexID() const { 4667fdf9ef1SGreg Clayton ThreadSP thread_sp(m_opaque_sp->GetThreadSP()); 46717a6ad05SGreg Clayton if (thread_sp) 46817a6ad05SGreg Clayton return thread_sp->GetIndexID(); 46930fdc8d8SChris Lattner return LLDB_INVALID_INDEX32; 47030fdc8d8SChris Lattner } 4711ac04c30SGreg Clayton 472b9c1b51eSKate Stone const char *SBThread::GetName() const { 4735160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 4744838131bSGreg Clayton const char *name = NULL; 475bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 476bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 4774fc6cb9cSJim Ingham 478b9c1b51eSKate Stone if (exe_ctx.HasThreadScope()) { 4797fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 480b9c1b51eSKate Stone if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { 4811ac04c30SGreg Clayton name = exe_ctx.GetThreadPtr()->GetName(); 482b9c1b51eSKate Stone } else { 483c9858e4dSGreg Clayton if (log) 484324a1036SSaleem Abdulrasool log->Printf("SBThread(%p)::GetName() => error: process is running", 485324a1036SSaleem Abdulrasool static_cast<void *>(exe_ctx.GetThreadPtr())); 486c9858e4dSGreg Clayton } 4877fdf9ef1SGreg Clayton } 488ceb6b139SCaroline Tice 489ceb6b139SCaroline Tice if (log) 490324a1036SSaleem Abdulrasool log->Printf("SBThread(%p)::GetName () => %s", 491324a1036SSaleem Abdulrasool static_cast<void *>(exe_ctx.GetThreadPtr()), 492324a1036SSaleem Abdulrasool name ? name : "NULL"); 493ceb6b139SCaroline Tice 4944838131bSGreg Clayton return name; 49530fdc8d8SChris Lattner } 49630fdc8d8SChris Lattner 497b9c1b51eSKate Stone const char *SBThread::GetQueueName() const { 4984838131bSGreg Clayton const char *name = NULL; 499bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 500bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 5014fc6cb9cSJim Ingham 5025160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 503b9c1b51eSKate Stone if (exe_ctx.HasThreadScope()) { 5047fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 505b9c1b51eSKate Stone if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { 5061ac04c30SGreg Clayton name = exe_ctx.GetThreadPtr()->GetQueueName(); 507b9c1b51eSKate Stone } else { 508c9858e4dSGreg Clayton if (log) 509324a1036SSaleem Abdulrasool log->Printf("SBThread(%p)::GetQueueName() => error: process is running", 510324a1036SSaleem Abdulrasool static_cast<void *>(exe_ctx.GetThreadPtr())); 511c9858e4dSGreg Clayton } 5127fdf9ef1SGreg Clayton } 513ceb6b139SCaroline Tice 514ceb6b139SCaroline Tice if (log) 515324a1036SSaleem Abdulrasool log->Printf("SBThread(%p)::GetQueueName () => %s", 516324a1036SSaleem Abdulrasool static_cast<void *>(exe_ctx.GetThreadPtr()), 517324a1036SSaleem Abdulrasool name ? name : "NULL"); 518ceb6b139SCaroline Tice 5194838131bSGreg Clayton return name; 52030fdc8d8SChris Lattner } 52130fdc8d8SChris Lattner 522b9c1b51eSKate Stone lldb::queue_id_t SBThread::GetQueueID() const { 5234fdb5863SJason Molenda queue_id_t id = LLDB_INVALID_QUEUE_ID; 524bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 525bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 5264fdb5863SJason Molenda 5274fdb5863SJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 528b9c1b51eSKate Stone if (exe_ctx.HasThreadScope()) { 5294fdb5863SJason Molenda Process::StopLocker stop_locker; 530b9c1b51eSKate Stone if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { 5314fdb5863SJason Molenda id = exe_ctx.GetThreadPtr()->GetQueueID(); 532b9c1b51eSKate Stone } else { 5334fdb5863SJason Molenda if (log) 534324a1036SSaleem Abdulrasool log->Printf("SBThread(%p)::GetQueueID() => error: process is running", 535324a1036SSaleem Abdulrasool static_cast<void *>(exe_ctx.GetThreadPtr())); 5364fdb5863SJason Molenda } 5374fdb5863SJason Molenda } 5384fdb5863SJason Molenda 5394fdb5863SJason Molenda if (log) 540324a1036SSaleem Abdulrasool log->Printf("SBThread(%p)::GetQueueID () => 0x%" PRIx64, 541324a1036SSaleem Abdulrasool static_cast<void *>(exe_ctx.GetThreadPtr()), id); 5424fdb5863SJason Molenda 5434fdb5863SJason Molenda return id; 5444fdb5863SJason Molenda } 5454fdb5863SJason Molenda 546b9c1b51eSKate Stone bool SBThread::GetInfoItemByPathAsString(const char *path, SBStream &strm) { 547705b1809SJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 548705b1809SJason Molenda bool success = false; 549bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 550bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 551705b1809SJason Molenda 552b9c1b51eSKate Stone if (exe_ctx.HasThreadScope()) { 553705b1809SJason Molenda Process::StopLocker stop_locker; 554b9c1b51eSKate Stone if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { 555705b1809SJason Molenda Thread *thread = exe_ctx.GetThreadPtr(); 556705b1809SJason Molenda StructuredData::ObjectSP info_root_sp = thread->GetExtendedInfo(); 557b9c1b51eSKate Stone if (info_root_sp) { 558b9c1b51eSKate Stone StructuredData::ObjectSP node = 559b9c1b51eSKate Stone info_root_sp->GetObjectForDotSeparatedPath(path); 560b9c1b51eSKate Stone if (node) { 5615bfee5f1SAbhishek Aggarwal if (node->GetType() == eStructuredDataTypeString) { 5622833321fSZachary Turner strm.Printf("%s", node->GetAsString()->GetValue().str().c_str()); 563705b1809SJason Molenda success = true; 564705b1809SJason Molenda } 5655bfee5f1SAbhishek Aggarwal if (node->GetType() == eStructuredDataTypeInteger) { 566705b1809SJason Molenda strm.Printf("0x%" PRIx64, node->GetAsInteger()->GetValue()); 567705b1809SJason Molenda success = true; 568705b1809SJason Molenda } 5695bfee5f1SAbhishek Aggarwal if (node->GetType() == eStructuredDataTypeFloat) { 570705b1809SJason Molenda strm.Printf("0x%f", node->GetAsFloat()->GetValue()); 571705b1809SJason Molenda success = true; 572705b1809SJason Molenda } 5735bfee5f1SAbhishek Aggarwal if (node->GetType() == eStructuredDataTypeBoolean) { 574705b1809SJason Molenda if (node->GetAsBoolean()->GetValue() == true) 575705b1809SJason Molenda strm.Printf("true"); 576705b1809SJason Molenda else 577705b1809SJason Molenda strm.Printf("false"); 578705b1809SJason Molenda success = true; 579705b1809SJason Molenda } 5805bfee5f1SAbhishek Aggarwal if (node->GetType() == eStructuredDataTypeNull) { 581705b1809SJason Molenda strm.Printf("null"); 582705b1809SJason Molenda success = true; 583705b1809SJason Molenda } 584705b1809SJason Molenda } 585705b1809SJason Molenda } 586b9c1b51eSKate Stone } else { 587705b1809SJason Molenda if (log) 588b9c1b51eSKate Stone log->Printf("SBThread(%p)::GetInfoItemByPathAsString() => error: " 589b9c1b51eSKate Stone "process is running", 590705b1809SJason Molenda static_cast<void *>(exe_ctx.GetThreadPtr())); 591705b1809SJason Molenda } 592705b1809SJason Molenda } 593705b1809SJason Molenda 594705b1809SJason Molenda if (log) 595753e13c0SJason Molenda log->Printf("SBThread(%p)::GetInfoItemByPathAsString (\"%s\") => \"%s\"", 596753e13c0SJason Molenda static_cast<void *>(exe_ctx.GetThreadPtr()), path, strm.GetData()); 597705b1809SJason Molenda 598705b1809SJason Molenda return success; 599705b1809SJason Molenda } 600705b1809SJason Molenda 601b9c1b51eSKate Stone SBError SBThread::ResumeNewPlan(ExecutionContext &exe_ctx, 602b9c1b51eSKate Stone ThreadPlan *new_plan) { 60364e7ead1SJim Ingham SBError sb_error; 60464e7ead1SJim Ingham 60564e7ead1SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 606b9c1b51eSKate Stone if (!process) { 60764e7ead1SJim Ingham sb_error.SetErrorString("No process in SBThread::ResumeNewPlan"); 60864e7ead1SJim Ingham return sb_error; 60964e7ead1SJim Ingham } 61064e7ead1SJim Ingham 61164e7ead1SJim Ingham Thread *thread = exe_ctx.GetThreadPtr(); 612b9c1b51eSKate Stone if (!thread) { 61364e7ead1SJim Ingham sb_error.SetErrorString("No thread in SBThread::ResumeNewPlan"); 61464e7ead1SJim Ingham return sb_error; 61564e7ead1SJim Ingham } 61664e7ead1SJim Ingham 617b9c1b51eSKate Stone // User level plans should be Master Plans so they can be interrupted, other 61805097246SAdrian Prantl // plans executed, and then a "continue" will resume the plan. 619b9c1b51eSKate Stone if (new_plan != NULL) { 62064e7ead1SJim Ingham new_plan->SetIsMasterPlan(true); 62164e7ead1SJim Ingham new_plan->SetOkayToDiscard(false); 62264e7ead1SJim Ingham } 62364e7ead1SJim Ingham 62464e7ead1SJim Ingham // Why do we need to set the current thread by ID here??? 62564e7ead1SJim Ingham process->GetThreadList().SetSelectedThreadByID(thread->GetID()); 62664e7ead1SJim Ingham 627dc6224e0SGreg Clayton if (process->GetTarget().GetDebugger().GetAsyncExecution()) 628dc6224e0SGreg Clayton sb_error.ref() = process->Resume(); 629dc6224e0SGreg Clayton else 630dc6224e0SGreg Clayton sb_error.ref() = process->ResumeSynchronous(NULL); 63164e7ead1SJim Ingham 63264e7ead1SJim Ingham return sb_error; 63364e7ead1SJim Ingham } 63430fdc8d8SChris Lattner 635b9c1b51eSKate Stone void SBThread::StepOver(lldb::RunMode stop_other_threads) { 636859f54b3SAlexander Polyakov SBError error; // Ignored 637859f54b3SAlexander Polyakov StepOver(stop_other_threads, error); 638859f54b3SAlexander Polyakov } 639859f54b3SAlexander Polyakov 640859f54b3SAlexander Polyakov void SBThread::StepOver(lldb::RunMode stop_other_threads, SBError &error) { 6415160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 642ceb6b139SCaroline Tice 643bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 644bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 64517a6ad05SGreg Clayton 646ceb6b139SCaroline Tice if (log) 647324a1036SSaleem Abdulrasool log->Printf("SBThread(%p)::StepOver (stop_other_threads='%s')", 648324a1036SSaleem Abdulrasool static_cast<void *>(exe_ctx.GetThreadPtr()), 649ceb6b139SCaroline Tice Thread::RunModeAsCString(stop_other_threads)); 650ceb6b139SCaroline Tice 651859f54b3SAlexander Polyakov if (!exe_ctx.HasThreadScope()) { 652859f54b3SAlexander Polyakov error.SetErrorString("this SBThread object is invalid"); 653859f54b3SAlexander Polyakov return; 654859f54b3SAlexander Polyakov } 655859f54b3SAlexander Polyakov 6561ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 6577ba6e991SJim Ingham bool abort_other_plans = false; 658b57e4a1bSJason Molenda StackFrameSP frame_sp(thread->GetStackFrameAtIndex(0)); 65930fdc8d8SChris Lattner 660e103ae92SJonas Devlieghere Status new_plan_status; 6614d56e9c1SJim Ingham ThreadPlanSP new_plan_sp; 662b9c1b51eSKate Stone if (frame_sp) { 663b9c1b51eSKate Stone if (frame_sp->HasDebugInformation()) { 6644b4b2478SJim Ingham const LazyBool avoid_no_debug = eLazyBoolCalculate; 66530fdc8d8SChris Lattner SymbolContext sc(frame_sp->GetSymbolContext(eSymbolContextEverything)); 666b9c1b51eSKate Stone new_plan_sp = thread->QueueThreadPlanForStepOverRange( 667b9c1b51eSKate Stone abort_other_plans, sc.line_entry, sc, stop_other_threads, 668e103ae92SJonas Devlieghere new_plan_status, avoid_no_debug); 669b9c1b51eSKate Stone } else { 670b9c1b51eSKate Stone new_plan_sp = thread->QueueThreadPlanForStepSingleInstruction( 671e103ae92SJonas Devlieghere true, abort_other_plans, stop_other_threads, new_plan_status); 67230fdc8d8SChris Lattner } 67330fdc8d8SChris Lattner } 674859f54b3SAlexander Polyakov error = ResumeNewPlan(exe_ctx, new_plan_sp.get()); 67530fdc8d8SChris Lattner } 67630fdc8d8SChris Lattner 677b9c1b51eSKate Stone void SBThread::StepInto(lldb::RunMode stop_other_threads) { 678c627682eSJim Ingham StepInto(NULL, stop_other_threads); 679c627682eSJim Ingham } 680c627682eSJim Ingham 681b9c1b51eSKate Stone void SBThread::StepInto(const char *target_name, 682b9c1b51eSKate Stone lldb::RunMode stop_other_threads) { 683859f54b3SAlexander Polyakov SBError error; // Ignored 684cbf6f9b2SJim Ingham StepInto(target_name, LLDB_INVALID_LINE_NUMBER, error, stop_other_threads); 685cbf6f9b2SJim Ingham } 686cbf6f9b2SJim Ingham 687b9c1b51eSKate Stone void SBThread::StepInto(const char *target_name, uint32_t end_line, 688b9c1b51eSKate Stone SBError &error, lldb::RunMode stop_other_threads) { 6895160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 690ceb6b139SCaroline Tice 691bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 692bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 69317a6ad05SGreg Clayton 69417a6ad05SGreg Clayton if (log) 695b9c1b51eSKate Stone log->Printf( 696b9c1b51eSKate Stone "SBThread(%p)::StepInto (target_name='%s', stop_other_threads='%s')", 697324a1036SSaleem Abdulrasool static_cast<void *>(exe_ctx.GetThreadPtr()), 698c627682eSJim Ingham target_name ? target_name : "<NULL>", 69917a6ad05SGreg Clayton Thread::RunModeAsCString(stop_other_threads)); 700c627682eSJim Ingham 701859f54b3SAlexander Polyakov if (!exe_ctx.HasThreadScope()) { 702859f54b3SAlexander Polyakov error.SetErrorString("this SBThread object is invalid"); 703859f54b3SAlexander Polyakov return; 704859f54b3SAlexander Polyakov } 705859f54b3SAlexander Polyakov 7067ba6e991SJim Ingham bool abort_other_plans = false; 70730fdc8d8SChris Lattner 7081ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 709b57e4a1bSJason Molenda StackFrameSP frame_sp(thread->GetStackFrameAtIndex(0)); 7104d56e9c1SJim Ingham ThreadPlanSP new_plan_sp; 711e103ae92SJonas Devlieghere Status new_plan_status; 71230fdc8d8SChris Lattner 713b9c1b51eSKate Stone if (frame_sp && frame_sp->HasDebugInformation()) { 714cbf6f9b2SJim Ingham SymbolContext sc(frame_sp->GetSymbolContext(eSymbolContextEverything)); 715cbf6f9b2SJim Ingham AddressRange range; 716cbf6f9b2SJim Ingham if (end_line == LLDB_INVALID_LINE_NUMBER) 717cbf6f9b2SJim Ingham range = sc.line_entry.range; 718b9c1b51eSKate Stone else { 719cbf6f9b2SJim Ingham if (!sc.GetAddressRangeFromHereToEndLine(end_line, range, error.ref())) 720cbf6f9b2SJim Ingham return; 721cbf6f9b2SJim Ingham } 722cbf6f9b2SJim Ingham 723b9c1b51eSKate Stone const LazyBool step_out_avoids_code_without_debug_info = 724b9c1b51eSKate Stone eLazyBoolCalculate; 725b9c1b51eSKate Stone const LazyBool step_in_avoids_code_without_debug_info = 726b9c1b51eSKate Stone eLazyBoolCalculate; 727b9c1b51eSKate Stone new_plan_sp = thread->QueueThreadPlanForStepInRange( 728b9c1b51eSKate Stone abort_other_plans, range, sc, target_name, stop_other_threads, 729e103ae92SJonas Devlieghere new_plan_status, step_in_avoids_code_without_debug_info, 7304b4b2478SJim Ingham step_out_avoids_code_without_debug_info); 731b9c1b51eSKate Stone } else { 732b9c1b51eSKate Stone new_plan_sp = thread->QueueThreadPlanForStepSingleInstruction( 733e103ae92SJonas Devlieghere false, abort_other_plans, stop_other_threads, new_plan_status); 73430fdc8d8SChris Lattner } 735e103ae92SJonas Devlieghere 736e103ae92SJonas Devlieghere if (new_plan_status.Success()) 737cbf6f9b2SJim Ingham error = ResumeNewPlan(exe_ctx, new_plan_sp.get()); 738e103ae92SJonas Devlieghere else 739e103ae92SJonas Devlieghere error.SetErrorString(new_plan_status.AsCString()); 74030fdc8d8SChris Lattner } 74130fdc8d8SChris Lattner 742b9c1b51eSKate Stone void SBThread::StepOut() { 743859f54b3SAlexander Polyakov SBError error; // Ignored 744859f54b3SAlexander Polyakov StepOut(error); 745859f54b3SAlexander Polyakov } 746859f54b3SAlexander Polyakov 747859f54b3SAlexander Polyakov void SBThread::StepOut(SBError &error) { 7485160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 749ceb6b139SCaroline Tice 750bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 751bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 7524fc6cb9cSJim Ingham 75317a6ad05SGreg Clayton if (log) 754324a1036SSaleem Abdulrasool log->Printf("SBThread(%p)::StepOut ()", 755324a1036SSaleem Abdulrasool static_cast<void *>(exe_ctx.GetThreadPtr())); 75617a6ad05SGreg Clayton 757859f54b3SAlexander Polyakov if (!exe_ctx.HasThreadScope()) { 758859f54b3SAlexander Polyakov error.SetErrorString("this SBThread object is invalid"); 759859f54b3SAlexander Polyakov return; 760859f54b3SAlexander Polyakov } 761859f54b3SAlexander Polyakov 7627ba6e991SJim Ingham bool abort_other_plans = false; 76394b09246SJim Ingham bool stop_other_threads = false; 76430fdc8d8SChris Lattner 7651ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 7661ac04c30SGreg Clayton 7674b4b2478SJim Ingham const LazyBool avoid_no_debug = eLazyBoolCalculate; 768e103ae92SJonas Devlieghere Status new_plan_status; 769b9c1b51eSKate Stone ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepOut( 770b9c1b51eSKate Stone abort_other_plans, NULL, false, stop_other_threads, eVoteYes, 771e103ae92SJonas Devlieghere eVoteNoOpinion, 0, new_plan_status, avoid_no_debug)); 772481cef25SGreg Clayton 773e103ae92SJonas Devlieghere if (new_plan_status.Success()) 774859f54b3SAlexander Polyakov error = ResumeNewPlan(exe_ctx, new_plan_sp.get()); 775e103ae92SJonas Devlieghere else 776e103ae92SJonas Devlieghere error.SetErrorString(new_plan_status.AsCString()); 777481cef25SGreg Clayton } 778481cef25SGreg Clayton 779859f54b3SAlexander Polyakov void SBThread::StepOutOfFrame(SBFrame &sb_frame) { 780859f54b3SAlexander Polyakov SBError error; // Ignored 781859f54b3SAlexander Polyakov StepOutOfFrame(sb_frame, error); 782859f54b3SAlexander Polyakov } 783859f54b3SAlexander Polyakov 784859f54b3SAlexander Polyakov void SBThread::StepOutOfFrame(SBFrame &sb_frame, SBError &error) { 7855160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 786481cef25SGreg Clayton 787bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 788bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 7894fc6cb9cSJim Ingham 790b9c1b51eSKate Stone if (!sb_frame.IsValid()) { 791989a7558SJim Ingham if (log) 792b9c1b51eSKate Stone log->Printf( 793b9c1b51eSKate Stone "SBThread(%p)::StepOutOfFrame passed an invalid frame, returning.", 794989a7558SJim Ingham static_cast<void *>(exe_ctx.GetThreadPtr())); 795859f54b3SAlexander Polyakov error.SetErrorString("passed invalid SBFrame object"); 796989a7558SJim Ingham return; 797989a7558SJim Ingham } 798989a7558SJim Ingham 799b57e4a1bSJason Molenda StackFrameSP frame_sp(sb_frame.GetFrameSP()); 800b9c1b51eSKate Stone if (log) { 801481cef25SGreg Clayton SBStream frame_desc_strm; 802481cef25SGreg Clayton sb_frame.GetDescription(frame_desc_strm); 803324a1036SSaleem Abdulrasool log->Printf("SBThread(%p)::StepOutOfFrame (frame = SBFrame(%p): %s)", 804324a1036SSaleem Abdulrasool static_cast<void *>(exe_ctx.GetThreadPtr()), 805b9c1b51eSKate Stone static_cast<void *>(frame_sp.get()), frame_desc_strm.GetData()); 806481cef25SGreg Clayton } 807481cef25SGreg Clayton 808859f54b3SAlexander Polyakov if (!exe_ctx.HasThreadScope()) { 809859f54b3SAlexander Polyakov error.SetErrorString("this SBThread object is invalid"); 810859f54b3SAlexander Polyakov return; 811859f54b3SAlexander Polyakov } 812859f54b3SAlexander Polyakov 8137ba6e991SJim Ingham bool abort_other_plans = false; 81494b09246SJim Ingham bool stop_other_threads = false; 8151ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 816b9c1b51eSKate Stone if (sb_frame.GetThread().GetThreadID() != thread->GetID()) { 817b9c1b51eSKate Stone log->Printf("SBThread(%p)::StepOutOfFrame passed a frame from another " 818b9c1b51eSKate Stone "thread (0x%" PRIx64 " vrs. 0x%" PRIx64 ", returning.", 819989a7558SJim Ingham static_cast<void *>(exe_ctx.GetThreadPtr()), 820b9c1b51eSKate Stone sb_frame.GetThread().GetThreadID(), thread->GetID()); 821859f54b3SAlexander Polyakov error.SetErrorString("passed a frame from another thread"); 822859f54b3SAlexander Polyakov return; 823989a7558SJim Ingham } 824481cef25SGreg Clayton 825e103ae92SJonas Devlieghere Status new_plan_status; 826b9c1b51eSKate Stone ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepOut( 827b9c1b51eSKate Stone abort_other_plans, NULL, false, stop_other_threads, eVoteYes, 828e103ae92SJonas Devlieghere eVoteNoOpinion, frame_sp->GetFrameIndex(), new_plan_status)); 82930fdc8d8SChris Lattner 830e103ae92SJonas Devlieghere if (new_plan_status.Success()) 831859f54b3SAlexander Polyakov error = ResumeNewPlan(exe_ctx, new_plan_sp.get()); 832e103ae92SJonas Devlieghere else 833e103ae92SJonas Devlieghere error.SetErrorString(new_plan_status.AsCString()); 83430fdc8d8SChris Lattner } 83530fdc8d8SChris Lattner 836b9c1b51eSKate Stone void SBThread::StepInstruction(bool step_over) { 837859f54b3SAlexander Polyakov SBError error; // Ignored 838859f54b3SAlexander Polyakov StepInstruction(step_over, error); 839859f54b3SAlexander Polyakov } 840859f54b3SAlexander Polyakov 841859f54b3SAlexander Polyakov void SBThread::StepInstruction(bool step_over, SBError &error) { 8425160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 843ceb6b139SCaroline Tice 844bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 845bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 846ceb6b139SCaroline Tice 84717a6ad05SGreg Clayton if (log) 848324a1036SSaleem Abdulrasool log->Printf("SBThread(%p)::StepInstruction (step_over=%i)", 849324a1036SSaleem Abdulrasool static_cast<void *>(exe_ctx.GetThreadPtr()), step_over); 85017a6ad05SGreg Clayton 851859f54b3SAlexander Polyakov if (!exe_ctx.HasThreadScope()) { 852859f54b3SAlexander Polyakov error.SetErrorString("this SBThread object is invalid"); 853859f54b3SAlexander Polyakov return; 854859f54b3SAlexander Polyakov } 855859f54b3SAlexander Polyakov 8561ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 857e103ae92SJonas Devlieghere Status new_plan_status; 858e103ae92SJonas Devlieghere ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepSingleInstruction( 859e103ae92SJonas Devlieghere step_over, true, true, new_plan_status)); 86064e7ead1SJim Ingham 861e103ae92SJonas Devlieghere if (new_plan_status.Success()) 862859f54b3SAlexander Polyakov error = ResumeNewPlan(exe_ctx, new_plan_sp.get()); 863e103ae92SJonas Devlieghere else 864e103ae92SJonas Devlieghere error.SetErrorString(new_plan_status.AsCString()); 86530fdc8d8SChris Lattner } 86630fdc8d8SChris Lattner 867b9c1b51eSKate Stone void SBThread::RunToAddress(lldb::addr_t addr) { 868859f54b3SAlexander Polyakov SBError error; // Ignored 869859f54b3SAlexander Polyakov RunToAddress(addr, error); 870859f54b3SAlexander Polyakov } 871859f54b3SAlexander Polyakov 872859f54b3SAlexander Polyakov void SBThread::RunToAddress(lldb::addr_t addr, SBError &error) { 8735160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 874ceb6b139SCaroline Tice 875bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 876bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 877ceb6b139SCaroline Tice 87817a6ad05SGreg Clayton if (log) 879324a1036SSaleem Abdulrasool log->Printf("SBThread(%p)::RunToAddress (addr=0x%" PRIx64 ")", 880324a1036SSaleem Abdulrasool static_cast<void *>(exe_ctx.GetThreadPtr()), addr); 88117a6ad05SGreg Clayton 882859f54b3SAlexander Polyakov if (!exe_ctx.HasThreadScope()) { 883859f54b3SAlexander Polyakov error.SetErrorString("this SBThread object is invalid"); 884859f54b3SAlexander Polyakov return; 885859f54b3SAlexander Polyakov } 886859f54b3SAlexander Polyakov 8877ba6e991SJim Ingham bool abort_other_plans = false; 88830fdc8d8SChris Lattner bool stop_other_threads = true; 88930fdc8d8SChris Lattner 890e72dfb32SGreg Clayton Address target_addr(addr); 89130fdc8d8SChris Lattner 8921ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 8931ac04c30SGreg Clayton 894e103ae92SJonas Devlieghere Status new_plan_status; 895b9c1b51eSKate Stone ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForRunToAddress( 896e103ae92SJonas Devlieghere abort_other_plans, target_addr, stop_other_threads, new_plan_status)); 89764e7ead1SJim Ingham 898e103ae92SJonas Devlieghere if (new_plan_status.Success()) 899859f54b3SAlexander Polyakov error = ResumeNewPlan(exe_ctx, new_plan_sp.get()); 900e103ae92SJonas Devlieghere else 901e103ae92SJonas Devlieghere error.SetErrorString(new_plan_status.AsCString()); 90230fdc8d8SChris Lattner } 90330fdc8d8SChris Lattner 904b9c1b51eSKate Stone SBError SBThread::StepOverUntil(lldb::SBFrame &sb_frame, 905b9c1b51eSKate Stone lldb::SBFileSpec &sb_file_spec, uint32_t line) { 906481cef25SGreg Clayton SBError sb_error; 9075160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 908481cef25SGreg Clayton char path[PATH_MAX]; 909481cef25SGreg Clayton 910bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 911bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 9124fc6cb9cSJim Ingham 913b57e4a1bSJason Molenda StackFrameSP frame_sp(sb_frame.GetFrameSP()); 91417a6ad05SGreg Clayton 915b9c1b51eSKate Stone if (log) { 916481cef25SGreg Clayton SBStream frame_desc_strm; 917481cef25SGreg Clayton sb_frame.GetDescription(frame_desc_strm); 918481cef25SGreg Clayton sb_file_spec->GetPath(path, sizeof(path)); 919b9c1b51eSKate Stone log->Printf("SBThread(%p)::StepOverUntil (frame = SBFrame(%p): %s, " 920b9c1b51eSKate Stone "file+line = %s:%u)", 921324a1036SSaleem Abdulrasool static_cast<void *>(exe_ctx.GetThreadPtr()), 922b9c1b51eSKate Stone static_cast<void *>(frame_sp.get()), frame_desc_strm.GetData(), 923b9c1b51eSKate Stone path, line); 924481cef25SGreg Clayton } 925481cef25SGreg Clayton 926b9c1b51eSKate Stone if (exe_ctx.HasThreadScope()) { 9271ac04c30SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 9281ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 929481cef25SGreg Clayton 930b9c1b51eSKate Stone if (line == 0) { 931481cef25SGreg Clayton sb_error.SetErrorString("invalid line argument"); 932481cef25SGreg Clayton return sb_error; 933481cef25SGreg Clayton } 934481cef25SGreg Clayton 935b9c1b51eSKate Stone if (!frame_sp) { 9361ac04c30SGreg Clayton frame_sp = thread->GetSelectedFrame(); 937481cef25SGreg Clayton if (!frame_sp) 9381ac04c30SGreg Clayton frame_sp = thread->GetStackFrameAtIndex(0); 939481cef25SGreg Clayton } 940481cef25SGreg Clayton 941481cef25SGreg Clayton SymbolContext frame_sc; 942b9c1b51eSKate Stone if (!frame_sp) { 943481cef25SGreg Clayton sb_error.SetErrorString("no valid frames in thread to step"); 944481cef25SGreg Clayton return sb_error; 945481cef25SGreg Clayton } 946481cef25SGreg Clayton 947481cef25SGreg Clayton // If we have a frame, get its line 948b9c1b51eSKate Stone frame_sc = frame_sp->GetSymbolContext( 949b9c1b51eSKate Stone eSymbolContextCompUnit | eSymbolContextFunction | 950b9c1b51eSKate Stone eSymbolContextLineEntry | eSymbolContextSymbol); 951481cef25SGreg Clayton 952b9c1b51eSKate Stone if (frame_sc.comp_unit == NULL) { 953b9c1b51eSKate Stone sb_error.SetErrorStringWithFormat( 954b9c1b51eSKate Stone "frame %u doesn't have debug information", frame_sp->GetFrameIndex()); 955481cef25SGreg Clayton return sb_error; 956481cef25SGreg Clayton } 957481cef25SGreg Clayton 958481cef25SGreg Clayton FileSpec step_file_spec; 959b9c1b51eSKate Stone if (sb_file_spec.IsValid()) { 960481cef25SGreg Clayton // The file spec passed in was valid, so use it 961481cef25SGreg Clayton step_file_spec = sb_file_spec.ref(); 962b9c1b51eSKate Stone } else { 963481cef25SGreg Clayton if (frame_sc.line_entry.IsValid()) 964481cef25SGreg Clayton step_file_spec = frame_sc.line_entry.file; 965b9c1b51eSKate Stone else { 966481cef25SGreg Clayton sb_error.SetErrorString("invalid file argument or no file for frame"); 967481cef25SGreg Clayton return sb_error; 968481cef25SGreg Clayton } 969481cef25SGreg Clayton } 970481cef25SGreg Clayton 9719b70ddb3SJim Ingham // Grab the current function, then we will make sure the "until" address is 9729b70ddb3SJim Ingham // within the function. We discard addresses that are out of the current 973b9c1b51eSKate Stone // function, and then if there are no addresses remaining, give an 97405097246SAdrian Prantl // appropriate error message. 9759b70ddb3SJim Ingham 9769b70ddb3SJim Ingham bool all_in_function = true; 9779b70ddb3SJim Ingham AddressRange fun_range = frame_sc.function->GetAddressRange(); 9789b70ddb3SJim Ingham 979481cef25SGreg Clayton std::vector<addr_t> step_over_until_addrs; 9807ba6e991SJim Ingham const bool abort_other_plans = false; 981c02e3344SJim Ingham const bool stop_other_threads = false; 982481cef25SGreg Clayton const bool check_inlines = true; 983481cef25SGreg Clayton const bool exact = false; 984481cef25SGreg Clayton 985481cef25SGreg Clayton SymbolContextList sc_list; 986b9c1b51eSKate Stone const uint32_t num_matches = frame_sc.comp_unit->ResolveSymbolContext( 987b9c1b51eSKate Stone step_file_spec, line, check_inlines, exact, eSymbolContextLineEntry, 9889b70ddb3SJim Ingham sc_list); 989b9c1b51eSKate Stone if (num_matches > 0) { 990481cef25SGreg Clayton SymbolContext sc; 991b9c1b51eSKate Stone for (uint32_t i = 0; i < num_matches; ++i) { 992b9c1b51eSKate Stone if (sc_list.GetContextAtIndex(i, sc)) { 993b9c1b51eSKate Stone addr_t step_addr = 994b9c1b51eSKate Stone sc.line_entry.range.GetBaseAddress().GetLoadAddress(target); 995b9c1b51eSKate Stone if (step_addr != LLDB_INVALID_ADDRESS) { 9969b70ddb3SJim Ingham if (fun_range.ContainsLoadAddress(step_addr, target)) 997481cef25SGreg Clayton step_over_until_addrs.push_back(step_addr); 9989b70ddb3SJim Ingham else 9999b70ddb3SJim Ingham all_in_function = false; 1000481cef25SGreg Clayton } 1001481cef25SGreg Clayton } 1002481cef25SGreg Clayton } 1003481cef25SGreg Clayton } 1004481cef25SGreg Clayton 1005b9c1b51eSKate Stone if (step_over_until_addrs.empty()) { 1006b9c1b51eSKate Stone if (all_in_function) { 1007481cef25SGreg Clayton step_file_spec.GetPath(path, sizeof(path)); 1008b9c1b51eSKate Stone sb_error.SetErrorStringWithFormat("No line entries for %s:%u", path, 1009b9c1b51eSKate Stone line); 1010b9c1b51eSKate Stone } else 101186edbf41SGreg Clayton sb_error.SetErrorString("step until target not in current function"); 1012b9c1b51eSKate Stone } else { 1013e103ae92SJonas Devlieghere Status new_plan_status; 1014b9c1b51eSKate Stone ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepUntil( 1015b9c1b51eSKate Stone abort_other_plans, &step_over_until_addrs[0], 1016b9c1b51eSKate Stone step_over_until_addrs.size(), stop_other_threads, 1017e103ae92SJonas Devlieghere frame_sp->GetFrameIndex(), new_plan_status)); 1018481cef25SGreg Clayton 1019e103ae92SJonas Devlieghere if (new_plan_status.Success()) 10204d56e9c1SJim Ingham sb_error = ResumeNewPlan(exe_ctx, new_plan_sp.get()); 1021e103ae92SJonas Devlieghere else 1022e103ae92SJonas Devlieghere sb_error.SetErrorString(new_plan_status.AsCString()); 1023481cef25SGreg Clayton } 1024b9c1b51eSKate Stone } else { 1025481cef25SGreg Clayton sb_error.SetErrorString("this SBThread object is invalid"); 1026481cef25SGreg Clayton } 1027481cef25SGreg Clayton return sb_error; 1028481cef25SGreg Clayton } 1029481cef25SGreg Clayton 1030b9c1b51eSKate Stone SBError SBThread::StepUsingScriptedThreadPlan(const char *script_class_name) { 1031000ca185SOleksiy Vyalov return StepUsingScriptedThreadPlan(script_class_name, true); 1032c915a7d2SJim Ingham } 1033c915a7d2SJim Ingham 1034b9c1b51eSKate Stone SBError SBThread::StepUsingScriptedThreadPlan(const char *script_class_name, 1035b9c1b51eSKate Stone bool resume_immediately) { 10362bdbfd50SJim Ingham Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1037e103ae92SJonas Devlieghere SBError error; 10382bdbfd50SJim Ingham 1039bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1040bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 10412bdbfd50SJim Ingham 1042b9c1b51eSKate Stone if (log) { 10432bdbfd50SJim Ingham log->Printf("SBThread(%p)::StepUsingScriptedThreadPlan: class name: %s", 1044b9c1b51eSKate Stone static_cast<void *>(exe_ctx.GetThreadPtr()), script_class_name); 10452bdbfd50SJim Ingham } 10462bdbfd50SJim Ingham 1047b9c1b51eSKate Stone if (!exe_ctx.HasThreadScope()) { 1048e103ae92SJonas Devlieghere error.SetErrorString("this SBThread object is invalid"); 1049e103ae92SJonas Devlieghere return error; 10502bdbfd50SJim Ingham } 10512bdbfd50SJim Ingham 10522bdbfd50SJim Ingham Thread *thread = exe_ctx.GetThreadPtr(); 1053e103ae92SJonas Devlieghere Status new_plan_status; 1054e103ae92SJonas Devlieghere ThreadPlanSP new_plan_sp = thread->QueueThreadPlanForStepScripted( 1055e103ae92SJonas Devlieghere false, script_class_name, false, new_plan_status); 10562bdbfd50SJim Ingham 1057e103ae92SJonas Devlieghere if (new_plan_status.Fail()) { 1058e103ae92SJonas Devlieghere error.SetErrorString(new_plan_status.AsCString()); 1059e103ae92SJonas Devlieghere return error; 1060c915a7d2SJim Ingham } 1061c915a7d2SJim Ingham 1062e103ae92SJonas Devlieghere if (!resume_immediately) 1063e103ae92SJonas Devlieghere return error; 1064c915a7d2SJim Ingham 1065e103ae92SJonas Devlieghere if (new_plan_status.Success()) 1066e103ae92SJonas Devlieghere error = ResumeNewPlan(exe_ctx, new_plan_sp.get()); 1067e103ae92SJonas Devlieghere else 1068e103ae92SJonas Devlieghere error.SetErrorString(new_plan_status.AsCString()); 10692bdbfd50SJim Ingham 1070e103ae92SJonas Devlieghere return error; 10712bdbfd50SJim Ingham } 10722bdbfd50SJim Ingham 1073b9c1b51eSKate Stone SBError SBThread::JumpToLine(lldb::SBFileSpec &file_spec, uint32_t line) { 1074f86248d9SRichard Mitton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1075f86248d9SRichard Mitton SBError sb_error; 1076f86248d9SRichard Mitton 1077bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1078bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1079f86248d9SRichard Mitton 1080f86248d9SRichard Mitton if (log) 1081324a1036SSaleem Abdulrasool log->Printf("SBThread(%p)::JumpToLine (file+line = %s:%u)", 1082324a1036SSaleem Abdulrasool static_cast<void *>(exe_ctx.GetThreadPtr()), 1083324a1036SSaleem Abdulrasool file_spec->GetPath().c_str(), line); 1084f86248d9SRichard Mitton 1085b9c1b51eSKate Stone if (!exe_ctx.HasThreadScope()) { 1086f86248d9SRichard Mitton sb_error.SetErrorString("this SBThread object is invalid"); 1087f86248d9SRichard Mitton return sb_error; 1088f86248d9SRichard Mitton } 1089f86248d9SRichard Mitton 1090f86248d9SRichard Mitton Thread *thread = exe_ctx.GetThreadPtr(); 1091f86248d9SRichard Mitton 109297206d57SZachary Turner Status err = thread->JumpToLine(file_spec.get(), line, true); 1093f86248d9SRichard Mitton sb_error.SetError(err); 1094f86248d9SRichard Mitton return sb_error; 1095f86248d9SRichard Mitton } 1096f86248d9SRichard Mitton 1097b9c1b51eSKate Stone SBError SBThread::ReturnFromFrame(SBFrame &frame, SBValue &return_value) { 10984413758cSJim Ingham SBError sb_error; 10994413758cSJim Ingham 11005160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 11014413758cSJim Ingham 1102bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1103bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 11044413758cSJim Ingham 11054413758cSJim Ingham if (log) 1106324a1036SSaleem Abdulrasool log->Printf("SBThread(%p)::ReturnFromFrame (frame=%d)", 1107324a1036SSaleem Abdulrasool static_cast<void *>(exe_ctx.GetThreadPtr()), 1108324a1036SSaleem Abdulrasool frame.GetFrameID()); 11094413758cSJim Ingham 1110b9c1b51eSKate Stone if (exe_ctx.HasThreadScope()) { 11114413758cSJim Ingham Thread *thread = exe_ctx.GetThreadPtr(); 1112b9c1b51eSKate Stone sb_error.SetError( 1113b9c1b51eSKate Stone thread->ReturnFromFrame(frame.GetFrameSP(), return_value.GetSP())); 11144413758cSJim Ingham } 11154413758cSJim Ingham 11164413758cSJim Ingham return sb_error; 11174413758cSJim Ingham } 11184413758cSJim Ingham 1119b9c1b51eSKate Stone SBError SBThread::UnwindInnermostExpression() { 11204ac8e93aSJim Ingham SBError sb_error; 11214ac8e93aSJim Ingham 11224ac8e93aSJim Ingham Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 11234ac8e93aSJim Ingham 11244ac8e93aSJim Ingham std::unique_lock<std::recursive_mutex> lock; 11254ac8e93aSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 11264ac8e93aSJim Ingham 11274ac8e93aSJim Ingham if (log) 11284ac8e93aSJim Ingham log->Printf("SBThread(%p)::UnwindExpressionEvaluation", 11294ac8e93aSJim Ingham static_cast<void *>(exe_ctx.GetThreadPtr())); 11304ac8e93aSJim Ingham 1131b9c1b51eSKate Stone if (exe_ctx.HasThreadScope()) { 11324ac8e93aSJim Ingham Thread *thread = exe_ctx.GetThreadPtr(); 11334ac8e93aSJim Ingham sb_error.SetError(thread->UnwindInnermostExpression()); 11344ac8e93aSJim Ingham if (sb_error.Success()) 11354ac8e93aSJim Ingham thread->SetSelectedFrameByIndex(0, false); 11364ac8e93aSJim Ingham } 11374ac8e93aSJim Ingham 11384ac8e93aSJim Ingham return sb_error; 11394ac8e93aSJim Ingham } 1140481cef25SGreg Clayton 1141b9c1b51eSKate Stone bool SBThread::Suspend() { 1142859f54b3SAlexander Polyakov SBError error; // Ignored 1143859f54b3SAlexander Polyakov return Suspend(error); 1144859f54b3SAlexander Polyakov } 1145859f54b3SAlexander Polyakov 1146859f54b3SAlexander Polyakov bool SBThread::Suspend(SBError &error) { 11475160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1148b2e7d28eSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1149b2e7d28eSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1150b2e7d28eSJim Ingham 1151c9858e4dSGreg Clayton bool result = false; 1152b9c1b51eSKate Stone if (exe_ctx.HasThreadScope()) { 1153c9858e4dSGreg Clayton Process::StopLocker stop_locker; 1154b9c1b51eSKate Stone if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { 11551ac04c30SGreg Clayton exe_ctx.GetThreadPtr()->SetResumeState(eStateSuspended); 1156c9858e4dSGreg Clayton result = true; 1157b9c1b51eSKate Stone } else { 1158859f54b3SAlexander Polyakov error.SetErrorString("process is running"); 1159c9858e4dSGreg Clayton if (log) 1160324a1036SSaleem Abdulrasool log->Printf("SBThread(%p)::Suspend() => error: process is running", 1161324a1036SSaleem Abdulrasool static_cast<void *>(exe_ctx.GetThreadPtr())); 1162c9858e4dSGreg Clayton } 1163859f54b3SAlexander Polyakov } else 1164859f54b3SAlexander Polyakov error.SetErrorString("this SBThread object is invalid"); 1165c9858e4dSGreg Clayton if (log) 1166324a1036SSaleem Abdulrasool log->Printf("SBThread(%p)::Suspend() => %i", 1167324a1036SSaleem Abdulrasool static_cast<void *>(exe_ctx.GetThreadPtr()), result); 1168c9858e4dSGreg Clayton return result; 1169722a0cdcSGreg Clayton } 1170722a0cdcSGreg Clayton 1171b9c1b51eSKate Stone bool SBThread::Resume() { 1172859f54b3SAlexander Polyakov SBError error; // Ignored 1173859f54b3SAlexander Polyakov return Resume(error); 1174859f54b3SAlexander Polyakov } 1175859f54b3SAlexander Polyakov 1176859f54b3SAlexander Polyakov bool SBThread::Resume(SBError &error) { 11775160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1178b2e7d28eSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1179b2e7d28eSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1180b2e7d28eSJim Ingham 1181c9858e4dSGreg Clayton bool result = false; 1182b9c1b51eSKate Stone if (exe_ctx.HasThreadScope()) { 1183c9858e4dSGreg Clayton Process::StopLocker stop_locker; 1184b9c1b51eSKate Stone if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { 11856c9ed91cSJim Ingham const bool override_suspend = true; 11866c9ed91cSJim Ingham exe_ctx.GetThreadPtr()->SetResumeState(eStateRunning, override_suspend); 1187c9858e4dSGreg Clayton result = true; 1188b9c1b51eSKate Stone } else { 1189859f54b3SAlexander Polyakov error.SetErrorString("process is running"); 1190c9858e4dSGreg Clayton if (log) 1191324a1036SSaleem Abdulrasool log->Printf("SBThread(%p)::Resume() => error: process is running", 1192324a1036SSaleem Abdulrasool static_cast<void *>(exe_ctx.GetThreadPtr())); 1193c9858e4dSGreg Clayton } 1194859f54b3SAlexander Polyakov } else 1195859f54b3SAlexander Polyakov error.SetErrorString("this SBThread object is invalid"); 1196c9858e4dSGreg Clayton if (log) 1197324a1036SSaleem Abdulrasool log->Printf("SBThread(%p)::Resume() => %i", 1198324a1036SSaleem Abdulrasool static_cast<void *>(exe_ctx.GetThreadPtr()), result); 1199c9858e4dSGreg Clayton return result; 1200722a0cdcSGreg Clayton } 1201722a0cdcSGreg Clayton 1202b9c1b51eSKate Stone bool SBThread::IsSuspended() { 1203b2e7d28eSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1204b2e7d28eSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1205b2e7d28eSJim Ingham 12061ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 12071ac04c30SGreg Clayton return exe_ctx.GetThreadPtr()->GetResumeState() == eStateSuspended; 1208722a0cdcSGreg Clayton return false; 1209722a0cdcSGreg Clayton } 1210722a0cdcSGreg Clayton 1211b9c1b51eSKate Stone bool SBThread::IsStopped() { 1212b2e7d28eSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1213b2e7d28eSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1214b2e7d28eSJim Ingham 1215a75418dbSAndrew Kaylor if (exe_ctx.HasThreadScope()) 1216a75418dbSAndrew Kaylor return StateIsStoppedState(exe_ctx.GetThreadPtr()->GetState(), true); 1217a75418dbSAndrew Kaylor return false; 1218a75418dbSAndrew Kaylor } 1219a75418dbSAndrew Kaylor 1220b9c1b51eSKate Stone SBProcess SBThread::GetProcess() { 1221b9556accSGreg Clayton SBProcess sb_process; 1222b2e7d28eSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1223b2e7d28eSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1224b2e7d28eSJim Ingham 1225b9c1b51eSKate Stone if (exe_ctx.HasThreadScope()) { 1226b9c1b51eSKate Stone // Have to go up to the target so we can get a shared pointer to our 1227b9c1b51eSKate Stone // process... 12281ac04c30SGreg Clayton sb_process.SetSP(exe_ctx.GetProcessSP()); 122930fdc8d8SChris Lattner } 1230ceb6b139SCaroline Tice 12315160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1232b9c1b51eSKate Stone if (log) { 1233481cef25SGreg Clayton SBStream frame_desc_strm; 1234b9556accSGreg Clayton sb_process.GetDescription(frame_desc_strm); 1235324a1036SSaleem Abdulrasool log->Printf("SBThread(%p)::GetProcess () => SBProcess(%p): %s", 1236324a1036SSaleem Abdulrasool static_cast<void *>(exe_ctx.GetThreadPtr()), 1237324a1036SSaleem Abdulrasool static_cast<void *>(sb_process.GetSP().get()), 1238324a1036SSaleem Abdulrasool frame_desc_strm.GetData()); 1239ceb6b139SCaroline Tice } 1240ceb6b139SCaroline Tice 1241b9556accSGreg Clayton return sb_process; 124230fdc8d8SChris Lattner } 124330fdc8d8SChris Lattner 1244b9c1b51eSKate Stone uint32_t SBThread::GetNumFrames() { 12455160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1246ceb6b139SCaroline Tice 1247ceb6b139SCaroline Tice uint32_t num_frames = 0; 1248bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1249bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 12504fc6cb9cSJim Ingham 1251b9c1b51eSKate Stone if (exe_ctx.HasThreadScope()) { 12527fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1253b9c1b51eSKate Stone if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { 12541ac04c30SGreg Clayton num_frames = exe_ctx.GetThreadPtr()->GetStackFrameCount(); 1255b9c1b51eSKate Stone } else { 1256c9858e4dSGreg Clayton if (log) 1257324a1036SSaleem Abdulrasool log->Printf("SBThread(%p)::GetNumFrames() => error: process is running", 1258324a1036SSaleem Abdulrasool static_cast<void *>(exe_ctx.GetThreadPtr())); 1259c9858e4dSGreg Clayton } 12607fdf9ef1SGreg Clayton } 1261ceb6b139SCaroline Tice 1262ceb6b139SCaroline Tice if (log) 1263324a1036SSaleem Abdulrasool log->Printf("SBThread(%p)::GetNumFrames () => %u", 1264324a1036SSaleem Abdulrasool static_cast<void *>(exe_ctx.GetThreadPtr()), num_frames); 1265ceb6b139SCaroline Tice 1266ceb6b139SCaroline Tice return num_frames; 126730fdc8d8SChris Lattner } 126830fdc8d8SChris Lattner 1269b9c1b51eSKate Stone SBFrame SBThread::GetFrameAtIndex(uint32_t idx) { 12705160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1271ceb6b139SCaroline Tice 127230fdc8d8SChris Lattner SBFrame sb_frame; 1273b57e4a1bSJason Molenda StackFrameSP frame_sp; 1274bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1275bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 12764fc6cb9cSJim Ingham 1277b9c1b51eSKate Stone if (exe_ctx.HasThreadScope()) { 12787fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1279b9c1b51eSKate Stone if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { 12801ac04c30SGreg Clayton frame_sp = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex(idx); 1281b9556accSGreg Clayton sb_frame.SetFrameSP(frame_sp); 1282b9c1b51eSKate Stone } else { 1283c9858e4dSGreg Clayton if (log) 1284b9c1b51eSKate Stone log->Printf( 1285b9c1b51eSKate Stone "SBThread(%p)::GetFrameAtIndex() => error: process is running", 1286324a1036SSaleem Abdulrasool static_cast<void *>(exe_ctx.GetThreadPtr())); 1287c9858e4dSGreg Clayton } 12887fdf9ef1SGreg Clayton } 1289ceb6b139SCaroline Tice 1290b9c1b51eSKate Stone if (log) { 1291481cef25SGreg Clayton SBStream frame_desc_strm; 1292481cef25SGreg Clayton sb_frame.GetDescription(frame_desc_strm); 12934838131bSGreg Clayton log->Printf("SBThread(%p)::GetFrameAtIndex (idx=%d) => SBFrame(%p): %s", 1294324a1036SSaleem Abdulrasool static_cast<void *>(exe_ctx.GetThreadPtr()), idx, 1295b9c1b51eSKate Stone static_cast<void *>(frame_sp.get()), frame_desc_strm.GetData()); 1296ceb6b139SCaroline Tice } 1297ceb6b139SCaroline Tice 129830fdc8d8SChris Lattner return sb_frame; 129930fdc8d8SChris Lattner } 130030fdc8d8SChris Lattner 1301b9c1b51eSKate Stone lldb::SBFrame SBThread::GetSelectedFrame() { 13025160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1303f028a1fbSGreg Clayton 1304f028a1fbSGreg Clayton SBFrame sb_frame; 1305b57e4a1bSJason Molenda StackFrameSP frame_sp; 1306bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1307bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 13084fc6cb9cSJim Ingham 1309b9c1b51eSKate Stone if (exe_ctx.HasThreadScope()) { 13107fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1311b9c1b51eSKate Stone if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { 13121ac04c30SGreg Clayton frame_sp = exe_ctx.GetThreadPtr()->GetSelectedFrame(); 1313b9556accSGreg Clayton sb_frame.SetFrameSP(frame_sp); 1314b9c1b51eSKate Stone } else { 1315c9858e4dSGreg Clayton if (log) 1316b9c1b51eSKate Stone log->Printf( 1317b9c1b51eSKate Stone "SBThread(%p)::GetSelectedFrame() => error: process is running", 1318324a1036SSaleem Abdulrasool static_cast<void *>(exe_ctx.GetThreadPtr())); 1319c9858e4dSGreg Clayton } 13207fdf9ef1SGreg Clayton } 1321f028a1fbSGreg Clayton 1322b9c1b51eSKate Stone if (log) { 1323481cef25SGreg Clayton SBStream frame_desc_strm; 1324481cef25SGreg Clayton sb_frame.GetDescription(frame_desc_strm); 1325f028a1fbSGreg Clayton log->Printf("SBThread(%p)::GetSelectedFrame () => SBFrame(%p): %s", 1326324a1036SSaleem Abdulrasool static_cast<void *>(exe_ctx.GetThreadPtr()), 1327b9c1b51eSKate Stone static_cast<void *>(frame_sp.get()), frame_desc_strm.GetData()); 1328f028a1fbSGreg Clayton } 1329f028a1fbSGreg Clayton 1330f028a1fbSGreg Clayton return sb_frame; 1331f028a1fbSGreg Clayton } 1332f028a1fbSGreg Clayton 1333b9c1b51eSKate Stone lldb::SBFrame SBThread::SetSelectedFrame(uint32_t idx) { 13345160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1335f028a1fbSGreg Clayton 1336f028a1fbSGreg Clayton SBFrame sb_frame; 1337b57e4a1bSJason Molenda StackFrameSP frame_sp; 1338bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1339bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 13404fc6cb9cSJim Ingham 1341b9c1b51eSKate Stone if (exe_ctx.HasThreadScope()) { 13427fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1343b9c1b51eSKate Stone if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { 13441ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 13451ac04c30SGreg Clayton frame_sp = thread->GetStackFrameAtIndex(idx); 1346b9c1b51eSKate Stone if (frame_sp) { 13471ac04c30SGreg Clayton thread->SetSelectedFrame(frame_sp.get()); 1348b9556accSGreg Clayton sb_frame.SetFrameSP(frame_sp); 1349f028a1fbSGreg Clayton } 1350b9c1b51eSKate Stone } else { 1351c9858e4dSGreg Clayton if (log) 1352b9c1b51eSKate Stone log->Printf( 1353b9c1b51eSKate Stone "SBThread(%p)::SetSelectedFrame() => error: process is running", 1354324a1036SSaleem Abdulrasool static_cast<void *>(exe_ctx.GetThreadPtr())); 1355c9858e4dSGreg Clayton } 13567fdf9ef1SGreg Clayton } 1357f028a1fbSGreg Clayton 1358b9c1b51eSKate Stone if (log) { 1359481cef25SGreg Clayton SBStream frame_desc_strm; 1360481cef25SGreg Clayton sb_frame.GetDescription(frame_desc_strm); 1361f028a1fbSGreg Clayton log->Printf("SBThread(%p)::SetSelectedFrame (idx=%u) => SBFrame(%p): %s", 1362324a1036SSaleem Abdulrasool static_cast<void *>(exe_ctx.GetThreadPtr()), idx, 1363b9c1b51eSKate Stone static_cast<void *>(frame_sp.get()), frame_desc_strm.GetData()); 1364f028a1fbSGreg Clayton } 1365f028a1fbSGreg Clayton return sb_frame; 1366f028a1fbSGreg Clayton } 1367f028a1fbSGreg Clayton 1368b9c1b51eSKate Stone bool SBThread::EventIsThreadEvent(const SBEvent &event) { 13694f465cffSJim Ingham return Thread::ThreadEventData::GetEventDataFromEvent(event.get()) != NULL; 13704f465cffSJim Ingham } 13714f465cffSJim Ingham 1372b9c1b51eSKate Stone SBFrame SBThread::GetStackFrameFromEvent(const SBEvent &event) { 13734f465cffSJim Ingham return Thread::ThreadEventData::GetStackFrameFromEvent(event.get()); 13744f465cffSJim Ingham } 13754f465cffSJim Ingham 1376b9c1b51eSKate Stone SBThread SBThread::GetThreadFromEvent(const SBEvent &event) { 13774f465cffSJim Ingham return Thread::ThreadEventData::GetThreadFromEvent(event.get()); 13784f465cffSJim Ingham } 1379f028a1fbSGreg Clayton 1380b9c1b51eSKate Stone bool SBThread::operator==(const SBThread &rhs) const { 1381b9c1b51eSKate Stone return m_opaque_sp->GetThreadSP().get() == 1382b9c1b51eSKate Stone rhs.m_opaque_sp->GetThreadSP().get(); 138330fdc8d8SChris Lattner } 138430fdc8d8SChris Lattner 1385b9c1b51eSKate Stone bool SBThread::operator!=(const SBThread &rhs) const { 1386b9c1b51eSKate Stone return m_opaque_sp->GetThreadSP().get() != 1387b9c1b51eSKate Stone rhs.m_opaque_sp->GetThreadSP().get(); 138830fdc8d8SChris Lattner } 1389dde9cff3SCaroline Tice 1390b9c1b51eSKate Stone bool SBThread::GetStatus(SBStream &status) const { 13914f465cffSJim Ingham Stream &strm = status.ref(); 13924f465cffSJim Ingham 1393b2e7d28eSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1394b2e7d28eSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1395b2e7d28eSJim Ingham 1396b9c1b51eSKate Stone if (exe_ctx.HasThreadScope()) { 13976a9767c7SJim Ingham exe_ctx.GetThreadPtr()->GetStatus(strm, 0, 1, 1, true); 1398b9c1b51eSKate Stone } else 13994f465cffSJim Ingham strm.PutCString("No status"); 14004f465cffSJim Ingham 14014f465cffSJim Ingham return true; 14024f465cffSJim Ingham } 14034f465cffSJim Ingham 1404b9c1b51eSKate Stone bool SBThread::GetDescription(SBStream &description) const { 14056a9767c7SJim Ingham return GetDescription(description, false); 14066a9767c7SJim Ingham } 14076a9767c7SJim Ingham 14086a9767c7SJim Ingham bool SBThread::GetDescription(SBStream &description, bool stop_format) const { 1409da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1410da7bc7d0SGreg Clayton 1411b2e7d28eSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1412b2e7d28eSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1413b2e7d28eSJim Ingham 1414b9c1b51eSKate Stone if (exe_ctx.HasThreadScope()) { 1415b9c1b51eSKate Stone exe_ctx.GetThreadPtr()->DumpUsingSettingsFormat(strm, 14166a9767c7SJim Ingham LLDB_INVALID_THREAD_ID, 14176a9767c7SJim Ingham stop_format); 1418b9c1b51eSKate Stone // strm.Printf("SBThread: tid = 0x%4.4" PRIx64, 1419b9c1b51eSKate Stone // exe_ctx.GetThreadPtr()->GetID()); 1420b9c1b51eSKate Stone } else 1421da7bc7d0SGreg Clayton strm.PutCString("No value"); 1422ceb6b139SCaroline Tice 1423ceb6b139SCaroline Tice return true; 1424ceb6b139SCaroline Tice } 14255dd4916fSJason Molenda 1426b9c1b51eSKate Stone SBThread SBThread::GetExtendedBacktraceThread(const char *type) { 14275dd4916fSJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1428bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1429bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 14305dd4916fSJason Molenda SBThread sb_origin_thread; 14315dd4916fSJason Molenda 1432b9c1b51eSKate Stone if (exe_ctx.HasThreadScope()) { 14335dd4916fSJason Molenda Process::StopLocker stop_locker; 1434b9c1b51eSKate Stone if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { 14357a2f7904SJason Molenda ThreadSP real_thread(exe_ctx.GetThreadSP()); 1436b9c1b51eSKate Stone if (real_thread) { 14375dd4916fSJason Molenda ConstString type_const(type); 14387a2f7904SJason Molenda Process *process = exe_ctx.GetProcessPtr(); 1439b9c1b51eSKate Stone if (process) { 14407a2f7904SJason Molenda SystemRuntime *runtime = process->GetSystemRuntime(); 1441b9c1b51eSKate Stone if (runtime) { 1442b9c1b51eSKate Stone ThreadSP new_thread_sp( 1443b9c1b51eSKate Stone runtime->GetExtendedBacktraceThread(real_thread, type_const)); 1444b9c1b51eSKate Stone if (new_thread_sp) { 1445b9c1b51eSKate Stone // Save this in the Process' ExtendedThreadList so a strong 144605097246SAdrian Prantl // pointer retains the object. 14477a2f7904SJason Molenda process->GetExtendedThreadList().AddThread(new_thread_sp); 14487a2f7904SJason Molenda sb_origin_thread.SetThread(new_thread_sp); 1449b9c1b51eSKate Stone if (log) { 1450a6e9130dSJason Molenda const char *queue_name = new_thread_sp->GetQueueName(); 1451a6e9130dSJason Molenda if (queue_name == NULL) 1452a6e9130dSJason Molenda queue_name = ""; 1453b9c1b51eSKate Stone log->Printf("SBThread(%p)::GetExtendedBacktraceThread() => new " 1454b9c1b51eSKate Stone "extended Thread " 1455b9c1b51eSKate Stone "created (%p) with queue_id 0x%" PRIx64 1456b9c1b51eSKate Stone " queue name '%s'", 1457324a1036SSaleem Abdulrasool static_cast<void *>(exe_ctx.GetThreadPtr()), 1458324a1036SSaleem Abdulrasool static_cast<void *>(new_thread_sp.get()), 1459b9c1b51eSKate Stone new_thread_sp->GetQueueID(), queue_name); 1460a6e9130dSJason Molenda } 1461a6e9130dSJason Molenda } 14627a2f7904SJason Molenda } 14635dd4916fSJason Molenda } 14645dd4916fSJason Molenda } 1465b9c1b51eSKate Stone } else { 14665dd4916fSJason Molenda if (log) 1467b9c1b51eSKate Stone log->Printf("SBThread(%p)::GetExtendedBacktraceThread() => error: " 1468b9c1b51eSKate Stone "process is running", 1469324a1036SSaleem Abdulrasool static_cast<void *>(exe_ctx.GetThreadPtr())); 14705dd4916fSJason Molenda } 14715dd4916fSJason Molenda } 14725dd4916fSJason Molenda 1473ac605f4aSJason Molenda if (log && sb_origin_thread.IsValid() == false) 1474b9c1b51eSKate Stone log->Printf("SBThread(%p)::GetExtendedBacktraceThread() is not returning a " 1475b9c1b51eSKate Stone "Valid thread", 1476324a1036SSaleem Abdulrasool static_cast<void *>(exe_ctx.GetThreadPtr())); 14775dd4916fSJason Molenda return sb_origin_thread; 14785dd4916fSJason Molenda } 14798ee9cb58SJason Molenda 1480b9c1b51eSKate Stone uint32_t SBThread::GetExtendedBacktraceOriginatingIndexID() { 14818ee9cb58SJason Molenda ThreadSP thread_sp(m_opaque_sp->GetThreadSP()); 14828ee9cb58SJason Molenda if (thread_sp) 14838ee9cb58SJason Molenda return thread_sp->GetExtendedBacktraceOriginatingIndexID(); 14848ee9cb58SJason Molenda return LLDB_INVALID_INDEX32; 14858ee9cb58SJason Molenda } 1486b4892cd2SJason Molenda 1487*e60bc53bSKuba Mracek SBValue SBThread::GetCurrentException() { 1488*e60bc53bSKuba Mracek ThreadSP thread_sp(m_opaque_sp->GetThreadSP()); 1489*e60bc53bSKuba Mracek if (!thread_sp) return SBValue(); 1490*e60bc53bSKuba Mracek 1491*e60bc53bSKuba Mracek return SBValue(thread_sp->GetCurrentException()); 1492*e60bc53bSKuba Mracek } 1493*e60bc53bSKuba Mracek 1494*e60bc53bSKuba Mracek /* TODO(kubamracek) 1495*e60bc53bSKuba Mracek SBThread SBThread::GetCurrentExceptionBacktrace() { 1496*e60bc53bSKuba Mracek ThreadSP thread_sp(m_opaque_sp->GetThreadSP()); 1497*e60bc53bSKuba Mracek if (!thread_sp) return SBThread(); 1498*e60bc53bSKuba Mracek 1499*e60bc53bSKuba Mracek return SBThread(thread_sp->GetCurrentExceptionBacktrace()); 1500*e60bc53bSKuba Mracek }*/ 1501*e60bc53bSKuba Mracek 1502b9c1b51eSKate Stone bool SBThread::SafeToCallFunctions() { 1503b4892cd2SJason Molenda ThreadSP thread_sp(m_opaque_sp->GetThreadSP()); 1504b4892cd2SJason Molenda if (thread_sp) 1505b4892cd2SJason Molenda return thread_sp->SafeToCallFunctions(); 1506b4892cd2SJason Molenda return true; 1507b4892cd2SJason Molenda } 15082bdbfd50SJim Ingham 1509b9c1b51eSKate Stone lldb_private::Thread *SBThread::operator->() { 15102bdbfd50SJim Ingham ThreadSP thread_sp(m_opaque_sp->GetThreadSP()); 15112bdbfd50SJim Ingham if (thread_sp) 15122bdbfd50SJim Ingham return thread_sp.get(); 15132bdbfd50SJim Ingham else 15142bdbfd50SJim Ingham return NULL; 15152bdbfd50SJim Ingham } 15162bdbfd50SJim Ingham 1517b9c1b51eSKate Stone lldb_private::Thread *SBThread::get() { 15182bdbfd50SJim Ingham ThreadSP thread_sp(m_opaque_sp->GetThreadSP()); 15192bdbfd50SJim Ingham if (thread_sp) 15202bdbfd50SJim Ingham return thread_sp.get(); 15212bdbfd50SJim Ingham else 15222bdbfd50SJim Ingham return NULL; 15232bdbfd50SJim Ingham } 1524