15ffd83dbSDimitry Andric //===-- SBThreadPlan.cpp --------------------------------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric #include "SBReproducerPrivate.h"
100b57cec5SDimitry Andric #include "lldb/API/SBThread.h"
110b57cec5SDimitry Andric 
120b57cec5SDimitry Andric #include "lldb/API/SBFileSpec.h"
130b57cec5SDimitry Andric #include "lldb/API/SBStream.h"
149dba64beSDimitry Andric #include "lldb/API/SBStructuredData.h"
150b57cec5SDimitry Andric #include "lldb/API/SBSymbolContext.h"
160b57cec5SDimitry Andric #include "lldb/Breakpoint/BreakpointLocation.h"
170b57cec5SDimitry Andric #include "lldb/Core/Debugger.h"
180b57cec5SDimitry Andric #include "lldb/Core/StreamFile.h"
199dba64beSDimitry Andric #include "lldb/Core/StructuredDataImpl.h"
200b57cec5SDimitry Andric #include "lldb/Interpreter/CommandInterpreter.h"
210b57cec5SDimitry Andric #include "lldb/Symbol/CompileUnit.h"
220b57cec5SDimitry Andric #include "lldb/Symbol/SymbolContext.h"
230b57cec5SDimitry Andric #include "lldb/Target/Process.h"
240b57cec5SDimitry Andric #include "lldb/Target/Queue.h"
250b57cec5SDimitry Andric #include "lldb/Target/StopInfo.h"
260b57cec5SDimitry Andric #include "lldb/Target/SystemRuntime.h"
270b57cec5SDimitry Andric #include "lldb/Target/Target.h"
280b57cec5SDimitry Andric #include "lldb/Target/Thread.h"
290b57cec5SDimitry Andric #include "lldb/Target/ThreadPlan.h"
300b57cec5SDimitry Andric #include "lldb/Target/ThreadPlanPython.h"
310b57cec5SDimitry Andric #include "lldb/Target/ThreadPlanStepInRange.h"
320b57cec5SDimitry Andric #include "lldb/Target/ThreadPlanStepInstruction.h"
330b57cec5SDimitry Andric #include "lldb/Target/ThreadPlanStepOut.h"
340b57cec5SDimitry Andric #include "lldb/Target/ThreadPlanStepRange.h"
350b57cec5SDimitry Andric #include "lldb/Utility/State.h"
360b57cec5SDimitry Andric #include "lldb/Utility/Stream.h"
370b57cec5SDimitry Andric #include "lldb/Utility/StructuredData.h"
380b57cec5SDimitry Andric 
390b57cec5SDimitry Andric #include "lldb/API/SBAddress.h"
400b57cec5SDimitry Andric #include "lldb/API/SBDebugger.h"
410b57cec5SDimitry Andric #include "lldb/API/SBEvent.h"
420b57cec5SDimitry Andric #include "lldb/API/SBFrame.h"
430b57cec5SDimitry Andric #include "lldb/API/SBProcess.h"
440b57cec5SDimitry Andric #include "lldb/API/SBThreadPlan.h"
450b57cec5SDimitry Andric #include "lldb/API/SBValue.h"
460b57cec5SDimitry Andric 
470b57cec5SDimitry Andric #include <memory>
480b57cec5SDimitry Andric 
490b57cec5SDimitry Andric using namespace lldb;
500b57cec5SDimitry Andric using namespace lldb_private;
510b57cec5SDimitry Andric 
520b57cec5SDimitry Andric // Constructors
SBThreadPlan()530b57cec5SDimitry Andric SBThreadPlan::SBThreadPlan() { LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBThreadPlan); }
540b57cec5SDimitry Andric 
SBThreadPlan(const ThreadPlanSP & lldb_object_sp)550b57cec5SDimitry Andric SBThreadPlan::SBThreadPlan(const ThreadPlanSP &lldb_object_sp)
56*af732203SDimitry Andric     : m_opaque_wp(lldb_object_sp) {
570b57cec5SDimitry Andric   LLDB_RECORD_CONSTRUCTOR(SBThreadPlan, (const lldb::ThreadPlanSP &),
580b57cec5SDimitry Andric                           lldb_object_sp);
590b57cec5SDimitry Andric }
600b57cec5SDimitry Andric 
SBThreadPlan(const SBThreadPlan & rhs)610b57cec5SDimitry Andric SBThreadPlan::SBThreadPlan(const SBThreadPlan &rhs)
62*af732203SDimitry Andric     : m_opaque_wp(rhs.m_opaque_wp) {
630b57cec5SDimitry Andric   LLDB_RECORD_CONSTRUCTOR(SBThreadPlan, (const lldb::SBThreadPlan &), rhs);
640b57cec5SDimitry Andric }
650b57cec5SDimitry Andric 
SBThreadPlan(lldb::SBThread & sb_thread,const char * class_name)660b57cec5SDimitry Andric SBThreadPlan::SBThreadPlan(lldb::SBThread &sb_thread, const char *class_name) {
670b57cec5SDimitry Andric   LLDB_RECORD_CONSTRUCTOR(SBThreadPlan, (lldb::SBThread &, const char *),
680b57cec5SDimitry Andric                           sb_thread, class_name);
690b57cec5SDimitry Andric 
700b57cec5SDimitry Andric   Thread *thread = sb_thread.get();
710b57cec5SDimitry Andric   if (thread)
72*af732203SDimitry Andric     m_opaque_wp =
73*af732203SDimitry Andric         std::make_shared<ThreadPlanPython>(*thread, class_name, nullptr);
749dba64beSDimitry Andric }
759dba64beSDimitry Andric 
SBThreadPlan(lldb::SBThread & sb_thread,const char * class_name,lldb::SBStructuredData & args_data)769dba64beSDimitry Andric SBThreadPlan::SBThreadPlan(lldb::SBThread &sb_thread, const char *class_name,
779dba64beSDimitry Andric                            lldb::SBStructuredData &args_data) {
789dba64beSDimitry Andric   LLDB_RECORD_CONSTRUCTOR(SBThreadPlan, (lldb::SBThread &, const char *,
799dba64beSDimitry Andric                                          SBStructuredData &),
809dba64beSDimitry Andric                           sb_thread, class_name, args_data);
819dba64beSDimitry Andric 
829dba64beSDimitry Andric   Thread *thread = sb_thread.get();
839dba64beSDimitry Andric   if (thread)
84*af732203SDimitry Andric     m_opaque_wp = std::make_shared<ThreadPlanPython>(*thread, class_name,
859dba64beSDimitry Andric                                                      args_data.m_impl_up.get());
860b57cec5SDimitry Andric }
870b57cec5SDimitry Andric 
880b57cec5SDimitry Andric // Assignment operator
890b57cec5SDimitry Andric 
operator =(const SBThreadPlan & rhs)900b57cec5SDimitry Andric const lldb::SBThreadPlan &SBThreadPlan::operator=(const SBThreadPlan &rhs) {
910b57cec5SDimitry Andric   LLDB_RECORD_METHOD(const lldb::SBThreadPlan &,
920b57cec5SDimitry Andric                      SBThreadPlan, operator=,(const lldb::SBThreadPlan &), rhs);
930b57cec5SDimitry Andric 
940b57cec5SDimitry Andric   if (this != &rhs)
95*af732203SDimitry Andric     m_opaque_wp = rhs.m_opaque_wp;
960b57cec5SDimitry Andric   return LLDB_RECORD_RESULT(*this);
970b57cec5SDimitry Andric }
980b57cec5SDimitry Andric // Destructor
995ffd83dbSDimitry Andric SBThreadPlan::~SBThreadPlan() = default;
1000b57cec5SDimitry Andric 
IsValid() const1010b57cec5SDimitry Andric bool SBThreadPlan::IsValid() const {
1020b57cec5SDimitry Andric   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBThreadPlan, IsValid);
1030b57cec5SDimitry Andric   return this->operator bool();
1040b57cec5SDimitry Andric }
operator bool() const1050b57cec5SDimitry Andric SBThreadPlan::operator bool() const {
1060b57cec5SDimitry Andric   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBThreadPlan, operator bool);
1070b57cec5SDimitry Andric 
108*af732203SDimitry Andric   return static_cast<bool>(GetSP());
1090b57cec5SDimitry Andric }
1100b57cec5SDimitry Andric 
Clear()1110b57cec5SDimitry Andric void SBThreadPlan::Clear() {
1120b57cec5SDimitry Andric   LLDB_RECORD_METHOD_NO_ARGS(void, SBThreadPlan, Clear);
1130b57cec5SDimitry Andric 
114*af732203SDimitry Andric   m_opaque_wp.reset();
1150b57cec5SDimitry Andric }
1160b57cec5SDimitry Andric 
GetStopReason()1170b57cec5SDimitry Andric lldb::StopReason SBThreadPlan::GetStopReason() {
1180b57cec5SDimitry Andric   LLDB_RECORD_METHOD_NO_ARGS(lldb::StopReason, SBThreadPlan, GetStopReason);
1190b57cec5SDimitry Andric 
1200b57cec5SDimitry Andric   return eStopReasonNone;
1210b57cec5SDimitry Andric }
1220b57cec5SDimitry Andric 
GetStopReasonDataCount()1230b57cec5SDimitry Andric size_t SBThreadPlan::GetStopReasonDataCount() {
1240b57cec5SDimitry Andric   LLDB_RECORD_METHOD_NO_ARGS(size_t, SBThreadPlan, GetStopReasonDataCount);
1250b57cec5SDimitry Andric 
1260b57cec5SDimitry Andric   return 0;
1270b57cec5SDimitry Andric }
1280b57cec5SDimitry Andric 
GetStopReasonDataAtIndex(uint32_t idx)1290b57cec5SDimitry Andric uint64_t SBThreadPlan::GetStopReasonDataAtIndex(uint32_t idx) {
1300b57cec5SDimitry Andric   LLDB_RECORD_METHOD(uint64_t, SBThreadPlan, GetStopReasonDataAtIndex,
1310b57cec5SDimitry Andric                      (uint32_t), idx);
1320b57cec5SDimitry Andric 
1330b57cec5SDimitry Andric   return 0;
1340b57cec5SDimitry Andric }
1350b57cec5SDimitry Andric 
GetThread() const1360b57cec5SDimitry Andric SBThread SBThreadPlan::GetThread() const {
1370b57cec5SDimitry Andric   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBThread, SBThreadPlan, GetThread);
1380b57cec5SDimitry Andric 
139*af732203SDimitry Andric   ThreadPlanSP thread_plan_sp(GetSP());
140*af732203SDimitry Andric   if (thread_plan_sp) {
1410b57cec5SDimitry Andric     return LLDB_RECORD_RESULT(
142*af732203SDimitry Andric         SBThread(thread_plan_sp->GetThread().shared_from_this()));
1430b57cec5SDimitry Andric   } else
1440b57cec5SDimitry Andric     return LLDB_RECORD_RESULT(SBThread());
1450b57cec5SDimitry Andric }
1460b57cec5SDimitry Andric 
GetDescription(lldb::SBStream & description) const1470b57cec5SDimitry Andric bool SBThreadPlan::GetDescription(lldb::SBStream &description) const {
1480b57cec5SDimitry Andric   LLDB_RECORD_METHOD_CONST(bool, SBThreadPlan, GetDescription,
1490b57cec5SDimitry Andric                            (lldb::SBStream &), description);
1500b57cec5SDimitry Andric 
151*af732203SDimitry Andric   ThreadPlanSP thread_plan_sp(GetSP());
152*af732203SDimitry Andric   if (thread_plan_sp) {
153*af732203SDimitry Andric     thread_plan_sp->GetDescription(description.get(), eDescriptionLevelFull);
1540b57cec5SDimitry Andric   } else {
1550b57cec5SDimitry Andric     description.Printf("Empty SBThreadPlan");
1560b57cec5SDimitry Andric   }
1570b57cec5SDimitry Andric   return true;
1580b57cec5SDimitry Andric }
1590b57cec5SDimitry Andric 
SetThreadPlan(const ThreadPlanSP & lldb_object_wp)160*af732203SDimitry Andric void SBThreadPlan::SetThreadPlan(const ThreadPlanSP &lldb_object_wp) {
161*af732203SDimitry Andric   m_opaque_wp = lldb_object_wp;
1620b57cec5SDimitry Andric }
1630b57cec5SDimitry Andric 
SetPlanComplete(bool success)1640b57cec5SDimitry Andric void SBThreadPlan::SetPlanComplete(bool success) {
1650b57cec5SDimitry Andric   LLDB_RECORD_METHOD(void, SBThreadPlan, SetPlanComplete, (bool), success);
1660b57cec5SDimitry Andric 
167*af732203SDimitry Andric   ThreadPlanSP thread_plan_sp(GetSP());
168*af732203SDimitry Andric   if (thread_plan_sp)
169*af732203SDimitry Andric     thread_plan_sp->SetPlanComplete(success);
1700b57cec5SDimitry Andric }
1710b57cec5SDimitry Andric 
IsPlanComplete()1720b57cec5SDimitry Andric bool SBThreadPlan::IsPlanComplete() {
1730b57cec5SDimitry Andric   LLDB_RECORD_METHOD_NO_ARGS(bool, SBThreadPlan, IsPlanComplete);
1740b57cec5SDimitry Andric 
175*af732203SDimitry Andric   ThreadPlanSP thread_plan_sp(GetSP());
176*af732203SDimitry Andric   if (thread_plan_sp)
177*af732203SDimitry Andric     return thread_plan_sp->IsPlanComplete();
1780b57cec5SDimitry Andric   return true;
1790b57cec5SDimitry Andric }
1800b57cec5SDimitry Andric 
IsPlanStale()1810b57cec5SDimitry Andric bool SBThreadPlan::IsPlanStale() {
1820b57cec5SDimitry Andric   LLDB_RECORD_METHOD_NO_ARGS(bool, SBThreadPlan, IsPlanStale);
1830b57cec5SDimitry Andric 
184*af732203SDimitry Andric   ThreadPlanSP thread_plan_sp(GetSP());
185*af732203SDimitry Andric   if (thread_plan_sp)
186*af732203SDimitry Andric     return thread_plan_sp->IsPlanStale();
1870b57cec5SDimitry Andric   return true;
1880b57cec5SDimitry Andric }
1890b57cec5SDimitry Andric 
IsValid()1900b57cec5SDimitry Andric bool SBThreadPlan::IsValid() {
1910b57cec5SDimitry Andric   LLDB_RECORD_METHOD_NO_ARGS(bool, SBThreadPlan, IsValid);
1920b57cec5SDimitry Andric 
193*af732203SDimitry Andric   ThreadPlanSP thread_plan_sp(GetSP());
194*af732203SDimitry Andric   if (thread_plan_sp)
195*af732203SDimitry Andric     return thread_plan_sp->ValidatePlan(nullptr);
1960b57cec5SDimitry Andric   return false;
1970b57cec5SDimitry Andric }
1980b57cec5SDimitry Andric 
GetStopOthers()199*af732203SDimitry Andric bool SBThreadPlan::GetStopOthers() {
200*af732203SDimitry Andric   LLDB_RECORD_METHOD_NO_ARGS(bool, SBThreadPlan, GetStopOthers);
201*af732203SDimitry Andric 
202*af732203SDimitry Andric   ThreadPlanSP thread_plan_sp(GetSP());
203*af732203SDimitry Andric   if (thread_plan_sp)
204*af732203SDimitry Andric     return thread_plan_sp->StopOthers();
205*af732203SDimitry Andric   return false;
206*af732203SDimitry Andric }
207*af732203SDimitry Andric 
SetStopOthers(bool stop_others)208*af732203SDimitry Andric void SBThreadPlan::SetStopOthers(bool stop_others) {
209*af732203SDimitry Andric   LLDB_RECORD_METHOD(void, SBThreadPlan, SetStopOthers, (bool), stop_others);
210*af732203SDimitry Andric 
211*af732203SDimitry Andric   ThreadPlanSP thread_plan_sp(GetSP());
212*af732203SDimitry Andric   if (thread_plan_sp)
213*af732203SDimitry Andric     thread_plan_sp->SetStopOthers(stop_others);
214*af732203SDimitry Andric }
215*af732203SDimitry Andric 
2160b57cec5SDimitry Andric // This section allows an SBThreadPlan to push another of the common types of
2170b57cec5SDimitry Andric // plans...
2180b57cec5SDimitry Andric //
2190b57cec5SDimitry Andric // FIXME, you should only be able to queue thread plans from inside the methods
2200b57cec5SDimitry Andric // of a Scripted Thread Plan.  Need a way to enforce that.
2210b57cec5SDimitry Andric 
2220b57cec5SDimitry Andric SBThreadPlan
QueueThreadPlanForStepOverRange(SBAddress & sb_start_address,lldb::addr_t size)2230b57cec5SDimitry Andric SBThreadPlan::QueueThreadPlanForStepOverRange(SBAddress &sb_start_address,
2240b57cec5SDimitry Andric                                               lldb::addr_t size) {
2250b57cec5SDimitry Andric   LLDB_RECORD_METHOD(lldb::SBThreadPlan, SBThreadPlan,
2260b57cec5SDimitry Andric                      QueueThreadPlanForStepOverRange,
2270b57cec5SDimitry Andric                      (lldb::SBAddress &, lldb::addr_t), sb_start_address, size);
2280b57cec5SDimitry Andric 
2290b57cec5SDimitry Andric   SBError error;
2300b57cec5SDimitry Andric   return LLDB_RECORD_RESULT(
2310b57cec5SDimitry Andric       QueueThreadPlanForStepOverRange(sb_start_address, size, error));
2320b57cec5SDimitry Andric }
2330b57cec5SDimitry Andric 
QueueThreadPlanForStepOverRange(SBAddress & sb_start_address,lldb::addr_t size,SBError & error)2340b57cec5SDimitry Andric SBThreadPlan SBThreadPlan::QueueThreadPlanForStepOverRange(
2350b57cec5SDimitry Andric     SBAddress &sb_start_address, lldb::addr_t size, SBError &error) {
2360b57cec5SDimitry Andric   LLDB_RECORD_METHOD(lldb::SBThreadPlan, SBThreadPlan,
2370b57cec5SDimitry Andric                      QueueThreadPlanForStepOverRange,
2380b57cec5SDimitry Andric                      (lldb::SBAddress &, lldb::addr_t, lldb::SBError &),
2390b57cec5SDimitry Andric                      sb_start_address, size, error);
2400b57cec5SDimitry Andric 
241*af732203SDimitry Andric   ThreadPlanSP thread_plan_sp(GetSP());
242*af732203SDimitry Andric   if (thread_plan_sp) {
2430b57cec5SDimitry Andric     Address *start_address = sb_start_address.get();
2440b57cec5SDimitry Andric     if (!start_address) {
2450b57cec5SDimitry Andric       return LLDB_RECORD_RESULT(SBThreadPlan());
2460b57cec5SDimitry Andric     }
2470b57cec5SDimitry Andric 
2480b57cec5SDimitry Andric     AddressRange range(*start_address, size);
2490b57cec5SDimitry Andric     SymbolContext sc;
2500b57cec5SDimitry Andric     start_address->CalculateSymbolContext(&sc);
2510b57cec5SDimitry Andric     Status plan_status;
2520b57cec5SDimitry Andric 
253*af732203SDimitry Andric     SBThreadPlan plan = SBThreadPlan(
254*af732203SDimitry Andric         thread_plan_sp->GetThread().QueueThreadPlanForStepOverRange(
2550b57cec5SDimitry Andric             false, range, sc, eAllThreads, plan_status));
2560b57cec5SDimitry Andric 
2570b57cec5SDimitry Andric     if (plan_status.Fail())
2580b57cec5SDimitry Andric       error.SetErrorString(plan_status.AsCString());
2595ffd83dbSDimitry Andric     else
260*af732203SDimitry Andric       plan.GetSP()->SetPrivate(true);
2610b57cec5SDimitry Andric 
2620b57cec5SDimitry Andric     return LLDB_RECORD_RESULT(plan);
2630b57cec5SDimitry Andric   }
264*af732203SDimitry Andric   return LLDB_RECORD_RESULT(SBThreadPlan());
2650b57cec5SDimitry Andric }
2660b57cec5SDimitry Andric 
2670b57cec5SDimitry Andric SBThreadPlan
QueueThreadPlanForStepInRange(SBAddress & sb_start_address,lldb::addr_t size)2680b57cec5SDimitry Andric SBThreadPlan::QueueThreadPlanForStepInRange(SBAddress &sb_start_address,
2690b57cec5SDimitry Andric                                             lldb::addr_t size) {
2700b57cec5SDimitry Andric   LLDB_RECORD_METHOD(lldb::SBThreadPlan, SBThreadPlan,
2710b57cec5SDimitry Andric                      QueueThreadPlanForStepInRange,
2720b57cec5SDimitry Andric                      (lldb::SBAddress &, lldb::addr_t), sb_start_address, size);
2730b57cec5SDimitry Andric 
2740b57cec5SDimitry Andric   SBError error;
2750b57cec5SDimitry Andric   return LLDB_RECORD_RESULT(
2760b57cec5SDimitry Andric       QueueThreadPlanForStepInRange(sb_start_address, size, error));
2770b57cec5SDimitry Andric }
2780b57cec5SDimitry Andric 
2790b57cec5SDimitry Andric SBThreadPlan
QueueThreadPlanForStepInRange(SBAddress & sb_start_address,lldb::addr_t size,SBError & error)2800b57cec5SDimitry Andric SBThreadPlan::QueueThreadPlanForStepInRange(SBAddress &sb_start_address,
2810b57cec5SDimitry Andric                                             lldb::addr_t size, SBError &error) {
2820b57cec5SDimitry Andric   LLDB_RECORD_METHOD(lldb::SBThreadPlan, SBThreadPlan,
2830b57cec5SDimitry Andric                      QueueThreadPlanForStepInRange,
2840b57cec5SDimitry Andric                      (lldb::SBAddress &, lldb::addr_t, lldb::SBError &),
2850b57cec5SDimitry Andric                      sb_start_address, size, error);
2860b57cec5SDimitry Andric 
287*af732203SDimitry Andric   ThreadPlanSP thread_plan_sp(GetSP());
288*af732203SDimitry Andric   if (thread_plan_sp) {
2890b57cec5SDimitry Andric     Address *start_address = sb_start_address.get();
2900b57cec5SDimitry Andric     if (!start_address) {
2910b57cec5SDimitry Andric       return LLDB_RECORD_RESULT(SBThreadPlan());
2920b57cec5SDimitry Andric     }
2930b57cec5SDimitry Andric 
2940b57cec5SDimitry Andric     AddressRange range(*start_address, size);
2950b57cec5SDimitry Andric     SymbolContext sc;
2960b57cec5SDimitry Andric     start_address->CalculateSymbolContext(&sc);
2970b57cec5SDimitry Andric 
2980b57cec5SDimitry Andric     Status plan_status;
2990b57cec5SDimitry Andric     SBThreadPlan plan =
300*af732203SDimitry Andric         SBThreadPlan(thread_plan_sp->GetThread().QueueThreadPlanForStepInRange(
3010b57cec5SDimitry Andric             false, range, sc, nullptr, eAllThreads, plan_status));
3020b57cec5SDimitry Andric 
3030b57cec5SDimitry Andric     if (plan_status.Fail())
3040b57cec5SDimitry Andric       error.SetErrorString(plan_status.AsCString());
3055ffd83dbSDimitry Andric     else
306*af732203SDimitry Andric       plan.GetSP()->SetPrivate(true);
3070b57cec5SDimitry Andric 
3080b57cec5SDimitry Andric     return LLDB_RECORD_RESULT(plan);
3090b57cec5SDimitry Andric   }
310*af732203SDimitry Andric   return LLDB_RECORD_RESULT(SBThreadPlan());
3110b57cec5SDimitry Andric }
3120b57cec5SDimitry Andric 
3130b57cec5SDimitry Andric SBThreadPlan
QueueThreadPlanForStepOut(uint32_t frame_idx_to_step_to,bool first_insn)3140b57cec5SDimitry Andric SBThreadPlan::QueueThreadPlanForStepOut(uint32_t frame_idx_to_step_to,
3150b57cec5SDimitry Andric                                         bool first_insn) {
3160b57cec5SDimitry Andric   LLDB_RECORD_METHOD(lldb::SBThreadPlan, SBThreadPlan,
3170b57cec5SDimitry Andric                      QueueThreadPlanForStepOut, (uint32_t, bool),
3180b57cec5SDimitry Andric                      frame_idx_to_step_to, first_insn);
3190b57cec5SDimitry Andric 
3200b57cec5SDimitry Andric   SBError error;
3210b57cec5SDimitry Andric   return LLDB_RECORD_RESULT(
3220b57cec5SDimitry Andric       QueueThreadPlanForStepOut(frame_idx_to_step_to, first_insn, error));
3230b57cec5SDimitry Andric }
3240b57cec5SDimitry Andric 
3250b57cec5SDimitry Andric SBThreadPlan
QueueThreadPlanForStepOut(uint32_t frame_idx_to_step_to,bool first_insn,SBError & error)3260b57cec5SDimitry Andric SBThreadPlan::QueueThreadPlanForStepOut(uint32_t frame_idx_to_step_to,
3270b57cec5SDimitry Andric                                         bool first_insn, SBError &error) {
3280b57cec5SDimitry Andric   LLDB_RECORD_METHOD(lldb::SBThreadPlan, SBThreadPlan,
3290b57cec5SDimitry Andric                      QueueThreadPlanForStepOut,
3300b57cec5SDimitry Andric                      (uint32_t, bool, lldb::SBError &), frame_idx_to_step_to,
3310b57cec5SDimitry Andric                      first_insn, error);
3320b57cec5SDimitry Andric 
333*af732203SDimitry Andric   ThreadPlanSP thread_plan_sp(GetSP());
334*af732203SDimitry Andric   if (thread_plan_sp) {
3350b57cec5SDimitry Andric     SymbolContext sc;
336*af732203SDimitry Andric     sc = thread_plan_sp->GetThread().GetStackFrameAtIndex(0)->GetSymbolContext(
3370b57cec5SDimitry Andric         lldb::eSymbolContextEverything);
3380b57cec5SDimitry Andric 
3390b57cec5SDimitry Andric     Status plan_status;
3400b57cec5SDimitry Andric     SBThreadPlan plan =
341*af732203SDimitry Andric         SBThreadPlan(thread_plan_sp->GetThread().QueueThreadPlanForStepOut(
3420b57cec5SDimitry Andric             false, &sc, first_insn, false, eVoteYes, eVoteNoOpinion,
3430b57cec5SDimitry Andric             frame_idx_to_step_to, plan_status));
3440b57cec5SDimitry Andric 
3450b57cec5SDimitry Andric     if (plan_status.Fail())
3460b57cec5SDimitry Andric       error.SetErrorString(plan_status.AsCString());
3475ffd83dbSDimitry Andric     else
348*af732203SDimitry Andric       plan.GetSP()->SetPrivate(true);
3490b57cec5SDimitry Andric 
3500b57cec5SDimitry Andric     return LLDB_RECORD_RESULT(plan);
3510b57cec5SDimitry Andric   }
352*af732203SDimitry Andric   return LLDB_RECORD_RESULT(SBThreadPlan());
3530b57cec5SDimitry Andric }
3540b57cec5SDimitry Andric 
3550b57cec5SDimitry Andric SBThreadPlan
QueueThreadPlanForRunToAddress(SBAddress sb_address)3560b57cec5SDimitry Andric SBThreadPlan::QueueThreadPlanForRunToAddress(SBAddress sb_address) {
3570b57cec5SDimitry Andric   LLDB_RECORD_METHOD(lldb::SBThreadPlan, SBThreadPlan,
3580b57cec5SDimitry Andric                      QueueThreadPlanForRunToAddress, (lldb::SBAddress),
3590b57cec5SDimitry Andric                      sb_address);
3600b57cec5SDimitry Andric 
3610b57cec5SDimitry Andric   SBError error;
3620b57cec5SDimitry Andric   return LLDB_RECORD_RESULT(QueueThreadPlanForRunToAddress(sb_address, error));
3630b57cec5SDimitry Andric }
3640b57cec5SDimitry Andric 
QueueThreadPlanForRunToAddress(SBAddress sb_address,SBError & error)3650b57cec5SDimitry Andric SBThreadPlan SBThreadPlan::QueueThreadPlanForRunToAddress(SBAddress sb_address,
3660b57cec5SDimitry Andric                                                           SBError &error) {
3670b57cec5SDimitry Andric   LLDB_RECORD_METHOD(lldb::SBThreadPlan, SBThreadPlan,
3680b57cec5SDimitry Andric                      QueueThreadPlanForRunToAddress,
3690b57cec5SDimitry Andric                      (lldb::SBAddress, lldb::SBError &), sb_address, error);
3700b57cec5SDimitry Andric 
371*af732203SDimitry Andric   ThreadPlanSP thread_plan_sp(GetSP());
372*af732203SDimitry Andric   if (thread_plan_sp) {
3730b57cec5SDimitry Andric     Address *address = sb_address.get();
3740b57cec5SDimitry Andric     if (!address)
3750b57cec5SDimitry Andric       return LLDB_RECORD_RESULT(SBThreadPlan());
3760b57cec5SDimitry Andric 
3770b57cec5SDimitry Andric     Status plan_status;
3780b57cec5SDimitry Andric     SBThreadPlan plan =
379*af732203SDimitry Andric         SBThreadPlan(thread_plan_sp->GetThread().QueueThreadPlanForRunToAddress(
3800b57cec5SDimitry Andric             false, *address, false, plan_status));
3810b57cec5SDimitry Andric 
3820b57cec5SDimitry Andric     if (plan_status.Fail())
3830b57cec5SDimitry Andric       error.SetErrorString(plan_status.AsCString());
3845ffd83dbSDimitry Andric     else
385*af732203SDimitry Andric       plan.GetSP()->SetPrivate(true);
3860b57cec5SDimitry Andric 
3870b57cec5SDimitry Andric     return LLDB_RECORD_RESULT(plan);
3880b57cec5SDimitry Andric   }
389*af732203SDimitry Andric   return LLDB_RECORD_RESULT(SBThreadPlan());
3900b57cec5SDimitry Andric }
3910b57cec5SDimitry Andric 
3920b57cec5SDimitry Andric SBThreadPlan
QueueThreadPlanForStepScripted(const char * script_class_name)3930b57cec5SDimitry Andric SBThreadPlan::QueueThreadPlanForStepScripted(const char *script_class_name) {
3940b57cec5SDimitry Andric   LLDB_RECORD_METHOD(lldb::SBThreadPlan, SBThreadPlan,
3950b57cec5SDimitry Andric                      QueueThreadPlanForStepScripted, (const char *),
3960b57cec5SDimitry Andric                      script_class_name);
3970b57cec5SDimitry Andric 
3980b57cec5SDimitry Andric   SBError error;
3990b57cec5SDimitry Andric   return LLDB_RECORD_RESULT(
4000b57cec5SDimitry Andric       QueueThreadPlanForStepScripted(script_class_name, error));
4010b57cec5SDimitry Andric }
4020b57cec5SDimitry Andric 
4030b57cec5SDimitry Andric SBThreadPlan
QueueThreadPlanForStepScripted(const char * script_class_name,SBError & error)4040b57cec5SDimitry Andric SBThreadPlan::QueueThreadPlanForStepScripted(const char *script_class_name,
4050b57cec5SDimitry Andric                                              SBError &error) {
4060b57cec5SDimitry Andric   LLDB_RECORD_METHOD(lldb::SBThreadPlan, SBThreadPlan,
4070b57cec5SDimitry Andric                      QueueThreadPlanForStepScripted,
4080b57cec5SDimitry Andric                      (const char *, lldb::SBError &), script_class_name, error);
4090b57cec5SDimitry Andric 
410*af732203SDimitry Andric   ThreadPlanSP thread_plan_sp(GetSP());
411*af732203SDimitry Andric   if (thread_plan_sp) {
4120b57cec5SDimitry Andric     Status plan_status;
4139dba64beSDimitry Andric     StructuredData::ObjectSP empty_args;
4140b57cec5SDimitry Andric     SBThreadPlan plan =
415*af732203SDimitry Andric         SBThreadPlan(thread_plan_sp->GetThread().QueueThreadPlanForStepScripted(
4169dba64beSDimitry Andric             false, script_class_name, empty_args, false, plan_status));
4179dba64beSDimitry Andric 
4189dba64beSDimitry Andric     if (plan_status.Fail())
4199dba64beSDimitry Andric       error.SetErrorString(plan_status.AsCString());
4205ffd83dbSDimitry Andric     else
421*af732203SDimitry Andric       plan.GetSP()->SetPrivate(true);
4229dba64beSDimitry Andric 
4239dba64beSDimitry Andric     return LLDB_RECORD_RESULT(plan);
4249dba64beSDimitry Andric   }
425*af732203SDimitry Andric   return LLDB_RECORD_RESULT(SBThreadPlan());
4269dba64beSDimitry Andric }
4279dba64beSDimitry Andric 
4289dba64beSDimitry Andric SBThreadPlan
QueueThreadPlanForStepScripted(const char * script_class_name,lldb::SBStructuredData & args_data,SBError & error)4299dba64beSDimitry Andric SBThreadPlan::QueueThreadPlanForStepScripted(const char *script_class_name,
4309dba64beSDimitry Andric                                              lldb::SBStructuredData &args_data,
4319dba64beSDimitry Andric                                              SBError &error) {
4329dba64beSDimitry Andric   LLDB_RECORD_METHOD(lldb::SBThreadPlan, SBThreadPlan,
4339dba64beSDimitry Andric                      QueueThreadPlanForStepScripted,
4349dba64beSDimitry Andric                      (const char *, lldb::SBStructuredData &, lldb::SBError &),
4359dba64beSDimitry Andric                      script_class_name, args_data, error);
4369dba64beSDimitry Andric 
437*af732203SDimitry Andric   ThreadPlanSP thread_plan_sp(GetSP());
438*af732203SDimitry Andric   if (thread_plan_sp) {
4399dba64beSDimitry Andric     Status plan_status;
4409dba64beSDimitry Andric     StructuredData::ObjectSP args_obj = args_data.m_impl_up->GetObjectSP();
4419dba64beSDimitry Andric     SBThreadPlan plan =
442*af732203SDimitry Andric         SBThreadPlan(thread_plan_sp->GetThread().QueueThreadPlanForStepScripted(
4439dba64beSDimitry Andric             false, script_class_name, args_obj, false, plan_status));
4440b57cec5SDimitry Andric 
4450b57cec5SDimitry Andric     if (plan_status.Fail())
4460b57cec5SDimitry Andric       error.SetErrorString(plan_status.AsCString());
4475ffd83dbSDimitry Andric     else
448*af732203SDimitry Andric       plan.GetSP()->SetPrivate(true);
4490b57cec5SDimitry Andric 
4500b57cec5SDimitry Andric     return LLDB_RECORD_RESULT(plan);
4510b57cec5SDimitry Andric   } else {
4520b57cec5SDimitry Andric     return LLDB_RECORD_RESULT(SBThreadPlan());
4530b57cec5SDimitry Andric   }
4540b57cec5SDimitry Andric }
4550b57cec5SDimitry Andric 
4560b57cec5SDimitry Andric namespace lldb_private {
4570b57cec5SDimitry Andric namespace repro {
4580b57cec5SDimitry Andric 
4590b57cec5SDimitry Andric template <>
RegisterMethods(Registry & R)4600b57cec5SDimitry Andric void RegisterMethods<SBThreadPlan>(Registry &R) {
4610b57cec5SDimitry Andric   LLDB_REGISTER_CONSTRUCTOR(SBThreadPlan, ());
4620b57cec5SDimitry Andric   LLDB_REGISTER_CONSTRUCTOR(SBThreadPlan, (const lldb::ThreadPlanSP &));
4630b57cec5SDimitry Andric   LLDB_REGISTER_CONSTRUCTOR(SBThreadPlan, (const lldb::SBThreadPlan &));
4640b57cec5SDimitry Andric   LLDB_REGISTER_CONSTRUCTOR(SBThreadPlan, (lldb::SBThread &, const char *));
4659dba64beSDimitry Andric   LLDB_REGISTER_CONSTRUCTOR(SBThreadPlan, (lldb::SBThread &, const char *,
4669dba64beSDimitry Andric                        lldb::SBStructuredData &));
4670b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(const lldb::SBThreadPlan &,
4680b57cec5SDimitry Andric                        SBThreadPlan, operator=,(const lldb::SBThreadPlan &));
4690b57cec5SDimitry Andric   LLDB_REGISTER_METHOD_CONST(bool, SBThreadPlan, IsValid, ());
4700b57cec5SDimitry Andric   LLDB_REGISTER_METHOD_CONST(bool, SBThreadPlan, operator bool, ());
4710b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(void, SBThreadPlan, Clear, ());
4720b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(lldb::StopReason, SBThreadPlan, GetStopReason, ());
4730b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(size_t, SBThreadPlan, GetStopReasonDataCount, ());
4740b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(uint64_t, SBThreadPlan, GetStopReasonDataAtIndex,
4750b57cec5SDimitry Andric                        (uint32_t));
4760b57cec5SDimitry Andric   LLDB_REGISTER_METHOD_CONST(lldb::SBThread, SBThreadPlan, GetThread, ());
4770b57cec5SDimitry Andric   LLDB_REGISTER_METHOD_CONST(bool, SBThreadPlan, GetDescription,
4780b57cec5SDimitry Andric                              (lldb::SBStream &));
4790b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(void, SBThreadPlan, SetPlanComplete, (bool));
4800b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(bool, SBThreadPlan, IsPlanComplete, ());
4810b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(bool, SBThreadPlan, IsPlanStale, ());
4820b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(bool, SBThreadPlan, IsValid, ());
483*af732203SDimitry Andric   LLDB_REGISTER_METHOD(void, SBThreadPlan, SetStopOthers, (bool));
484*af732203SDimitry Andric   LLDB_REGISTER_METHOD(bool, SBThreadPlan, GetStopOthers, ());
4850b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(lldb::SBThreadPlan, SBThreadPlan,
4860b57cec5SDimitry Andric                        QueueThreadPlanForStepOverRange,
4870b57cec5SDimitry Andric                        (lldb::SBAddress &, lldb::addr_t));
4880b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(lldb::SBThreadPlan, SBThreadPlan,
4890b57cec5SDimitry Andric                        QueueThreadPlanForStepOverRange,
4900b57cec5SDimitry Andric                        (lldb::SBAddress &, lldb::addr_t, lldb::SBError &));
4910b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(lldb::SBThreadPlan, SBThreadPlan,
4920b57cec5SDimitry Andric                        QueueThreadPlanForStepInRange,
4930b57cec5SDimitry Andric                        (lldb::SBAddress &, lldb::addr_t));
4940b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(lldb::SBThreadPlan, SBThreadPlan,
4950b57cec5SDimitry Andric                        QueueThreadPlanForStepInRange,
4960b57cec5SDimitry Andric                        (lldb::SBAddress &, lldb::addr_t, lldb::SBError &));
4970b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(lldb::SBThreadPlan, SBThreadPlan,
4980b57cec5SDimitry Andric                        QueueThreadPlanForStepOut, (uint32_t, bool));
4990b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(lldb::SBThreadPlan, SBThreadPlan,
5000b57cec5SDimitry Andric                        QueueThreadPlanForStepOut,
5010b57cec5SDimitry Andric                        (uint32_t, bool, lldb::SBError &));
5020b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(lldb::SBThreadPlan, SBThreadPlan,
5030b57cec5SDimitry Andric                        QueueThreadPlanForRunToAddress, (lldb::SBAddress));
5040b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(lldb::SBThreadPlan, SBThreadPlan,
5050b57cec5SDimitry Andric                        QueueThreadPlanForRunToAddress,
5060b57cec5SDimitry Andric                        (lldb::SBAddress, lldb::SBError &));
5070b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(lldb::SBThreadPlan, SBThreadPlan,
5080b57cec5SDimitry Andric                        QueueThreadPlanForStepScripted, (const char *));
5090b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(lldb::SBThreadPlan, SBThreadPlan,
5100b57cec5SDimitry Andric                        QueueThreadPlanForStepScripted,
5110b57cec5SDimitry Andric                        (const char *, lldb::SBError &));
5129dba64beSDimitry Andric   LLDB_REGISTER_METHOD(lldb::SBThreadPlan, SBThreadPlan,
5139dba64beSDimitry Andric                        QueueThreadPlanForStepScripted,
5149dba64beSDimitry Andric                        (const char *, lldb::SBStructuredData &,
5159dba64beSDimitry Andric                        lldb::SBError &));
5160b57cec5SDimitry Andric }
5170b57cec5SDimitry Andric 
5180b57cec5SDimitry Andric }
5190b57cec5SDimitry Andric }
520