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