1696bd635SAlexander Shaposhnikov //===-- SBThreadPlan.cpp ----------------------------------------*- C++ -*-===//
22bdbfd50SJim Ingham //
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
62bdbfd50SJim Ingham //
72bdbfd50SJim Ingham //===----------------------------------------------------------------------===//
82bdbfd50SJim Ingham 
9*baf5664fSJonas Devlieghere #include "SBReproducerPrivate.h"
102bdbfd50SJim Ingham #include "lldb/API/SBThread.h"
112bdbfd50SJim Ingham 
122bdbfd50SJim Ingham #include "lldb/API/SBFileSpec.h"
132bdbfd50SJim Ingham #include "lldb/API/SBStream.h"
14b9c1b51eSKate Stone #include "lldb/API/SBSymbolContext.h"
152bdbfd50SJim Ingham #include "lldb/Breakpoint/BreakpointLocation.h"
162bdbfd50SJim Ingham #include "lldb/Core/Debugger.h"
172bdbfd50SJim Ingham #include "lldb/Core/StreamFile.h"
182bdbfd50SJim Ingham #include "lldb/Interpreter/CommandInterpreter.h"
19b9c1b51eSKate Stone #include "lldb/Symbol/CompileUnit.h"
20b9c1b51eSKate Stone #include "lldb/Symbol/SymbolContext.h"
212bdbfd50SJim Ingham #include "lldb/Target/Process.h"
222bdbfd50SJim Ingham #include "lldb/Target/Queue.h"
232bdbfd50SJim Ingham #include "lldb/Target/StopInfo.h"
24b9c1b51eSKate Stone #include "lldb/Target/SystemRuntime.h"
252bdbfd50SJim Ingham #include "lldb/Target/Target.h"
26b9c1b51eSKate Stone #include "lldb/Target/Thread.h"
27b9c1b51eSKate Stone #include "lldb/Target/ThreadPlan.h"
282bdbfd50SJim Ingham #include "lldb/Target/ThreadPlanPython.h"
29b9c1b51eSKate Stone #include "lldb/Target/ThreadPlanStepInRange.h"
302bdbfd50SJim Ingham #include "lldb/Target/ThreadPlanStepInstruction.h"
312bdbfd50SJim Ingham #include "lldb/Target/ThreadPlanStepOut.h"
322bdbfd50SJim Ingham #include "lldb/Target/ThreadPlanStepRange.h"
33d821c997SPavel Labath #include "lldb/Utility/State.h"
34bf9a7730SZachary Turner #include "lldb/Utility/Stream.h"
35f2a8bccfSPavel Labath #include "lldb/Utility/StructuredData.h"
362bdbfd50SJim Ingham 
372bdbfd50SJim Ingham #include "lldb/API/SBAddress.h"
382bdbfd50SJim Ingham #include "lldb/API/SBDebugger.h"
392bdbfd50SJim Ingham #include "lldb/API/SBEvent.h"
402bdbfd50SJim Ingham #include "lldb/API/SBFrame.h"
412bdbfd50SJim Ingham #include "lldb/API/SBProcess.h"
422bdbfd50SJim Ingham #include "lldb/API/SBThreadPlan.h"
432bdbfd50SJim Ingham #include "lldb/API/SBValue.h"
442bdbfd50SJim Ingham 
45796ac80bSJonas Devlieghere #include <memory>
46796ac80bSJonas Devlieghere 
472bdbfd50SJim Ingham using namespace lldb;
482bdbfd50SJim Ingham using namespace lldb_private;
492bdbfd50SJim Ingham 
502bdbfd50SJim Ingham //----------------------------------------------------------------------
512bdbfd50SJim Ingham // Constructors
522bdbfd50SJim Ingham //----------------------------------------------------------------------
53*baf5664fSJonas Devlieghere SBThreadPlan::SBThreadPlan() { LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBThreadPlan); }
542bdbfd50SJim Ingham 
55b9c1b51eSKate Stone SBThreadPlan::SBThreadPlan(const ThreadPlanSP &lldb_object_sp)
56*baf5664fSJonas Devlieghere     : m_opaque_sp(lldb_object_sp) {
57*baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBThreadPlan, (const lldb::ThreadPlanSP &),
58*baf5664fSJonas Devlieghere                           lldb_object_sp);
59*baf5664fSJonas Devlieghere }
602bdbfd50SJim Ingham 
61b9c1b51eSKate Stone SBThreadPlan::SBThreadPlan(const SBThreadPlan &rhs)
62*baf5664fSJonas Devlieghere     : m_opaque_sp(rhs.m_opaque_sp) {
63*baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBThreadPlan, (const lldb::SBThreadPlan &), rhs);
64*baf5664fSJonas Devlieghere }
652bdbfd50SJim Ingham 
66b9c1b51eSKate Stone SBThreadPlan::SBThreadPlan(lldb::SBThread &sb_thread, const char *class_name) {
67*baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBThreadPlan, (lldb::SBThread &, const char *),
68*baf5664fSJonas Devlieghere                           sb_thread, class_name);
69*baf5664fSJonas Devlieghere 
702bdbfd50SJim Ingham   Thread *thread = sb_thread.get();
712bdbfd50SJim Ingham   if (thread)
72796ac80bSJonas Devlieghere     m_opaque_sp = std::make_shared<ThreadPlanPython>(*thread, class_name);
732bdbfd50SJim Ingham }
742bdbfd50SJim Ingham 
752bdbfd50SJim Ingham //----------------------------------------------------------------------
762bdbfd50SJim Ingham // Assignment operator
772bdbfd50SJim Ingham //----------------------------------------------------------------------
782bdbfd50SJim Ingham 
79b9c1b51eSKate Stone const lldb::SBThreadPlan &SBThreadPlan::operator=(const SBThreadPlan &rhs) {
80*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(const lldb::SBThreadPlan &,
81*baf5664fSJonas Devlieghere                      SBThreadPlan, operator=,(const lldb::SBThreadPlan &), rhs);
82*baf5664fSJonas Devlieghere 
832bdbfd50SJim Ingham   if (this != &rhs)
842bdbfd50SJim Ingham     m_opaque_sp = rhs.m_opaque_sp;
852bdbfd50SJim Ingham   return *this;
862bdbfd50SJim Ingham }
872bdbfd50SJim Ingham //----------------------------------------------------------------------
882bdbfd50SJim Ingham // Destructor
892bdbfd50SJim Ingham //----------------------------------------------------------------------
90b9c1b51eSKate Stone SBThreadPlan::~SBThreadPlan() {}
912bdbfd50SJim Ingham 
92*baf5664fSJonas Devlieghere lldb_private::ThreadPlan *SBThreadPlan::get() {
93*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(lldb_private::ThreadPlan *, SBThreadPlan, get);
942bdbfd50SJim Ingham 
95*baf5664fSJonas Devlieghere   return m_opaque_sp.get();
96*baf5664fSJonas Devlieghere }
972bdbfd50SJim Ingham 
98*baf5664fSJonas Devlieghere bool SBThreadPlan::IsValid() const {
99*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBThreadPlan, IsValid);
1002bdbfd50SJim Ingham 
101*baf5664fSJonas Devlieghere   return m_opaque_sp.get() != NULL;
102*baf5664fSJonas Devlieghere }
1032bdbfd50SJim Ingham 
104*baf5664fSJonas Devlieghere void SBThreadPlan::Clear() {
105*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(void, SBThreadPlan, Clear);
1062bdbfd50SJim Ingham 
107*baf5664fSJonas Devlieghere   m_opaque_sp.reset();
108*baf5664fSJonas Devlieghere }
109*baf5664fSJonas Devlieghere 
110*baf5664fSJonas Devlieghere lldb::StopReason SBThreadPlan::GetStopReason() {
111*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(lldb::StopReason, SBThreadPlan, GetStopReason);
112*baf5664fSJonas Devlieghere 
113*baf5664fSJonas Devlieghere   return eStopReasonNone;
114*baf5664fSJonas Devlieghere }
115*baf5664fSJonas Devlieghere 
116*baf5664fSJonas Devlieghere size_t SBThreadPlan::GetStopReasonDataCount() {
117*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(size_t, SBThreadPlan, GetStopReasonDataCount);
118*baf5664fSJonas Devlieghere 
119*baf5664fSJonas Devlieghere   return 0;
120*baf5664fSJonas Devlieghere }
121*baf5664fSJonas Devlieghere 
122*baf5664fSJonas Devlieghere uint64_t SBThreadPlan::GetStopReasonDataAtIndex(uint32_t idx) {
123*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(uint64_t, SBThreadPlan, GetStopReasonDataAtIndex,
124*baf5664fSJonas Devlieghere                      (uint32_t), idx);
125*baf5664fSJonas Devlieghere 
126*baf5664fSJonas Devlieghere   return 0;
127*baf5664fSJonas Devlieghere }
1282bdbfd50SJim Ingham 
129b9c1b51eSKate Stone SBThread SBThreadPlan::GetThread() const {
130*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBThread, SBThreadPlan, GetThread);
131*baf5664fSJonas Devlieghere 
132b9c1b51eSKate Stone   if (m_opaque_sp) {
133*baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(
134*baf5664fSJonas Devlieghere         SBThread(m_opaque_sp->GetThread().shared_from_this()));
135b9c1b51eSKate Stone   } else
136*baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(SBThread());
1372bdbfd50SJim Ingham }
1382bdbfd50SJim Ingham 
139b9c1b51eSKate Stone bool SBThreadPlan::GetDescription(lldb::SBStream &description) const {
140*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(bool, SBThreadPlan, GetDescription,
141*baf5664fSJonas Devlieghere                            (lldb::SBStream &), description);
142*baf5664fSJonas Devlieghere 
143b9c1b51eSKate Stone   if (m_opaque_sp) {
1442bdbfd50SJim Ingham     m_opaque_sp->GetDescription(description.get(), eDescriptionLevelFull);
145b9c1b51eSKate Stone   } else {
1462bdbfd50SJim Ingham     description.Printf("Empty SBThreadPlan");
1472bdbfd50SJim Ingham   }
1482bdbfd50SJim Ingham   return true;
1492bdbfd50SJim Ingham }
1502bdbfd50SJim Ingham 
151b9c1b51eSKate Stone void SBThreadPlan::SetThreadPlan(const ThreadPlanSP &lldb_object_sp) {
1522bdbfd50SJim Ingham   m_opaque_sp = lldb_object_sp;
1532bdbfd50SJim Ingham }
1542bdbfd50SJim Ingham 
155b9c1b51eSKate Stone void SBThreadPlan::SetPlanComplete(bool success) {
156*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(void, SBThreadPlan, SetPlanComplete, (bool), success);
157*baf5664fSJonas Devlieghere 
1582bdbfd50SJim Ingham   if (m_opaque_sp)
1592bdbfd50SJim Ingham     m_opaque_sp->SetPlanComplete(success);
1602bdbfd50SJim Ingham }
1612bdbfd50SJim Ingham 
162b9c1b51eSKate Stone bool SBThreadPlan::IsPlanComplete() {
163*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(bool, SBThreadPlan, IsPlanComplete);
164*baf5664fSJonas Devlieghere 
1652bdbfd50SJim Ingham   if (m_opaque_sp)
1662bdbfd50SJim Ingham     return m_opaque_sp->IsPlanComplete();
1672bdbfd50SJim Ingham   else
1682bdbfd50SJim Ingham     return true;
1692bdbfd50SJim Ingham }
1702bdbfd50SJim Ingham 
171b9c1b51eSKate Stone bool SBThreadPlan::IsPlanStale() {
172*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(bool, SBThreadPlan, IsPlanStale);
173*baf5664fSJonas Devlieghere 
174c915a7d2SJim Ingham   if (m_opaque_sp)
175c915a7d2SJim Ingham     return m_opaque_sp->IsPlanStale();
176c915a7d2SJim Ingham   else
177c915a7d2SJim Ingham     return true;
178c915a7d2SJim Ingham }
179c915a7d2SJim Ingham 
180b9c1b51eSKate Stone bool SBThreadPlan::IsValid() {
181*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(bool, SBThreadPlan, IsValid);
182*baf5664fSJonas Devlieghere 
1832bdbfd50SJim Ingham   if (m_opaque_sp)
1842bdbfd50SJim Ingham     return m_opaque_sp->ValidatePlan(nullptr);
1852bdbfd50SJim Ingham   else
1862bdbfd50SJim Ingham     return false;
1872bdbfd50SJim Ingham }
1882bdbfd50SJim Ingham 
189b9c1b51eSKate Stone // This section allows an SBThreadPlan to push another of the common types of
190b9c1b51eSKate Stone // plans...
1912bdbfd50SJim Ingham //
192b9c1b51eSKate Stone // FIXME, you should only be able to queue thread plans from inside the methods
19305097246SAdrian Prantl // of a Scripted Thread Plan.  Need a way to enforce that.
1942bdbfd50SJim Ingham 
1952bdbfd50SJim Ingham SBThreadPlan
1962bdbfd50SJim Ingham SBThreadPlan::QueueThreadPlanForStepOverRange(SBAddress &sb_start_address,
197b9c1b51eSKate Stone                                               lldb::addr_t size) {
198*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBThreadPlan, SBThreadPlan,
199*baf5664fSJonas Devlieghere                      QueueThreadPlanForStepOverRange,
200*baf5664fSJonas Devlieghere                      (lldb::SBAddress &, lldb::addr_t), sb_start_address, size);
201*baf5664fSJonas Devlieghere 
202e103ae92SJonas Devlieghere   SBError error;
203*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(
204*baf5664fSJonas Devlieghere       QueueThreadPlanForStepOverRange(sb_start_address, size, error));
205e103ae92SJonas Devlieghere }
206e103ae92SJonas Devlieghere 
207e103ae92SJonas Devlieghere SBThreadPlan SBThreadPlan::QueueThreadPlanForStepOverRange(
208e103ae92SJonas Devlieghere     SBAddress &sb_start_address, lldb::addr_t size, SBError &error) {
209*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBThreadPlan, SBThreadPlan,
210*baf5664fSJonas Devlieghere                      QueueThreadPlanForStepOverRange,
211*baf5664fSJonas Devlieghere                      (lldb::SBAddress &, lldb::addr_t, lldb::SBError &),
212*baf5664fSJonas Devlieghere                      sb_start_address, size, error);
213*baf5664fSJonas Devlieghere 
214b9c1b51eSKate Stone   if (m_opaque_sp) {
2152bdbfd50SJim Ingham     Address *start_address = sb_start_address.get();
216b9c1b51eSKate Stone     if (!start_address) {
217*baf5664fSJonas Devlieghere       return LLDB_RECORD_RESULT(SBThreadPlan());
2182bdbfd50SJim Ingham     }
2192bdbfd50SJim Ingham 
2202bdbfd50SJim Ingham     AddressRange range(*start_address, size);
2212bdbfd50SJim Ingham     SymbolContext sc;
2222bdbfd50SJim Ingham     start_address->CalculateSymbolContext(&sc);
223e103ae92SJonas Devlieghere     Status plan_status;
224e103ae92SJonas Devlieghere 
225e103ae92SJonas Devlieghere     SBThreadPlan plan =
226e103ae92SJonas Devlieghere         SBThreadPlan(m_opaque_sp->GetThread().QueueThreadPlanForStepOverRange(
227e103ae92SJonas Devlieghere             false, range, sc, eAllThreads, plan_status));
228e103ae92SJonas Devlieghere 
229e103ae92SJonas Devlieghere     if (plan_status.Fail())
230e103ae92SJonas Devlieghere       error.SetErrorString(plan_status.AsCString());
231e103ae92SJonas Devlieghere 
232*baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(plan);
233b9c1b51eSKate Stone   } else {
234*baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(SBThreadPlan());
2352bdbfd50SJim Ingham   }
2362bdbfd50SJim Ingham }
2372bdbfd50SJim Ingham 
2382bdbfd50SJim Ingham SBThreadPlan
2392bdbfd50SJim Ingham SBThreadPlan::QueueThreadPlanForStepInRange(SBAddress &sb_start_address,
240b9c1b51eSKate Stone                                             lldb::addr_t size) {
241*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBThreadPlan, SBThreadPlan,
242*baf5664fSJonas Devlieghere                      QueueThreadPlanForStepInRange,
243*baf5664fSJonas Devlieghere                      (lldb::SBAddress &, lldb::addr_t), sb_start_address, size);
244*baf5664fSJonas Devlieghere 
245e103ae92SJonas Devlieghere   SBError error;
246*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(
247*baf5664fSJonas Devlieghere       QueueThreadPlanForStepInRange(sb_start_address, size, error));
248e103ae92SJonas Devlieghere }
249e103ae92SJonas Devlieghere 
250e103ae92SJonas Devlieghere SBThreadPlan
251e103ae92SJonas Devlieghere SBThreadPlan::QueueThreadPlanForStepInRange(SBAddress &sb_start_address,
252e103ae92SJonas Devlieghere                                             lldb::addr_t size, SBError &error) {
253*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBThreadPlan, SBThreadPlan,
254*baf5664fSJonas Devlieghere                      QueueThreadPlanForStepInRange,
255*baf5664fSJonas Devlieghere                      (lldb::SBAddress &, lldb::addr_t, lldb::SBError &),
256*baf5664fSJonas Devlieghere                      sb_start_address, size, error);
257*baf5664fSJonas Devlieghere 
258b9c1b51eSKate Stone   if (m_opaque_sp) {
2592bdbfd50SJim Ingham     Address *start_address = sb_start_address.get();
260b9c1b51eSKate Stone     if (!start_address) {
261*baf5664fSJonas Devlieghere       return LLDB_RECORD_RESULT(SBThreadPlan());
2622bdbfd50SJim Ingham     }
2632bdbfd50SJim Ingham 
2642bdbfd50SJim Ingham     AddressRange range(*start_address, size);
2652bdbfd50SJim Ingham     SymbolContext sc;
2662bdbfd50SJim Ingham     start_address->CalculateSymbolContext(&sc);
267e103ae92SJonas Devlieghere 
268e103ae92SJonas Devlieghere     Status plan_status;
269e103ae92SJonas Devlieghere     SBThreadPlan plan =
270e103ae92SJonas Devlieghere         SBThreadPlan(m_opaque_sp->GetThread().QueueThreadPlanForStepInRange(
271e103ae92SJonas Devlieghere             false, range, sc, NULL, eAllThreads, plan_status));
272e103ae92SJonas Devlieghere 
273e103ae92SJonas Devlieghere     if (plan_status.Fail())
274e103ae92SJonas Devlieghere       error.SetErrorString(plan_status.AsCString());
275e103ae92SJonas Devlieghere 
276*baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(plan);
277b9c1b51eSKate Stone   } else {
278*baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(SBThreadPlan());
2792bdbfd50SJim Ingham   }
2802bdbfd50SJim Ingham }
2812bdbfd50SJim Ingham 
2822bdbfd50SJim Ingham SBThreadPlan
283b9c1b51eSKate Stone SBThreadPlan::QueueThreadPlanForStepOut(uint32_t frame_idx_to_step_to,
284b9c1b51eSKate Stone                                         bool first_insn) {
285*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBThreadPlan, SBThreadPlan,
286*baf5664fSJonas Devlieghere                      QueueThreadPlanForStepOut, (uint32_t, bool),
287*baf5664fSJonas Devlieghere                      frame_idx_to_step_to, first_insn);
288*baf5664fSJonas Devlieghere 
289e103ae92SJonas Devlieghere   SBError error;
290*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(
291*baf5664fSJonas Devlieghere       QueueThreadPlanForStepOut(frame_idx_to_step_to, first_insn, error));
292e103ae92SJonas Devlieghere }
293e103ae92SJonas Devlieghere 
294e103ae92SJonas Devlieghere SBThreadPlan
295e103ae92SJonas Devlieghere SBThreadPlan::QueueThreadPlanForStepOut(uint32_t frame_idx_to_step_to,
296e103ae92SJonas Devlieghere                                         bool first_insn, SBError &error) {
297*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBThreadPlan, SBThreadPlan,
298*baf5664fSJonas Devlieghere                      QueueThreadPlanForStepOut,
299*baf5664fSJonas Devlieghere                      (uint32_t, bool, lldb::SBError &), frame_idx_to_step_to,
300*baf5664fSJonas Devlieghere                      first_insn, error);
301*baf5664fSJonas Devlieghere 
302b9c1b51eSKate Stone   if (m_opaque_sp) {
3032bdbfd50SJim Ingham     SymbolContext sc;
304b9c1b51eSKate Stone     sc = m_opaque_sp->GetThread().GetStackFrameAtIndex(0)->GetSymbolContext(
305b9c1b51eSKate Stone         lldb::eSymbolContextEverything);
306e103ae92SJonas Devlieghere 
307e103ae92SJonas Devlieghere     Status plan_status;
308e103ae92SJonas Devlieghere     SBThreadPlan plan =
309e103ae92SJonas Devlieghere         SBThreadPlan(m_opaque_sp->GetThread().QueueThreadPlanForStepOut(
310b9c1b51eSKate Stone             false, &sc, first_insn, false, eVoteYes, eVoteNoOpinion,
311e103ae92SJonas Devlieghere             frame_idx_to_step_to, plan_status));
312e103ae92SJonas Devlieghere 
313e103ae92SJonas Devlieghere     if (plan_status.Fail())
314e103ae92SJonas Devlieghere       error.SetErrorString(plan_status.AsCString());
315e103ae92SJonas Devlieghere 
316*baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(plan);
317b9c1b51eSKate Stone   } else {
318*baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(SBThreadPlan());
3192bdbfd50SJim Ingham   }
3202bdbfd50SJim Ingham }
3212bdbfd50SJim Ingham 
3222bdbfd50SJim Ingham SBThreadPlan
323b9c1b51eSKate Stone SBThreadPlan::QueueThreadPlanForRunToAddress(SBAddress sb_address) {
324*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBThreadPlan, SBThreadPlan,
325*baf5664fSJonas Devlieghere                      QueueThreadPlanForRunToAddress, (lldb::SBAddress),
326*baf5664fSJonas Devlieghere                      sb_address);
327*baf5664fSJonas Devlieghere 
328e103ae92SJonas Devlieghere   SBError error;
329*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(QueueThreadPlanForRunToAddress(sb_address, error));
330e103ae92SJonas Devlieghere }
331e103ae92SJonas Devlieghere 
332e103ae92SJonas Devlieghere SBThreadPlan SBThreadPlan::QueueThreadPlanForRunToAddress(SBAddress sb_address,
333e103ae92SJonas Devlieghere                                                           SBError &error) {
334*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBThreadPlan, SBThreadPlan,
335*baf5664fSJonas Devlieghere                      QueueThreadPlanForRunToAddress,
336*baf5664fSJonas Devlieghere                      (lldb::SBAddress, lldb::SBError &), sb_address, error);
337*baf5664fSJonas Devlieghere 
338b9c1b51eSKate Stone   if (m_opaque_sp) {
3392bdbfd50SJim Ingham     Address *address = sb_address.get();
3402bdbfd50SJim Ingham     if (!address)
341*baf5664fSJonas Devlieghere       return LLDB_RECORD_RESULT(SBThreadPlan());
3422bdbfd50SJim Ingham 
343e103ae92SJonas Devlieghere     Status plan_status;
344e103ae92SJonas Devlieghere     SBThreadPlan plan =
345e103ae92SJonas Devlieghere         SBThreadPlan(m_opaque_sp->GetThread().QueueThreadPlanForRunToAddress(
346e103ae92SJonas Devlieghere             false, *address, false, plan_status));
347e103ae92SJonas Devlieghere 
348e103ae92SJonas Devlieghere     if (plan_status.Fail())
349e103ae92SJonas Devlieghere       error.SetErrorString(plan_status.AsCString());
350e103ae92SJonas Devlieghere 
351*baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(plan);
352b9c1b51eSKate Stone   } else {
353*baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(SBThreadPlan());
3542bdbfd50SJim Ingham   }
3552bdbfd50SJim Ingham }
356c1c0fac7SAleksandr Urakov 
357c1c0fac7SAleksandr Urakov SBThreadPlan
358c1c0fac7SAleksandr Urakov SBThreadPlan::QueueThreadPlanForStepScripted(const char *script_class_name) {
359*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBThreadPlan, SBThreadPlan,
360*baf5664fSJonas Devlieghere                      QueueThreadPlanForStepScripted, (const char *),
361*baf5664fSJonas Devlieghere                      script_class_name);
362*baf5664fSJonas Devlieghere 
363e103ae92SJonas Devlieghere   SBError error;
364*baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(
365*baf5664fSJonas Devlieghere       QueueThreadPlanForStepScripted(script_class_name, error));
366e103ae92SJonas Devlieghere }
367e103ae92SJonas Devlieghere 
368e103ae92SJonas Devlieghere SBThreadPlan
369e103ae92SJonas Devlieghere SBThreadPlan::QueueThreadPlanForStepScripted(const char *script_class_name,
370e103ae92SJonas Devlieghere                                              SBError &error) {
371*baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBThreadPlan, SBThreadPlan,
372*baf5664fSJonas Devlieghere                      QueueThreadPlanForStepScripted,
373*baf5664fSJonas Devlieghere                      (const char *, lldb::SBError &), script_class_name, error);
374*baf5664fSJonas Devlieghere 
375c1c0fac7SAleksandr Urakov   if (m_opaque_sp) {
376e103ae92SJonas Devlieghere     Status plan_status;
377e103ae92SJonas Devlieghere     SBThreadPlan plan =
378e103ae92SJonas Devlieghere         SBThreadPlan(m_opaque_sp->GetThread().QueueThreadPlanForStepScripted(
379e103ae92SJonas Devlieghere             false, script_class_name, false, plan_status));
380e103ae92SJonas Devlieghere 
381e103ae92SJonas Devlieghere     if (plan_status.Fail())
382e103ae92SJonas Devlieghere       error.SetErrorString(plan_status.AsCString());
383e103ae92SJonas Devlieghere 
384*baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(plan);
385c1c0fac7SAleksandr Urakov   } else {
386*baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(SBThreadPlan());
387c1c0fac7SAleksandr Urakov   }
388c1c0fac7SAleksandr Urakov }
389