15ffd83dbSDimitry Andric //===-- SBThreadPlan.cpp --------------------------------------------------===//
2*0b57cec5SDimitry Andric //
3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*0b57cec5SDimitry Andric //
7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
8*0b57cec5SDimitry Andric
9*0b57cec5SDimitry Andric #include "lldb/API/SBThread.h"
1004eeddc0SDimitry Andric #include "lldb/Utility/Instrumentation.h"
11*0b57cec5SDimitry Andric
12*0b57cec5SDimitry Andric #include "lldb/API/SBFileSpec.h"
13*0b57cec5SDimitry Andric #include "lldb/API/SBStream.h"
149dba64beSDimitry Andric #include "lldb/API/SBStructuredData.h"
15*0b57cec5SDimitry Andric #include "lldb/API/SBSymbolContext.h"
16*0b57cec5SDimitry Andric #include "lldb/Breakpoint/BreakpointLocation.h"
17*0b57cec5SDimitry Andric #include "lldb/Core/Debugger.h"
189dba64beSDimitry Andric #include "lldb/Core/StructuredDataImpl.h"
19*0b57cec5SDimitry Andric #include "lldb/Interpreter/CommandInterpreter.h"
20*0b57cec5SDimitry Andric #include "lldb/Symbol/CompileUnit.h"
21*0b57cec5SDimitry Andric #include "lldb/Symbol/SymbolContext.h"
22*0b57cec5SDimitry Andric #include "lldb/Target/Process.h"
23*0b57cec5SDimitry Andric #include "lldb/Target/Queue.h"
24*0b57cec5SDimitry Andric #include "lldb/Target/StopInfo.h"
25*0b57cec5SDimitry Andric #include "lldb/Target/SystemRuntime.h"
26*0b57cec5SDimitry Andric #include "lldb/Target/Target.h"
27*0b57cec5SDimitry Andric #include "lldb/Target/Thread.h"
28*0b57cec5SDimitry Andric #include "lldb/Target/ThreadPlan.h"
29*0b57cec5SDimitry Andric #include "lldb/Target/ThreadPlanPython.h"
30*0b57cec5SDimitry Andric #include "lldb/Target/ThreadPlanStepInRange.h"
31*0b57cec5SDimitry Andric #include "lldb/Target/ThreadPlanStepInstruction.h"
32*0b57cec5SDimitry Andric #include "lldb/Target/ThreadPlanStepOut.h"
33*0b57cec5SDimitry Andric #include "lldb/Target/ThreadPlanStepRange.h"
34*0b57cec5SDimitry Andric #include "lldb/Utility/State.h"
35*0b57cec5SDimitry Andric #include "lldb/Utility/Stream.h"
36*0b57cec5SDimitry Andric #include "lldb/Utility/StructuredData.h"
37*0b57cec5SDimitry Andric
38*0b57cec5SDimitry Andric #include "lldb/API/SBAddress.h"
39*0b57cec5SDimitry Andric #include "lldb/API/SBDebugger.h"
40*0b57cec5SDimitry Andric #include "lldb/API/SBEvent.h"
41*0b57cec5SDimitry Andric #include "lldb/API/SBFrame.h"
42*0b57cec5SDimitry Andric #include "lldb/API/SBProcess.h"
43*0b57cec5SDimitry Andric #include "lldb/API/SBThreadPlan.h"
44*0b57cec5SDimitry Andric #include "lldb/API/SBValue.h"
45*0b57cec5SDimitry Andric
46*0b57cec5SDimitry Andric #include <memory>
47*0b57cec5SDimitry Andric
48*0b57cec5SDimitry Andric using namespace lldb;
49*0b57cec5SDimitry Andric using namespace lldb_private;
50*0b57cec5SDimitry Andric
51*0b57cec5SDimitry Andric // Constructors
SBThreadPlan()5204eeddc0SDimitry Andric SBThreadPlan::SBThreadPlan() { LLDB_INSTRUMENT_VA(this); }
53*0b57cec5SDimitry Andric
SBThreadPlan(const ThreadPlanSP & lldb_object_sp)54*0b57cec5SDimitry Andric SBThreadPlan::SBThreadPlan(const ThreadPlanSP &lldb_object_sp)
55e8d8bef9SDimitry Andric : m_opaque_wp(lldb_object_sp) {
5604eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, lldb_object_sp);
57*0b57cec5SDimitry Andric }
58*0b57cec5SDimitry Andric
SBThreadPlan(const SBThreadPlan & rhs)59*0b57cec5SDimitry Andric SBThreadPlan::SBThreadPlan(const SBThreadPlan &rhs)
60e8d8bef9SDimitry Andric : m_opaque_wp(rhs.m_opaque_wp) {
6104eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, rhs);
62*0b57cec5SDimitry Andric }
63*0b57cec5SDimitry Andric
SBThreadPlan(lldb::SBThread & sb_thread,const char * class_name)64*0b57cec5SDimitry Andric SBThreadPlan::SBThreadPlan(lldb::SBThread &sb_thread, const char *class_name) {
6504eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, sb_thread, class_name);
66*0b57cec5SDimitry Andric
67*0b57cec5SDimitry Andric Thread *thread = sb_thread.get();
68*0b57cec5SDimitry Andric if (thread)
690eae32dcSDimitry Andric m_opaque_wp = std::make_shared<ThreadPlanPython>(*thread, class_name,
700eae32dcSDimitry Andric StructuredDataImpl());
719dba64beSDimitry Andric }
729dba64beSDimitry Andric
SBThreadPlan(lldb::SBThread & sb_thread,const char * class_name,lldb::SBStructuredData & args_data)739dba64beSDimitry Andric SBThreadPlan::SBThreadPlan(lldb::SBThread &sb_thread, const char *class_name,
749dba64beSDimitry Andric lldb::SBStructuredData &args_data) {
7504eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, sb_thread, class_name, args_data);
769dba64beSDimitry Andric
779dba64beSDimitry Andric Thread *thread = sb_thread.get();
789dba64beSDimitry Andric if (thread)
79e8d8bef9SDimitry Andric m_opaque_wp = std::make_shared<ThreadPlanPython>(*thread, class_name,
800eae32dcSDimitry Andric *args_data.m_impl_up);
81*0b57cec5SDimitry Andric }
82*0b57cec5SDimitry Andric
83*0b57cec5SDimitry Andric // Assignment operator
84*0b57cec5SDimitry Andric
operator =(const SBThreadPlan & rhs)85*0b57cec5SDimitry Andric const lldb::SBThreadPlan &SBThreadPlan::operator=(const SBThreadPlan &rhs) {
8604eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, rhs);
87*0b57cec5SDimitry Andric
88*0b57cec5SDimitry Andric if (this != &rhs)
89e8d8bef9SDimitry Andric m_opaque_wp = rhs.m_opaque_wp;
9004eeddc0SDimitry Andric return *this;
91*0b57cec5SDimitry Andric }
92*0b57cec5SDimitry Andric // Destructor
935ffd83dbSDimitry Andric SBThreadPlan::~SBThreadPlan() = default;
94*0b57cec5SDimitry Andric
IsValid() const95*0b57cec5SDimitry Andric bool SBThreadPlan::IsValid() const {
9604eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this);
97*0b57cec5SDimitry Andric return this->operator bool();
98*0b57cec5SDimitry Andric }
operator bool() const99*0b57cec5SDimitry Andric SBThreadPlan::operator bool() const {
10004eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this);
101*0b57cec5SDimitry Andric
102e8d8bef9SDimitry Andric return static_cast<bool>(GetSP());
103*0b57cec5SDimitry Andric }
104*0b57cec5SDimitry Andric
Clear()105*0b57cec5SDimitry Andric void SBThreadPlan::Clear() {
10604eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this);
107*0b57cec5SDimitry Andric
108e8d8bef9SDimitry Andric m_opaque_wp.reset();
109*0b57cec5SDimitry Andric }
110*0b57cec5SDimitry Andric
GetStopReason()111*0b57cec5SDimitry Andric lldb::StopReason SBThreadPlan::GetStopReason() {
11204eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this);
113*0b57cec5SDimitry Andric
114*0b57cec5SDimitry Andric return eStopReasonNone;
115*0b57cec5SDimitry Andric }
116*0b57cec5SDimitry Andric
GetStopReasonDataCount()117*0b57cec5SDimitry Andric size_t SBThreadPlan::GetStopReasonDataCount() {
11804eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this);
119*0b57cec5SDimitry Andric
120*0b57cec5SDimitry Andric return 0;
121*0b57cec5SDimitry Andric }
122*0b57cec5SDimitry Andric
GetStopReasonDataAtIndex(uint32_t idx)123*0b57cec5SDimitry Andric uint64_t SBThreadPlan::GetStopReasonDataAtIndex(uint32_t idx) {
12404eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, idx);
125*0b57cec5SDimitry Andric
126*0b57cec5SDimitry Andric return 0;
127*0b57cec5SDimitry Andric }
128*0b57cec5SDimitry Andric
GetThread() const129*0b57cec5SDimitry Andric SBThread SBThreadPlan::GetThread() const {
13004eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this);
131*0b57cec5SDimitry Andric
132e8d8bef9SDimitry Andric ThreadPlanSP thread_plan_sp(GetSP());
133e8d8bef9SDimitry Andric if (thread_plan_sp) {
13404eeddc0SDimitry Andric return SBThread(thread_plan_sp->GetThread().shared_from_this());
135*0b57cec5SDimitry Andric } else
13604eeddc0SDimitry Andric return SBThread();
137*0b57cec5SDimitry Andric }
138*0b57cec5SDimitry Andric
GetDescription(lldb::SBStream & description) const139*0b57cec5SDimitry Andric bool SBThreadPlan::GetDescription(lldb::SBStream &description) const {
14004eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, description);
141*0b57cec5SDimitry Andric
142e8d8bef9SDimitry Andric ThreadPlanSP thread_plan_sp(GetSP());
143e8d8bef9SDimitry Andric if (thread_plan_sp) {
144e8d8bef9SDimitry Andric thread_plan_sp->GetDescription(description.get(), eDescriptionLevelFull);
145*0b57cec5SDimitry Andric } else {
146*0b57cec5SDimitry Andric description.Printf("Empty SBThreadPlan");
147*0b57cec5SDimitry Andric }
148*0b57cec5SDimitry Andric return true;
149*0b57cec5SDimitry Andric }
150*0b57cec5SDimitry Andric
SetThreadPlan(const ThreadPlanSP & lldb_object_wp)151e8d8bef9SDimitry Andric void SBThreadPlan::SetThreadPlan(const ThreadPlanSP &lldb_object_wp) {
152e8d8bef9SDimitry Andric m_opaque_wp = lldb_object_wp;
153*0b57cec5SDimitry Andric }
154*0b57cec5SDimitry Andric
SetPlanComplete(bool success)155*0b57cec5SDimitry Andric void SBThreadPlan::SetPlanComplete(bool success) {
15604eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, success);
157*0b57cec5SDimitry Andric
158e8d8bef9SDimitry Andric ThreadPlanSP thread_plan_sp(GetSP());
159e8d8bef9SDimitry Andric if (thread_plan_sp)
160e8d8bef9SDimitry Andric thread_plan_sp->SetPlanComplete(success);
161*0b57cec5SDimitry Andric }
162*0b57cec5SDimitry Andric
IsPlanComplete()163*0b57cec5SDimitry Andric bool SBThreadPlan::IsPlanComplete() {
16404eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this);
165*0b57cec5SDimitry Andric
166e8d8bef9SDimitry Andric ThreadPlanSP thread_plan_sp(GetSP());
167e8d8bef9SDimitry Andric if (thread_plan_sp)
168e8d8bef9SDimitry Andric return thread_plan_sp->IsPlanComplete();
169*0b57cec5SDimitry Andric return true;
170*0b57cec5SDimitry Andric }
171*0b57cec5SDimitry Andric
IsPlanStale()172*0b57cec5SDimitry Andric bool SBThreadPlan::IsPlanStale() {
17304eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this);
174*0b57cec5SDimitry Andric
175e8d8bef9SDimitry Andric ThreadPlanSP thread_plan_sp(GetSP());
176e8d8bef9SDimitry Andric if (thread_plan_sp)
177e8d8bef9SDimitry Andric return thread_plan_sp->IsPlanStale();
178*0b57cec5SDimitry Andric return true;
179*0b57cec5SDimitry Andric }
180*0b57cec5SDimitry Andric
IsValid()181*0b57cec5SDimitry Andric bool SBThreadPlan::IsValid() {
18204eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this);
183*0b57cec5SDimitry Andric
184e8d8bef9SDimitry Andric ThreadPlanSP thread_plan_sp(GetSP());
185e8d8bef9SDimitry Andric if (thread_plan_sp)
186e8d8bef9SDimitry Andric return thread_plan_sp->ValidatePlan(nullptr);
187*0b57cec5SDimitry Andric return false;
188*0b57cec5SDimitry Andric }
189*0b57cec5SDimitry Andric
GetStopOthers()190e8d8bef9SDimitry Andric bool SBThreadPlan::GetStopOthers() {
19104eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this);
192e8d8bef9SDimitry Andric
193e8d8bef9SDimitry Andric ThreadPlanSP thread_plan_sp(GetSP());
194e8d8bef9SDimitry Andric if (thread_plan_sp)
195e8d8bef9SDimitry Andric return thread_plan_sp->StopOthers();
196e8d8bef9SDimitry Andric return false;
197e8d8bef9SDimitry Andric }
198e8d8bef9SDimitry Andric
SetStopOthers(bool stop_others)199e8d8bef9SDimitry Andric void SBThreadPlan::SetStopOthers(bool stop_others) {
20004eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, stop_others);
201e8d8bef9SDimitry Andric
202e8d8bef9SDimitry Andric ThreadPlanSP thread_plan_sp(GetSP());
203e8d8bef9SDimitry Andric if (thread_plan_sp)
204e8d8bef9SDimitry Andric thread_plan_sp->SetStopOthers(stop_others);
205e8d8bef9SDimitry Andric }
206e8d8bef9SDimitry Andric
207*0b57cec5SDimitry Andric // This section allows an SBThreadPlan to push another of the common types of
208*0b57cec5SDimitry Andric // plans...
209*0b57cec5SDimitry Andric //
210*0b57cec5SDimitry Andric // FIXME, you should only be able to queue thread plans from inside the methods
211*0b57cec5SDimitry Andric // of a Scripted Thread Plan. Need a way to enforce that.
212*0b57cec5SDimitry Andric
213*0b57cec5SDimitry Andric SBThreadPlan
QueueThreadPlanForStepOverRange(SBAddress & sb_start_address,lldb::addr_t size)214*0b57cec5SDimitry Andric SBThreadPlan::QueueThreadPlanForStepOverRange(SBAddress &sb_start_address,
215*0b57cec5SDimitry Andric lldb::addr_t size) {
21604eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, sb_start_address, size);
217*0b57cec5SDimitry Andric
218*0b57cec5SDimitry Andric SBError error;
21904eeddc0SDimitry Andric return QueueThreadPlanForStepOverRange(sb_start_address, size, error);
220*0b57cec5SDimitry Andric }
221*0b57cec5SDimitry Andric
QueueThreadPlanForStepOverRange(SBAddress & sb_start_address,lldb::addr_t size,SBError & error)222*0b57cec5SDimitry Andric SBThreadPlan SBThreadPlan::QueueThreadPlanForStepOverRange(
223*0b57cec5SDimitry Andric SBAddress &sb_start_address, lldb::addr_t size, SBError &error) {
22404eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, sb_start_address, size, error);
225*0b57cec5SDimitry Andric
226e8d8bef9SDimitry Andric ThreadPlanSP thread_plan_sp(GetSP());
227e8d8bef9SDimitry Andric if (thread_plan_sp) {
228*0b57cec5SDimitry Andric Address *start_address = sb_start_address.get();
229*0b57cec5SDimitry Andric if (!start_address) {
23004eeddc0SDimitry Andric return SBThreadPlan();
231*0b57cec5SDimitry Andric }
232*0b57cec5SDimitry Andric
233*0b57cec5SDimitry Andric AddressRange range(*start_address, size);
234*0b57cec5SDimitry Andric SymbolContext sc;
235*0b57cec5SDimitry Andric start_address->CalculateSymbolContext(&sc);
236*0b57cec5SDimitry Andric Status plan_status;
237*0b57cec5SDimitry Andric
238e8d8bef9SDimitry Andric SBThreadPlan plan = SBThreadPlan(
239e8d8bef9SDimitry Andric thread_plan_sp->GetThread().QueueThreadPlanForStepOverRange(
240*0b57cec5SDimitry Andric false, range, sc, eAllThreads, plan_status));
241*0b57cec5SDimitry Andric
242*0b57cec5SDimitry Andric if (plan_status.Fail())
243*0b57cec5SDimitry Andric error.SetErrorString(plan_status.AsCString());
2445ffd83dbSDimitry Andric else
245e8d8bef9SDimitry Andric plan.GetSP()->SetPrivate(true);
246*0b57cec5SDimitry Andric
24704eeddc0SDimitry Andric return plan;
248*0b57cec5SDimitry Andric }
24904eeddc0SDimitry Andric return SBThreadPlan();
250*0b57cec5SDimitry Andric }
251*0b57cec5SDimitry Andric
252*0b57cec5SDimitry Andric SBThreadPlan
QueueThreadPlanForStepInRange(SBAddress & sb_start_address,lldb::addr_t size)253*0b57cec5SDimitry Andric SBThreadPlan::QueueThreadPlanForStepInRange(SBAddress &sb_start_address,
254*0b57cec5SDimitry Andric lldb::addr_t size) {
25504eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, sb_start_address, size);
256*0b57cec5SDimitry Andric
257*0b57cec5SDimitry Andric SBError error;
25804eeddc0SDimitry Andric return QueueThreadPlanForStepInRange(sb_start_address, size, error);
259*0b57cec5SDimitry Andric }
260*0b57cec5SDimitry Andric
261*0b57cec5SDimitry Andric SBThreadPlan
QueueThreadPlanForStepInRange(SBAddress & sb_start_address,lldb::addr_t size,SBError & error)262*0b57cec5SDimitry Andric SBThreadPlan::QueueThreadPlanForStepInRange(SBAddress &sb_start_address,
263*0b57cec5SDimitry Andric lldb::addr_t size, SBError &error) {
26404eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, sb_start_address, size, error);
265*0b57cec5SDimitry Andric
266e8d8bef9SDimitry Andric ThreadPlanSP thread_plan_sp(GetSP());
267e8d8bef9SDimitry Andric if (thread_plan_sp) {
268*0b57cec5SDimitry Andric Address *start_address = sb_start_address.get();
269*0b57cec5SDimitry Andric if (!start_address) {
27004eeddc0SDimitry Andric return SBThreadPlan();
271*0b57cec5SDimitry Andric }
272*0b57cec5SDimitry Andric
273*0b57cec5SDimitry Andric AddressRange range(*start_address, size);
274*0b57cec5SDimitry Andric SymbolContext sc;
275*0b57cec5SDimitry Andric start_address->CalculateSymbolContext(&sc);
276*0b57cec5SDimitry Andric
277*0b57cec5SDimitry Andric Status plan_status;
278*0b57cec5SDimitry Andric SBThreadPlan plan =
279e8d8bef9SDimitry Andric SBThreadPlan(thread_plan_sp->GetThread().QueueThreadPlanForStepInRange(
280*0b57cec5SDimitry Andric false, range, sc, nullptr, eAllThreads, plan_status));
281*0b57cec5SDimitry Andric
282*0b57cec5SDimitry Andric if (plan_status.Fail())
283*0b57cec5SDimitry Andric error.SetErrorString(plan_status.AsCString());
2845ffd83dbSDimitry Andric else
285e8d8bef9SDimitry Andric plan.GetSP()->SetPrivate(true);
286*0b57cec5SDimitry Andric
28704eeddc0SDimitry Andric return plan;
288*0b57cec5SDimitry Andric }
28904eeddc0SDimitry Andric return SBThreadPlan();
290*0b57cec5SDimitry Andric }
291*0b57cec5SDimitry Andric
292*0b57cec5SDimitry Andric SBThreadPlan
QueueThreadPlanForStepOut(uint32_t frame_idx_to_step_to,bool first_insn)293*0b57cec5SDimitry Andric SBThreadPlan::QueueThreadPlanForStepOut(uint32_t frame_idx_to_step_to,
294*0b57cec5SDimitry Andric bool first_insn) {
29504eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, frame_idx_to_step_to, first_insn);
296*0b57cec5SDimitry Andric
297*0b57cec5SDimitry Andric SBError error;
29804eeddc0SDimitry Andric return QueueThreadPlanForStepOut(frame_idx_to_step_to, first_insn, error);
299*0b57cec5SDimitry Andric }
300*0b57cec5SDimitry Andric
301*0b57cec5SDimitry Andric SBThreadPlan
QueueThreadPlanForStepOut(uint32_t frame_idx_to_step_to,bool first_insn,SBError & error)302*0b57cec5SDimitry Andric SBThreadPlan::QueueThreadPlanForStepOut(uint32_t frame_idx_to_step_to,
303*0b57cec5SDimitry Andric bool first_insn, SBError &error) {
30404eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, frame_idx_to_step_to, first_insn, error);
305*0b57cec5SDimitry Andric
306e8d8bef9SDimitry Andric ThreadPlanSP thread_plan_sp(GetSP());
307e8d8bef9SDimitry Andric if (thread_plan_sp) {
308*0b57cec5SDimitry Andric SymbolContext sc;
309e8d8bef9SDimitry Andric sc = thread_plan_sp->GetThread().GetStackFrameAtIndex(0)->GetSymbolContext(
310*0b57cec5SDimitry Andric lldb::eSymbolContextEverything);
311*0b57cec5SDimitry Andric
312*0b57cec5SDimitry Andric Status plan_status;
313*0b57cec5SDimitry Andric SBThreadPlan plan =
314e8d8bef9SDimitry Andric SBThreadPlan(thread_plan_sp->GetThread().QueueThreadPlanForStepOut(
315*0b57cec5SDimitry Andric false, &sc, first_insn, false, eVoteYes, eVoteNoOpinion,
316*0b57cec5SDimitry Andric frame_idx_to_step_to, plan_status));
317*0b57cec5SDimitry Andric
318*0b57cec5SDimitry Andric if (plan_status.Fail())
319*0b57cec5SDimitry Andric error.SetErrorString(plan_status.AsCString());
3205ffd83dbSDimitry Andric else
321e8d8bef9SDimitry Andric plan.GetSP()->SetPrivate(true);
322*0b57cec5SDimitry Andric
32304eeddc0SDimitry Andric return plan;
324*0b57cec5SDimitry Andric }
32504eeddc0SDimitry Andric return SBThreadPlan();
326*0b57cec5SDimitry Andric }
327*0b57cec5SDimitry Andric
328*0b57cec5SDimitry Andric SBThreadPlan
QueueThreadPlanForRunToAddress(SBAddress sb_address)329*0b57cec5SDimitry Andric SBThreadPlan::QueueThreadPlanForRunToAddress(SBAddress sb_address) {
33004eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, sb_address);
331*0b57cec5SDimitry Andric
332*0b57cec5SDimitry Andric SBError error;
33304eeddc0SDimitry Andric return QueueThreadPlanForRunToAddress(sb_address, error);
334*0b57cec5SDimitry Andric }
335*0b57cec5SDimitry Andric
QueueThreadPlanForRunToAddress(SBAddress sb_address,SBError & error)336*0b57cec5SDimitry Andric SBThreadPlan SBThreadPlan::QueueThreadPlanForRunToAddress(SBAddress sb_address,
337*0b57cec5SDimitry Andric SBError &error) {
33804eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, sb_address, error);
339*0b57cec5SDimitry Andric
340e8d8bef9SDimitry Andric ThreadPlanSP thread_plan_sp(GetSP());
341e8d8bef9SDimitry Andric if (thread_plan_sp) {
342*0b57cec5SDimitry Andric Address *address = sb_address.get();
343*0b57cec5SDimitry Andric if (!address)
34404eeddc0SDimitry Andric return SBThreadPlan();
345*0b57cec5SDimitry Andric
346*0b57cec5SDimitry Andric Status plan_status;
347*0b57cec5SDimitry Andric SBThreadPlan plan =
348e8d8bef9SDimitry Andric SBThreadPlan(thread_plan_sp->GetThread().QueueThreadPlanForRunToAddress(
349*0b57cec5SDimitry Andric false, *address, false, plan_status));
350*0b57cec5SDimitry Andric
351*0b57cec5SDimitry Andric if (plan_status.Fail())
352*0b57cec5SDimitry Andric error.SetErrorString(plan_status.AsCString());
3535ffd83dbSDimitry Andric else
354e8d8bef9SDimitry Andric plan.GetSP()->SetPrivate(true);
355*0b57cec5SDimitry Andric
35604eeddc0SDimitry Andric return plan;
357*0b57cec5SDimitry Andric }
35804eeddc0SDimitry Andric return SBThreadPlan();
359*0b57cec5SDimitry Andric }
360*0b57cec5SDimitry Andric
361*0b57cec5SDimitry Andric SBThreadPlan
QueueThreadPlanForStepScripted(const char * script_class_name)362*0b57cec5SDimitry Andric SBThreadPlan::QueueThreadPlanForStepScripted(const char *script_class_name) {
36304eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, script_class_name);
364*0b57cec5SDimitry Andric
365*0b57cec5SDimitry Andric SBError error;
36604eeddc0SDimitry Andric return QueueThreadPlanForStepScripted(script_class_name, error);
367*0b57cec5SDimitry Andric }
368*0b57cec5SDimitry Andric
369*0b57cec5SDimitry Andric SBThreadPlan
QueueThreadPlanForStepScripted(const char * script_class_name,SBError & error)370*0b57cec5SDimitry Andric SBThreadPlan::QueueThreadPlanForStepScripted(const char *script_class_name,
371*0b57cec5SDimitry Andric SBError &error) {
37204eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, script_class_name, error);
373*0b57cec5SDimitry Andric
374e8d8bef9SDimitry Andric ThreadPlanSP thread_plan_sp(GetSP());
375e8d8bef9SDimitry Andric if (thread_plan_sp) {
376*0b57cec5SDimitry Andric Status plan_status;
3779dba64beSDimitry Andric StructuredData::ObjectSP empty_args;
378*0b57cec5SDimitry Andric SBThreadPlan plan =
379e8d8bef9SDimitry Andric SBThreadPlan(thread_plan_sp->GetThread().QueueThreadPlanForStepScripted(
3809dba64beSDimitry Andric false, script_class_name, empty_args, false, plan_status));
3819dba64beSDimitry Andric
3829dba64beSDimitry Andric if (plan_status.Fail())
3839dba64beSDimitry Andric error.SetErrorString(plan_status.AsCString());
3845ffd83dbSDimitry Andric else
385e8d8bef9SDimitry Andric plan.GetSP()->SetPrivate(true);
3869dba64beSDimitry Andric
38704eeddc0SDimitry Andric return plan;
3889dba64beSDimitry Andric }
38904eeddc0SDimitry Andric return SBThreadPlan();
3909dba64beSDimitry Andric }
3919dba64beSDimitry Andric
3929dba64beSDimitry Andric SBThreadPlan
QueueThreadPlanForStepScripted(const char * script_class_name,lldb::SBStructuredData & args_data,SBError & error)3939dba64beSDimitry Andric SBThreadPlan::QueueThreadPlanForStepScripted(const char *script_class_name,
3949dba64beSDimitry Andric lldb::SBStructuredData &args_data,
3959dba64beSDimitry Andric SBError &error) {
39604eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, script_class_name, args_data, error);
3979dba64beSDimitry Andric
398e8d8bef9SDimitry Andric ThreadPlanSP thread_plan_sp(GetSP());
399e8d8bef9SDimitry Andric if (thread_plan_sp) {
4009dba64beSDimitry Andric Status plan_status;
4019dba64beSDimitry Andric StructuredData::ObjectSP args_obj = args_data.m_impl_up->GetObjectSP();
4029dba64beSDimitry Andric SBThreadPlan plan =
403e8d8bef9SDimitry Andric SBThreadPlan(thread_plan_sp->GetThread().QueueThreadPlanForStepScripted(
4049dba64beSDimitry Andric false, script_class_name, args_obj, false, plan_status));
405*0b57cec5SDimitry Andric
406*0b57cec5SDimitry Andric if (plan_status.Fail())
407*0b57cec5SDimitry Andric error.SetErrorString(plan_status.AsCString());
4085ffd83dbSDimitry Andric else
409e8d8bef9SDimitry Andric plan.GetSP()->SetPrivate(true);
410*0b57cec5SDimitry Andric
41104eeddc0SDimitry Andric return plan;
412*0b57cec5SDimitry Andric } else {
41304eeddc0SDimitry Andric return SBThreadPlan();
414*0b57cec5SDimitry Andric }
415*0b57cec5SDimitry Andric }
416