blob: 11afa9946e45e15f2eda3e4d2d8f37e64c762188 [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- SBBreakpoint.cpp ----------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "lldb/API/SBBreakpoint.h"
11#include "lldb/API/SBBreakpointLocation.h"
12#include "lldb/API/SBDebugger.h"
Greg Clayton9fed0d82010-07-23 23:33:17 +000013#include "lldb/API/SBEvent.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000014#include "lldb/API/SBProcess.h"
Caroline Ticedde9cff2010-09-20 05:20:02 +000015#include "lldb/API/SBStream.h"
Jim Ingham5e09c8c2014-12-16 23:40:14 +000016#include "lldb/API/SBStringList.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000017#include "lldb/API/SBThread.h"
18
19#include "lldb/Breakpoint/Breakpoint.h"
Jim Ingham01f16662016-09-14 19:07:35 +000020#include "lldb/Breakpoint/BreakpointIDList.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000021#include "lldb/Breakpoint/BreakpointLocation.h"
Jim Ingham3815e702018-09-13 21:35:32 +000022#include "lldb/Breakpoint/BreakpointResolver.h"
23#include "lldb/Breakpoint/BreakpointResolverScripted.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000024#include "lldb/Breakpoint/StoppointCallbackContext.h"
25#include "lldb/Core/Address.h"
Jim Inghamd80102e2014-04-02 01:04:55 +000026#include "lldb/Core/Debugger.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000027#include "lldb/Core/StreamFile.h"
Jim Inghamd80102e2014-04-02 01:04:55 +000028#include "lldb/Interpreter/CommandInterpreter.h"
29#include "lldb/Interpreter/ScriptInterpreter.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000030#include "lldb/Target/Process.h"
Greg Claytond5944cd2013-12-06 01:12:00 +000031#include "lldb/Target/SectionLoadList.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000032#include "lldb/Target/Target.h"
Jim Ingham62b02c62010-06-18 01:47:08 +000033#include "lldb/Target/Thread.h"
34#include "lldb/Target/ThreadSpec.h"
Zachary Turner6f9e6902017-03-03 20:56:28 +000035#include "lldb/Utility/Log.h"
Zachary Turnerbf9a7732017-02-02 21:39:50 +000036#include "lldb/Utility/Stream.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000037
Jim Inghamb842f2e2017-09-14 20:22:49 +000038#include "SBBreakpointOptionCommon.h"
39
Chris Lattner30fdc8d2010-06-08 16:52:24 +000040#include "lldb/lldb-enumerations.h"
41
Zachary Turner4e4fbe82016-09-13 17:53:38 +000042#include "llvm/ADT/STLExtras.h"
43
Chris Lattner30fdc8d2010-06-08 16:52:24 +000044using namespace lldb;
45using namespace lldb_private;
46
Pavel Labath6ac84032017-02-27 11:05:34 +000047SBBreakpoint::SBBreakpoint() {}
Chris Lattner30fdc8d2010-06-08 16:52:24 +000048
Kate Stoneb9c1b512016-09-06 20:57:50 +000049SBBreakpoint::SBBreakpoint(const SBBreakpoint &rhs)
Pavel Labath6ac84032017-02-27 11:05:34 +000050 : m_opaque_wp(rhs.m_opaque_wp) {}
Chris Lattner30fdc8d2010-06-08 16:52:24 +000051
Kate Stoneb9c1b512016-09-06 20:57:50 +000052SBBreakpoint::SBBreakpoint(const lldb::BreakpointSP &bp_sp)
Pavel Labath6ac84032017-02-27 11:05:34 +000053 : m_opaque_wp(bp_sp) {}
Chris Lattner30fdc8d2010-06-08 16:52:24 +000054
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +000055SBBreakpoint::~SBBreakpoint() = default;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000056
Kate Stoneb9c1b512016-09-06 20:57:50 +000057const SBBreakpoint &SBBreakpoint::operator=(const SBBreakpoint &rhs) {
Pavel Labath6ac84032017-02-27 11:05:34 +000058 m_opaque_wp = rhs.m_opaque_wp;
Kate Stoneb9c1b512016-09-06 20:57:50 +000059 return *this;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000060}
61
Kate Stoneb9c1b512016-09-06 20:57:50 +000062bool SBBreakpoint::operator==(const lldb::SBBreakpoint &rhs) {
Pavel Labath6ac84032017-02-27 11:05:34 +000063 return m_opaque_wp.lock() == rhs.m_opaque_wp.lock();
Kate Stoneb9c1b512016-09-06 20:57:50 +000064}
65
66bool SBBreakpoint::operator!=(const lldb::SBBreakpoint &rhs) {
Pavel Labath6ac84032017-02-27 11:05:34 +000067 return m_opaque_wp.lock() != rhs.m_opaque_wp.lock();
Kate Stoneb9c1b512016-09-06 20:57:50 +000068}
69
70break_id_t SBBreakpoint::GetID() const {
71 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
72
73 break_id_t break_id = LLDB_INVALID_BREAK_ID;
Pavel Labath6ac84032017-02-27 11:05:34 +000074 BreakpointSP bkpt_sp = GetSP();
75 if (bkpt_sp)
76 break_id = bkpt_sp->GetID();
Kate Stoneb9c1b512016-09-06 20:57:50 +000077
Pavel Labath6ac84032017-02-27 11:05:34 +000078 LLDB_LOG(log, "breakpoint = {0}, id = {1}", bkpt_sp.get(), break_id);
Kate Stoneb9c1b512016-09-06 20:57:50 +000079 return break_id;
80}
81
82bool SBBreakpoint::IsValid() const {
Pavel Labath6ac84032017-02-27 11:05:34 +000083 BreakpointSP bkpt_sp = GetSP();
84 if (!bkpt_sp)
Kate Stoneb9c1b512016-09-06 20:57:50 +000085 return false;
Pavel Labath6ac84032017-02-27 11:05:34 +000086 else if (bkpt_sp->GetTarget().GetBreakpointByID(bkpt_sp->GetID()))
Kate Stoneb9c1b512016-09-06 20:57:50 +000087 return true;
88 else
Greg Claytonac2eb9b2010-12-12 19:25:26 +000089 return false;
90}
91
Kate Stoneb9c1b512016-09-06 20:57:50 +000092void SBBreakpoint::ClearAllBreakpointSites() {
Pavel Labath6ac84032017-02-27 11:05:34 +000093 BreakpointSP bkpt_sp = GetSP();
94 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +000095 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +000096 bkpt_sp->GetTarget().GetAPIMutex());
97 bkpt_sp->ClearAllBreakpointSites();
Kate Stoneb9c1b512016-09-06 20:57:50 +000098 }
Enrico Granatac3387332013-05-03 01:29:27 +000099}
100
Kate Stoneb9c1b512016-09-06 20:57:50 +0000101SBBreakpointLocation SBBreakpoint::FindLocationByAddress(addr_t vm_addr) {
102 SBBreakpointLocation sb_bp_location;
Caroline Ticeceb6b132010-10-26 03:11:13 +0000103
Pavel Labath6ac84032017-02-27 11:05:34 +0000104 BreakpointSP bkpt_sp = GetSP();
105 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000106 if (vm_addr != LLDB_INVALID_ADDRESS) {
107 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000108 bkpt_sp->GetTarget().GetAPIMutex());
Kate Stoneb9c1b512016-09-06 20:57:50 +0000109 Address address;
Pavel Labath6ac84032017-02-27 11:05:34 +0000110 Target &target = bkpt_sp->GetTarget();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000111 if (!target.GetSectionLoadList().ResolveLoadAddress(vm_addr, address)) {
112 address.SetRawAddress(vm_addr);
113 }
Pavel Labath6ac84032017-02-27 11:05:34 +0000114 sb_bp_location.SetLocation(bkpt_sp->FindLocationByAddress(address));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000115 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000116 }
117 return sb_bp_location;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000118}
119
Kate Stoneb9c1b512016-09-06 20:57:50 +0000120break_id_t SBBreakpoint::FindLocationIDByAddress(addr_t vm_addr) {
121 break_id_t break_id = LLDB_INVALID_BREAK_ID;
Pavel Labath6ac84032017-02-27 11:05:34 +0000122 BreakpointSP bkpt_sp = GetSP();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000123
Pavel Labath6ac84032017-02-27 11:05:34 +0000124 if (bkpt_sp && vm_addr != LLDB_INVALID_ADDRESS) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000125 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000126 bkpt_sp->GetTarget().GetAPIMutex());
Kate Stoneb9c1b512016-09-06 20:57:50 +0000127 Address address;
Pavel Labath6ac84032017-02-27 11:05:34 +0000128 Target &target = bkpt_sp->GetTarget();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000129 if (!target.GetSectionLoadList().ResolveLoadAddress(vm_addr, address)) {
130 address.SetRawAddress(vm_addr);
Greg Claytonaf67cec2010-12-20 20:49:23 +0000131 }
Pavel Labath6ac84032017-02-27 11:05:34 +0000132 break_id = bkpt_sp->FindLocationIDByAddress(address);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000133 }
134
135 return break_id;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000136}
137
Kate Stoneb9c1b512016-09-06 20:57:50 +0000138SBBreakpointLocation SBBreakpoint::FindLocationByID(break_id_t bp_loc_id) {
139 SBBreakpointLocation sb_bp_location;
Pavel Labath6ac84032017-02-27 11:05:34 +0000140 BreakpointSP bkpt_sp = GetSP();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000141
Pavel Labath6ac84032017-02-27 11:05:34 +0000142 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000143 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000144 bkpt_sp->GetTarget().GetAPIMutex());
145 sb_bp_location.SetLocation(bkpt_sp->FindLocationByID(bp_loc_id));
Kate Stoneb9c1b512016-09-06 20:57:50 +0000146 }
147
148 return sb_bp_location;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000149}
150
Kate Stoneb9c1b512016-09-06 20:57:50 +0000151SBBreakpointLocation SBBreakpoint::GetLocationAtIndex(uint32_t index) {
152 SBBreakpointLocation sb_bp_location;
Pavel Labath6ac84032017-02-27 11:05:34 +0000153 BreakpointSP bkpt_sp = GetSP();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000154
Pavel Labath6ac84032017-02-27 11:05:34 +0000155 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000156 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000157 bkpt_sp->GetTarget().GetAPIMutex());
158 sb_bp_location.SetLocation(bkpt_sp->GetLocationAtIndex(index));
Kate Stoneb9c1b512016-09-06 20:57:50 +0000159 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000160
Kate Stoneb9c1b512016-09-06 20:57:50 +0000161 return sb_bp_location;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000162}
163
Kate Stoneb9c1b512016-09-06 20:57:50 +0000164void SBBreakpoint::SetEnabled(bool enable) {
165 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Pavel Labath6ac84032017-02-27 11:05:34 +0000166 BreakpointSP bkpt_sp = GetSP();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000167
Pavel Labath6ac84032017-02-27 11:05:34 +0000168 LLDB_LOG(log, "breakpoint = {0}, enable = {1}", bkpt_sp.get(), enable);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000169
Pavel Labath6ac84032017-02-27 11:05:34 +0000170 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000171 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000172 bkpt_sp->GetTarget().GetAPIMutex());
173 bkpt_sp->SetEnabled(enable);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000174 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000175}
176
Kate Stoneb9c1b512016-09-06 20:57:50 +0000177bool SBBreakpoint::IsEnabled() {
Pavel Labath6ac84032017-02-27 11:05:34 +0000178 BreakpointSP bkpt_sp = GetSP();
179 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000180 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000181 bkpt_sp->GetTarget().GetAPIMutex());
182 return bkpt_sp->IsEnabled();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000183 } else
Greg Clayton05faeb72010-10-07 04:19:01 +0000184 return false;
Caroline Ticedde9cff2010-09-20 05:20:02 +0000185}
186
Kate Stoneb9c1b512016-09-06 20:57:50 +0000187void SBBreakpoint::SetOneShot(bool one_shot) {
188 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Pavel Labath6ac84032017-02-27 11:05:34 +0000189 BreakpointSP bkpt_sp = GetSP();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000190
Pavel Labath6ac84032017-02-27 11:05:34 +0000191 LLDB_LOG(log, "breakpoint = {0}, one_shot = {1}", bkpt_sp.get(), one_shot);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000192
Pavel Labath6ac84032017-02-27 11:05:34 +0000193 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000194 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000195 bkpt_sp->GetTarget().GetAPIMutex());
196 bkpt_sp->SetOneShot(one_shot);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000197 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000198}
199
Kate Stoneb9c1b512016-09-06 20:57:50 +0000200bool SBBreakpoint::IsOneShot() const {
Pavel Labath6ac84032017-02-27 11:05:34 +0000201 BreakpointSP bkpt_sp = GetSP();
202 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000203 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000204 bkpt_sp->GetTarget().GetAPIMutex());
205 return bkpt_sp->IsOneShot();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000206 } else
Jim Ingham5e09c8c2014-12-16 23:40:14 +0000207 return false;
208}
209
Kate Stoneb9c1b512016-09-06 20:57:50 +0000210bool SBBreakpoint::IsInternal() {
Pavel Labath6ac84032017-02-27 11:05:34 +0000211 BreakpointSP bkpt_sp = GetSP();
212 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000213 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000214 bkpt_sp->GetTarget().GetAPIMutex());
215 return bkpt_sp->IsInternal();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000216 } else
Jim Ingham5e09c8c2014-12-16 23:40:14 +0000217 return false;
218}
219
Kate Stoneb9c1b512016-09-06 20:57:50 +0000220void SBBreakpoint::SetIgnoreCount(uint32_t count) {
221 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Pavel Labath6ac84032017-02-27 11:05:34 +0000222 BreakpointSP bkpt_sp = GetSP();
Jim Ingham5e09c8c2014-12-16 23:40:14 +0000223
Pavel Labath6ac84032017-02-27 11:05:34 +0000224 LLDB_LOG(log, "breakpoint = {0}, count = {1}", bkpt_sp.get(), count);
Jim Ingham5e09c8c2014-12-16 23:40:14 +0000225
Pavel Labath6ac84032017-02-27 11:05:34 +0000226 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000227 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000228 bkpt_sp->GetTarget().GetAPIMutex());
229 bkpt_sp->SetIgnoreCount(count);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000230 }
231}
232
233void SBBreakpoint::SetCondition(const char *condition) {
Pavel Labath6ac84032017-02-27 11:05:34 +0000234 BreakpointSP bkpt_sp = GetSP();
235 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000236 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000237 bkpt_sp->GetTarget().GetAPIMutex());
238 bkpt_sp->SetCondition(condition);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000239 }
240}
241
242const char *SBBreakpoint::GetCondition() {
Pavel Labath6ac84032017-02-27 11:05:34 +0000243 BreakpointSP bkpt_sp = GetSP();
244 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000245 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000246 bkpt_sp->GetTarget().GetAPIMutex());
247 return bkpt_sp->GetConditionText();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000248 }
249 return nullptr;
250}
251
Jim Inghamf08f5c92017-08-03 18:13:24 +0000252void SBBreakpoint::SetAutoContinue(bool auto_continue) {
253 BreakpointSP bkpt_sp = GetSP();
254 if (bkpt_sp) {
255 std::lock_guard<std::recursive_mutex> guard(
256 bkpt_sp->GetTarget().GetAPIMutex());
257 bkpt_sp->SetAutoContinue(auto_continue);
258 }
259}
260
261bool SBBreakpoint::GetAutoContinue() {
262 BreakpointSP bkpt_sp = GetSP();
263 if (bkpt_sp) {
264 std::lock_guard<std::recursive_mutex> guard(
265 bkpt_sp->GetTarget().GetAPIMutex());
266 return bkpt_sp->IsAutoContinue();
267 }
Jim Ingham1c7dc822017-08-03 19:38:38 +0000268 return false;
Jim Inghamf08f5c92017-08-03 18:13:24 +0000269}
270
Kate Stoneb9c1b512016-09-06 20:57:50 +0000271uint32_t SBBreakpoint::GetHitCount() const {
272 uint32_t count = 0;
Pavel Labath6ac84032017-02-27 11:05:34 +0000273 BreakpointSP bkpt_sp = GetSP();
274 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000275 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000276 bkpt_sp->GetTarget().GetAPIMutex());
277 count = bkpt_sp->GetHitCount();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000278 }
279
280 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Pavel Labath6ac84032017-02-27 11:05:34 +0000281 LLDB_LOG(log, "breakpoint = {0}, count = {1}", bkpt_sp.get(), count);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000282
283 return count;
284}
285
286uint32_t SBBreakpoint::GetIgnoreCount() const {
287 uint32_t count = 0;
Pavel Labath6ac84032017-02-27 11:05:34 +0000288 BreakpointSP bkpt_sp = GetSP();
289 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000290 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000291 bkpt_sp->GetTarget().GetAPIMutex());
292 count = bkpt_sp->GetIgnoreCount();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000293 }
294
295 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Pavel Labath6ac84032017-02-27 11:05:34 +0000296 LLDB_LOG(log, "breakpoint = {0}, count = {1}", bkpt_sp.get(), count);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000297
298 return count;
299}
300
301void SBBreakpoint::SetThreadID(tid_t tid) {
Pavel Labath6ac84032017-02-27 11:05:34 +0000302 BreakpointSP bkpt_sp = GetSP();
303 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000304 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000305 bkpt_sp->GetTarget().GetAPIMutex());
306 bkpt_sp->SetThreadID(tid);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000307 }
308 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Pavel Labath6ac84032017-02-27 11:05:34 +0000309 LLDB_LOG(log, "breakpoint = {0}, tid = {1:x}", bkpt_sp.get(), tid);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000310}
311
312tid_t SBBreakpoint::GetThreadID() {
313 tid_t tid = LLDB_INVALID_THREAD_ID;
Pavel Labath6ac84032017-02-27 11:05:34 +0000314 BreakpointSP bkpt_sp = GetSP();
315 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000316 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000317 bkpt_sp->GetTarget().GetAPIMutex());
318 tid = bkpt_sp->GetThreadID();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000319 }
320
321 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Pavel Labath6ac84032017-02-27 11:05:34 +0000322 LLDB_LOG(log, "breakpoint = {0}, tid = {1:x}", bkpt_sp.get(), tid);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000323 return tid;
324}
325
326void SBBreakpoint::SetThreadIndex(uint32_t index) {
327 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Pavel Labath6ac84032017-02-27 11:05:34 +0000328 BreakpointSP bkpt_sp = GetSP();
329 LLDB_LOG(log, "breakpoint = {0}, index = {1}", bkpt_sp.get(), index);
330 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000331 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000332 bkpt_sp->GetTarget().GetAPIMutex());
333 bkpt_sp->GetOptions()->GetThreadSpec()->SetIndex(index);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000334 }
335}
336
337uint32_t SBBreakpoint::GetThreadIndex() const {
338 uint32_t thread_idx = UINT32_MAX;
Pavel Labath6ac84032017-02-27 11:05:34 +0000339 BreakpointSP bkpt_sp = GetSP();
340 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000341 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000342 bkpt_sp->GetTarget().GetAPIMutex());
Kate Stoneb9c1b512016-09-06 20:57:50 +0000343 const ThreadSpec *thread_spec =
Pavel Labath6ac84032017-02-27 11:05:34 +0000344 bkpt_sp->GetOptions()->GetThreadSpecNoCreate();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000345 if (thread_spec != nullptr)
346 thread_idx = thread_spec->GetIndex();
347 }
348 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Pavel Labath6ac84032017-02-27 11:05:34 +0000349 LLDB_LOG(log, "breakpoint = {0}, index = {1}", bkpt_sp.get(), thread_idx);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000350
351 return thread_idx;
352}
353
354void SBBreakpoint::SetThreadName(const char *thread_name) {
355 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Pavel Labath6ac84032017-02-27 11:05:34 +0000356 BreakpointSP bkpt_sp = GetSP();
357 LLDB_LOG(log, "breakpoint = {0}, name = {1}", bkpt_sp.get(), thread_name);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000358
Pavel Labath6ac84032017-02-27 11:05:34 +0000359 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000360 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000361 bkpt_sp->GetTarget().GetAPIMutex());
362 bkpt_sp->GetOptions()->GetThreadSpec()->SetName(thread_name);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000363 }
364}
365
366const char *SBBreakpoint::GetThreadName() const {
367 const char *name = nullptr;
Pavel Labath6ac84032017-02-27 11:05:34 +0000368 BreakpointSP bkpt_sp = GetSP();
369 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000370 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000371 bkpt_sp->GetTarget().GetAPIMutex());
Kate Stoneb9c1b512016-09-06 20:57:50 +0000372 const ThreadSpec *thread_spec =
Pavel Labath6ac84032017-02-27 11:05:34 +0000373 bkpt_sp->GetOptions()->GetThreadSpecNoCreate();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000374 if (thread_spec != nullptr)
375 name = thread_spec->GetName();
376 }
377 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Pavel Labath6ac84032017-02-27 11:05:34 +0000378 LLDB_LOG(log, "breakpoint = {0}, name = {1}", bkpt_sp.get(), name);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000379
380 return name;
381}
382
383void SBBreakpoint::SetQueueName(const char *queue_name) {
384 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Pavel Labath6ac84032017-02-27 11:05:34 +0000385 BreakpointSP bkpt_sp = GetSP();
386 LLDB_LOG(log, "breakpoint = {0}, queue_name = {1}", bkpt_sp.get(),
387 queue_name);
388 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000389 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000390 bkpt_sp->GetTarget().GetAPIMutex());
391 bkpt_sp->GetOptions()->GetThreadSpec()->SetQueueName(queue_name);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000392 }
393}
394
395const char *SBBreakpoint::GetQueueName() const {
396 const char *name = nullptr;
Pavel Labath6ac84032017-02-27 11:05:34 +0000397 BreakpointSP bkpt_sp = GetSP();
398 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000399 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000400 bkpt_sp->GetTarget().GetAPIMutex());
Kate Stoneb9c1b512016-09-06 20:57:50 +0000401 const ThreadSpec *thread_spec =
Pavel Labath6ac84032017-02-27 11:05:34 +0000402 bkpt_sp->GetOptions()->GetThreadSpecNoCreate();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000403 if (thread_spec)
404 name = thread_spec->GetQueueName();
405 }
406 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Pavel Labath6ac84032017-02-27 11:05:34 +0000407 LLDB_LOG(log, "breakpoint = {0}, name = {1}", bkpt_sp.get(), name);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000408
409 return name;
410}
411
412size_t SBBreakpoint::GetNumResolvedLocations() const {
413 size_t num_resolved = 0;
Pavel Labath6ac84032017-02-27 11:05:34 +0000414 BreakpointSP bkpt_sp = GetSP();
415 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000416 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000417 bkpt_sp->GetTarget().GetAPIMutex());
418 num_resolved = bkpt_sp->GetNumResolvedLocations();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000419 }
420 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Pavel Labath6ac84032017-02-27 11:05:34 +0000421 LLDB_LOG(log, "breakpoint = {0}, num_resolved = {1}", bkpt_sp.get(),
422 num_resolved);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000423 return num_resolved;
424}
425
426size_t SBBreakpoint::GetNumLocations() const {
Pavel Labath6ac84032017-02-27 11:05:34 +0000427 BreakpointSP bkpt_sp = GetSP();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000428 size_t num_locs = 0;
Pavel Labath6ac84032017-02-27 11:05:34 +0000429 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000430 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000431 bkpt_sp->GetTarget().GetAPIMutex());
432 num_locs = bkpt_sp->GetNumLocations();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000433 }
434 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Pavel Labath6ac84032017-02-27 11:05:34 +0000435 LLDB_LOG(log, "breakpoint = {0}, num_locs = {1}", bkpt_sp.get(), num_locs);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000436 return num_locs;
437}
438
Jim Ingham92d19602016-09-20 22:54:49 +0000439void SBBreakpoint::SetCommandLineCommands(SBStringList &commands) {
Pavel Labath6ac84032017-02-27 11:05:34 +0000440 BreakpointSP bkpt_sp = GetSP();
441 if (!bkpt_sp)
Jim Ingham92d19602016-09-20 22:54:49 +0000442 return;
443 if (commands.GetSize() == 0)
444 return;
445
446 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000447 bkpt_sp->GetTarget().GetAPIMutex());
Jim Ingham92d19602016-09-20 22:54:49 +0000448 std::unique_ptr<BreakpointOptions::CommandData> cmd_data_up(
Jim Inghamf7e07252016-09-26 19:47:37 +0000449 new BreakpointOptions::CommandData(*commands, eScriptLanguageNone));
Jim Ingham92d19602016-09-20 22:54:49 +0000450
Pavel Labath6ac84032017-02-27 11:05:34 +0000451 bkpt_sp->GetOptions()->SetCommandDataCallback(cmd_data_up);
Jim Ingham92d19602016-09-20 22:54:49 +0000452}
453
454bool SBBreakpoint::GetCommandLineCommands(SBStringList &commands) {
Pavel Labath6ac84032017-02-27 11:05:34 +0000455 BreakpointSP bkpt_sp = GetSP();
456 if (!bkpt_sp)
Jim Ingham92d19602016-09-20 22:54:49 +0000457 return false;
458 StringList command_list;
459 bool has_commands =
Pavel Labath6ac84032017-02-27 11:05:34 +0000460 bkpt_sp->GetOptions()->GetCommandLineCallbacks(command_list);
Jim Ingham92d19602016-09-20 22:54:49 +0000461 if (has_commands)
462 commands.AppendList(command_list);
463 return has_commands;
464}
465
Kate Stoneb9c1b512016-09-06 20:57:50 +0000466bool SBBreakpoint::GetDescription(SBStream &s) {
Jim Ingham6d1e4692016-09-16 01:41:27 +0000467 return GetDescription(s, true);
468}
469
470bool SBBreakpoint::GetDescription(SBStream &s, bool include_locations) {
Pavel Labath6ac84032017-02-27 11:05:34 +0000471 BreakpointSP bkpt_sp = GetSP();
472 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000473 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000474 bkpt_sp->GetTarget().GetAPIMutex());
475 s.Printf("SBBreakpoint: id = %i, ", bkpt_sp->GetID());
476 bkpt_sp->GetResolverDescription(s.get());
477 bkpt_sp->GetFilterDescription(s.get());
Jim Ingham6d1e4692016-09-16 01:41:27 +0000478 if (include_locations) {
Pavel Labath6ac84032017-02-27 11:05:34 +0000479 const size_t num_locations = bkpt_sp->GetNumLocations();
Jim Ingham6d1e4692016-09-16 01:41:27 +0000480 s.Printf(", locations = %" PRIu64, (uint64_t)num_locations);
481 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000482 return true;
483 }
484 s.Printf("No value");
485 return false;
486}
487
Jim Ingham3815e702018-09-13 21:35:32 +0000488SBError
489SBBreakpoint::AddLocation(SBAddress &address) {
490 BreakpointSP bkpt_sp = GetSP();
491 SBError error;
492
493 if (!address.IsValid()) {
494 error.SetErrorString("Can't add an invalid address.");
495 return error;
496 }
497
498 if (!bkpt_sp) {
499 error.SetErrorString("No breakpoint to add a location to.");
500 return error;
501 }
502
503 if (!llvm::isa<BreakpointResolverScripted>(bkpt_sp->GetResolver().get())) {
504 error.SetErrorString("Only a scripted resolver can add locations.");
505 return error;
506 }
507
508 if (bkpt_sp->GetSearchFilter()->AddressPasses(address.ref()))
509 bkpt_sp->AddLocation(address.ref());
510 else
511 {
512 StreamString s;
513 address.get()->Dump(&s, &bkpt_sp->GetTarget(),
514 Address::DumpStyleModuleWithFileAddress);
515 error.SetErrorStringWithFormat("Address: %s didn't pass the filter.",
516 s.GetData());
517 }
518 return error;
519}
520
521
Jim Inghamb842f2e2017-09-14 20:22:49 +0000522void SBBreakpoint
523 ::SetCallback(SBBreakpointHitCallback callback,
524 void *baton) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000525 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Pavel Labath6ac84032017-02-27 11:05:34 +0000526 BreakpointSP bkpt_sp = GetSP();
527 LLDB_LOG(log, "breakpoint = {0}, callback = {1}, baton = {2}", bkpt_sp.get(),
528 callback, baton);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000529
Pavel Labath6ac84032017-02-27 11:05:34 +0000530 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000531 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000532 bkpt_sp->GetTarget().GetAPIMutex());
Kate Stoneb9c1b512016-09-06 20:57:50 +0000533 BatonSP baton_sp(new SBBreakpointCallbackBaton(callback, baton));
Jim Inghamb842f2e2017-09-14 20:22:49 +0000534 bkpt_sp->SetCallback(SBBreakpointCallbackBaton
535 ::PrivateBreakpointHitCallback, baton_sp,
Pavel Labath6ac84032017-02-27 11:05:34 +0000536 false);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000537 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000538}
539
Kate Stoneb9c1b512016-09-06 20:57:50 +0000540void SBBreakpoint::SetScriptCallbackFunction(
541 const char *callback_function_name) {
542 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Pavel Labath6ac84032017-02-27 11:05:34 +0000543 BreakpointSP bkpt_sp = GetSP();
544 LLDB_LOG(log, "breakpoint = {0}, callback = {1}", bkpt_sp.get(),
545 callback_function_name);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000546
Pavel Labath6ac84032017-02-27 11:05:34 +0000547 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000548 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000549 bkpt_sp->GetTarget().GetAPIMutex());
550 BreakpointOptions *bp_options = bkpt_sp->GetOptions();
551 bkpt_sp->GetTarget()
Kate Stoneb9c1b512016-09-06 20:57:50 +0000552 .GetDebugger()
553 .GetCommandInterpreter()
554 .GetScriptInterpreter()
555 ->SetBreakpointCommandCallbackFunction(bp_options,
556 callback_function_name);
557 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000558}
559
Kate Stoneb9c1b512016-09-06 20:57:50 +0000560SBError SBBreakpoint::SetScriptCallbackBody(const char *callback_body_text) {
561 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Pavel Labath6ac84032017-02-27 11:05:34 +0000562 BreakpointSP bkpt_sp = GetSP();
563 LLDB_LOG(log, "breakpoint = {0}, callback body:\n{1}", bkpt_sp.get(),
564 callback_body_text);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000565
566 SBError sb_error;
Pavel Labath6ac84032017-02-27 11:05:34 +0000567 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000568 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000569 bkpt_sp->GetTarget().GetAPIMutex());
570 BreakpointOptions *bp_options = bkpt_sp->GetOptions();
Zachary Turner97206d52017-05-12 04:51:55 +0000571 Status error =
Pavel Labath6ac84032017-02-27 11:05:34 +0000572 bkpt_sp->GetTarget()
Kate Stoneb9c1b512016-09-06 20:57:50 +0000573 .GetDebugger()
574 .GetCommandInterpreter()
575 .GetScriptInterpreter()
576 ->SetBreakpointCommandCallback(bp_options, callback_body_text);
577 sb_error.SetError(error);
578 } else
579 sb_error.SetErrorString("invalid breakpoint");
580
581 return sb_error;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000582}
583
Kate Stoneb9c1b512016-09-06 20:57:50 +0000584bool SBBreakpoint::AddName(const char *new_name) {
585 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Pavel Labath6ac84032017-02-27 11:05:34 +0000586 BreakpointSP bkpt_sp = GetSP();
587 LLDB_LOG(log, "breakpoint = {0}, name = {1}", bkpt_sp.get(), new_name);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000588
Pavel Labath6ac84032017-02-27 11:05:34 +0000589 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000590 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000591 bkpt_sp->GetTarget().GetAPIMutex());
Zachary Turner97206d52017-05-12 04:51:55 +0000592 Status error; // Think I'm just going to swallow the error here, it's
593 // probably more annoying to have to provide it.
Jim Inghamb842f2e2017-09-14 20:22:49 +0000594 bkpt_sp->GetTarget().AddNameToBreakpoint(bkpt_sp, new_name, error);
595 if (error.Fail())
596 {
597 if (log)
598 log->Printf("Failed to add name: '%s' to breakpoint: %s",
599 new_name, error.AsCString());
600 return false;
601 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000602 }
603
Jim Inghamb842f2e2017-09-14 20:22:49 +0000604 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000605}
606
Kate Stoneb9c1b512016-09-06 20:57:50 +0000607void SBBreakpoint::RemoveName(const char *name_to_remove) {
608 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Pavel Labath6ac84032017-02-27 11:05:34 +0000609 BreakpointSP bkpt_sp = GetSP();
610 LLDB_LOG(log, "breakpoint = {0}, name = {1}", bkpt_sp.get(), name_to_remove);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000611
Pavel Labath6ac84032017-02-27 11:05:34 +0000612 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000613 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000614 bkpt_sp->GetTarget().GetAPIMutex());
Jim Inghamb842f2e2017-09-14 20:22:49 +0000615 bkpt_sp->GetTarget().RemoveNameFromBreakpoint(bkpt_sp,
616 ConstString(name_to_remove));
Kate Stoneb9c1b512016-09-06 20:57:50 +0000617 }
618}
619
620bool SBBreakpoint::MatchesName(const char *name) {
621 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Pavel Labath6ac84032017-02-27 11:05:34 +0000622 BreakpointSP bkpt_sp = GetSP();
623 LLDB_LOG(log, "breakpoint = {0}, name = {1}", bkpt_sp.get(), name);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000624
Pavel Labath6ac84032017-02-27 11:05:34 +0000625 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000626 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000627 bkpt_sp->GetTarget().GetAPIMutex());
628 return bkpt_sp->MatchesName(name);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000629 }
630
631 return false;
632}
633
634void SBBreakpoint::GetNames(SBStringList &names) {
635 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Pavel Labath6ac84032017-02-27 11:05:34 +0000636 BreakpointSP bkpt_sp = GetSP();
637 LLDB_LOG(log, "breakpoint = {0}", bkpt_sp.get());
Kate Stoneb9c1b512016-09-06 20:57:50 +0000638
Pavel Labath6ac84032017-02-27 11:05:34 +0000639 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000640 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000641 bkpt_sp->GetTarget().GetAPIMutex());
Kate Stoneb9c1b512016-09-06 20:57:50 +0000642 std::vector<std::string> names_vec;
Pavel Labath6ac84032017-02-27 11:05:34 +0000643 bkpt_sp->GetNames(names_vec);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000644 for (std::string name : names_vec) {
645 names.AppendString(name.c_str());
646 }
647 }
648}
649
Kate Stoneb9c1b512016-09-06 20:57:50 +0000650bool SBBreakpoint::EventIsBreakpointEvent(const lldb::SBEvent &event) {
651 return Breakpoint::BreakpointEventData::GetEventDataFromEvent(event.get()) !=
652 nullptr;
Jim Inghame6bc6cb2012-02-08 05:23:15 +0000653}
654
Greg Clayton9fed0d82010-07-23 23:33:17 +0000655BreakpointEventType
Kate Stoneb9c1b512016-09-06 20:57:50 +0000656SBBreakpoint::GetBreakpointEventTypeFromEvent(const SBEvent &event) {
657 if (event.IsValid())
658 return Breakpoint::BreakpointEventData::GetBreakpointEventTypeFromEvent(
659 event.GetSP());
660 return eBreakpointEventTypeInvalidType;
Greg Clayton9fed0d82010-07-23 23:33:17 +0000661}
662
Kate Stoneb9c1b512016-09-06 20:57:50 +0000663SBBreakpoint SBBreakpoint::GetBreakpointFromEvent(const lldb::SBEvent &event) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000664 if (event.IsValid())
Pavel Labath6ac84032017-02-27 11:05:34 +0000665 return SBBreakpoint(
666 Breakpoint::BreakpointEventData::GetBreakpointFromEvent(event.GetSP()));
667 return SBBreakpoint();
Greg Clayton9fed0d82010-07-23 23:33:17 +0000668}
669
670SBBreakpointLocation
Kate Stoneb9c1b512016-09-06 20:57:50 +0000671SBBreakpoint::GetBreakpointLocationAtIndexFromEvent(const lldb::SBEvent &event,
672 uint32_t loc_idx) {
673 SBBreakpointLocation sb_breakpoint_loc;
674 if (event.IsValid())
675 sb_breakpoint_loc.SetLocation(
676 Breakpoint::BreakpointEventData::GetBreakpointLocationAtIndexFromEvent(
677 event.GetSP(), loc_idx));
678 return sb_breakpoint_loc;
Greg Clayton9fed0d82010-07-23 23:33:17 +0000679}
680
Jim Inghame6bc6cb2012-02-08 05:23:15 +0000681uint32_t
Kate Stoneb9c1b512016-09-06 20:57:50 +0000682SBBreakpoint::GetNumBreakpointLocationsFromEvent(const lldb::SBEvent &event) {
683 uint32_t num_locations = 0;
684 if (event.IsValid())
685 num_locations =
686 (Breakpoint::BreakpointEventData::GetNumBreakpointLocationsFromEvent(
687 event.GetSP()));
688 return num_locations;
Jim Inghame6bc6cb2012-02-08 05:23:15 +0000689}
Jim Ingham01f16662016-09-14 19:07:35 +0000690
Pavel Labath6ac84032017-02-27 11:05:34 +0000691BreakpointSP SBBreakpoint::GetSP() const { return m_opaque_wp.lock(); }
692
Jim Ingham01f16662016-09-14 19:07:35 +0000693// This is simple collection of breakpoint id's and their target.
Todd Fiala653e3f42016-11-11 21:06:40 +0000694class SBBreakpointListImpl {
Jim Ingham01f16662016-09-14 19:07:35 +0000695public:
Todd Fiala653e3f42016-11-11 21:06:40 +0000696 SBBreakpointListImpl(lldb::TargetSP target_sp) : m_target_wp() {
697 if (target_sp && target_sp->IsValid())
698 m_target_wp = target_sp;
Jim Ingham01f16662016-09-14 19:07:35 +0000699 }
700
701 ~SBBreakpointListImpl() = default;
702
703 size_t GetSize() { return m_break_ids.size(); }
704
705 BreakpointSP GetBreakpointAtIndex(size_t idx) {
706 if (idx >= m_break_ids.size())
707 return BreakpointSP();
708 TargetSP target_sp = m_target_wp.lock();
709 if (!target_sp)
710 return BreakpointSP();
711 lldb::break_id_t bp_id = m_break_ids[idx];
712 return target_sp->GetBreakpointList().FindBreakpointByID(bp_id);
713 }
714
Jim Ingham6d1e4692016-09-16 01:41:27 +0000715 BreakpointSP FindBreakpointByID(lldb::break_id_t desired_id) {
716 TargetSP target_sp = m_target_wp.lock();
717 if (!target_sp)
718 return BreakpointSP();
719
720 for (lldb::break_id_t &break_id : m_break_ids) {
721 if (break_id == desired_id)
722 return target_sp->GetBreakpointList().FindBreakpointByID(break_id);
723 }
724 return BreakpointSP();
725 }
726
Pavel Labath6ac84032017-02-27 11:05:34 +0000727 bool Append(BreakpointSP bkpt) {
Jim Ingham01f16662016-09-14 19:07:35 +0000728 TargetSP target_sp = m_target_wp.lock();
Pavel Labath6ac84032017-02-27 11:05:34 +0000729 if (!target_sp || !bkpt)
Jim Ingham01f16662016-09-14 19:07:35 +0000730 return false;
Pavel Labath6ac84032017-02-27 11:05:34 +0000731 if (bkpt->GetTargetSP() != target_sp)
Jim Ingham01f16662016-09-14 19:07:35 +0000732 return false;
Pavel Labath6ac84032017-02-27 11:05:34 +0000733 m_break_ids.push_back(bkpt->GetID());
Jim Ingham01f16662016-09-14 19:07:35 +0000734 return true;
735 }
736
Pavel Labath6ac84032017-02-27 11:05:34 +0000737 bool AppendIfUnique(BreakpointSP bkpt) {
Jim Ingham01f16662016-09-14 19:07:35 +0000738 TargetSP target_sp = m_target_wp.lock();
Pavel Labath6ac84032017-02-27 11:05:34 +0000739 if (!target_sp || !bkpt)
Jim Ingham01f16662016-09-14 19:07:35 +0000740 return false;
Pavel Labath6ac84032017-02-27 11:05:34 +0000741 if (bkpt->GetTargetSP() != target_sp)
Jim Ingham01f16662016-09-14 19:07:35 +0000742 return false;
Pavel Labath6ac84032017-02-27 11:05:34 +0000743 lldb::break_id_t bp_id = bkpt->GetID();
Jim Ingham01f16662016-09-14 19:07:35 +0000744 if (find(m_break_ids.begin(), m_break_ids.end(), bp_id) ==
745 m_break_ids.end())
746 return false;
747
Pavel Labath6ac84032017-02-27 11:05:34 +0000748 m_break_ids.push_back(bkpt->GetID());
Jim Ingham01f16662016-09-14 19:07:35 +0000749 return true;
750 }
751
752 bool AppendByID(lldb::break_id_t id) {
753 TargetSP target_sp = m_target_wp.lock();
754 if (!target_sp)
755 return false;
756 if (id == LLDB_INVALID_BREAK_ID)
757 return false;
758 m_break_ids.push_back(id);
759 return true;
760 }
761
762 void Clear() { m_break_ids.clear(); }
763
764 void CopyToBreakpointIDList(lldb_private::BreakpointIDList &bp_list) {
765 for (lldb::break_id_t id : m_break_ids) {
766 bp_list.AddBreakpointID(BreakpointID(id));
767 }
768 }
769
770 TargetSP GetTarget() { return m_target_wp.lock(); }
771
772private:
773 std::vector<lldb::break_id_t> m_break_ids;
774 TargetWP m_target_wp;
775};
776
777SBBreakpointList::SBBreakpointList(SBTarget &target)
Todd Fiala653e3f42016-11-11 21:06:40 +0000778 : m_opaque_sp(new SBBreakpointListImpl(target.GetSP())) {}
Jim Ingham01f16662016-09-14 19:07:35 +0000779
780SBBreakpointList::~SBBreakpointList() {}
781
782size_t SBBreakpointList::GetSize() const {
783 if (!m_opaque_sp)
784 return 0;
785 else
786 return m_opaque_sp->GetSize();
787}
788
789SBBreakpoint SBBreakpointList::GetBreakpointAtIndex(size_t idx) {
790 if (!m_opaque_sp)
791 return SBBreakpoint();
792
793 BreakpointSP bkpt_sp = m_opaque_sp->GetBreakpointAtIndex(idx);
794 return SBBreakpoint(bkpt_sp);
795}
796
Jim Ingham6d1e4692016-09-16 01:41:27 +0000797SBBreakpoint SBBreakpointList::FindBreakpointByID(lldb::break_id_t id) {
798 if (!m_opaque_sp)
799 return SBBreakpoint();
800 BreakpointSP bkpt_sp = m_opaque_sp->FindBreakpointByID(id);
801 return SBBreakpoint(bkpt_sp);
802}
803
Jim Ingham01f16662016-09-14 19:07:35 +0000804void SBBreakpointList::Append(const SBBreakpoint &sb_bkpt) {
805 if (!sb_bkpt.IsValid())
806 return;
807 if (!m_opaque_sp)
808 return;
Pavel Labath6ac84032017-02-27 11:05:34 +0000809 m_opaque_sp->Append(sb_bkpt.m_opaque_wp.lock());
Jim Ingham01f16662016-09-14 19:07:35 +0000810}
811
812void SBBreakpointList::AppendByID(lldb::break_id_t id) {
813 if (!m_opaque_sp)
814 return;
815 m_opaque_sp->AppendByID(id);
816}
817
818bool SBBreakpointList::AppendIfUnique(const SBBreakpoint &sb_bkpt) {
819 if (!sb_bkpt.IsValid())
820 return false;
821 if (!m_opaque_sp)
822 return false;
Pavel Labath6ac84032017-02-27 11:05:34 +0000823 return m_opaque_sp->AppendIfUnique(sb_bkpt.GetSP());
Jim Ingham01f16662016-09-14 19:07:35 +0000824}
825
826void SBBreakpointList::Clear() {
827 if (m_opaque_sp)
828 m_opaque_sp->Clear();
829}
830
831void SBBreakpointList::CopyToBreakpointIDList(
832 lldb_private::BreakpointIDList &bp_id_list) {
833 if (m_opaque_sp)
834 m_opaque_sp->CopyToBreakpointIDList(bp_id_list);
835}