180814287SRaphael Isemann //===-- SBThread.cpp ------------------------------------------------------===// 230fdc8d8SChris Lattner // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 630fdc8d8SChris Lattner // 730fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 830fdc8d8SChris Lattner 94c5de699SEli Friedman #include "lldb/API/SBThread.h" 10baf5664fSJonas Devlieghere #include "SBReproducerPrivate.h" 11bd4bf82aSJonas Devlieghere #include "Utils.h" 12bd4bf82aSJonas Devlieghere #include "lldb/API/SBAddress.h" 13bd4bf82aSJonas Devlieghere #include "lldb/API/SBDebugger.h" 14bd4bf82aSJonas Devlieghere #include "lldb/API/SBEvent.h" 1530fdc8d8SChris Lattner #include "lldb/API/SBFileSpec.h" 16bd4bf82aSJonas Devlieghere #include "lldb/API/SBFrame.h" 17bd4bf82aSJonas Devlieghere #include "lldb/API/SBProcess.h" 18dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 1927a14f19SJim Ingham #include "lldb/API/SBStructuredData.h" 20b9c1b51eSKate Stone #include "lldb/API/SBSymbolContext.h" 21bd4bf82aSJonas Devlieghere #include "lldb/API/SBThreadCollection.h" 22bd4bf82aSJonas Devlieghere #include "lldb/API/SBThreadPlan.h" 23bd4bf82aSJonas Devlieghere #include "lldb/API/SBValue.h" 244e78f606SGreg Clayton #include "lldb/Breakpoint/BreakpointLocation.h" 256611103cSGreg Clayton #include "lldb/Core/Debugger.h" 2630fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 2727a14f19SJim Ingham #include "lldb/Core/StructuredDataImpl.h" 28a78bd7ffSZachary Turner #include "lldb/Core/ValueObject.h" 296611103cSGreg Clayton #include "lldb/Interpreter/CommandInterpreter.h" 3093749ab3SZachary Turner #include "lldb/Symbol/CompileUnit.h" 31b9c1b51eSKate Stone #include "lldb/Symbol/SymbolContext.h" 3230fdc8d8SChris Lattner #include "lldb/Target/Process.h" 33b9ffa98cSJason Molenda #include "lldb/Target/Queue.h" 34f4b47e15SGreg Clayton #include "lldb/Target/StopInfo.h" 35b9c1b51eSKate Stone #include "lldb/Target/SystemRuntime.h" 3630fdc8d8SChris Lattner #include "lldb/Target/Target.h" 37b9c1b51eSKate Stone #include "lldb/Target/Thread.h" 3830fdc8d8SChris Lattner #include "lldb/Target/ThreadPlan.h" 39b9c1b51eSKate Stone #include "lldb/Target/ThreadPlanStepInRange.h" 4030fdc8d8SChris Lattner #include "lldb/Target/ThreadPlanStepInstruction.h" 4130fdc8d8SChris Lattner #include "lldb/Target/ThreadPlanStepOut.h" 4230fdc8d8SChris Lattner #include "lldb/Target/ThreadPlanStepRange.h" 43b9c1b51eSKate Stone #include "lldb/Target/UnixSignals.h" 44d821c997SPavel Labath #include "lldb/Utility/State.h" 45bf9a7730SZachary Turner #include "lldb/Utility/Stream.h" 46f2a8bccfSPavel Labath #include "lldb/Utility/StructuredData.h" 475bfee5f1SAbhishek Aggarwal #include "lldb/lldb-enumerations.h" 4830fdc8d8SChris Lattner 49796ac80bSJonas Devlieghere #include <memory> 50796ac80bSJonas Devlieghere 5130fdc8d8SChris Lattner using namespace lldb; 5230fdc8d8SChris Lattner using namespace lldb_private; 5330fdc8d8SChris Lattner 54b9c1b51eSKate Stone const char *SBThread::GetBroadcasterClassName() { 55baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD_NO_ARGS(const char *, SBThread, 56baf5664fSJonas Devlieghere GetBroadcasterClassName); 57baf5664fSJonas Devlieghere 584f465cffSJim Ingham return Thread::GetStaticBroadcasterClass().AsCString(); 594f465cffSJim Ingham } 604f465cffSJim Ingham 61cfd1acedSGreg Clayton // Constructors 62baf5664fSJonas Devlieghere SBThread::SBThread() : m_opaque_sp(new ExecutionContextRef()) { 63baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBThread); 64baf5664fSJonas Devlieghere } 6530fdc8d8SChris Lattner 66b9c1b51eSKate Stone SBThread::SBThread(const ThreadSP &lldb_object_sp) 67baf5664fSJonas Devlieghere : m_opaque_sp(new ExecutionContextRef(lldb_object_sp)) { 68baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR(SBThread, (const lldb::ThreadSP &), lldb_object_sp); 69baf5664fSJonas Devlieghere } 7030fdc8d8SChris Lattner 71bd4bf82aSJonas Devlieghere SBThread::SBThread(const SBThread &rhs) : m_opaque_sp() { 72baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR(SBThread, (const lldb::SBThread &), rhs); 73baf5664fSJonas Devlieghere 74bd4bf82aSJonas Devlieghere m_opaque_sp = clone(rhs.m_opaque_sp); 75bd4bf82aSJonas Devlieghere } 7630fdc8d8SChris Lattner 77cfd1acedSGreg Clayton // Assignment operator 78cfd1acedSGreg Clayton 79b9c1b51eSKate Stone const lldb::SBThread &SBThread::operator=(const SBThread &rhs) { 80baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(const lldb::SBThread &, 81baf5664fSJonas Devlieghere SBThread, operator=,(const lldb::SBThread &), rhs); 82baf5664fSJonas Devlieghere 83cfd1acedSGreg Clayton if (this != &rhs) 84bd4bf82aSJonas Devlieghere m_opaque_sp = clone(rhs.m_opaque_sp); 85306809f2SJonas Devlieghere return LLDB_RECORD_RESULT(*this); 86cfd1acedSGreg Clayton } 87cfd1acedSGreg Clayton 8830fdc8d8SChris Lattner // Destructor 89b9c1b51eSKate Stone SBThread::~SBThread() {} 9030fdc8d8SChris Lattner 91b9c1b51eSKate Stone lldb::SBQueue SBThread::GetQueue() const { 92baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBQueue, SBThread, GetQueue); 93baf5664fSJonas Devlieghere 94b9ffa98cSJason Molenda SBQueue sb_queue; 95b9ffa98cSJason Molenda QueueSP queue_sp; 96bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 97bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 98b9ffa98cSJason Molenda 99b9c1b51eSKate Stone if (exe_ctx.HasThreadScope()) { 100b9ffa98cSJason Molenda Process::StopLocker stop_locker; 101b9c1b51eSKate Stone if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { 102b9ffa98cSJason Molenda queue_sp = exe_ctx.GetThreadPtr()->GetQueue(); 103b9c1b51eSKate Stone if (queue_sp) { 104b9ffa98cSJason Molenda sb_queue.SetQueue(queue_sp); 105b9ffa98cSJason Molenda } 106b9ffa98cSJason Molenda } 107b9ffa98cSJason Molenda } 108b9ffa98cSJason Molenda 109baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_queue); 110b9ffa98cSJason Molenda } 111b9ffa98cSJason Molenda 112b9c1b51eSKate Stone bool SBThread::IsValid() const { 113baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBThread, IsValid); 1147f5237bcSPavel Labath return this->operator bool(); 1157f5237bcSPavel Labath } 1167f5237bcSPavel Labath SBThread::operator bool() const { 1177f5237bcSPavel Labath LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBThread, operator bool); 118baf5664fSJonas Devlieghere 119bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 120bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1217fa7dc36SJim Ingham 1227fa7dc36SJim Ingham Target *target = exe_ctx.GetTargetPtr(); 1237fa7dc36SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 124b9c1b51eSKate Stone if (target && process) { 1257fa7dc36SJim Ingham Process::StopLocker stop_locker; 1267fa7dc36SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 127248a1305SKonrad Kleine return m_opaque_sp->GetThreadSP().get() != nullptr; 12830fdc8d8SChris Lattner } 1297fa7dc36SJim Ingham // Without a valid target & process, this thread can't be valid. 1307fa7dc36SJim Ingham return false; 1317fa7dc36SJim Ingham } 13230fdc8d8SChris Lattner 133baf5664fSJonas Devlieghere void SBThread::Clear() { 134baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(void, SBThread, Clear); 135baf5664fSJonas Devlieghere 136baf5664fSJonas Devlieghere m_opaque_sp->Clear(); 137baf5664fSJonas Devlieghere } 13848e42549SGreg Clayton 139b9c1b51eSKate Stone StopReason SBThread::GetStopReason() { 140baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::StopReason, SBThread, GetStopReason); 141baf5664fSJonas Devlieghere 142ceb6b139SCaroline Tice StopReason reason = eStopReasonInvalid; 143bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 144bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1454fc6cb9cSJim Ingham 146b9c1b51eSKate Stone if (exe_ctx.HasThreadScope()) { 1477fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 148b9c1b51eSKate Stone if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { 14997d5cf05SGreg Clayton return exe_ctx.GetThreadPtr()->GetStopReason(); 150c9858e4dSGreg Clayton } 1517fdf9ef1SGreg Clayton } 152ceb6b139SCaroline Tice 153ceb6b139SCaroline Tice return reason; 15430fdc8d8SChris Lattner } 15530fdc8d8SChris Lattner 156b9c1b51eSKate Stone size_t SBThread::GetStopReasonDataCount() { 157baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(size_t, SBThread, GetStopReasonDataCount); 158baf5664fSJonas Devlieghere 159bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 160bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1614fc6cb9cSJim Ingham 162b9c1b51eSKate Stone if (exe_ctx.HasThreadScope()) { 1637fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 164b9c1b51eSKate Stone if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { 1651ac04c30SGreg Clayton StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo(); 166b9c1b51eSKate Stone if (stop_info_sp) { 1674e78f606SGreg Clayton StopReason reason = stop_info_sp->GetStopReason(); 168b9c1b51eSKate Stone switch (reason) { 1694e78f606SGreg Clayton case eStopReasonInvalid: 1704e78f606SGreg Clayton case eStopReasonNone: 1714e78f606SGreg Clayton case eStopReasonTrace: 17290ba8115SGreg Clayton case eStopReasonExec: 1734e78f606SGreg Clayton case eStopReasonPlanComplete: 174f85defaeSAndrew Kaylor case eStopReasonThreadExiting: 175afdf842bSKuba Brecka case eStopReasonInstrumentation: 1764e78f606SGreg Clayton // There is no data for these stop reasons. 1774e78f606SGreg Clayton return 0; 1784e78f606SGreg Clayton 179b9c1b51eSKate Stone case eStopReasonBreakpoint: { 1804e78f606SGreg Clayton break_id_t site_id = stop_info_sp->GetValue(); 181b9c1b51eSKate Stone lldb::BreakpointSiteSP bp_site_sp( 182b9c1b51eSKate Stone exe_ctx.GetProcessPtr()->GetBreakpointSiteList().FindByID( 183b9c1b51eSKate Stone site_id)); 1844e78f606SGreg Clayton if (bp_site_sp) 1854e78f606SGreg Clayton return bp_site_sp->GetNumberOfOwners() * 2; 1864e78f606SGreg Clayton else 1874e78f606SGreg Clayton return 0; // Breakpoint must have cleared itself... 188b9c1b51eSKate Stone } break; 1894e78f606SGreg Clayton 1904e78f606SGreg Clayton case eStopReasonWatchpoint: 191290fa41bSJohnny Chen return 1; 1924e78f606SGreg Clayton 1934e78f606SGreg Clayton case eStopReasonSignal: 1944e78f606SGreg Clayton return 1; 1954e78f606SGreg Clayton 1964e78f606SGreg Clayton case eStopReasonException: 1974e78f606SGreg Clayton return 1; 1984e78f606SGreg Clayton } 1994e78f606SGreg Clayton } 200c9858e4dSGreg Clayton } 2017fdf9ef1SGreg Clayton } 2024e78f606SGreg Clayton return 0; 2034e78f606SGreg Clayton } 2044e78f606SGreg Clayton 205b9c1b51eSKate Stone uint64_t SBThread::GetStopReasonDataAtIndex(uint32_t idx) { 206baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(uint64_t, SBThread, GetStopReasonDataAtIndex, (uint32_t), 207baf5664fSJonas Devlieghere idx); 208baf5664fSJonas Devlieghere 209bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 210bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 2114fc6cb9cSJim Ingham 212b9c1b51eSKate Stone if (exe_ctx.HasThreadScope()) { 2137fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 214b9c1b51eSKate Stone if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { 2151ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 2161ac04c30SGreg Clayton StopInfoSP stop_info_sp = thread->GetStopInfo(); 217b9c1b51eSKate Stone if (stop_info_sp) { 2184e78f606SGreg Clayton StopReason reason = stop_info_sp->GetStopReason(); 219b9c1b51eSKate Stone switch (reason) { 2204e78f606SGreg Clayton case eStopReasonInvalid: 2214e78f606SGreg Clayton case eStopReasonNone: 2224e78f606SGreg Clayton case eStopReasonTrace: 22390ba8115SGreg Clayton case eStopReasonExec: 2244e78f606SGreg Clayton case eStopReasonPlanComplete: 225f85defaeSAndrew Kaylor case eStopReasonThreadExiting: 226afdf842bSKuba Brecka case eStopReasonInstrumentation: 2274e78f606SGreg Clayton // There is no data for these stop reasons. 2284e78f606SGreg Clayton return 0; 2294e78f606SGreg Clayton 230b9c1b51eSKate Stone case eStopReasonBreakpoint: { 2314e78f606SGreg Clayton break_id_t site_id = stop_info_sp->GetValue(); 232b9c1b51eSKate Stone lldb::BreakpointSiteSP bp_site_sp( 233b9c1b51eSKate Stone exe_ctx.GetProcessPtr()->GetBreakpointSiteList().FindByID( 234b9c1b51eSKate Stone site_id)); 235b9c1b51eSKate Stone if (bp_site_sp) { 2364e78f606SGreg Clayton uint32_t bp_index = idx / 2; 237b9c1b51eSKate Stone BreakpointLocationSP bp_loc_sp( 238b9c1b51eSKate Stone bp_site_sp->GetOwnerAtIndex(bp_index)); 239b9c1b51eSKate Stone if (bp_loc_sp) { 240b9c1b51eSKate Stone if (idx & 1) { 2414e78f606SGreg Clayton // Odd idx, return the breakpoint location ID 2424e78f606SGreg Clayton return bp_loc_sp->GetID(); 243b9c1b51eSKate Stone } else { 2444e78f606SGreg Clayton // Even idx, return the breakpoint ID 2454e78f606SGreg Clayton return bp_loc_sp->GetBreakpoint().GetID(); 2464e78f606SGreg Clayton } 2474e78f606SGreg Clayton } 2484e78f606SGreg Clayton } 2494e78f606SGreg Clayton return LLDB_INVALID_BREAK_ID; 250b9c1b51eSKate Stone } break; 2514e78f606SGreg Clayton 2524e78f606SGreg Clayton case eStopReasonWatchpoint: 253290fa41bSJohnny Chen return stop_info_sp->GetValue(); 2544e78f606SGreg Clayton 2554e78f606SGreg Clayton case eStopReasonSignal: 2564e78f606SGreg Clayton return stop_info_sp->GetValue(); 2574e78f606SGreg Clayton 2584e78f606SGreg Clayton case eStopReasonException: 2594e78f606SGreg Clayton return stop_info_sp->GetValue(); 2604e78f606SGreg Clayton } 2614e78f606SGreg Clayton } 262c9858e4dSGreg Clayton } 2637fdf9ef1SGreg Clayton } 2644e78f606SGreg Clayton return 0; 2654e78f606SGreg Clayton } 2664e78f606SGreg Clayton 267b9c1b51eSKate Stone bool SBThread::GetStopReasonExtendedInfoAsJSON(lldb::SBStream &stream) { 268baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBThread, GetStopReasonExtendedInfoAsJSON, 269baf5664fSJonas Devlieghere (lldb::SBStream &), stream); 270baf5664fSJonas Devlieghere 271afdf842bSKuba Brecka Stream &strm = stream.ref(); 272afdf842bSKuba Brecka 273b2e7d28eSJim Ingham std::unique_lock<std::recursive_mutex> lock; 274b2e7d28eSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 275b2e7d28eSJim Ingham 276afdf842bSKuba Brecka if (!exe_ctx.HasThreadScope()) 277afdf842bSKuba Brecka return false; 278afdf842bSKuba Brecka 279afdf842bSKuba Brecka StopInfoSP stop_info = exe_ctx.GetThreadPtr()->GetStopInfo(); 280afdf842bSKuba Brecka StructuredData::ObjectSP info = stop_info->GetExtendedInfo(); 281afdf842bSKuba Brecka if (!info) 282afdf842bSKuba Brecka return false; 283afdf842bSKuba Brecka 284afdf842bSKuba Brecka info->Dump(strm); 285afdf842bSKuba Brecka 286afdf842bSKuba Brecka return true; 287afdf842bSKuba Brecka } 288afdf842bSKuba Brecka 2896a831436SKuba Brecka SBThreadCollection 290b9c1b51eSKate Stone SBThread::GetStopReasonExtendedBacktraces(InstrumentationRuntimeType type) { 291baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBThreadCollection, SBThread, 292baf5664fSJonas Devlieghere GetStopReasonExtendedBacktraces, 293baf5664fSJonas Devlieghere (lldb::InstrumentationRuntimeType), type); 294baf5664fSJonas Devlieghere 2956a831436SKuba Brecka ThreadCollectionSP threads; 296796ac80bSJonas Devlieghere threads = std::make_shared<ThreadCollection>(); 2976a831436SKuba Brecka 298b2e7d28eSJim Ingham std::unique_lock<std::recursive_mutex> lock; 299b2e7d28eSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 300b2e7d28eSJim Ingham 3016a831436SKuba Brecka if (!exe_ctx.HasThreadScope()) 302baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(threads); 3036a831436SKuba Brecka 3046a831436SKuba Brecka ProcessSP process_sp = exe_ctx.GetProcessSP(); 3056a831436SKuba Brecka 3066a831436SKuba Brecka StopInfoSP stop_info = exe_ctx.GetThreadPtr()->GetStopInfo(); 3076a831436SKuba Brecka StructuredData::ObjectSP info = stop_info->GetExtendedInfo(); 3086a831436SKuba Brecka if (!info) 309baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(threads); 3106a831436SKuba Brecka 311baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(process_sp->GetInstrumentationRuntime(type) 312baf5664fSJonas Devlieghere ->GetBacktracesFromExtendedStopInfo(info)); 3136a831436SKuba Brecka } 3146a831436SKuba Brecka 315b9c1b51eSKate Stone size_t SBThread::GetStopDescription(char *dst, size_t dst_len) { 316*3da7dcf3SJonas Devlieghere LLDB_RECORD_METHOD(size_t, SBThread, GetStopDescription, (char *, size_t), "", 317*3da7dcf3SJonas Devlieghere dst_len); 318baf5664fSJonas Devlieghere 319bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 320bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 3214fc6cb9cSJim Ingham 322b9c1b51eSKate Stone if (exe_ctx.HasThreadScope()) { 3237fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 324b9c1b51eSKate Stone if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { 3257fdf9ef1SGreg Clayton 3261ac04c30SGreg Clayton StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo(); 327b9c1b51eSKate Stone if (stop_info_sp) { 32898b273c8SPavel Labath const char *stop_desc = stop_info_sp->GetDescription(); 329b9c1b51eSKate Stone if (stop_desc) { 33030fdc8d8SChris Lattner if (dst) 33130fdc8d8SChris Lattner return ::snprintf(dst, dst_len, "%s", stop_desc); 332b9c1b51eSKate Stone else { 333b9c1b51eSKate Stone // NULL dst passed in, return the length needed to contain the 334b9c1b51eSKate Stone // description 33530fdc8d8SChris Lattner return ::strlen(stop_desc) + 1; // Include the NULL byte for size 33630fdc8d8SChris Lattner } 337b9c1b51eSKate Stone } else { 33830fdc8d8SChris Lattner size_t stop_desc_len = 0; 339b9c1b51eSKate Stone switch (stop_info_sp->GetStopReason()) { 34030fdc8d8SChris Lattner case eStopReasonTrace: 341b9c1b51eSKate Stone case eStopReasonPlanComplete: { 34230fdc8d8SChris Lattner static char trace_desc[] = "step"; 34330fdc8d8SChris Lattner stop_desc = trace_desc; 344b9c1b51eSKate Stone stop_desc_len = 345b9c1b51eSKate Stone sizeof(trace_desc); // Include the NULL byte for size 346b9c1b51eSKate Stone } break; 34730fdc8d8SChris Lattner 348b9c1b51eSKate Stone case eStopReasonBreakpoint: { 34930fdc8d8SChris Lattner static char bp_desc[] = "breakpoint hit"; 35030fdc8d8SChris Lattner stop_desc = bp_desc; 35130fdc8d8SChris Lattner stop_desc_len = sizeof(bp_desc); // Include the NULL byte for size 352b9c1b51eSKate Stone } break; 35330fdc8d8SChris Lattner 354b9c1b51eSKate Stone case eStopReasonWatchpoint: { 35530fdc8d8SChris Lattner static char wp_desc[] = "watchpoint hit"; 35630fdc8d8SChris Lattner stop_desc = wp_desc; 35730fdc8d8SChris Lattner stop_desc_len = sizeof(wp_desc); // Include the NULL byte for size 358b9c1b51eSKate Stone } break; 35930fdc8d8SChris Lattner 360b9c1b51eSKate Stone case eStopReasonSignal: { 361b9c1b51eSKate Stone stop_desc = 362b9c1b51eSKate Stone exe_ctx.GetProcessPtr()->GetUnixSignals()->GetSignalAsCString( 363b9c1b51eSKate Stone stop_info_sp->GetValue()); 364248a1305SKonrad Kleine if (stop_desc == nullptr || stop_desc[0] == '\0') { 36530fdc8d8SChris Lattner static char signal_desc[] = "signal"; 36630fdc8d8SChris Lattner stop_desc = signal_desc; 367b9c1b51eSKate Stone stop_desc_len = 368b9c1b51eSKate Stone sizeof(signal_desc); // Include the NULL byte for size 36930fdc8d8SChris Lattner } 370b9c1b51eSKate Stone } break; 37130fdc8d8SChris Lattner 372b9c1b51eSKate Stone case eStopReasonException: { 37330fdc8d8SChris Lattner char exc_desc[] = "exception"; 37430fdc8d8SChris Lattner stop_desc = exc_desc; 37530fdc8d8SChris Lattner stop_desc_len = sizeof(exc_desc); // Include the NULL byte for size 376b9c1b51eSKate Stone } break; 377c982c768SGreg Clayton 378b9c1b51eSKate Stone case eStopReasonExec: { 37990ba8115SGreg Clayton char exc_desc[] = "exec"; 38090ba8115SGreg Clayton stop_desc = exc_desc; 38190ba8115SGreg Clayton stop_desc_len = sizeof(exc_desc); // Include the NULL byte for size 382b9c1b51eSKate Stone } break; 38390ba8115SGreg Clayton 384b9c1b51eSKate Stone case eStopReasonThreadExiting: { 385f85defaeSAndrew Kaylor char limbo_desc[] = "thread exiting"; 386f85defaeSAndrew Kaylor stop_desc = limbo_desc; 387f85defaeSAndrew Kaylor stop_desc_len = sizeof(limbo_desc); 388b9c1b51eSKate Stone } break; 389c982c768SGreg Clayton default: 390c982c768SGreg Clayton break; 39130fdc8d8SChris Lattner } 39230fdc8d8SChris Lattner 393b9c1b51eSKate Stone if (stop_desc && stop_desc[0]) { 39430fdc8d8SChris Lattner if (dst) 395b9c1b51eSKate Stone return ::snprintf(dst, dst_len, "%s", stop_desc) + 396b9c1b51eSKate Stone 1; // Include the NULL byte 39730fdc8d8SChris Lattner 39830fdc8d8SChris Lattner if (stop_desc_len == 0) 39930fdc8d8SChris Lattner stop_desc_len = ::strlen(stop_desc) + 1; // Include the NULL byte 40030fdc8d8SChris Lattner 40130fdc8d8SChris Lattner return stop_desc_len; 40230fdc8d8SChris Lattner } 40330fdc8d8SChris Lattner } 40430fdc8d8SChris Lattner } 405c9858e4dSGreg Clayton } 4067fdf9ef1SGreg Clayton } 40730fdc8d8SChris Lattner if (dst) 40830fdc8d8SChris Lattner *dst = 0; 40930fdc8d8SChris Lattner return 0; 41030fdc8d8SChris Lattner } 41130fdc8d8SChris Lattner 412b9c1b51eSKate Stone SBValue SBThread::GetStopReturnValue() { 413baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::SBValue, SBThread, GetStopReturnValue); 414baf5664fSJonas Devlieghere 41573ca05a2SJim Ingham ValueObjectSP return_valobj_sp; 416bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 417bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 4184fc6cb9cSJim Ingham 419b9c1b51eSKate Stone if (exe_ctx.HasThreadScope()) { 4207fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 421b9c1b51eSKate Stone if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { 4221ac04c30SGreg Clayton StopInfoSP stop_info_sp = exe_ctx.GetThreadPtr()->GetStopInfo(); 423b9c1b51eSKate Stone if (stop_info_sp) { 42473ca05a2SJim Ingham return_valobj_sp = StopInfo::GetReturnValueObject(stop_info_sp); 42573ca05a2SJim Ingham } 426c9858e4dSGreg Clayton } 4277fdf9ef1SGreg Clayton } 42873ca05a2SJim Ingham 429baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(SBValue(return_valobj_sp)); 43073ca05a2SJim Ingham } 43173ca05a2SJim Ingham 432b9c1b51eSKate Stone void SBThread::SetThread(const ThreadSP &lldb_object_sp) { 4337fdf9ef1SGreg Clayton m_opaque_sp->SetThreadSP(lldb_object_sp); 43430fdc8d8SChris Lattner } 43530fdc8d8SChris Lattner 436b9c1b51eSKate Stone lldb::tid_t SBThread::GetThreadID() const { 437baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::tid_t, SBThread, GetThreadID); 438baf5664fSJonas Devlieghere 4397fdf9ef1SGreg Clayton ThreadSP thread_sp(m_opaque_sp->GetThreadSP()); 44017a6ad05SGreg Clayton if (thread_sp) 4411ac04c30SGreg Clayton return thread_sp->GetID(); 4421ac04c30SGreg Clayton return LLDB_INVALID_THREAD_ID; 44330fdc8d8SChris Lattner } 44430fdc8d8SChris Lattner 445b9c1b51eSKate Stone uint32_t SBThread::GetIndexID() const { 446baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBThread, GetIndexID); 447baf5664fSJonas Devlieghere 4487fdf9ef1SGreg Clayton ThreadSP thread_sp(m_opaque_sp->GetThreadSP()); 44917a6ad05SGreg Clayton if (thread_sp) 45017a6ad05SGreg Clayton return thread_sp->GetIndexID(); 45130fdc8d8SChris Lattner return LLDB_INVALID_INDEX32; 45230fdc8d8SChris Lattner } 4531ac04c30SGreg Clayton 454b9c1b51eSKate Stone const char *SBThread::GetName() const { 455baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBThread, GetName); 456baf5664fSJonas Devlieghere 457248a1305SKonrad Kleine const char *name = nullptr; 458bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 459bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 4604fc6cb9cSJim Ingham 461b9c1b51eSKate Stone if (exe_ctx.HasThreadScope()) { 4627fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 463b9c1b51eSKate Stone if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { 4641ac04c30SGreg Clayton name = exe_ctx.GetThreadPtr()->GetName(); 465c9858e4dSGreg Clayton } 4667fdf9ef1SGreg Clayton } 467ceb6b139SCaroline Tice 4684838131bSGreg Clayton return name; 46930fdc8d8SChris Lattner } 47030fdc8d8SChris Lattner 471b9c1b51eSKate Stone const char *SBThread::GetQueueName() const { 472baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBThread, GetQueueName); 473baf5664fSJonas Devlieghere 474248a1305SKonrad Kleine const char *name = nullptr; 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()->GetQueueName(); 482c9858e4dSGreg Clayton } 4837fdf9ef1SGreg Clayton } 484ceb6b139SCaroline Tice 4854838131bSGreg Clayton return name; 48630fdc8d8SChris Lattner } 48730fdc8d8SChris Lattner 488b9c1b51eSKate Stone lldb::queue_id_t SBThread::GetQueueID() const { 489baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::queue_id_t, SBThread, GetQueueID); 490baf5664fSJonas Devlieghere 4914fdb5863SJason Molenda queue_id_t id = LLDB_INVALID_QUEUE_ID; 492bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 493bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 4944fdb5863SJason Molenda 495b9c1b51eSKate Stone if (exe_ctx.HasThreadScope()) { 4964fdb5863SJason Molenda Process::StopLocker stop_locker; 497b9c1b51eSKate Stone if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { 4984fdb5863SJason Molenda id = exe_ctx.GetThreadPtr()->GetQueueID(); 4994fdb5863SJason Molenda } 5004fdb5863SJason Molenda } 5014fdb5863SJason Molenda 5024fdb5863SJason Molenda return id; 5034fdb5863SJason Molenda } 5044fdb5863SJason Molenda 505b9c1b51eSKate Stone bool SBThread::GetInfoItemByPathAsString(const char *path, SBStream &strm) { 506baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBThread, GetInfoItemByPathAsString, 507baf5664fSJonas Devlieghere (const char *, lldb::SBStream &), path, strm); 508baf5664fSJonas Devlieghere 509705b1809SJason Molenda bool success = false; 510bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 511bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 512705b1809SJason Molenda 513b9c1b51eSKate Stone if (exe_ctx.HasThreadScope()) { 514705b1809SJason Molenda Process::StopLocker stop_locker; 515b9c1b51eSKate Stone if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { 516705b1809SJason Molenda Thread *thread = exe_ctx.GetThreadPtr(); 517705b1809SJason Molenda StructuredData::ObjectSP info_root_sp = thread->GetExtendedInfo(); 518b9c1b51eSKate Stone if (info_root_sp) { 519b9c1b51eSKate Stone StructuredData::ObjectSP node = 520b9c1b51eSKate Stone info_root_sp->GetObjectForDotSeparatedPath(path); 521b9c1b51eSKate Stone if (node) { 5225bfee5f1SAbhishek Aggarwal if (node->GetType() == eStructuredDataTypeString) { 5232833321fSZachary Turner strm.Printf("%s", node->GetAsString()->GetValue().str().c_str()); 524705b1809SJason Molenda success = true; 525705b1809SJason Molenda } 5265bfee5f1SAbhishek Aggarwal if (node->GetType() == eStructuredDataTypeInteger) { 527705b1809SJason Molenda strm.Printf("0x%" PRIx64, node->GetAsInteger()->GetValue()); 528705b1809SJason Molenda success = true; 529705b1809SJason Molenda } 5305bfee5f1SAbhishek Aggarwal if (node->GetType() == eStructuredDataTypeFloat) { 531705b1809SJason Molenda strm.Printf("0x%f", node->GetAsFloat()->GetValue()); 532705b1809SJason Molenda success = true; 533705b1809SJason Molenda } 5345bfee5f1SAbhishek Aggarwal if (node->GetType() == eStructuredDataTypeBoolean) { 535a6682a41SJonas Devlieghere if (node->GetAsBoolean()->GetValue()) 536705b1809SJason Molenda strm.Printf("true"); 537705b1809SJason Molenda else 538705b1809SJason Molenda strm.Printf("false"); 539705b1809SJason Molenda success = true; 540705b1809SJason Molenda } 5415bfee5f1SAbhishek Aggarwal if (node->GetType() == eStructuredDataTypeNull) { 542705b1809SJason Molenda strm.Printf("null"); 543705b1809SJason Molenda success = true; 544705b1809SJason Molenda } 545705b1809SJason Molenda } 546705b1809SJason Molenda } 547705b1809SJason Molenda } 548705b1809SJason Molenda } 549705b1809SJason Molenda 550705b1809SJason Molenda return success; 551705b1809SJason Molenda } 552705b1809SJason Molenda 553b9c1b51eSKate Stone SBError SBThread::ResumeNewPlan(ExecutionContext &exe_ctx, 554b9c1b51eSKate Stone ThreadPlan *new_plan) { 55564e7ead1SJim Ingham SBError sb_error; 55664e7ead1SJim Ingham 55764e7ead1SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 558b9c1b51eSKate Stone if (!process) { 55964e7ead1SJim Ingham sb_error.SetErrorString("No process in SBThread::ResumeNewPlan"); 56064e7ead1SJim Ingham return sb_error; 56164e7ead1SJim Ingham } 56264e7ead1SJim Ingham 56364e7ead1SJim Ingham Thread *thread = exe_ctx.GetThreadPtr(); 564b9c1b51eSKate Stone if (!thread) { 56564e7ead1SJim Ingham sb_error.SetErrorString("No thread in SBThread::ResumeNewPlan"); 56664e7ead1SJim Ingham return sb_error; 56764e7ead1SJim Ingham } 56864e7ead1SJim Ingham 569b9c1b51eSKate Stone // User level plans should be Master Plans so they can be interrupted, other 57005097246SAdrian Prantl // plans executed, and then a "continue" will resume the plan. 571248a1305SKonrad Kleine if (new_plan != nullptr) { 57264e7ead1SJim Ingham new_plan->SetIsMasterPlan(true); 57364e7ead1SJim Ingham new_plan->SetOkayToDiscard(false); 57464e7ead1SJim Ingham } 57564e7ead1SJim Ingham 57664e7ead1SJim Ingham // Why do we need to set the current thread by ID here??? 57764e7ead1SJim Ingham process->GetThreadList().SetSelectedThreadByID(thread->GetID()); 57864e7ead1SJim Ingham 579dc6224e0SGreg Clayton if (process->GetTarget().GetDebugger().GetAsyncExecution()) 580dc6224e0SGreg Clayton sb_error.ref() = process->Resume(); 581dc6224e0SGreg Clayton else 582248a1305SKonrad Kleine sb_error.ref() = process->ResumeSynchronous(nullptr); 58364e7ead1SJim Ingham 58464e7ead1SJim Ingham return sb_error; 58564e7ead1SJim Ingham } 58630fdc8d8SChris Lattner 587b9c1b51eSKate Stone void SBThread::StepOver(lldb::RunMode stop_other_threads) { 588baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBThread, StepOver, (lldb::RunMode), 589baf5664fSJonas Devlieghere stop_other_threads); 590baf5664fSJonas Devlieghere 591859f54b3SAlexander Polyakov SBError error; // Ignored 592859f54b3SAlexander Polyakov StepOver(stop_other_threads, error); 593859f54b3SAlexander Polyakov } 594859f54b3SAlexander Polyakov 595859f54b3SAlexander Polyakov void SBThread::StepOver(lldb::RunMode stop_other_threads, SBError &error) { 596baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBThread, StepOver, (lldb::RunMode, lldb::SBError &), 597baf5664fSJonas Devlieghere stop_other_threads, error); 598baf5664fSJonas Devlieghere 599bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 600bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 60117a6ad05SGreg Clayton 602859f54b3SAlexander Polyakov if (!exe_ctx.HasThreadScope()) { 603859f54b3SAlexander Polyakov error.SetErrorString("this SBThread object is invalid"); 604859f54b3SAlexander Polyakov return; 605859f54b3SAlexander Polyakov } 606859f54b3SAlexander Polyakov 6071ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 6087ba6e991SJim Ingham bool abort_other_plans = false; 609b57e4a1bSJason Molenda StackFrameSP frame_sp(thread->GetStackFrameAtIndex(0)); 61030fdc8d8SChris Lattner 611e103ae92SJonas Devlieghere Status new_plan_status; 6124d56e9c1SJim Ingham ThreadPlanSP new_plan_sp; 613b9c1b51eSKate Stone if (frame_sp) { 614b9c1b51eSKate Stone if (frame_sp->HasDebugInformation()) { 6154b4b2478SJim Ingham const LazyBool avoid_no_debug = eLazyBoolCalculate; 61630fdc8d8SChris Lattner SymbolContext sc(frame_sp->GetSymbolContext(eSymbolContextEverything)); 617b9c1b51eSKate Stone new_plan_sp = thread->QueueThreadPlanForStepOverRange( 618b9c1b51eSKate Stone abort_other_plans, sc.line_entry, sc, stop_other_threads, 619e103ae92SJonas Devlieghere new_plan_status, avoid_no_debug); 620b9c1b51eSKate Stone } else { 621b9c1b51eSKate Stone new_plan_sp = thread->QueueThreadPlanForStepSingleInstruction( 622e103ae92SJonas Devlieghere true, abort_other_plans, stop_other_threads, new_plan_status); 62330fdc8d8SChris Lattner } 62430fdc8d8SChris Lattner } 625859f54b3SAlexander Polyakov error = ResumeNewPlan(exe_ctx, new_plan_sp.get()); 62630fdc8d8SChris Lattner } 62730fdc8d8SChris Lattner 628b9c1b51eSKate Stone void SBThread::StepInto(lldb::RunMode stop_other_threads) { 629baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBThread, StepInto, (lldb::RunMode), 630baf5664fSJonas Devlieghere stop_other_threads); 631baf5664fSJonas Devlieghere 632248a1305SKonrad Kleine StepInto(nullptr, stop_other_threads); 633c627682eSJim Ingham } 634c627682eSJim Ingham 635b9c1b51eSKate Stone void SBThread::StepInto(const char *target_name, 636b9c1b51eSKate Stone lldb::RunMode stop_other_threads) { 637baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBThread, StepInto, (const char *, lldb::RunMode), 638baf5664fSJonas Devlieghere target_name, stop_other_threads); 639baf5664fSJonas Devlieghere 640859f54b3SAlexander Polyakov SBError error; // Ignored 641cbf6f9b2SJim Ingham StepInto(target_name, LLDB_INVALID_LINE_NUMBER, error, stop_other_threads); 642cbf6f9b2SJim Ingham } 643cbf6f9b2SJim Ingham 644b9c1b51eSKate Stone void SBThread::StepInto(const char *target_name, uint32_t end_line, 645b9c1b51eSKate Stone SBError &error, lldb::RunMode stop_other_threads) { 646baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBThread, StepInto, 647baf5664fSJonas Devlieghere (const char *, uint32_t, lldb::SBError &, lldb::RunMode), 648baf5664fSJonas Devlieghere target_name, end_line, error, stop_other_threads); 649baf5664fSJonas Devlieghere 650ceb6b139SCaroline Tice 651bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 652bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 65317a6ad05SGreg Clayton 654859f54b3SAlexander Polyakov if (!exe_ctx.HasThreadScope()) { 655859f54b3SAlexander Polyakov error.SetErrorString("this SBThread object is invalid"); 656859f54b3SAlexander Polyakov return; 657859f54b3SAlexander Polyakov } 658859f54b3SAlexander Polyakov 6597ba6e991SJim Ingham bool abort_other_plans = false; 66030fdc8d8SChris Lattner 6611ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 662b57e4a1bSJason Molenda StackFrameSP frame_sp(thread->GetStackFrameAtIndex(0)); 6634d56e9c1SJim Ingham ThreadPlanSP new_plan_sp; 664e103ae92SJonas Devlieghere Status new_plan_status; 66530fdc8d8SChris Lattner 666b9c1b51eSKate Stone if (frame_sp && frame_sp->HasDebugInformation()) { 667cbf6f9b2SJim Ingham SymbolContext sc(frame_sp->GetSymbolContext(eSymbolContextEverything)); 668cbf6f9b2SJim Ingham AddressRange range; 669cbf6f9b2SJim Ingham if (end_line == LLDB_INVALID_LINE_NUMBER) 670cbf6f9b2SJim Ingham range = sc.line_entry.range; 671b9c1b51eSKate Stone else { 672cbf6f9b2SJim Ingham if (!sc.GetAddressRangeFromHereToEndLine(end_line, range, error.ref())) 673cbf6f9b2SJim Ingham return; 674cbf6f9b2SJim Ingham } 675cbf6f9b2SJim Ingham 676b9c1b51eSKate Stone const LazyBool step_out_avoids_code_without_debug_info = 677b9c1b51eSKate Stone eLazyBoolCalculate; 678b9c1b51eSKate Stone const LazyBool step_in_avoids_code_without_debug_info = 679b9c1b51eSKate Stone eLazyBoolCalculate; 680b9c1b51eSKate Stone new_plan_sp = thread->QueueThreadPlanForStepInRange( 681b9c1b51eSKate Stone abort_other_plans, range, sc, target_name, stop_other_threads, 682e103ae92SJonas Devlieghere new_plan_status, step_in_avoids_code_without_debug_info, 6834b4b2478SJim Ingham step_out_avoids_code_without_debug_info); 684b9c1b51eSKate Stone } else { 685b9c1b51eSKate Stone new_plan_sp = thread->QueueThreadPlanForStepSingleInstruction( 686e103ae92SJonas Devlieghere false, abort_other_plans, stop_other_threads, new_plan_status); 68730fdc8d8SChris Lattner } 688e103ae92SJonas Devlieghere 689e103ae92SJonas Devlieghere if (new_plan_status.Success()) 690cbf6f9b2SJim Ingham error = ResumeNewPlan(exe_ctx, new_plan_sp.get()); 691e103ae92SJonas Devlieghere else 692e103ae92SJonas Devlieghere error.SetErrorString(new_plan_status.AsCString()); 69330fdc8d8SChris Lattner } 69430fdc8d8SChris Lattner 695b9c1b51eSKate Stone void SBThread::StepOut() { 696baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(void, SBThread, StepOut); 697baf5664fSJonas Devlieghere 698859f54b3SAlexander Polyakov SBError error; // Ignored 699859f54b3SAlexander Polyakov StepOut(error); 700859f54b3SAlexander Polyakov } 701859f54b3SAlexander Polyakov 702859f54b3SAlexander Polyakov void SBThread::StepOut(SBError &error) { 703baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBThread, StepOut, (lldb::SBError &), error); 704baf5664fSJonas Devlieghere 705bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 706bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 7074fc6cb9cSJim Ingham 708859f54b3SAlexander Polyakov if (!exe_ctx.HasThreadScope()) { 709859f54b3SAlexander Polyakov error.SetErrorString("this SBThread object is invalid"); 710859f54b3SAlexander Polyakov return; 711859f54b3SAlexander Polyakov } 712859f54b3SAlexander Polyakov 7137ba6e991SJim Ingham bool abort_other_plans = false; 71494b09246SJim Ingham bool stop_other_threads = false; 71530fdc8d8SChris Lattner 7161ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 7171ac04c30SGreg Clayton 7184b4b2478SJim Ingham const LazyBool avoid_no_debug = eLazyBoolCalculate; 719e103ae92SJonas Devlieghere Status new_plan_status; 720b9c1b51eSKate Stone ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepOut( 721248a1305SKonrad Kleine abort_other_plans, nullptr, false, stop_other_threads, eVoteYes, 722e103ae92SJonas Devlieghere eVoteNoOpinion, 0, new_plan_status, avoid_no_debug)); 723481cef25SGreg Clayton 724e103ae92SJonas Devlieghere if (new_plan_status.Success()) 725859f54b3SAlexander Polyakov error = ResumeNewPlan(exe_ctx, new_plan_sp.get()); 726e103ae92SJonas Devlieghere else 727e103ae92SJonas Devlieghere error.SetErrorString(new_plan_status.AsCString()); 728481cef25SGreg Clayton } 729481cef25SGreg Clayton 730859f54b3SAlexander Polyakov void SBThread::StepOutOfFrame(SBFrame &sb_frame) { 731baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBThread, StepOutOfFrame, (lldb::SBFrame &), 732baf5664fSJonas Devlieghere sb_frame); 733baf5664fSJonas Devlieghere 734859f54b3SAlexander Polyakov SBError error; // Ignored 735859f54b3SAlexander Polyakov StepOutOfFrame(sb_frame, error); 736859f54b3SAlexander Polyakov } 737859f54b3SAlexander Polyakov 738859f54b3SAlexander Polyakov void SBThread::StepOutOfFrame(SBFrame &sb_frame, SBError &error) { 739baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBThread, StepOutOfFrame, 740baf5664fSJonas Devlieghere (lldb::SBFrame &, lldb::SBError &), sb_frame, error); 741baf5664fSJonas Devlieghere 742481cef25SGreg Clayton 743bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 744bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 7454fc6cb9cSJim Ingham 746b9c1b51eSKate Stone if (!sb_frame.IsValid()) { 747859f54b3SAlexander Polyakov error.SetErrorString("passed invalid SBFrame object"); 748989a7558SJim Ingham return; 749989a7558SJim Ingham } 750989a7558SJim Ingham 751b57e4a1bSJason Molenda StackFrameSP frame_sp(sb_frame.GetFrameSP()); 752481cef25SGreg Clayton 753859f54b3SAlexander Polyakov if (!exe_ctx.HasThreadScope()) { 754859f54b3SAlexander Polyakov error.SetErrorString("this SBThread object is invalid"); 755859f54b3SAlexander Polyakov return; 756859f54b3SAlexander Polyakov } 757859f54b3SAlexander Polyakov 7587ba6e991SJim Ingham bool abort_other_plans = false; 75994b09246SJim Ingham bool stop_other_threads = false; 7601ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 761b9c1b51eSKate Stone if (sb_frame.GetThread().GetThreadID() != thread->GetID()) { 762859f54b3SAlexander Polyakov error.SetErrorString("passed a frame from another thread"); 763859f54b3SAlexander Polyakov return; 764989a7558SJim Ingham } 765481cef25SGreg Clayton 766e103ae92SJonas Devlieghere Status new_plan_status; 767b9c1b51eSKate Stone ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepOut( 768248a1305SKonrad Kleine abort_other_plans, nullptr, false, stop_other_threads, eVoteYes, 769e103ae92SJonas Devlieghere eVoteNoOpinion, frame_sp->GetFrameIndex(), new_plan_status)); 77030fdc8d8SChris Lattner 771e103ae92SJonas Devlieghere if (new_plan_status.Success()) 772859f54b3SAlexander Polyakov error = ResumeNewPlan(exe_ctx, new_plan_sp.get()); 773e103ae92SJonas Devlieghere else 774e103ae92SJonas Devlieghere error.SetErrorString(new_plan_status.AsCString()); 77530fdc8d8SChris Lattner } 77630fdc8d8SChris Lattner 777b9c1b51eSKate Stone void SBThread::StepInstruction(bool step_over) { 778baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBThread, StepInstruction, (bool), step_over); 779baf5664fSJonas Devlieghere 780859f54b3SAlexander Polyakov SBError error; // Ignored 781859f54b3SAlexander Polyakov StepInstruction(step_over, error); 782859f54b3SAlexander Polyakov } 783859f54b3SAlexander Polyakov 784859f54b3SAlexander Polyakov void SBThread::StepInstruction(bool step_over, SBError &error) { 785baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBThread, StepInstruction, (bool, lldb::SBError &), 786baf5664fSJonas Devlieghere step_over, error); 787baf5664fSJonas Devlieghere 788bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 789bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 790ceb6b139SCaroline Tice 791859f54b3SAlexander Polyakov if (!exe_ctx.HasThreadScope()) { 792859f54b3SAlexander Polyakov error.SetErrorString("this SBThread object is invalid"); 793859f54b3SAlexander Polyakov return; 794859f54b3SAlexander Polyakov } 795859f54b3SAlexander Polyakov 7961ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 797e103ae92SJonas Devlieghere Status new_plan_status; 798e103ae92SJonas Devlieghere ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepSingleInstruction( 799e103ae92SJonas Devlieghere step_over, true, true, new_plan_status)); 80064e7ead1SJim Ingham 801e103ae92SJonas Devlieghere if (new_plan_status.Success()) 802859f54b3SAlexander Polyakov error = ResumeNewPlan(exe_ctx, new_plan_sp.get()); 803e103ae92SJonas Devlieghere else 804e103ae92SJonas Devlieghere error.SetErrorString(new_plan_status.AsCString()); 80530fdc8d8SChris Lattner } 80630fdc8d8SChris Lattner 807b9c1b51eSKate Stone void SBThread::RunToAddress(lldb::addr_t addr) { 808baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBThread, RunToAddress, (lldb::addr_t), addr); 809baf5664fSJonas Devlieghere 810859f54b3SAlexander Polyakov SBError error; // Ignored 811859f54b3SAlexander Polyakov RunToAddress(addr, error); 812859f54b3SAlexander Polyakov } 813859f54b3SAlexander Polyakov 814859f54b3SAlexander Polyakov void SBThread::RunToAddress(lldb::addr_t addr, SBError &error) { 815baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBThread, RunToAddress, 816baf5664fSJonas Devlieghere (lldb::addr_t, lldb::SBError &), addr, error); 817baf5664fSJonas Devlieghere 818bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 819bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 820ceb6b139SCaroline Tice 821859f54b3SAlexander Polyakov if (!exe_ctx.HasThreadScope()) { 822859f54b3SAlexander Polyakov error.SetErrorString("this SBThread object is invalid"); 823859f54b3SAlexander Polyakov return; 824859f54b3SAlexander Polyakov } 825859f54b3SAlexander Polyakov 8267ba6e991SJim Ingham bool abort_other_plans = false; 82730fdc8d8SChris Lattner bool stop_other_threads = true; 82830fdc8d8SChris Lattner 829e72dfb32SGreg Clayton Address target_addr(addr); 83030fdc8d8SChris Lattner 8311ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 8321ac04c30SGreg Clayton 833e103ae92SJonas Devlieghere Status new_plan_status; 834b9c1b51eSKate Stone ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForRunToAddress( 835e103ae92SJonas Devlieghere abort_other_plans, target_addr, stop_other_threads, new_plan_status)); 83664e7ead1SJim Ingham 837e103ae92SJonas Devlieghere if (new_plan_status.Success()) 838859f54b3SAlexander Polyakov error = ResumeNewPlan(exe_ctx, new_plan_sp.get()); 839e103ae92SJonas Devlieghere else 840e103ae92SJonas Devlieghere error.SetErrorString(new_plan_status.AsCString()); 84130fdc8d8SChris Lattner } 84230fdc8d8SChris Lattner 843b9c1b51eSKate Stone SBError SBThread::StepOverUntil(lldb::SBFrame &sb_frame, 844b9c1b51eSKate Stone lldb::SBFileSpec &sb_file_spec, uint32_t line) { 845baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBError, SBThread, StepOverUntil, 846baf5664fSJonas Devlieghere (lldb::SBFrame &, lldb::SBFileSpec &, uint32_t), sb_frame, 847baf5664fSJonas Devlieghere sb_file_spec, line); 848baf5664fSJonas Devlieghere 849481cef25SGreg Clayton SBError sb_error; 850481cef25SGreg Clayton char path[PATH_MAX]; 851481cef25SGreg Clayton 852bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 853bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 8544fc6cb9cSJim Ingham 855b57e4a1bSJason Molenda StackFrameSP frame_sp(sb_frame.GetFrameSP()); 85617a6ad05SGreg Clayton 857b9c1b51eSKate Stone if (exe_ctx.HasThreadScope()) { 8581ac04c30SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 8591ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 860481cef25SGreg Clayton 861b9c1b51eSKate Stone if (line == 0) { 862481cef25SGreg Clayton sb_error.SetErrorString("invalid line argument"); 863baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_error); 864481cef25SGreg Clayton } 865481cef25SGreg Clayton 866b9c1b51eSKate Stone if (!frame_sp) { 8671ac04c30SGreg Clayton frame_sp = thread->GetSelectedFrame(); 868481cef25SGreg Clayton if (!frame_sp) 8691ac04c30SGreg Clayton frame_sp = thread->GetStackFrameAtIndex(0); 870481cef25SGreg Clayton } 871481cef25SGreg Clayton 872481cef25SGreg Clayton SymbolContext frame_sc; 873b9c1b51eSKate Stone if (!frame_sp) { 874481cef25SGreg Clayton sb_error.SetErrorString("no valid frames in thread to step"); 875baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_error); 876481cef25SGreg Clayton } 877481cef25SGreg Clayton 878481cef25SGreg Clayton // If we have a frame, get its line 879b9c1b51eSKate Stone frame_sc = frame_sp->GetSymbolContext( 880b9c1b51eSKate Stone eSymbolContextCompUnit | eSymbolContextFunction | 881b9c1b51eSKate Stone eSymbolContextLineEntry | eSymbolContextSymbol); 882481cef25SGreg Clayton 883248a1305SKonrad Kleine if (frame_sc.comp_unit == nullptr) { 884b9c1b51eSKate Stone sb_error.SetErrorStringWithFormat( 885b9c1b51eSKate Stone "frame %u doesn't have debug information", frame_sp->GetFrameIndex()); 886baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_error); 887481cef25SGreg Clayton } 888481cef25SGreg Clayton 889481cef25SGreg Clayton FileSpec step_file_spec; 890b9c1b51eSKate Stone if (sb_file_spec.IsValid()) { 891481cef25SGreg Clayton // The file spec passed in was valid, so use it 892481cef25SGreg Clayton step_file_spec = sb_file_spec.ref(); 893b9c1b51eSKate Stone } else { 894481cef25SGreg Clayton if (frame_sc.line_entry.IsValid()) 895481cef25SGreg Clayton step_file_spec = frame_sc.line_entry.file; 896b9c1b51eSKate Stone else { 897481cef25SGreg Clayton sb_error.SetErrorString("invalid file argument or no file for frame"); 898baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_error); 899481cef25SGreg Clayton } 900481cef25SGreg Clayton } 901481cef25SGreg Clayton 9029b70ddb3SJim Ingham // Grab the current function, then we will make sure the "until" address is 9039b70ddb3SJim Ingham // within the function. We discard addresses that are out of the current 904b9c1b51eSKate Stone // function, and then if there are no addresses remaining, give an 90505097246SAdrian Prantl // appropriate error message. 9069b70ddb3SJim Ingham 9079b70ddb3SJim Ingham bool all_in_function = true; 9089b70ddb3SJim Ingham AddressRange fun_range = frame_sc.function->GetAddressRange(); 9099b70ddb3SJim Ingham 910481cef25SGreg Clayton std::vector<addr_t> step_over_until_addrs; 9117ba6e991SJim Ingham const bool abort_other_plans = false; 912c02e3344SJim Ingham const bool stop_other_threads = false; 913481cef25SGreg Clayton const bool check_inlines = true; 914481cef25SGreg Clayton const bool exact = false; 915481cef25SGreg Clayton 916481cef25SGreg Clayton SymbolContextList sc_list; 917c671639aSKonrad Kleine frame_sc.comp_unit->ResolveSymbolContext(step_file_spec, line, 918c671639aSKonrad Kleine check_inlines, exact, 919c671639aSKonrad Kleine eSymbolContextLineEntry, sc_list); 920c671639aSKonrad Kleine const uint32_t num_matches = sc_list.GetSize(); 921b9c1b51eSKate Stone if (num_matches > 0) { 922481cef25SGreg Clayton SymbolContext sc; 923b9c1b51eSKate Stone for (uint32_t i = 0; i < num_matches; ++i) { 924b9c1b51eSKate Stone if (sc_list.GetContextAtIndex(i, sc)) { 925b9c1b51eSKate Stone addr_t step_addr = 926b9c1b51eSKate Stone sc.line_entry.range.GetBaseAddress().GetLoadAddress(target); 927b9c1b51eSKate Stone if (step_addr != LLDB_INVALID_ADDRESS) { 9289b70ddb3SJim Ingham if (fun_range.ContainsLoadAddress(step_addr, target)) 929481cef25SGreg Clayton step_over_until_addrs.push_back(step_addr); 9309b70ddb3SJim Ingham else 9319b70ddb3SJim Ingham all_in_function = false; 932481cef25SGreg Clayton } 933481cef25SGreg Clayton } 934481cef25SGreg Clayton } 935481cef25SGreg Clayton } 936481cef25SGreg Clayton 937b9c1b51eSKate Stone if (step_over_until_addrs.empty()) { 938b9c1b51eSKate Stone if (all_in_function) { 939481cef25SGreg Clayton step_file_spec.GetPath(path, sizeof(path)); 940b9c1b51eSKate Stone sb_error.SetErrorStringWithFormat("No line entries for %s:%u", path, 941b9c1b51eSKate Stone line); 942b9c1b51eSKate Stone } else 94386edbf41SGreg Clayton sb_error.SetErrorString("step until target not in current function"); 944b9c1b51eSKate Stone } else { 945e103ae92SJonas Devlieghere Status new_plan_status; 946b9c1b51eSKate Stone ThreadPlanSP new_plan_sp(thread->QueueThreadPlanForStepUntil( 947b9c1b51eSKate Stone abort_other_plans, &step_over_until_addrs[0], 948b9c1b51eSKate Stone step_over_until_addrs.size(), stop_other_threads, 949e103ae92SJonas Devlieghere frame_sp->GetFrameIndex(), new_plan_status)); 950481cef25SGreg Clayton 951e103ae92SJonas Devlieghere if (new_plan_status.Success()) 9524d56e9c1SJim Ingham sb_error = ResumeNewPlan(exe_ctx, new_plan_sp.get()); 953e103ae92SJonas Devlieghere else 954e103ae92SJonas Devlieghere sb_error.SetErrorString(new_plan_status.AsCString()); 955481cef25SGreg Clayton } 956b9c1b51eSKate Stone } else { 957481cef25SGreg Clayton sb_error.SetErrorString("this SBThread object is invalid"); 958481cef25SGreg Clayton } 959baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_error); 960481cef25SGreg Clayton } 961481cef25SGreg Clayton 962b9c1b51eSKate Stone SBError SBThread::StepUsingScriptedThreadPlan(const char *script_class_name) { 963baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBError, SBThread, StepUsingScriptedThreadPlan, 964baf5664fSJonas Devlieghere (const char *), script_class_name); 965baf5664fSJonas Devlieghere 966baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT( 967baf5664fSJonas Devlieghere StepUsingScriptedThreadPlan(script_class_name, true)); 968c915a7d2SJim Ingham } 969c915a7d2SJim Ingham 970b9c1b51eSKate Stone SBError SBThread::StepUsingScriptedThreadPlan(const char *script_class_name, 971b9c1b51eSKate Stone bool resume_immediately) { 972baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBError, SBThread, StepUsingScriptedThreadPlan, 973baf5664fSJonas Devlieghere (const char *, bool), script_class_name, 974baf5664fSJonas Devlieghere resume_immediately); 975baf5664fSJonas Devlieghere 97627a14f19SJim Ingham lldb::SBStructuredData no_data; 977*3da7dcf3SJonas Devlieghere return LLDB_RECORD_RESULT(StepUsingScriptedThreadPlan( 978*3da7dcf3SJonas Devlieghere script_class_name, no_data, resume_immediately)); 97927a14f19SJim Ingham } 98027a14f19SJim Ingham 98127a14f19SJim Ingham SBError SBThread::StepUsingScriptedThreadPlan(const char *script_class_name, 98227a14f19SJim Ingham SBStructuredData &args_data, 98327a14f19SJim Ingham bool resume_immediately) { 98427a14f19SJim Ingham LLDB_RECORD_METHOD(lldb::SBError, SBThread, StepUsingScriptedThreadPlan, 98527a14f19SJim Ingham (const char *, lldb::SBStructuredData &, bool), 986*3da7dcf3SJonas Devlieghere script_class_name, args_data, resume_immediately); 98727a14f19SJim Ingham 988e103ae92SJonas Devlieghere SBError error; 9892bdbfd50SJim Ingham 990bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 991bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 9922bdbfd50SJim Ingham 993b9c1b51eSKate Stone if (!exe_ctx.HasThreadScope()) { 994e103ae92SJonas Devlieghere error.SetErrorString("this SBThread object is invalid"); 995baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(error); 9962bdbfd50SJim Ingham } 9972bdbfd50SJim Ingham 9982bdbfd50SJim Ingham Thread *thread = exe_ctx.GetThreadPtr(); 999e103ae92SJonas Devlieghere Status new_plan_status; 100027a14f19SJim Ingham StructuredData::ObjectSP obj_sp = args_data.m_impl_up->GetObjectSP(); 100127a14f19SJim Ingham 1002e103ae92SJonas Devlieghere ThreadPlanSP new_plan_sp = thread->QueueThreadPlanForStepScripted( 100327a14f19SJim Ingham false, script_class_name, obj_sp, false, new_plan_status); 10042bdbfd50SJim Ingham 1005e103ae92SJonas Devlieghere if (new_plan_status.Fail()) { 1006e103ae92SJonas Devlieghere error.SetErrorString(new_plan_status.AsCString()); 1007baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(error); 1008c915a7d2SJim Ingham } 1009c915a7d2SJim Ingham 1010e103ae92SJonas Devlieghere if (!resume_immediately) 1011baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(error); 1012c915a7d2SJim Ingham 1013e103ae92SJonas Devlieghere if (new_plan_status.Success()) 1014e103ae92SJonas Devlieghere error = ResumeNewPlan(exe_ctx, new_plan_sp.get()); 1015e103ae92SJonas Devlieghere else 1016e103ae92SJonas Devlieghere error.SetErrorString(new_plan_status.AsCString()); 10172bdbfd50SJim Ingham 1018baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(error); 10192bdbfd50SJim Ingham } 10202bdbfd50SJim Ingham 1021b9c1b51eSKate Stone SBError SBThread::JumpToLine(lldb::SBFileSpec &file_spec, uint32_t line) { 1022baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBError, SBThread, JumpToLine, 1023baf5664fSJonas Devlieghere (lldb::SBFileSpec &, uint32_t), file_spec, line); 1024baf5664fSJonas Devlieghere 1025f86248d9SRichard Mitton SBError sb_error; 1026f86248d9SRichard Mitton 1027bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1028bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1029f86248d9SRichard Mitton 1030b9c1b51eSKate Stone if (!exe_ctx.HasThreadScope()) { 1031f86248d9SRichard Mitton sb_error.SetErrorString("this SBThread object is invalid"); 1032baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_error); 1033f86248d9SRichard Mitton } 1034f86248d9SRichard Mitton 1035f86248d9SRichard Mitton Thread *thread = exe_ctx.GetThreadPtr(); 1036f86248d9SRichard Mitton 103728e4942bSPavel Labath Status err = thread->JumpToLine(file_spec.ref(), line, true); 1038f86248d9SRichard Mitton sb_error.SetError(err); 1039baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_error); 1040f86248d9SRichard Mitton } 1041f86248d9SRichard Mitton 1042b9c1b51eSKate Stone SBError SBThread::ReturnFromFrame(SBFrame &frame, SBValue &return_value) { 1043baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBError, SBThread, ReturnFromFrame, 1044baf5664fSJonas Devlieghere (lldb::SBFrame &, lldb::SBValue &), frame, return_value); 1045baf5664fSJonas Devlieghere 10464413758cSJim Ingham SBError sb_error; 10474413758cSJim Ingham 1048bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1049bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 10504413758cSJim Ingham 1051b9c1b51eSKate Stone if (exe_ctx.HasThreadScope()) { 10524413758cSJim Ingham Thread *thread = exe_ctx.GetThreadPtr(); 1053b9c1b51eSKate Stone sb_error.SetError( 1054b9c1b51eSKate Stone thread->ReturnFromFrame(frame.GetFrameSP(), return_value.GetSP())); 10554413758cSJim Ingham } 10564413758cSJim Ingham 1057baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_error); 10584413758cSJim Ingham } 10594413758cSJim Ingham 1060b9c1b51eSKate Stone SBError SBThread::UnwindInnermostExpression() { 1061baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::SBError, SBThread, 1062baf5664fSJonas Devlieghere UnwindInnermostExpression); 1063baf5664fSJonas Devlieghere 10644ac8e93aSJim Ingham SBError sb_error; 10654ac8e93aSJim Ingham 10664ac8e93aSJim Ingham std::unique_lock<std::recursive_mutex> lock; 10674ac8e93aSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 10684ac8e93aSJim Ingham 1069b9c1b51eSKate Stone if (exe_ctx.HasThreadScope()) { 10704ac8e93aSJim Ingham Thread *thread = exe_ctx.GetThreadPtr(); 10714ac8e93aSJim Ingham sb_error.SetError(thread->UnwindInnermostExpression()); 10724ac8e93aSJim Ingham if (sb_error.Success()) 10734ac8e93aSJim Ingham thread->SetSelectedFrameByIndex(0, false); 10744ac8e93aSJim Ingham } 10754ac8e93aSJim Ingham 1076baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_error); 10774ac8e93aSJim Ingham } 1078481cef25SGreg Clayton 1079b9c1b51eSKate Stone bool SBThread::Suspend() { 1080baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(bool, SBThread, Suspend); 1081baf5664fSJonas Devlieghere 1082859f54b3SAlexander Polyakov SBError error; // Ignored 1083859f54b3SAlexander Polyakov return Suspend(error); 1084859f54b3SAlexander Polyakov } 1085859f54b3SAlexander Polyakov 1086859f54b3SAlexander Polyakov bool SBThread::Suspend(SBError &error) { 1087baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBThread, Suspend, (lldb::SBError &), error); 1088baf5664fSJonas Devlieghere 1089b2e7d28eSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1090b2e7d28eSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1091b2e7d28eSJim Ingham 1092c9858e4dSGreg Clayton bool result = false; 1093b9c1b51eSKate Stone if (exe_ctx.HasThreadScope()) { 1094c9858e4dSGreg Clayton Process::StopLocker stop_locker; 1095b9c1b51eSKate Stone if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { 10961ac04c30SGreg Clayton exe_ctx.GetThreadPtr()->SetResumeState(eStateSuspended); 1097c9858e4dSGreg Clayton result = true; 1098b9c1b51eSKate Stone } else { 1099859f54b3SAlexander Polyakov error.SetErrorString("process is running"); 1100c9858e4dSGreg Clayton } 1101859f54b3SAlexander Polyakov } else 1102859f54b3SAlexander Polyakov error.SetErrorString("this SBThread object is invalid"); 1103c9858e4dSGreg Clayton return result; 1104722a0cdcSGreg Clayton } 1105722a0cdcSGreg Clayton 1106b9c1b51eSKate Stone bool SBThread::Resume() { 1107baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(bool, SBThread, Resume); 1108baf5664fSJonas Devlieghere 1109859f54b3SAlexander Polyakov SBError error; // Ignored 1110859f54b3SAlexander Polyakov return Resume(error); 1111859f54b3SAlexander Polyakov } 1112859f54b3SAlexander Polyakov 1113859f54b3SAlexander Polyakov bool SBThread::Resume(SBError &error) { 1114baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBThread, Resume, (lldb::SBError &), error); 1115baf5664fSJonas Devlieghere 1116b2e7d28eSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1117b2e7d28eSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1118b2e7d28eSJim Ingham 1119c9858e4dSGreg Clayton bool result = false; 1120b9c1b51eSKate Stone if (exe_ctx.HasThreadScope()) { 1121c9858e4dSGreg Clayton Process::StopLocker stop_locker; 1122b9c1b51eSKate Stone if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { 11236c9ed91cSJim Ingham const bool override_suspend = true; 11246c9ed91cSJim Ingham exe_ctx.GetThreadPtr()->SetResumeState(eStateRunning, override_suspend); 1125c9858e4dSGreg Clayton result = true; 1126b9c1b51eSKate Stone } else { 1127859f54b3SAlexander Polyakov error.SetErrorString("process is running"); 1128c9858e4dSGreg Clayton } 1129859f54b3SAlexander Polyakov } else 1130859f54b3SAlexander Polyakov error.SetErrorString("this SBThread object is invalid"); 1131c9858e4dSGreg Clayton return result; 1132722a0cdcSGreg Clayton } 1133722a0cdcSGreg Clayton 1134b9c1b51eSKate Stone bool SBThread::IsSuspended() { 1135baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(bool, SBThread, IsSuspended); 1136baf5664fSJonas Devlieghere 1137b2e7d28eSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1138b2e7d28eSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1139b2e7d28eSJim Ingham 11401ac04c30SGreg Clayton if (exe_ctx.HasThreadScope()) 11411ac04c30SGreg Clayton return exe_ctx.GetThreadPtr()->GetResumeState() == eStateSuspended; 1142722a0cdcSGreg Clayton return false; 1143722a0cdcSGreg Clayton } 1144722a0cdcSGreg Clayton 1145b9c1b51eSKate Stone bool SBThread::IsStopped() { 1146baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(bool, SBThread, IsStopped); 1147baf5664fSJonas Devlieghere 1148b2e7d28eSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1149b2e7d28eSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1150b2e7d28eSJim Ingham 1151a75418dbSAndrew Kaylor if (exe_ctx.HasThreadScope()) 1152a75418dbSAndrew Kaylor return StateIsStoppedState(exe_ctx.GetThreadPtr()->GetState(), true); 1153a75418dbSAndrew Kaylor return false; 1154a75418dbSAndrew Kaylor } 1155a75418dbSAndrew Kaylor 1156b9c1b51eSKate Stone SBProcess SBThread::GetProcess() { 1157baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::SBProcess, SBThread, GetProcess); 1158baf5664fSJonas Devlieghere 1159b9556accSGreg Clayton SBProcess sb_process; 1160b2e7d28eSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1161b2e7d28eSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1162b2e7d28eSJim Ingham 1163b9c1b51eSKate Stone if (exe_ctx.HasThreadScope()) { 1164b9c1b51eSKate Stone // Have to go up to the target so we can get a shared pointer to our 1165b9c1b51eSKate Stone // process... 11661ac04c30SGreg Clayton sb_process.SetSP(exe_ctx.GetProcessSP()); 116730fdc8d8SChris Lattner } 1168ceb6b139SCaroline Tice 1169baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_process); 117030fdc8d8SChris Lattner } 117130fdc8d8SChris Lattner 1172b9c1b51eSKate Stone uint32_t SBThread::GetNumFrames() { 1173baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBThread, GetNumFrames); 1174baf5664fSJonas Devlieghere 1175ceb6b139SCaroline Tice uint32_t num_frames = 0; 1176bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1177bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 11784fc6cb9cSJim Ingham 1179b9c1b51eSKate Stone if (exe_ctx.HasThreadScope()) { 11807fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1181b9c1b51eSKate Stone if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { 11821ac04c30SGreg Clayton num_frames = exe_ctx.GetThreadPtr()->GetStackFrameCount(); 1183c9858e4dSGreg Clayton } 11847fdf9ef1SGreg Clayton } 1185ceb6b139SCaroline Tice 1186ceb6b139SCaroline Tice return num_frames; 118730fdc8d8SChris Lattner } 118830fdc8d8SChris Lattner 1189b9c1b51eSKate Stone SBFrame SBThread::GetFrameAtIndex(uint32_t idx) { 1190baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBFrame, SBThread, GetFrameAtIndex, (uint32_t), idx); 1191baf5664fSJonas Devlieghere 119230fdc8d8SChris Lattner SBFrame sb_frame; 1193b57e4a1bSJason Molenda StackFrameSP frame_sp; 1194bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1195bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 11964fc6cb9cSJim Ingham 1197b9c1b51eSKate Stone if (exe_ctx.HasThreadScope()) { 11987fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1199b9c1b51eSKate Stone if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { 12001ac04c30SGreg Clayton frame_sp = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex(idx); 1201b9556accSGreg Clayton sb_frame.SetFrameSP(frame_sp); 1202c9858e4dSGreg Clayton } 12037fdf9ef1SGreg Clayton } 1204ceb6b139SCaroline Tice 1205baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_frame); 120630fdc8d8SChris Lattner } 120730fdc8d8SChris Lattner 1208b9c1b51eSKate Stone lldb::SBFrame SBThread::GetSelectedFrame() { 1209baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::SBFrame, SBThread, GetSelectedFrame); 1210baf5664fSJonas Devlieghere 1211f028a1fbSGreg Clayton SBFrame sb_frame; 1212b57e4a1bSJason Molenda StackFrameSP frame_sp; 1213bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1214bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 12154fc6cb9cSJim Ingham 1216b9c1b51eSKate Stone if (exe_ctx.HasThreadScope()) { 12177fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1218b9c1b51eSKate Stone if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { 12191ac04c30SGreg Clayton frame_sp = exe_ctx.GetThreadPtr()->GetSelectedFrame(); 1220b9556accSGreg Clayton sb_frame.SetFrameSP(frame_sp); 1221c9858e4dSGreg Clayton } 12227fdf9ef1SGreg Clayton } 1223f028a1fbSGreg Clayton 1224baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_frame); 1225f028a1fbSGreg Clayton } 1226f028a1fbSGreg Clayton 1227b9c1b51eSKate Stone lldb::SBFrame SBThread::SetSelectedFrame(uint32_t idx) { 1228baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBFrame, SBThread, SetSelectedFrame, (uint32_t), 1229baf5664fSJonas Devlieghere idx); 1230baf5664fSJonas Devlieghere 1231f028a1fbSGreg Clayton SBFrame sb_frame; 1232b57e4a1bSJason Molenda StackFrameSP frame_sp; 1233bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1234bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 12354fc6cb9cSJim Ingham 1236b9c1b51eSKate Stone if (exe_ctx.HasThreadScope()) { 12377fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1238b9c1b51eSKate Stone if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { 12391ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 12401ac04c30SGreg Clayton frame_sp = thread->GetStackFrameAtIndex(idx); 1241b9c1b51eSKate Stone if (frame_sp) { 12421ac04c30SGreg Clayton thread->SetSelectedFrame(frame_sp.get()); 1243b9556accSGreg Clayton sb_frame.SetFrameSP(frame_sp); 1244f028a1fbSGreg Clayton } 1245c9858e4dSGreg Clayton } 12467fdf9ef1SGreg Clayton } 1247f028a1fbSGreg Clayton 1248baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_frame); 1249f028a1fbSGreg Clayton } 1250f028a1fbSGreg Clayton 1251b9c1b51eSKate Stone bool SBThread::EventIsThreadEvent(const SBEvent &event) { 1252baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD(bool, SBThread, EventIsThreadEvent, 1253baf5664fSJonas Devlieghere (const lldb::SBEvent &), event); 1254baf5664fSJonas Devlieghere 1255248a1305SKonrad Kleine return Thread::ThreadEventData::GetEventDataFromEvent(event.get()) != nullptr; 12564f465cffSJim Ingham } 12574f465cffSJim Ingham 1258b9c1b51eSKate Stone SBFrame SBThread::GetStackFrameFromEvent(const SBEvent &event) { 1259baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD(lldb::SBFrame, SBThread, GetStackFrameFromEvent, 1260baf5664fSJonas Devlieghere (const lldb::SBEvent &), event); 1261baf5664fSJonas Devlieghere 1262baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT( 1263baf5664fSJonas Devlieghere Thread::ThreadEventData::GetStackFrameFromEvent(event.get())); 12644f465cffSJim Ingham } 12654f465cffSJim Ingham 1266b9c1b51eSKate Stone SBThread SBThread::GetThreadFromEvent(const SBEvent &event) { 1267baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD(lldb::SBThread, SBThread, GetThreadFromEvent, 1268baf5664fSJonas Devlieghere (const lldb::SBEvent &), event); 1269baf5664fSJonas Devlieghere 1270baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT( 1271baf5664fSJonas Devlieghere Thread::ThreadEventData::GetThreadFromEvent(event.get())); 12724f465cffSJim Ingham } 1273f028a1fbSGreg Clayton 1274b9c1b51eSKate Stone bool SBThread::operator==(const SBThread &rhs) const { 1275baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(bool, SBThread, operator==,(const lldb::SBThread &), 1276baf5664fSJonas Devlieghere rhs); 1277baf5664fSJonas Devlieghere 1278b9c1b51eSKate Stone return m_opaque_sp->GetThreadSP().get() == 1279b9c1b51eSKate Stone rhs.m_opaque_sp->GetThreadSP().get(); 128030fdc8d8SChris Lattner } 128130fdc8d8SChris Lattner 1282b9c1b51eSKate Stone bool SBThread::operator!=(const SBThread &rhs) const { 1283baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(bool, SBThread, operator!=,(const lldb::SBThread &), 1284baf5664fSJonas Devlieghere rhs); 1285baf5664fSJonas Devlieghere 1286b9c1b51eSKate Stone return m_opaque_sp->GetThreadSP().get() != 1287b9c1b51eSKate Stone rhs.m_opaque_sp->GetThreadSP().get(); 128830fdc8d8SChris Lattner } 1289dde9cff3SCaroline Tice 1290b9c1b51eSKate Stone bool SBThread::GetStatus(SBStream &status) const { 1291baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(bool, SBThread, GetStatus, (lldb::SBStream &), 1292baf5664fSJonas Devlieghere status); 1293baf5664fSJonas Devlieghere 12944f465cffSJim Ingham Stream &strm = status.ref(); 12954f465cffSJim Ingham 1296b2e7d28eSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1297b2e7d28eSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1298b2e7d28eSJim Ingham 1299b9c1b51eSKate Stone if (exe_ctx.HasThreadScope()) { 13006a9767c7SJim Ingham exe_ctx.GetThreadPtr()->GetStatus(strm, 0, 1, 1, true); 1301b9c1b51eSKate Stone } else 13024f465cffSJim Ingham strm.PutCString("No status"); 13034f465cffSJim Ingham 13044f465cffSJim Ingham return true; 13054f465cffSJim Ingham } 13064f465cffSJim Ingham 1307b9c1b51eSKate Stone bool SBThread::GetDescription(SBStream &description) const { 1308baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(bool, SBThread, GetDescription, (lldb::SBStream &), 1309baf5664fSJonas Devlieghere description); 1310baf5664fSJonas Devlieghere 13116a9767c7SJim Ingham return GetDescription(description, false); 13126a9767c7SJim Ingham } 13136a9767c7SJim Ingham 13146a9767c7SJim Ingham bool SBThread::GetDescription(SBStream &description, bool stop_format) const { 1315baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(bool, SBThread, GetDescription, 1316baf5664fSJonas Devlieghere (lldb::SBStream &, bool), description, stop_format); 1317baf5664fSJonas Devlieghere 1318da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1319da7bc7d0SGreg Clayton 1320b2e7d28eSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1321b2e7d28eSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1322b2e7d28eSJim Ingham 1323b9c1b51eSKate Stone if (exe_ctx.HasThreadScope()) { 1324b9c1b51eSKate Stone exe_ctx.GetThreadPtr()->DumpUsingSettingsFormat(strm, 13256a9767c7SJim Ingham LLDB_INVALID_THREAD_ID, 13266a9767c7SJim Ingham stop_format); 1327b9c1b51eSKate Stone // strm.Printf("SBThread: tid = 0x%4.4" PRIx64, 1328b9c1b51eSKate Stone // exe_ctx.GetThreadPtr()->GetID()); 1329b9c1b51eSKate Stone } else 1330da7bc7d0SGreg Clayton strm.PutCString("No value"); 1331ceb6b139SCaroline Tice 1332ceb6b139SCaroline Tice return true; 1333ceb6b139SCaroline Tice } 13345dd4916fSJason Molenda 1335b9c1b51eSKate Stone SBThread SBThread::GetExtendedBacktraceThread(const char *type) { 1336baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBThread, SBThread, GetExtendedBacktraceThread, 1337baf5664fSJonas Devlieghere (const char *), type); 1338baf5664fSJonas Devlieghere 1339bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1340bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 13415dd4916fSJason Molenda SBThread sb_origin_thread; 13425dd4916fSJason Molenda 13435dd4916fSJason Molenda Process::StopLocker stop_locker; 1344b9c1b51eSKate Stone if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) { 1345b78094abSJim Ingham if (exe_ctx.HasThreadScope()) { 13467a2f7904SJason Molenda ThreadSP real_thread(exe_ctx.GetThreadSP()); 1347b9c1b51eSKate Stone if (real_thread) { 13485dd4916fSJason Molenda ConstString type_const(type); 13497a2f7904SJason Molenda Process *process = exe_ctx.GetProcessPtr(); 1350b9c1b51eSKate Stone if (process) { 13517a2f7904SJason Molenda SystemRuntime *runtime = process->GetSystemRuntime(); 1352b9c1b51eSKate Stone if (runtime) { 1353b9c1b51eSKate Stone ThreadSP new_thread_sp( 1354b9c1b51eSKate Stone runtime->GetExtendedBacktraceThread(real_thread, type_const)); 1355b9c1b51eSKate Stone if (new_thread_sp) { 1356b9c1b51eSKate Stone // Save this in the Process' ExtendedThreadList so a strong 135705097246SAdrian Prantl // pointer retains the object. 13587a2f7904SJason Molenda process->GetExtendedThreadList().AddThread(new_thread_sp); 13597a2f7904SJason Molenda sb_origin_thread.SetThread(new_thread_sp); 1360a6e9130dSJason Molenda } 1361a6e9130dSJason Molenda } 13627a2f7904SJason Molenda } 13635dd4916fSJason Molenda } 13645dd4916fSJason Molenda } 13655dd4916fSJason Molenda } 13665dd4916fSJason Molenda 1367baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_origin_thread); 13685dd4916fSJason Molenda } 13698ee9cb58SJason Molenda 1370b9c1b51eSKate Stone uint32_t SBThread::GetExtendedBacktraceOriginatingIndexID() { 1371baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBThread, 1372baf5664fSJonas Devlieghere GetExtendedBacktraceOriginatingIndexID); 1373baf5664fSJonas Devlieghere 13748ee9cb58SJason Molenda ThreadSP thread_sp(m_opaque_sp->GetThreadSP()); 13758ee9cb58SJason Molenda if (thread_sp) 13768ee9cb58SJason Molenda return thread_sp->GetExtendedBacktraceOriginatingIndexID(); 13778ee9cb58SJason Molenda return LLDB_INVALID_INDEX32; 13788ee9cb58SJason Molenda } 1379b4892cd2SJason Molenda 1380e60bc53bSKuba Mracek SBValue SBThread::GetCurrentException() { 1381baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::SBValue, SBThread, GetCurrentException); 1382e60bc53bSKuba Mracek 1383baf5664fSJonas Devlieghere ThreadSP thread_sp(m_opaque_sp->GetThreadSP()); 1384baf5664fSJonas Devlieghere if (!thread_sp) 1385baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(SBValue()); 1386baf5664fSJonas Devlieghere 1387baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(SBValue(thread_sp->GetCurrentException())); 1388e60bc53bSKuba Mracek } 1389e60bc53bSKuba Mracek 1390e60bc53bSKuba Mracek SBThread SBThread::GetCurrentExceptionBacktrace() { 1391baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::SBThread, SBThread, 1392baf5664fSJonas Devlieghere GetCurrentExceptionBacktrace); 1393e60bc53bSKuba Mracek 1394baf5664fSJonas Devlieghere ThreadSP thread_sp(m_opaque_sp->GetThreadSP()); 1395baf5664fSJonas Devlieghere if (!thread_sp) 1396baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(SBThread()); 1397baf5664fSJonas Devlieghere 1398baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT( 1399baf5664fSJonas Devlieghere SBThread(thread_sp->GetCurrentExceptionBacktrace())); 1400c9e1190aSKuba Mracek } 1401e60bc53bSKuba Mracek 1402b9c1b51eSKate Stone bool SBThread::SafeToCallFunctions() { 1403baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(bool, SBThread, SafeToCallFunctions); 1404baf5664fSJonas Devlieghere 1405b4892cd2SJason Molenda ThreadSP thread_sp(m_opaque_sp->GetThreadSP()); 1406b4892cd2SJason Molenda if (thread_sp) 1407b4892cd2SJason Molenda return thread_sp->SafeToCallFunctions(); 1408b4892cd2SJason Molenda return true; 1409b4892cd2SJason Molenda } 14102bdbfd50SJim Ingham 1411b9c1b51eSKate Stone lldb_private::Thread *SBThread::operator->() { 141226ca5a57SPavel Labath return get(); 14132bdbfd50SJim Ingham } 14142bdbfd50SJim Ingham 1415b9c1b51eSKate Stone lldb_private::Thread *SBThread::get() { 141626ca5a57SPavel Labath return m_opaque_sp->GetThreadSP().get(); 14172bdbfd50SJim Ingham } 1418ae211eceSMichal Gorny 1419ae211eceSMichal Gorny namespace lldb_private { 1420ae211eceSMichal Gorny namespace repro { 1421ae211eceSMichal Gorny 1422ae211eceSMichal Gorny template <> 1423ae211eceSMichal Gorny void RegisterMethods<SBThread>(Registry &R) { 1424ae211eceSMichal Gorny LLDB_REGISTER_STATIC_METHOD(const char *, SBThread, GetBroadcasterClassName, 1425ae211eceSMichal Gorny ()); 1426ae211eceSMichal Gorny LLDB_REGISTER_CONSTRUCTOR(SBThread, ()); 1427ae211eceSMichal Gorny LLDB_REGISTER_CONSTRUCTOR(SBThread, (const lldb::ThreadSP &)); 1428ae211eceSMichal Gorny LLDB_REGISTER_CONSTRUCTOR(SBThread, (const lldb::SBThread &)); 1429ae211eceSMichal Gorny LLDB_REGISTER_METHOD(const lldb::SBThread &, 1430ae211eceSMichal Gorny SBThread, operator=,(const lldb::SBThread &)); 1431ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::SBQueue, SBThread, GetQueue, ()); 1432ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBThread, IsValid, ()); 1433ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBThread, operator bool, ()); 1434ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBThread, Clear, ()); 1435ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::StopReason, SBThread, GetStopReason, ()); 1436ae211eceSMichal Gorny LLDB_REGISTER_METHOD(size_t, SBThread, GetStopReasonDataCount, ()); 1437ae211eceSMichal Gorny LLDB_REGISTER_METHOD(uint64_t, SBThread, GetStopReasonDataAtIndex, 1438ae211eceSMichal Gorny (uint32_t)); 1439ae211eceSMichal Gorny LLDB_REGISTER_METHOD(bool, SBThread, GetStopReasonExtendedInfoAsJSON, 1440ae211eceSMichal Gorny (lldb::SBStream &)); 1441ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBThreadCollection, SBThread, 1442ae211eceSMichal Gorny GetStopReasonExtendedBacktraces, 1443ae211eceSMichal Gorny (lldb::InstrumentationRuntimeType)); 1444ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBValue, SBThread, GetStopReturnValue, ()); 1445ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::tid_t, SBThread, GetThreadID, ()); 1446ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(uint32_t, SBThread, GetIndexID, ()); 1447ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(const char *, SBThread, GetName, ()); 1448ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(const char *, SBThread, GetQueueName, ()); 1449ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(lldb::queue_id_t, SBThread, GetQueueID, ()); 1450ae211eceSMichal Gorny LLDB_REGISTER_METHOD(bool, SBThread, GetInfoItemByPathAsString, 1451ae211eceSMichal Gorny (const char *, lldb::SBStream &)); 1452ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBThread, StepOver, (lldb::RunMode)); 1453ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBThread, StepOver, 1454ae211eceSMichal Gorny (lldb::RunMode, lldb::SBError &)); 1455ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBThread, StepInto, (lldb::RunMode)); 1456ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBThread, StepInto, 1457ae211eceSMichal Gorny (const char *, lldb::RunMode)); 1458ae211eceSMichal Gorny LLDB_REGISTER_METHOD( 1459ae211eceSMichal Gorny void, SBThread, StepInto, 1460ae211eceSMichal Gorny (const char *, uint32_t, lldb::SBError &, lldb::RunMode)); 1461ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBThread, StepOut, ()); 1462ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBThread, StepOut, (lldb::SBError &)); 1463ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBThread, StepOutOfFrame, (lldb::SBFrame &)); 1464ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBThread, StepOutOfFrame, 1465ae211eceSMichal Gorny (lldb::SBFrame &, lldb::SBError &)); 1466ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBThread, StepInstruction, (bool)); 1467ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBThread, StepInstruction, 1468ae211eceSMichal Gorny (bool, lldb::SBError &)); 1469ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBThread, RunToAddress, (lldb::addr_t)); 1470ae211eceSMichal Gorny LLDB_REGISTER_METHOD(void, SBThread, RunToAddress, 1471ae211eceSMichal Gorny (lldb::addr_t, lldb::SBError &)); 1472ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBError, SBThread, StepOverUntil, 1473ae211eceSMichal Gorny (lldb::SBFrame &, lldb::SBFileSpec &, uint32_t)); 1474ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBError, SBThread, StepUsingScriptedThreadPlan, 1475ae211eceSMichal Gorny (const char *)); 1476ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBError, SBThread, StepUsingScriptedThreadPlan, 1477ae211eceSMichal Gorny (const char *, bool)); 147827a14f19SJim Ingham LLDB_REGISTER_METHOD(lldb::SBError, SBThread, StepUsingScriptedThreadPlan, 147927a14f19SJim Ingham (const char *, SBStructuredData &, bool)); 1480ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBError, SBThread, JumpToLine, 1481ae211eceSMichal Gorny (lldb::SBFileSpec &, uint32_t)); 1482ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBError, SBThread, ReturnFromFrame, 1483ae211eceSMichal Gorny (lldb::SBFrame &, lldb::SBValue &)); 1484ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBError, SBThread, UnwindInnermostExpression, 1485ae211eceSMichal Gorny ()); 1486ae211eceSMichal Gorny LLDB_REGISTER_METHOD(bool, SBThread, Suspend, ()); 1487ae211eceSMichal Gorny LLDB_REGISTER_METHOD(bool, SBThread, Suspend, (lldb::SBError &)); 1488ae211eceSMichal Gorny LLDB_REGISTER_METHOD(bool, SBThread, Resume, ()); 1489ae211eceSMichal Gorny LLDB_REGISTER_METHOD(bool, SBThread, Resume, (lldb::SBError &)); 1490ae211eceSMichal Gorny LLDB_REGISTER_METHOD(bool, SBThread, IsSuspended, ()); 1491ae211eceSMichal Gorny LLDB_REGISTER_METHOD(bool, SBThread, IsStopped, ()); 1492ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBProcess, SBThread, GetProcess, ()); 1493ae211eceSMichal Gorny LLDB_REGISTER_METHOD(uint32_t, SBThread, GetNumFrames, ()); 1494ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBFrame, SBThread, GetFrameAtIndex, (uint32_t)); 1495ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBFrame, SBThread, GetSelectedFrame, ()); 1496ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBFrame, SBThread, SetSelectedFrame, (uint32_t)); 1497ae211eceSMichal Gorny LLDB_REGISTER_STATIC_METHOD(bool, SBThread, EventIsThreadEvent, 1498ae211eceSMichal Gorny (const lldb::SBEvent &)); 1499ae211eceSMichal Gorny LLDB_REGISTER_STATIC_METHOD(lldb::SBFrame, SBThread, GetStackFrameFromEvent, 1500ae211eceSMichal Gorny (const lldb::SBEvent &)); 1501ae211eceSMichal Gorny LLDB_REGISTER_STATIC_METHOD(lldb::SBThread, SBThread, GetThreadFromEvent, 1502ae211eceSMichal Gorny (const lldb::SBEvent &)); 1503ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, 1504ae211eceSMichal Gorny SBThread, operator==,(const lldb::SBThread &)); 1505ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, 1506ae211eceSMichal Gorny SBThread, operator!=,(const lldb::SBThread &)); 1507ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBThread, GetStatus, (lldb::SBStream &)); 1508ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBThread, GetDescription, 1509ae211eceSMichal Gorny (lldb::SBStream &)); 1510ae211eceSMichal Gorny LLDB_REGISTER_METHOD_CONST(bool, SBThread, GetDescription, 1511ae211eceSMichal Gorny (lldb::SBStream &, bool)); 1512ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBThread, SBThread, GetExtendedBacktraceThread, 1513ae211eceSMichal Gorny (const char *)); 1514ae211eceSMichal Gorny LLDB_REGISTER_METHOD(uint32_t, SBThread, 1515ae211eceSMichal Gorny GetExtendedBacktraceOriginatingIndexID, ()); 1516ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBValue, SBThread, GetCurrentException, ()); 1517ae211eceSMichal Gorny LLDB_REGISTER_METHOD(lldb::SBThread, SBThread, GetCurrentExceptionBacktrace, 1518ae211eceSMichal Gorny ()); 1519ae211eceSMichal Gorny LLDB_REGISTER_METHOD(bool, SBThread, SafeToCallFunctions, ()); 15202f025bb8SJonas Devlieghere LLDB_REGISTER_CHAR_PTR_REDIRECT(size_t, SBThread, GetStopDescription); 1521ae211eceSMichal Gorny } 1522ae211eceSMichal Gorny 1523ae211eceSMichal Gorny } 1524ae211eceSMichal Gorny } 1525