180814287SRaphael Isemann //===-- SBBreakpointName.cpp ----------------------------------------------===//
2b842f2ecSJim 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
6b842f2ecSJim Ingham //
7b842f2ecSJim Ingham //===----------------------------------------------------------------------===//
8b842f2ecSJim Ingham
9b842f2ecSJim Ingham #include "lldb/API/SBBreakpointName.h"
10b842f2ecSJim Ingham #include "lldb/API/SBDebugger.h"
11b842f2ecSJim Ingham #include "lldb/API/SBError.h"
12b842f2ecSJim Ingham #include "lldb/API/SBStream.h"
13b842f2ecSJim Ingham #include "lldb/API/SBStringList.h"
14738af7a6SJim Ingham #include "lldb/API/SBStructuredData.h"
15b842f2ecSJim Ingham #include "lldb/API/SBTarget.h"
16*1755f5b1SJonas Devlieghere #include "lldb/Utility/Instrumentation.h"
17b842f2ecSJim Ingham
18b842f2ecSJim Ingham #include "lldb/Breakpoint/BreakpointName.h"
19b842f2ecSJim Ingham #include "lldb/Breakpoint/StoppointCallbackContext.h"
20b842f2ecSJim Ingham #include "lldb/Core/Debugger.h"
21738af7a6SJim Ingham #include "lldb/Core/StructuredDataImpl.h"
22b842f2ecSJim Ingham #include "lldb/Interpreter/CommandInterpreter.h"
23b842f2ecSJim Ingham #include "lldb/Interpreter/ScriptInterpreter.h"
24b842f2ecSJim Ingham #include "lldb/Target/Target.h"
25b842f2ecSJim Ingham #include "lldb/Target/ThreadSpec.h"
26b842f2ecSJim Ingham #include "lldb/Utility/Stream.h"
27b842f2ecSJim Ingham
28b842f2ecSJim Ingham #include "SBBreakpointOptionCommon.h"
29b842f2ecSJim Ingham
30b842f2ecSJim Ingham using namespace lldb;
31b842f2ecSJim Ingham using namespace lldb_private;
32b842f2ecSJim Ingham
33b842f2ecSJim Ingham namespace lldb
34b842f2ecSJim Ingham {
35b842f2ecSJim Ingham class SBBreakpointNameImpl {
36b842f2ecSJim Ingham public:
SBBreakpointNameImpl(TargetSP target_sp,const char * name)37c218ee58SDavide Italiano SBBreakpointNameImpl(TargetSP target_sp, const char *name) {
38b842f2ecSJim Ingham if (!name || name[0] == '\0')
39b842f2ecSJim Ingham return;
40b842f2ecSJim Ingham m_name.assign(name);
41b842f2ecSJim Ingham
42b842f2ecSJim Ingham if (!target_sp)
43b842f2ecSJim Ingham return;
44b842f2ecSJim Ingham
45b842f2ecSJim Ingham m_target_wp = target_sp;
46b842f2ecSJim Ingham }
47b842f2ecSJim Ingham
48c218ee58SDavide Italiano SBBreakpointNameImpl(SBTarget &sb_target, const char *name);
49c218ee58SDavide Italiano bool operator==(const SBBreakpointNameImpl &rhs);
50c218ee58SDavide Italiano bool operator!=(const SBBreakpointNameImpl &rhs);
51b842f2ecSJim Ingham
5205097246SAdrian Prantl // For now we take a simple approach and only keep the name, and relook up
5305097246SAdrian Prantl // the location when we need it.
54b842f2ecSJim Ingham
GetTarget() const55576628bdSJim Ingham TargetSP GetTarget() const {
56b842f2ecSJim Ingham return m_target_wp.lock();
57b842f2ecSJim Ingham }
58b842f2ecSJim Ingham
GetName() const59576628bdSJim Ingham const char *GetName() const {
60b842f2ecSJim Ingham return m_name.c_str();
61b842f2ecSJim Ingham }
62b842f2ecSJim Ingham
IsValid() const63576628bdSJim Ingham bool IsValid() const {
64b842f2ecSJim Ingham return !m_name.empty() && m_target_wp.lock();
65b842f2ecSJim Ingham }
66b842f2ecSJim Ingham
67c218ee58SDavide Italiano lldb_private::BreakpointName *GetBreakpointName() const;
68b842f2ecSJim Ingham
69b842f2ecSJim Ingham private:
70b842f2ecSJim Ingham TargetWP m_target_wp;
71b842f2ecSJim Ingham std::string m_name;
72b842f2ecSJim Ingham };
73c218ee58SDavide Italiano
SBBreakpointNameImpl(SBTarget & sb_target,const char * name)74c218ee58SDavide Italiano SBBreakpointNameImpl::SBBreakpointNameImpl(SBTarget &sb_target,
75c218ee58SDavide Italiano const char *name) {
76c218ee58SDavide Italiano if (!name || name[0] == '\0')
77c218ee58SDavide Italiano return;
78c218ee58SDavide Italiano m_name.assign(name);
79c218ee58SDavide Italiano
80c218ee58SDavide Italiano if (!sb_target.IsValid())
81c218ee58SDavide Italiano return;
82c218ee58SDavide Italiano
83c218ee58SDavide Italiano TargetSP target_sp = sb_target.GetSP();
84c218ee58SDavide Italiano if (!target_sp)
85c218ee58SDavide Italiano return;
86c218ee58SDavide Italiano
87c218ee58SDavide Italiano m_target_wp = target_sp;
88c218ee58SDavide Italiano }
89c218ee58SDavide Italiano
operator ==(const SBBreakpointNameImpl & rhs)90c218ee58SDavide Italiano bool SBBreakpointNameImpl::operator==(const SBBreakpointNameImpl &rhs) {
91c218ee58SDavide Italiano return m_name == rhs.m_name && m_target_wp.lock() == rhs.m_target_wp.lock();
92c218ee58SDavide Italiano }
93c218ee58SDavide Italiano
operator !=(const SBBreakpointNameImpl & rhs)94c218ee58SDavide Italiano bool SBBreakpointNameImpl::operator!=(const SBBreakpointNameImpl &rhs) {
95c218ee58SDavide Italiano return m_name != rhs.m_name || m_target_wp.lock() != rhs.m_target_wp.lock();
96c218ee58SDavide Italiano }
97c218ee58SDavide Italiano
GetBreakpointName() const98c218ee58SDavide Italiano lldb_private::BreakpointName *SBBreakpointNameImpl::GetBreakpointName() const {
99c218ee58SDavide Italiano if (!IsValid())
100c218ee58SDavide Italiano return nullptr;
101c218ee58SDavide Italiano TargetSP target_sp = GetTarget();
102c218ee58SDavide Italiano if (!target_sp)
103c218ee58SDavide Italiano return nullptr;
104c218ee58SDavide Italiano Status error;
105c218ee58SDavide Italiano return target_sp->FindBreakpointName(ConstString(m_name), true, error);
106c218ee58SDavide Italiano }
107c218ee58SDavide Italiano
108b842f2ecSJim Ingham } // namespace lldb
109b842f2ecSJim Ingham
SBBreakpointName()110*1755f5b1SJonas Devlieghere SBBreakpointName::SBBreakpointName() { LLDB_INSTRUMENT_VA(this); }
111b842f2ecSJim Ingham
SBBreakpointName(SBTarget & sb_target,const char * name)112baf5664fSJonas Devlieghere SBBreakpointName::SBBreakpointName(SBTarget &sb_target, const char *name) {
113*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, sb_target, name);
114baf5664fSJonas Devlieghere
1151c0bbe43SJonas Devlieghere m_impl_up = std::make_unique<SBBreakpointNameImpl>(sb_target, name);
11605097246SAdrian Prantl // Call FindBreakpointName here to make sure the name is valid, reset if not:
117b842f2ecSJim Ingham BreakpointName *bp_name = GetBreakpointName();
118b842f2ecSJim Ingham if (!bp_name)
119b842f2ecSJim Ingham m_impl_up.reset();
120b842f2ecSJim Ingham }
121b842f2ecSJim Ingham
SBBreakpointName(SBBreakpoint & sb_bkpt,const char * name)122baf5664fSJonas Devlieghere SBBreakpointName::SBBreakpointName(SBBreakpoint &sb_bkpt, const char *name) {
123*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, sb_bkpt, name);
124baf5664fSJonas Devlieghere
125b842f2ecSJim Ingham if (!sb_bkpt.IsValid()) {
126b842f2ecSJim Ingham m_impl_up.reset();
127b842f2ecSJim Ingham return;
128b842f2ecSJim Ingham }
129b842f2ecSJim Ingham BreakpointSP bkpt_sp = sb_bkpt.GetSP();
130b842f2ecSJim Ingham Target &target = bkpt_sp->GetTarget();
131b842f2ecSJim Ingham
1321c0bbe43SJonas Devlieghere m_impl_up =
1331c0bbe43SJonas Devlieghere std::make_unique<SBBreakpointNameImpl>(target.shared_from_this(), name);
134b842f2ecSJim Ingham
13505097246SAdrian Prantl // Call FindBreakpointName here to make sure the name is valid, reset if not:
136b842f2ecSJim Ingham BreakpointName *bp_name = GetBreakpointName();
137b842f2ecSJim Ingham if (!bp_name) {
138b842f2ecSJim Ingham m_impl_up.reset();
139b842f2ecSJim Ingham return;
140b842f2ecSJim Ingham }
141b842f2ecSJim Ingham
142b842f2ecSJim Ingham // Now copy over the breakpoint's options:
143cfb96d84SJim Ingham target.ConfigureBreakpointName(*bp_name, bkpt_sp->GetOptions(),
144b842f2ecSJim Ingham BreakpointName::Permissions());
145b842f2ecSJim Ingham }
146b842f2ecSJim Ingham
SBBreakpointName(const SBBreakpointName & rhs)147baf5664fSJonas Devlieghere SBBreakpointName::SBBreakpointName(const SBBreakpointName &rhs) {
148*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs);
149baf5664fSJonas Devlieghere
150b842f2ecSJim Ingham if (!rhs.m_impl_up)
151b842f2ecSJim Ingham return;
152b842f2ecSJim Ingham else
1531c0bbe43SJonas Devlieghere m_impl_up = std::make_unique<SBBreakpointNameImpl>(
1541c0bbe43SJonas Devlieghere rhs.m_impl_up->GetTarget(), rhs.m_impl_up->GetName());
155b842f2ecSJim Ingham }
156b842f2ecSJim Ingham
157b842f2ecSJim Ingham SBBreakpointName::~SBBreakpointName() = default;
158b842f2ecSJim Ingham
159baf5664fSJonas Devlieghere const SBBreakpointName &SBBreakpointName::
operator =(const SBBreakpointName & rhs)160baf5664fSJonas Devlieghere operator=(const SBBreakpointName &rhs) {
161*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs);
162baf5664fSJonas Devlieghere
163b842f2ecSJim Ingham if (!rhs.m_impl_up) {
164b842f2ecSJim Ingham m_impl_up.reset();
165d232abc3SJonas Devlieghere return *this;
166b842f2ecSJim Ingham }
167b842f2ecSJim Ingham
1681c0bbe43SJonas Devlieghere m_impl_up = std::make_unique<SBBreakpointNameImpl>(rhs.m_impl_up->GetTarget(),
1691c0bbe43SJonas Devlieghere rhs.m_impl_up->GetName());
170d232abc3SJonas Devlieghere return *this;
171b842f2ecSJim Ingham }
172b842f2ecSJim Ingham
operator ==(const lldb::SBBreakpointName & rhs)173b842f2ecSJim Ingham bool SBBreakpointName::operator==(const lldb::SBBreakpointName &rhs) {
174*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs);
175baf5664fSJonas Devlieghere
1763447077aSJonas Devlieghere return *m_impl_up == *rhs.m_impl_up;
177b842f2ecSJim Ingham }
178b842f2ecSJim Ingham
operator !=(const lldb::SBBreakpointName & rhs)179b842f2ecSJim Ingham bool SBBreakpointName::operator!=(const lldb::SBBreakpointName &rhs) {
180*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs);
181baf5664fSJonas Devlieghere
1823447077aSJonas Devlieghere return *m_impl_up != *rhs.m_impl_up;
183b842f2ecSJim Ingham }
184b842f2ecSJim Ingham
IsValid() const185b842f2ecSJim Ingham bool SBBreakpointName::IsValid() const {
186*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
1877f5237bcSPavel Labath return this->operator bool();
1887f5237bcSPavel Labath }
operator bool() const1897f5237bcSPavel Labath SBBreakpointName::operator bool() const {
190*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
191baf5664fSJonas Devlieghere
192b842f2ecSJim Ingham if (!m_impl_up)
193b842f2ecSJim Ingham return false;
194b842f2ecSJim Ingham return m_impl_up->IsValid();
195b842f2ecSJim Ingham }
196b842f2ecSJim Ingham
GetName() const197b842f2ecSJim Ingham const char *SBBreakpointName::GetName() const {
198*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
199baf5664fSJonas Devlieghere
200b842f2ecSJim Ingham if (!m_impl_up)
201b842f2ecSJim Ingham return "<Invalid Breakpoint Name Object>";
202b842f2ecSJim Ingham return m_impl_up->GetName();
203b842f2ecSJim Ingham }
204b842f2ecSJim Ingham
SetEnabled(bool enable)205b842f2ecSJim Ingham void SBBreakpointName::SetEnabled(bool enable) {
206*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, enable);
207baf5664fSJonas Devlieghere
208b842f2ecSJim Ingham BreakpointName *bp_name = GetBreakpointName();
209b842f2ecSJim Ingham if (!bp_name)
210b842f2ecSJim Ingham return;
211b842f2ecSJim Ingham
212b842f2ecSJim Ingham std::lock_guard<std::recursive_mutex> guard(
213b842f2ecSJim Ingham m_impl_up->GetTarget()->GetAPIMutex());
214b842f2ecSJim Ingham
215b842f2ecSJim Ingham bp_name->GetOptions().SetEnabled(enable);
216b842f2ecSJim Ingham }
217b842f2ecSJim Ingham
UpdateName(BreakpointName & bp_name)218b842f2ecSJim Ingham void SBBreakpointName::UpdateName(BreakpointName &bp_name) {
219b842f2ecSJim Ingham if (!IsValid())
220b842f2ecSJim Ingham return;
221b842f2ecSJim Ingham
222b842f2ecSJim Ingham TargetSP target_sp = m_impl_up->GetTarget();
223b842f2ecSJim Ingham if (!target_sp)
224b842f2ecSJim Ingham return;
225b842f2ecSJim Ingham target_sp->ApplyNameToBreakpoints(bp_name);
226b842f2ecSJim Ingham
227b842f2ecSJim Ingham }
228b842f2ecSJim Ingham
IsEnabled()229b842f2ecSJim Ingham bool SBBreakpointName::IsEnabled() {
230*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
231baf5664fSJonas Devlieghere
232b842f2ecSJim Ingham BreakpointName *bp_name = GetBreakpointName();
233b842f2ecSJim Ingham if (!bp_name)
234b842f2ecSJim Ingham return false;
235b842f2ecSJim Ingham
236b842f2ecSJim Ingham std::lock_guard<std::recursive_mutex> guard(
237b842f2ecSJim Ingham m_impl_up->GetTarget()->GetAPIMutex());
238b842f2ecSJim Ingham
239b842f2ecSJim Ingham return bp_name->GetOptions().IsEnabled();
240b842f2ecSJim Ingham }
241b842f2ecSJim Ingham
SetOneShot(bool one_shot)242b842f2ecSJim Ingham void SBBreakpointName::SetOneShot(bool one_shot) {
243*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, one_shot);
244baf5664fSJonas Devlieghere
245b842f2ecSJim Ingham BreakpointName *bp_name = GetBreakpointName();
246b842f2ecSJim Ingham if (!bp_name)
247b842f2ecSJim Ingham return;
248b842f2ecSJim Ingham
249b842f2ecSJim Ingham std::lock_guard<std::recursive_mutex> guard(
250b842f2ecSJim Ingham m_impl_up->GetTarget()->GetAPIMutex());
251b842f2ecSJim Ingham
252b842f2ecSJim Ingham bp_name->GetOptions().SetOneShot(one_shot);
253b842f2ecSJim Ingham UpdateName(*bp_name);
254b842f2ecSJim Ingham }
255b842f2ecSJim Ingham
IsOneShot() const256b842f2ecSJim Ingham bool SBBreakpointName::IsOneShot() const {
257*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
258baf5664fSJonas Devlieghere
259b842f2ecSJim Ingham const BreakpointName *bp_name = GetBreakpointName();
260b842f2ecSJim Ingham if (!bp_name)
261b842f2ecSJim Ingham return false;
262b842f2ecSJim Ingham
263b842f2ecSJim Ingham std::lock_guard<std::recursive_mutex> guard(
264b842f2ecSJim Ingham m_impl_up->GetTarget()->GetAPIMutex());
265b842f2ecSJim Ingham
266b842f2ecSJim Ingham return bp_name->GetOptions().IsOneShot();
267b842f2ecSJim Ingham }
268b842f2ecSJim Ingham
SetIgnoreCount(uint32_t count)269b842f2ecSJim Ingham void SBBreakpointName::SetIgnoreCount(uint32_t count) {
270*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, count);
271baf5664fSJonas Devlieghere
272b842f2ecSJim Ingham BreakpointName *bp_name = GetBreakpointName();
273b842f2ecSJim Ingham if (!bp_name)
274b842f2ecSJim Ingham return;
275b842f2ecSJim Ingham
276b842f2ecSJim Ingham std::lock_guard<std::recursive_mutex> guard(
277b842f2ecSJim Ingham m_impl_up->GetTarget()->GetAPIMutex());
278b842f2ecSJim Ingham
279b842f2ecSJim Ingham bp_name->GetOptions().SetIgnoreCount(count);
280b842f2ecSJim Ingham UpdateName(*bp_name);
281b842f2ecSJim Ingham }
282b842f2ecSJim Ingham
GetIgnoreCount() const283b842f2ecSJim Ingham uint32_t SBBreakpointName::GetIgnoreCount() const {
284*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
285baf5664fSJonas Devlieghere
286b842f2ecSJim Ingham BreakpointName *bp_name = GetBreakpointName();
287b842f2ecSJim Ingham if (!bp_name)
288b842f2ecSJim Ingham return false;
289b842f2ecSJim Ingham
290b842f2ecSJim Ingham std::lock_guard<std::recursive_mutex> guard(
291b842f2ecSJim Ingham m_impl_up->GetTarget()->GetAPIMutex());
292b842f2ecSJim Ingham
293b842f2ecSJim Ingham return bp_name->GetOptions().GetIgnoreCount();
294b842f2ecSJim Ingham }
295b842f2ecSJim Ingham
SetCondition(const char * condition)296b842f2ecSJim Ingham void SBBreakpointName::SetCondition(const char *condition) {
297*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, condition);
298baf5664fSJonas Devlieghere
299b842f2ecSJim Ingham BreakpointName *bp_name = GetBreakpointName();
300b842f2ecSJim Ingham if (!bp_name)
301b842f2ecSJim Ingham return;
302b842f2ecSJim Ingham
303b842f2ecSJim Ingham std::lock_guard<std::recursive_mutex> guard(
304b842f2ecSJim Ingham m_impl_up->GetTarget()->GetAPIMutex());
305b842f2ecSJim Ingham
306b842f2ecSJim Ingham bp_name->GetOptions().SetCondition(condition);
307b842f2ecSJim Ingham UpdateName(*bp_name);
308b842f2ecSJim Ingham }
309b842f2ecSJim Ingham
GetCondition()310b842f2ecSJim Ingham const char *SBBreakpointName::GetCondition() {
311*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
312baf5664fSJonas Devlieghere
313b842f2ecSJim Ingham BreakpointName *bp_name = GetBreakpointName();
314b842f2ecSJim Ingham if (!bp_name)
315b842f2ecSJim Ingham return nullptr;
316b842f2ecSJim Ingham
317b842f2ecSJim Ingham std::lock_guard<std::recursive_mutex> guard(
318b842f2ecSJim Ingham m_impl_up->GetTarget()->GetAPIMutex());
319b842f2ecSJim Ingham
320b842f2ecSJim Ingham return bp_name->GetOptions().GetConditionText();
321b842f2ecSJim Ingham }
322b842f2ecSJim Ingham
SetAutoContinue(bool auto_continue)323b842f2ecSJim Ingham void SBBreakpointName::SetAutoContinue(bool auto_continue) {
324*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, auto_continue);
325baf5664fSJonas Devlieghere
326b842f2ecSJim Ingham BreakpointName *bp_name = GetBreakpointName();
327b842f2ecSJim Ingham if (!bp_name)
328b842f2ecSJim Ingham return;
329b842f2ecSJim Ingham
330b842f2ecSJim Ingham std::lock_guard<std::recursive_mutex> guard(
331b842f2ecSJim Ingham m_impl_up->GetTarget()->GetAPIMutex());
332b842f2ecSJim Ingham
333b842f2ecSJim Ingham bp_name->GetOptions().SetAutoContinue(auto_continue);
334b842f2ecSJim Ingham UpdateName(*bp_name);
335b842f2ecSJim Ingham }
336b842f2ecSJim Ingham
GetAutoContinue()337b842f2ecSJim Ingham bool SBBreakpointName::GetAutoContinue() {
338*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
339baf5664fSJonas Devlieghere
340b842f2ecSJim Ingham BreakpointName *bp_name = GetBreakpointName();
341b842f2ecSJim Ingham if (!bp_name)
342576628bdSJim Ingham return false;
343b842f2ecSJim Ingham
344b842f2ecSJim Ingham std::lock_guard<std::recursive_mutex> guard(
345b842f2ecSJim Ingham m_impl_up->GetTarget()->GetAPIMutex());
346b842f2ecSJim Ingham
347b842f2ecSJim Ingham return bp_name->GetOptions().IsAutoContinue();
348b842f2ecSJim Ingham }
349b842f2ecSJim Ingham
SetThreadID(tid_t tid)350b842f2ecSJim Ingham void SBBreakpointName::SetThreadID(tid_t tid) {
351*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, tid);
352baf5664fSJonas Devlieghere
353b842f2ecSJim Ingham BreakpointName *bp_name = GetBreakpointName();
354b842f2ecSJim Ingham if (!bp_name)
355b842f2ecSJim Ingham return;
356b842f2ecSJim Ingham
357b842f2ecSJim Ingham std::lock_guard<std::recursive_mutex> guard(
358b842f2ecSJim Ingham m_impl_up->GetTarget()->GetAPIMutex());
359b842f2ecSJim Ingham
360b842f2ecSJim Ingham bp_name->GetOptions().SetThreadID(tid);
361b842f2ecSJim Ingham UpdateName(*bp_name);
362b842f2ecSJim Ingham }
363b842f2ecSJim Ingham
GetThreadID()364b842f2ecSJim Ingham tid_t SBBreakpointName::GetThreadID() {
365*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
366baf5664fSJonas Devlieghere
367b842f2ecSJim Ingham BreakpointName *bp_name = GetBreakpointName();
368b842f2ecSJim Ingham if (!bp_name)
369b842f2ecSJim Ingham return LLDB_INVALID_THREAD_ID;
370b842f2ecSJim Ingham
371b842f2ecSJim Ingham std::lock_guard<std::recursive_mutex> guard(
372b842f2ecSJim Ingham m_impl_up->GetTarget()->GetAPIMutex());
373b842f2ecSJim Ingham
374b842f2ecSJim Ingham return bp_name->GetOptions().GetThreadSpec()->GetTID();
375b842f2ecSJim Ingham }
376b842f2ecSJim Ingham
SetThreadIndex(uint32_t index)377b842f2ecSJim Ingham void SBBreakpointName::SetThreadIndex(uint32_t index) {
378*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, index);
379baf5664fSJonas Devlieghere
380b842f2ecSJim Ingham BreakpointName *bp_name = GetBreakpointName();
381b842f2ecSJim Ingham if (!bp_name)
382b842f2ecSJim Ingham return;
383b842f2ecSJim Ingham
384b842f2ecSJim Ingham std::lock_guard<std::recursive_mutex> guard(
385b842f2ecSJim Ingham m_impl_up->GetTarget()->GetAPIMutex());
386b842f2ecSJim Ingham
387b842f2ecSJim Ingham bp_name->GetOptions().GetThreadSpec()->SetIndex(index);
388b842f2ecSJim Ingham UpdateName(*bp_name);
389b842f2ecSJim Ingham }
390b842f2ecSJim Ingham
GetThreadIndex() const391b842f2ecSJim Ingham uint32_t SBBreakpointName::GetThreadIndex() const {
392*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
393baf5664fSJonas Devlieghere
394b842f2ecSJim Ingham BreakpointName *bp_name = GetBreakpointName();
395b842f2ecSJim Ingham if (!bp_name)
396b842f2ecSJim Ingham return LLDB_INVALID_THREAD_ID;
397b842f2ecSJim Ingham
398b842f2ecSJim Ingham std::lock_guard<std::recursive_mutex> guard(
399b842f2ecSJim Ingham m_impl_up->GetTarget()->GetAPIMutex());
400b842f2ecSJim Ingham
401b842f2ecSJim Ingham return bp_name->GetOptions().GetThreadSpec()->GetIndex();
402b842f2ecSJim Ingham }
403b842f2ecSJim Ingham
SetThreadName(const char * thread_name)404b842f2ecSJim Ingham void SBBreakpointName::SetThreadName(const char *thread_name) {
405*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, thread_name);
406baf5664fSJonas Devlieghere
407b842f2ecSJim Ingham BreakpointName *bp_name = GetBreakpointName();
408b842f2ecSJim Ingham if (!bp_name)
409b842f2ecSJim Ingham return;
410b842f2ecSJim Ingham
411b842f2ecSJim Ingham std::lock_guard<std::recursive_mutex> guard(
412b842f2ecSJim Ingham m_impl_up->GetTarget()->GetAPIMutex());
413b842f2ecSJim Ingham
414b842f2ecSJim Ingham bp_name->GetOptions().GetThreadSpec()->SetName(thread_name);
415b842f2ecSJim Ingham UpdateName(*bp_name);
416b842f2ecSJim Ingham }
417b842f2ecSJim Ingham
GetThreadName() const418b842f2ecSJim Ingham const char *SBBreakpointName::GetThreadName() const {
419*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
420baf5664fSJonas Devlieghere
421b842f2ecSJim Ingham BreakpointName *bp_name = GetBreakpointName();
422b842f2ecSJim Ingham if (!bp_name)
423b842f2ecSJim Ingham return nullptr;
424b842f2ecSJim Ingham
425b842f2ecSJim Ingham std::lock_guard<std::recursive_mutex> guard(
426b842f2ecSJim Ingham m_impl_up->GetTarget()->GetAPIMutex());
427b842f2ecSJim Ingham
428b842f2ecSJim Ingham return bp_name->GetOptions().GetThreadSpec()->GetName();
429b842f2ecSJim Ingham }
430b842f2ecSJim Ingham
SetQueueName(const char * queue_name)431b842f2ecSJim Ingham void SBBreakpointName::SetQueueName(const char *queue_name) {
432*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, queue_name);
433baf5664fSJonas Devlieghere
434b842f2ecSJim Ingham BreakpointName *bp_name = GetBreakpointName();
435b842f2ecSJim Ingham if (!bp_name)
436b842f2ecSJim Ingham return;
437b842f2ecSJim Ingham
438b842f2ecSJim Ingham std::lock_guard<std::recursive_mutex> guard(
439b842f2ecSJim Ingham m_impl_up->GetTarget()->GetAPIMutex());
440b842f2ecSJim Ingham
441b842f2ecSJim Ingham bp_name->GetOptions().GetThreadSpec()->SetQueueName(queue_name);
442b842f2ecSJim Ingham UpdateName(*bp_name);
443b842f2ecSJim Ingham }
444b842f2ecSJim Ingham
GetQueueName() const445b842f2ecSJim Ingham const char *SBBreakpointName::GetQueueName() const {
446*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
447baf5664fSJonas Devlieghere
448b842f2ecSJim Ingham BreakpointName *bp_name = GetBreakpointName();
449b842f2ecSJim Ingham if (!bp_name)
450b842f2ecSJim Ingham return nullptr;
451b842f2ecSJim Ingham
452b842f2ecSJim Ingham std::lock_guard<std::recursive_mutex> guard(
453b842f2ecSJim Ingham m_impl_up->GetTarget()->GetAPIMutex());
454b842f2ecSJim Ingham
455b842f2ecSJim Ingham return bp_name->GetOptions().GetThreadSpec()->GetQueueName();
456b842f2ecSJim Ingham }
457b842f2ecSJim Ingham
SetCommandLineCommands(SBStringList & commands)458b842f2ecSJim Ingham void SBBreakpointName::SetCommandLineCommands(SBStringList &commands) {
459*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, commands);
460baf5664fSJonas Devlieghere
461b842f2ecSJim Ingham BreakpointName *bp_name = GetBreakpointName();
462b842f2ecSJim Ingham if (!bp_name)
463b842f2ecSJim Ingham return;
464b842f2ecSJim Ingham if (commands.GetSize() == 0)
465b842f2ecSJim Ingham return;
466b842f2ecSJim Ingham
467b842f2ecSJim Ingham
468b842f2ecSJim Ingham std::lock_guard<std::recursive_mutex> guard(
469b842f2ecSJim Ingham m_impl_up->GetTarget()->GetAPIMutex());
470b842f2ecSJim Ingham std::unique_ptr<BreakpointOptions::CommandData> cmd_data_up(
471b842f2ecSJim Ingham new BreakpointOptions::CommandData(*commands, eScriptLanguageNone));
472b842f2ecSJim Ingham
473b842f2ecSJim Ingham bp_name->GetOptions().SetCommandDataCallback(cmd_data_up);
474b842f2ecSJim Ingham UpdateName(*bp_name);
475b842f2ecSJim Ingham }
476b842f2ecSJim Ingham
GetCommandLineCommands(SBStringList & commands)477b842f2ecSJim Ingham bool SBBreakpointName::GetCommandLineCommands(SBStringList &commands) {
478*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, commands);
479baf5664fSJonas Devlieghere
480b842f2ecSJim Ingham BreakpointName *bp_name = GetBreakpointName();
481b842f2ecSJim Ingham if (!bp_name)
482b842f2ecSJim Ingham return false;
483b842f2ecSJim Ingham
484b842f2ecSJim Ingham StringList command_list;
485b842f2ecSJim Ingham bool has_commands =
486b842f2ecSJim Ingham bp_name->GetOptions().GetCommandLineCallbacks(command_list);
487b842f2ecSJim Ingham if (has_commands)
488b842f2ecSJim Ingham commands.AppendList(command_list);
489b842f2ecSJim Ingham return has_commands;
490b842f2ecSJim Ingham }
491b842f2ecSJim Ingham
GetHelpString() const492e9632ebaSJim Ingham const char *SBBreakpointName::GetHelpString() const {
493*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
494baf5664fSJonas Devlieghere
495e9632ebaSJim Ingham BreakpointName *bp_name = GetBreakpointName();
496e9632ebaSJim Ingham if (!bp_name)
497e9632ebaSJim Ingham return "";
498e9632ebaSJim Ingham
499e9632ebaSJim Ingham return bp_name->GetHelp();
500e9632ebaSJim Ingham }
501e9632ebaSJim Ingham
SetHelpString(const char * help_string)502e9632ebaSJim Ingham void SBBreakpointName::SetHelpString(const char *help_string) {
503*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, help_string);
504baf5664fSJonas Devlieghere
505e9632ebaSJim Ingham BreakpointName *bp_name = GetBreakpointName();
506e9632ebaSJim Ingham if (!bp_name)
507e9632ebaSJim Ingham return;
508e9632ebaSJim Ingham
509e9632ebaSJim Ingham
510e9632ebaSJim Ingham std::lock_guard<std::recursive_mutex> guard(
511e9632ebaSJim Ingham m_impl_up->GetTarget()->GetAPIMutex());
512e9632ebaSJim Ingham bp_name->SetHelp(help_string);
513e9632ebaSJim Ingham }
514e9632ebaSJim Ingham
GetDescription(SBStream & s)515b842f2ecSJim Ingham bool SBBreakpointName::GetDescription(SBStream &s) {
516*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, s);
517baf5664fSJonas Devlieghere
518b842f2ecSJim Ingham BreakpointName *bp_name = GetBreakpointName();
519b842f2ecSJim Ingham if (!bp_name)
520b842f2ecSJim Ingham {
521b842f2ecSJim Ingham s.Printf("No value");
522b842f2ecSJim Ingham return false;
523b842f2ecSJim Ingham }
524b842f2ecSJim Ingham
525b842f2ecSJim Ingham std::lock_guard<std::recursive_mutex> guard(
526b842f2ecSJim Ingham m_impl_up->GetTarget()->GetAPIMutex());
527b842f2ecSJim Ingham bp_name->GetDescription(s.get(), eDescriptionLevelFull);
528b842f2ecSJim Ingham return true;
529b842f2ecSJim Ingham }
530b842f2ecSJim Ingham
SetCallback(SBBreakpointHitCallback callback,void * baton)531b842f2ecSJim Ingham void SBBreakpointName::SetCallback(SBBreakpointHitCallback callback,
532b842f2ecSJim Ingham void *baton) {
533*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, callback, baton);
5340d7b0c96SJonas Devlieghere
535b842f2ecSJim Ingham BreakpointName *bp_name = GetBreakpointName();
536b842f2ecSJim Ingham if (!bp_name)
537b842f2ecSJim Ingham return;
538b842f2ecSJim Ingham std::lock_guard<std::recursive_mutex> guard(
539b842f2ecSJim Ingham m_impl_up->GetTarget()->GetAPIMutex());
540b842f2ecSJim Ingham
541b842f2ecSJim Ingham BatonSP baton_sp(new SBBreakpointCallbackBaton(callback, baton));
542b842f2ecSJim Ingham bp_name->GetOptions().SetCallback(SBBreakpointCallbackBaton
543b842f2ecSJim Ingham ::PrivateBreakpointHitCallback,
544b842f2ecSJim Ingham baton_sp,
545b842f2ecSJim Ingham false);
546b842f2ecSJim Ingham UpdateName(*bp_name);
547b842f2ecSJim Ingham }
548b842f2ecSJim Ingham
SetScriptCallbackFunction(const char * callback_function_name)549b842f2ecSJim Ingham void SBBreakpointName::SetScriptCallbackFunction(
550b842f2ecSJim Ingham const char *callback_function_name) {
551*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, callback_function_name);
552738af7a6SJim Ingham SBStructuredData empty_args;
553738af7a6SJim Ingham SetScriptCallbackFunction(callback_function_name, empty_args);
554738af7a6SJim Ingham }
555baf5664fSJonas Devlieghere
SetScriptCallbackFunction(const char * callback_function_name,SBStructuredData & extra_args)556738af7a6SJim Ingham SBError SBBreakpointName::SetScriptCallbackFunction(
557738af7a6SJim Ingham const char *callback_function_name,
558738af7a6SJim Ingham SBStructuredData &extra_args) {
559*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, callback_function_name, extra_args);
560738af7a6SJim Ingham SBError sb_error;
561b842f2ecSJim Ingham BreakpointName *bp_name = GetBreakpointName();
562738af7a6SJim Ingham if (!bp_name) {
563738af7a6SJim Ingham sb_error.SetErrorString("unrecognized breakpoint name");
564d232abc3SJonas Devlieghere return sb_error;
565738af7a6SJim Ingham }
566b842f2ecSJim Ingham
567b842f2ecSJim Ingham std::lock_guard<std::recursive_mutex> guard(
568b842f2ecSJim Ingham m_impl_up->GetTarget()->GetAPIMutex());
569b842f2ecSJim Ingham
570b842f2ecSJim Ingham BreakpointOptions &bp_options = bp_name->GetOptions();
571738af7a6SJim Ingham Status error;
572738af7a6SJim Ingham error = m_impl_up->GetTarget()
573b842f2ecSJim Ingham ->GetDebugger()
574b842f2ecSJim Ingham .GetScriptInterpreter()
575cfb96d84SJim Ingham ->SetBreakpointCommandCallbackFunction(
576cfb96d84SJim Ingham bp_options, callback_function_name,
577cfb96d84SJim Ingham extra_args.m_impl_up->GetObjectSP());
578738af7a6SJim Ingham sb_error.SetError(error);
579b842f2ecSJim Ingham UpdateName(*bp_name);
580d232abc3SJonas Devlieghere return sb_error;
581b842f2ecSJim Ingham }
582b842f2ecSJim Ingham
583baf5664fSJonas Devlieghere SBError
SetScriptCallbackBody(const char * callback_body_text)584baf5664fSJonas Devlieghere SBBreakpointName::SetScriptCallbackBody(const char *callback_body_text) {
585*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, callback_body_text);
586baf5664fSJonas Devlieghere
587b842f2ecSJim Ingham SBError sb_error;
588b842f2ecSJim Ingham BreakpointName *bp_name = GetBreakpointName();
589b842f2ecSJim Ingham if (!bp_name)
590d232abc3SJonas Devlieghere return sb_error;
591b842f2ecSJim Ingham
592b842f2ecSJim Ingham std::lock_guard<std::recursive_mutex> guard(
593b842f2ecSJim Ingham m_impl_up->GetTarget()->GetAPIMutex());
594b842f2ecSJim Ingham
595b842f2ecSJim Ingham BreakpointOptions &bp_options = bp_name->GetOptions();
596b842f2ecSJim Ingham Status error =
597b842f2ecSJim Ingham m_impl_up->GetTarget()
598b842f2ecSJim Ingham ->GetDebugger()
599b842f2ecSJim Ingham .GetScriptInterpreter()
600cfb96d84SJim Ingham ->SetBreakpointCommandCallback(bp_options, callback_body_text);
601b842f2ecSJim Ingham sb_error.SetError(error);
602b842f2ecSJim Ingham if (!sb_error.Fail())
603b842f2ecSJim Ingham UpdateName(*bp_name);
604b842f2ecSJim Ingham
605d232abc3SJonas Devlieghere return sb_error;
606b842f2ecSJim Ingham }
607b842f2ecSJim Ingham
GetAllowList() const608baf5664fSJonas Devlieghere bool SBBreakpointName::GetAllowList() const {
609*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
610baf5664fSJonas Devlieghere
611b842f2ecSJim Ingham BreakpointName *bp_name = GetBreakpointName();
612b842f2ecSJim Ingham if (!bp_name)
613b842f2ecSJim Ingham return false;
614b842f2ecSJim Ingham return bp_name->GetPermissions().GetAllowList();
615b842f2ecSJim Ingham }
616b842f2ecSJim Ingham
SetAllowList(bool value)617baf5664fSJonas Devlieghere void SBBreakpointName::SetAllowList(bool value) {
618*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, value);
619b842f2ecSJim Ingham
620b842f2ecSJim Ingham BreakpointName *bp_name = GetBreakpointName();
621b842f2ecSJim Ingham if (!bp_name)
622b842f2ecSJim Ingham return;
623b842f2ecSJim Ingham bp_name->GetPermissions().SetAllowList(value);
624b842f2ecSJim Ingham }
625b842f2ecSJim Ingham
GetAllowDelete()626baf5664fSJonas Devlieghere bool SBBreakpointName::GetAllowDelete() {
627*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
628baf5664fSJonas Devlieghere
629b842f2ecSJim Ingham BreakpointName *bp_name = GetBreakpointName();
630b842f2ecSJim Ingham if (!bp_name)
631b842f2ecSJim Ingham return false;
632b842f2ecSJim Ingham return bp_name->GetPermissions().GetAllowDelete();
633b842f2ecSJim Ingham }
634b842f2ecSJim Ingham
SetAllowDelete(bool value)635baf5664fSJonas Devlieghere void SBBreakpointName::SetAllowDelete(bool value) {
636*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, value);
637b842f2ecSJim Ingham
638b842f2ecSJim Ingham BreakpointName *bp_name = GetBreakpointName();
639b842f2ecSJim Ingham if (!bp_name)
640b842f2ecSJim Ingham return;
641b842f2ecSJim Ingham bp_name->GetPermissions().SetAllowDelete(value);
642b842f2ecSJim Ingham }
643b842f2ecSJim Ingham
GetAllowDisable()644baf5664fSJonas Devlieghere bool SBBreakpointName::GetAllowDisable() {
645*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
646baf5664fSJonas Devlieghere
647b842f2ecSJim Ingham BreakpointName *bp_name = GetBreakpointName();
648b842f2ecSJim Ingham if (!bp_name)
649b842f2ecSJim Ingham return false;
650b842f2ecSJim Ingham return bp_name->GetPermissions().GetAllowDisable();
651b842f2ecSJim Ingham }
652b842f2ecSJim Ingham
SetAllowDisable(bool value)653baf5664fSJonas Devlieghere void SBBreakpointName::SetAllowDisable(bool value) {
654*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, value);
655baf5664fSJonas Devlieghere
656b842f2ecSJim Ingham BreakpointName *bp_name = GetBreakpointName();
657b842f2ecSJim Ingham if (!bp_name)
658b842f2ecSJim Ingham return;
659b842f2ecSJim Ingham bp_name->GetPermissions().SetAllowDisable(value);
660b842f2ecSJim Ingham }
661b842f2ecSJim Ingham
GetBreakpointName() const662b842f2ecSJim Ingham lldb_private::BreakpointName *SBBreakpointName::GetBreakpointName() const
663b842f2ecSJim Ingham {
664b842f2ecSJim Ingham if (!IsValid())
665b842f2ecSJim Ingham return nullptr;
666b842f2ecSJim Ingham return m_impl_up->GetBreakpointName();
667b842f2ecSJim Ingham }
668