blob: ba645cba343946b12d88218463aaa0b51353b770 [file] [log] [blame]
Alexander Shaposhnikov696bd632016-11-26 05:23:44 +00001//===-- SBThreadPlan.cpp ----------------------------------------*- C++ -*-===//
Jim Ingham2bdbfd52014-09-29 23:17:18 +00002//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Jim Ingham2bdbfd52014-09-29 23:17:18 +00006//
7//===----------------------------------------------------------------------===//
8
Jim Ingham2bdbfd52014-09-29 23:17:18 +00009#include "lldb/API/SBThread.h"
10
Jim Ingham2bdbfd52014-09-29 23:17:18 +000011#include "lldb/API/SBFileSpec.h"
12#include "lldb/API/SBStream.h"
Kate Stoneb9c1b512016-09-06 20:57:50 +000013#include "lldb/API/SBSymbolContext.h"
Jim Ingham2bdbfd52014-09-29 23:17:18 +000014#include "lldb/Breakpoint/BreakpointLocation.h"
15#include "lldb/Core/Debugger.h"
Jim Ingham2bdbfd52014-09-29 23:17:18 +000016#include "lldb/Core/StreamFile.h"
Jim Ingham2bdbfd52014-09-29 23:17:18 +000017#include "lldb/Interpreter/CommandInterpreter.h"
Kate Stoneb9c1b512016-09-06 20:57:50 +000018#include "lldb/Symbol/CompileUnit.h"
19#include "lldb/Symbol/SymbolContext.h"
Jim Ingham2bdbfd52014-09-29 23:17:18 +000020#include "lldb/Target/Process.h"
21#include "lldb/Target/Queue.h"
Jim Ingham2bdbfd52014-09-29 23:17:18 +000022#include "lldb/Target/StopInfo.h"
Kate Stoneb9c1b512016-09-06 20:57:50 +000023#include "lldb/Target/SystemRuntime.h"
Jim Ingham2bdbfd52014-09-29 23:17:18 +000024#include "lldb/Target/Target.h"
Kate Stoneb9c1b512016-09-06 20:57:50 +000025#include "lldb/Target/Thread.h"
26#include "lldb/Target/ThreadPlan.h"
Jim Ingham2bdbfd52014-09-29 23:17:18 +000027#include "lldb/Target/ThreadPlanPython.h"
Kate Stoneb9c1b512016-09-06 20:57:50 +000028#include "lldb/Target/ThreadPlanStepInRange.h"
Jim Ingham2bdbfd52014-09-29 23:17:18 +000029#include "lldb/Target/ThreadPlanStepInstruction.h"
30#include "lldb/Target/ThreadPlanStepOut.h"
31#include "lldb/Target/ThreadPlanStepRange.h"
Pavel Labathd821c992018-08-07 11:07:21 +000032#include "lldb/Utility/State.h"
Zachary Turnerbf9a7732017-02-02 21:39:50 +000033#include "lldb/Utility/Stream.h"
Pavel Labathf2a8bcc2017-06-27 10:45:31 +000034#include "lldb/Utility/StructuredData.h"
Jim Ingham2bdbfd52014-09-29 23:17:18 +000035
36#include "lldb/API/SBAddress.h"
37#include "lldb/API/SBDebugger.h"
38#include "lldb/API/SBEvent.h"
39#include "lldb/API/SBFrame.h"
40#include "lldb/API/SBProcess.h"
41#include "lldb/API/SBThreadPlan.h"
42#include "lldb/API/SBValue.h"
43
44using namespace lldb;
45using namespace lldb_private;
46
47//----------------------------------------------------------------------
48// Constructors
49//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +000050SBThreadPlan::SBThreadPlan() {}
Jim Ingham2bdbfd52014-09-29 23:17:18 +000051
Kate Stoneb9c1b512016-09-06 20:57:50 +000052SBThreadPlan::SBThreadPlan(const ThreadPlanSP &lldb_object_sp)
53 : m_opaque_sp(lldb_object_sp) {}
Jim Ingham2bdbfd52014-09-29 23:17:18 +000054
Kate Stoneb9c1b512016-09-06 20:57:50 +000055SBThreadPlan::SBThreadPlan(const SBThreadPlan &rhs)
56 : m_opaque_sp(rhs.m_opaque_sp) {}
Jim Ingham2bdbfd52014-09-29 23:17:18 +000057
Kate Stoneb9c1b512016-09-06 20:57:50 +000058SBThreadPlan::SBThreadPlan(lldb::SBThread &sb_thread, const char *class_name) {
59 Thread *thread = sb_thread.get();
60 if (thread)
61 m_opaque_sp.reset(new ThreadPlanPython(*thread, class_name));
Jim Ingham2bdbfd52014-09-29 23:17:18 +000062}
63
64//----------------------------------------------------------------------
65// Assignment operator
66//----------------------------------------------------------------------
67
Kate Stoneb9c1b512016-09-06 20:57:50 +000068const lldb::SBThreadPlan &SBThreadPlan::operator=(const SBThreadPlan &rhs) {
69 if (this != &rhs)
70 m_opaque_sp = rhs.m_opaque_sp;
71 return *this;
Jim Ingham2bdbfd52014-09-29 23:17:18 +000072}
73//----------------------------------------------------------------------
74// Destructor
75//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +000076SBThreadPlan::~SBThreadPlan() {}
77
78lldb_private::ThreadPlan *SBThreadPlan::get() { return m_opaque_sp.get(); }
79
80bool SBThreadPlan::IsValid() const { return m_opaque_sp.get() != NULL; }
81
82void SBThreadPlan::Clear() { m_opaque_sp.reset(); }
83
84lldb::StopReason SBThreadPlan::GetStopReason() { return eStopReasonNone; }
85
86size_t SBThreadPlan::GetStopReasonDataCount() { return 0; }
87
88uint64_t SBThreadPlan::GetStopReasonDataAtIndex(uint32_t idx) { return 0; }
89
90SBThread SBThreadPlan::GetThread() const {
91 if (m_opaque_sp) {
92 return SBThread(m_opaque_sp->GetThread().shared_from_this());
93 } else
94 return SBThread();
Jim Ingham2bdbfd52014-09-29 23:17:18 +000095}
96
Kate Stoneb9c1b512016-09-06 20:57:50 +000097bool SBThreadPlan::GetDescription(lldb::SBStream &description) const {
98 if (m_opaque_sp) {
99 m_opaque_sp->GetDescription(description.get(), eDescriptionLevelFull);
100 } else {
101 description.Printf("Empty SBThreadPlan");
102 }
103 return true;
Jim Ingham2bdbfd52014-09-29 23:17:18 +0000104}
105
Kate Stoneb9c1b512016-09-06 20:57:50 +0000106void SBThreadPlan::SetThreadPlan(const ThreadPlanSP &lldb_object_sp) {
107 m_opaque_sp = lldb_object_sp;
Jim Ingham2bdbfd52014-09-29 23:17:18 +0000108}
109
Kate Stoneb9c1b512016-09-06 20:57:50 +0000110void SBThreadPlan::SetPlanComplete(bool success) {
111 if (m_opaque_sp)
112 m_opaque_sp->SetPlanComplete(success);
Jim Ingham2bdbfd52014-09-29 23:17:18 +0000113}
114
Kate Stoneb9c1b512016-09-06 20:57:50 +0000115bool SBThreadPlan::IsPlanComplete() {
116 if (m_opaque_sp)
117 return m_opaque_sp->IsPlanComplete();
118 else
Jim Ingham2bdbfd52014-09-29 23:17:18 +0000119 return true;
120}
121
Kate Stoneb9c1b512016-09-06 20:57:50 +0000122bool SBThreadPlan::IsPlanStale() {
123 if (m_opaque_sp)
124 return m_opaque_sp->IsPlanStale();
125 else
126 return true;
Jim Ingham2bdbfd52014-09-29 23:17:18 +0000127}
128
Kate Stoneb9c1b512016-09-06 20:57:50 +0000129bool SBThreadPlan::IsValid() {
130 if (m_opaque_sp)
131 return m_opaque_sp->ValidatePlan(nullptr);
132 else
133 return false;
Jim Ingham2bdbfd52014-09-29 23:17:18 +0000134}
135
Kate Stoneb9c1b512016-09-06 20:57:50 +0000136// This section allows an SBThreadPlan to push another of the common types of
137// plans...
138//
139// FIXME, you should only be able to queue thread plans from inside the methods
Adrian Prantl05097242018-04-30 16:49:04 +0000140// of a Scripted Thread Plan. Need a way to enforce that.
Jim Ingham2bdbfd52014-09-29 23:17:18 +0000141
142SBThreadPlan
Kate Stoneb9c1b512016-09-06 20:57:50 +0000143SBThreadPlan::QueueThreadPlanForStepOverRange(SBAddress &sb_start_address,
144 lldb::addr_t size) {
Jonas Devliegheree103ae92018-11-15 01:18:15 +0000145 SBError error;
146 return QueueThreadPlanForStepOverRange(sb_start_address, size, error);
147}
148
149SBThreadPlan SBThreadPlan::QueueThreadPlanForStepOverRange(
150 SBAddress &sb_start_address, lldb::addr_t size, SBError &error) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000151 if (m_opaque_sp) {
152 Address *start_address = sb_start_address.get();
153 if (!start_address) {
154 return SBThreadPlan();
155 }
Jim Ingham2bdbfd52014-09-29 23:17:18 +0000156
Kate Stoneb9c1b512016-09-06 20:57:50 +0000157 AddressRange range(*start_address, size);
158 SymbolContext sc;
159 start_address->CalculateSymbolContext(&sc);
Jonas Devliegheree103ae92018-11-15 01:18:15 +0000160 Status plan_status;
161
162 SBThreadPlan plan =
163 SBThreadPlan(m_opaque_sp->GetThread().QueueThreadPlanForStepOverRange(
164 false, range, sc, eAllThreads, plan_status));
165
166 if (plan_status.Fail())
167 error.SetErrorString(plan_status.AsCString());
168
169 return plan;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000170 } else {
171 return SBThreadPlan();
172 }
Jim Ingham2bdbfd52014-09-29 23:17:18 +0000173}
174
175SBThreadPlan
Kate Stoneb9c1b512016-09-06 20:57:50 +0000176SBThreadPlan::QueueThreadPlanForStepInRange(SBAddress &sb_start_address,
177 lldb::addr_t size) {
Jonas Devliegheree103ae92018-11-15 01:18:15 +0000178 SBError error;
179 return QueueThreadPlanForStepInRange(sb_start_address, size, error);
180}
181
182SBThreadPlan
183SBThreadPlan::QueueThreadPlanForStepInRange(SBAddress &sb_start_address,
184 lldb::addr_t size, SBError &error) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000185 if (m_opaque_sp) {
186 Address *start_address = sb_start_address.get();
187 if (!start_address) {
188 return SBThreadPlan();
189 }
Jim Ingham2bdbfd52014-09-29 23:17:18 +0000190
Kate Stoneb9c1b512016-09-06 20:57:50 +0000191 AddressRange range(*start_address, size);
192 SymbolContext sc;
193 start_address->CalculateSymbolContext(&sc);
Jonas Devliegheree103ae92018-11-15 01:18:15 +0000194
195 Status plan_status;
196 SBThreadPlan plan =
197 SBThreadPlan(m_opaque_sp->GetThread().QueueThreadPlanForStepInRange(
198 false, range, sc, NULL, eAllThreads, plan_status));
199
200 if (plan_status.Fail())
201 error.SetErrorString(plan_status.AsCString());
202
203 return plan;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000204 } else {
205 return SBThreadPlan();
206 }
Jim Ingham2bdbfd52014-09-29 23:17:18 +0000207}
208
209SBThreadPlan
Kate Stoneb9c1b512016-09-06 20:57:50 +0000210SBThreadPlan::QueueThreadPlanForStepOut(uint32_t frame_idx_to_step_to,
211 bool first_insn) {
Jonas Devliegheree103ae92018-11-15 01:18:15 +0000212 SBError error;
213 return QueueThreadPlanForStepOut(frame_idx_to_step_to, first_insn, error);
214}
215
216SBThreadPlan
217SBThreadPlan::QueueThreadPlanForStepOut(uint32_t frame_idx_to_step_to,
218 bool first_insn, SBError &error) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000219 if (m_opaque_sp) {
220 SymbolContext sc;
221 sc = m_opaque_sp->GetThread().GetStackFrameAtIndex(0)->GetSymbolContext(
222 lldb::eSymbolContextEverything);
Jonas Devliegheree103ae92018-11-15 01:18:15 +0000223
224 Status plan_status;
225 SBThreadPlan plan =
226 SBThreadPlan(m_opaque_sp->GetThread().QueueThreadPlanForStepOut(
227 false, &sc, first_insn, false, eVoteYes, eVoteNoOpinion,
228 frame_idx_to_step_to, plan_status));
229
230 if (plan_status.Fail())
231 error.SetErrorString(plan_status.AsCString());
232
233 return plan;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000234 } else {
235 return SBThreadPlan();
236 }
Jim Ingham2bdbfd52014-09-29 23:17:18 +0000237}
238
239SBThreadPlan
Kate Stoneb9c1b512016-09-06 20:57:50 +0000240SBThreadPlan::QueueThreadPlanForRunToAddress(SBAddress sb_address) {
Jonas Devliegheree103ae92018-11-15 01:18:15 +0000241 SBError error;
242 return QueueThreadPlanForRunToAddress(sb_address, error);
243}
244
245SBThreadPlan SBThreadPlan::QueueThreadPlanForRunToAddress(SBAddress sb_address,
246 SBError &error) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000247 if (m_opaque_sp) {
248 Address *address = sb_address.get();
249 if (!address)
250 return SBThreadPlan();
Jim Ingham2bdbfd52014-09-29 23:17:18 +0000251
Jonas Devliegheree103ae92018-11-15 01:18:15 +0000252 Status plan_status;
253 SBThreadPlan plan =
254 SBThreadPlan(m_opaque_sp->GetThread().QueueThreadPlanForRunToAddress(
255 false, *address, false, plan_status));
256
257 if (plan_status.Fail())
258 error.SetErrorString(plan_status.AsCString());
259
260 return plan;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000261 } else {
262 return SBThreadPlan();
263 }
Jim Ingham2bdbfd52014-09-29 23:17:18 +0000264}
Aleksandr Urakovc1c0fac2018-10-25 08:27:42 +0000265
266SBThreadPlan
267SBThreadPlan::QueueThreadPlanForStepScripted(const char *script_class_name) {
Jonas Devliegheree103ae92018-11-15 01:18:15 +0000268 SBError error;
269 return QueueThreadPlanForStepScripted(script_class_name, error);
270}
271
272SBThreadPlan
273SBThreadPlan::QueueThreadPlanForStepScripted(const char *script_class_name,
274 SBError &error) {
Aleksandr Urakovc1c0fac2018-10-25 08:27:42 +0000275 if (m_opaque_sp) {
Jonas Devliegheree103ae92018-11-15 01:18:15 +0000276 Status plan_status;
277 SBThreadPlan plan =
278 SBThreadPlan(m_opaque_sp->GetThread().QueueThreadPlanForStepScripted(
279 false, script_class_name, false, plan_status));
280
281 if (plan_status.Fail())
282 error.SetErrorString(plan_status.AsCString());
283
284 return plan;
Aleksandr Urakovc1c0fac2018-10-25 08:27:42 +0000285 } else {
286 return SBThreadPlan();
287 }
288}