blob: bf9603248d71f2f36537f406259010ed16a32264 [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
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +000010// C Includes
11// C++ Includes
12// Other libraries and framework includes
13// Project includes
Chris Lattner30fdc8d2010-06-08 16:52:24 +000014#include "lldb/API/SBBreakpoint.h"
15#include "lldb/API/SBBreakpointLocation.h"
16#include "lldb/API/SBDebugger.h"
Greg Clayton9fed0d82010-07-23 23:33:17 +000017#include "lldb/API/SBEvent.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000018#include "lldb/API/SBProcess.h"
Caroline Ticedde9cff2010-09-20 05:20:02 +000019#include "lldb/API/SBStream.h"
Jim Ingham5e09c8c2014-12-16 23:40:14 +000020#include "lldb/API/SBStringList.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000021#include "lldb/API/SBThread.h"
22
23#include "lldb/Breakpoint/Breakpoint.h"
Jim Ingham01f16662016-09-14 19:07:35 +000024#include "lldb/Breakpoint/BreakpointIDList.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000025#include "lldb/Breakpoint/BreakpointLocation.h"
26#include "lldb/Breakpoint/StoppointCallbackContext.h"
27#include "lldb/Core/Address.h"
Jim Inghamd80102e2014-04-02 01:04:55 +000028#include "lldb/Core/Debugger.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000029#include "lldb/Core/StreamFile.h"
Jim Inghamd80102e2014-04-02 01:04:55 +000030#include "lldb/Interpreter/CommandInterpreter.h"
31#include "lldb/Interpreter/ScriptInterpreter.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000032#include "lldb/Target/Process.h"
Greg Claytond5944cd2013-12-06 01:12:00 +000033#include "lldb/Target/SectionLoadList.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000034#include "lldb/Target/Target.h"
Jim Ingham62b02c62010-06-18 01:47:08 +000035#include "lldb/Target/Thread.h"
36#include "lldb/Target/ThreadSpec.h"
Zachary Turner6f9e6902017-03-03 20:56:28 +000037#include "lldb/Utility/Log.h"
Zachary Turnerbf9a7732017-02-02 21:39:50 +000038#include "lldb/Utility/Stream.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000039
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
Kate Stoneb9c1b512016-09-06 20:57:50 +000047struct CallbackData {
48 SBBreakpoint::BreakpointHitCallback callback;
49 void *callback_baton;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000050};
51
Zachary Turner4e4fbe82016-09-13 17:53:38 +000052class SBBreakpointCallbackBaton : public TypedBaton<CallbackData> {
Chris Lattner30fdc8d2010-06-08 16:52:24 +000053public:
Kate Stoneb9c1b512016-09-06 20:57:50 +000054 SBBreakpointCallbackBaton(SBBreakpoint::BreakpointHitCallback callback,
55 void *baton)
Zachary Turner4e4fbe82016-09-13 17:53:38 +000056 : TypedBaton(llvm::make_unique<CallbackData>()) {
57 getItem()->callback = callback;
58 getItem()->callback_baton = baton;
Kate Stoneb9c1b512016-09-06 20:57:50 +000059 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +000060};
61
Pavel Labath6ac84032017-02-27 11:05:34 +000062SBBreakpoint::SBBreakpoint() {}
Chris Lattner30fdc8d2010-06-08 16:52:24 +000063
Kate Stoneb9c1b512016-09-06 20:57:50 +000064SBBreakpoint::SBBreakpoint(const SBBreakpoint &rhs)
Pavel Labath6ac84032017-02-27 11:05:34 +000065 : m_opaque_wp(rhs.m_opaque_wp) {}
Chris Lattner30fdc8d2010-06-08 16:52:24 +000066
Kate Stoneb9c1b512016-09-06 20:57:50 +000067SBBreakpoint::SBBreakpoint(const lldb::BreakpointSP &bp_sp)
Pavel Labath6ac84032017-02-27 11:05:34 +000068 : m_opaque_wp(bp_sp) {}
Chris Lattner30fdc8d2010-06-08 16:52:24 +000069
Eugene Zelenkodbb0abb2015-10-31 01:22:59 +000070SBBreakpoint::~SBBreakpoint() = default;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000071
Kate Stoneb9c1b512016-09-06 20:57:50 +000072const SBBreakpoint &SBBreakpoint::operator=(const SBBreakpoint &rhs) {
Pavel Labath6ac84032017-02-27 11:05:34 +000073 m_opaque_wp = rhs.m_opaque_wp;
Kate Stoneb9c1b512016-09-06 20:57:50 +000074 return *this;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000075}
76
Kate Stoneb9c1b512016-09-06 20:57:50 +000077bool SBBreakpoint::operator==(const lldb::SBBreakpoint &rhs) {
Pavel Labath6ac84032017-02-27 11:05:34 +000078 return m_opaque_wp.lock() == rhs.m_opaque_wp.lock();
Kate Stoneb9c1b512016-09-06 20:57:50 +000079}
80
81bool SBBreakpoint::operator!=(const lldb::SBBreakpoint &rhs) {
Pavel Labath6ac84032017-02-27 11:05:34 +000082 return m_opaque_wp.lock() != rhs.m_opaque_wp.lock();
Kate Stoneb9c1b512016-09-06 20:57:50 +000083}
84
85break_id_t SBBreakpoint::GetID() const {
86 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
87
88 break_id_t break_id = LLDB_INVALID_BREAK_ID;
Pavel Labath6ac84032017-02-27 11:05:34 +000089 BreakpointSP bkpt_sp = GetSP();
90 if (bkpt_sp)
91 break_id = bkpt_sp->GetID();
Kate Stoneb9c1b512016-09-06 20:57:50 +000092
Pavel Labath6ac84032017-02-27 11:05:34 +000093 LLDB_LOG(log, "breakpoint = {0}, id = {1}", bkpt_sp.get(), break_id);
Kate Stoneb9c1b512016-09-06 20:57:50 +000094 return break_id;
95}
96
97bool SBBreakpoint::IsValid() const {
Pavel Labath6ac84032017-02-27 11:05:34 +000098 BreakpointSP bkpt_sp = GetSP();
99 if (!bkpt_sp)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000100 return false;
Pavel Labath6ac84032017-02-27 11:05:34 +0000101 else if (bkpt_sp->GetTarget().GetBreakpointByID(bkpt_sp->GetID()))
Kate Stoneb9c1b512016-09-06 20:57:50 +0000102 return true;
103 else
Greg Claytonac2eb9b2010-12-12 19:25:26 +0000104 return false;
105}
106
Kate Stoneb9c1b512016-09-06 20:57:50 +0000107void SBBreakpoint::ClearAllBreakpointSites() {
Pavel Labath6ac84032017-02-27 11:05:34 +0000108 BreakpointSP bkpt_sp = GetSP();
109 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000110 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000111 bkpt_sp->GetTarget().GetAPIMutex());
112 bkpt_sp->ClearAllBreakpointSites();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000113 }
Enrico Granatac3387332013-05-03 01:29:27 +0000114}
115
Kate Stoneb9c1b512016-09-06 20:57:50 +0000116SBBreakpointLocation SBBreakpoint::FindLocationByAddress(addr_t vm_addr) {
117 SBBreakpointLocation sb_bp_location;
Caroline Ticeceb6b132010-10-26 03:11:13 +0000118
Pavel Labath6ac84032017-02-27 11:05:34 +0000119 BreakpointSP bkpt_sp = GetSP();
120 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000121 if (vm_addr != LLDB_INVALID_ADDRESS) {
122 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000123 bkpt_sp->GetTarget().GetAPIMutex());
Kate Stoneb9c1b512016-09-06 20:57:50 +0000124 Address address;
Pavel Labath6ac84032017-02-27 11:05:34 +0000125 Target &target = bkpt_sp->GetTarget();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000126 if (!target.GetSectionLoadList().ResolveLoadAddress(vm_addr, address)) {
127 address.SetRawAddress(vm_addr);
128 }
Pavel Labath6ac84032017-02-27 11:05:34 +0000129 sb_bp_location.SetLocation(bkpt_sp->FindLocationByAddress(address));
Greg Claytonaf67cec2010-12-20 20:49:23 +0000130 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000131 }
132 return sb_bp_location;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000133}
134
Kate Stoneb9c1b512016-09-06 20:57:50 +0000135break_id_t SBBreakpoint::FindLocationIDByAddress(addr_t vm_addr) {
136 break_id_t break_id = LLDB_INVALID_BREAK_ID;
Pavel Labath6ac84032017-02-27 11:05:34 +0000137 BreakpointSP bkpt_sp = GetSP();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000138
Pavel Labath6ac84032017-02-27 11:05:34 +0000139 if (bkpt_sp && vm_addr != LLDB_INVALID_ADDRESS) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000140 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000141 bkpt_sp->GetTarget().GetAPIMutex());
Kate Stoneb9c1b512016-09-06 20:57:50 +0000142 Address address;
Pavel Labath6ac84032017-02-27 11:05:34 +0000143 Target &target = bkpt_sp->GetTarget();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000144 if (!target.GetSectionLoadList().ResolveLoadAddress(vm_addr, address)) {
145 address.SetRawAddress(vm_addr);
Greg Claytonaf67cec2010-12-20 20:49:23 +0000146 }
Pavel Labath6ac84032017-02-27 11:05:34 +0000147 break_id = bkpt_sp->FindLocationIDByAddress(address);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000148 }
149
150 return break_id;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000151}
152
Kate Stoneb9c1b512016-09-06 20:57:50 +0000153SBBreakpointLocation SBBreakpoint::FindLocationByID(break_id_t bp_loc_id) {
154 SBBreakpointLocation sb_bp_location;
Pavel Labath6ac84032017-02-27 11:05:34 +0000155 BreakpointSP bkpt_sp = GetSP();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000156
Pavel Labath6ac84032017-02-27 11:05:34 +0000157 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000158 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000159 bkpt_sp->GetTarget().GetAPIMutex());
160 sb_bp_location.SetLocation(bkpt_sp->FindLocationByID(bp_loc_id));
Kate Stoneb9c1b512016-09-06 20:57:50 +0000161 }
162
163 return sb_bp_location;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000164}
165
Kate Stoneb9c1b512016-09-06 20:57:50 +0000166SBBreakpointLocation SBBreakpoint::GetLocationAtIndex(uint32_t index) {
167 SBBreakpointLocation sb_bp_location;
Pavel Labath6ac84032017-02-27 11:05:34 +0000168 BreakpointSP bkpt_sp = GetSP();
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 sb_bp_location.SetLocation(bkpt_sp->GetLocationAtIndex(index));
Kate Stoneb9c1b512016-09-06 20:57:50 +0000174 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000175
Kate Stoneb9c1b512016-09-06 20:57:50 +0000176 return sb_bp_location;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000177}
178
Kate Stoneb9c1b512016-09-06 20:57:50 +0000179void SBBreakpoint::SetEnabled(bool enable) {
180 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Pavel Labath6ac84032017-02-27 11:05:34 +0000181 BreakpointSP bkpt_sp = GetSP();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000182
Pavel Labath6ac84032017-02-27 11:05:34 +0000183 LLDB_LOG(log, "breakpoint = {0}, enable = {1}", bkpt_sp.get(), enable);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000184
Pavel Labath6ac84032017-02-27 11:05:34 +0000185 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000186 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000187 bkpt_sp->GetTarget().GetAPIMutex());
188 bkpt_sp->SetEnabled(enable);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000189 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000190}
191
Kate Stoneb9c1b512016-09-06 20:57:50 +0000192bool SBBreakpoint::IsEnabled() {
Pavel Labath6ac84032017-02-27 11:05:34 +0000193 BreakpointSP bkpt_sp = GetSP();
194 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000195 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000196 bkpt_sp->GetTarget().GetAPIMutex());
197 return bkpt_sp->IsEnabled();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000198 } else
Greg Clayton05faeb72010-10-07 04:19:01 +0000199 return false;
Caroline Ticedde9cff2010-09-20 05:20:02 +0000200}
201
Kate Stoneb9c1b512016-09-06 20:57:50 +0000202void SBBreakpoint::SetOneShot(bool one_shot) {
203 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Pavel Labath6ac84032017-02-27 11:05:34 +0000204 BreakpointSP bkpt_sp = GetSP();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000205
Pavel Labath6ac84032017-02-27 11:05:34 +0000206 LLDB_LOG(log, "breakpoint = {0}, one_shot = {1}", bkpt_sp.get(), one_shot);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000207
Pavel Labath6ac84032017-02-27 11:05:34 +0000208 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000209 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000210 bkpt_sp->GetTarget().GetAPIMutex());
211 bkpt_sp->SetOneShot(one_shot);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000212 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000213}
214
Kate Stoneb9c1b512016-09-06 20:57:50 +0000215bool SBBreakpoint::IsOneShot() const {
Pavel Labath6ac84032017-02-27 11:05:34 +0000216 BreakpointSP bkpt_sp = GetSP();
217 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000218 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000219 bkpt_sp->GetTarget().GetAPIMutex());
220 return bkpt_sp->IsOneShot();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000221 } else
Jim Ingham5e09c8c2014-12-16 23:40:14 +0000222 return false;
223}
224
Kate Stoneb9c1b512016-09-06 20:57:50 +0000225bool SBBreakpoint::IsInternal() {
Pavel Labath6ac84032017-02-27 11:05:34 +0000226 BreakpointSP bkpt_sp = GetSP();
227 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000228 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000229 bkpt_sp->GetTarget().GetAPIMutex());
230 return bkpt_sp->IsInternal();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000231 } else
Jim Ingham5e09c8c2014-12-16 23:40:14 +0000232 return false;
233}
234
Kate Stoneb9c1b512016-09-06 20:57:50 +0000235void SBBreakpoint::SetIgnoreCount(uint32_t count) {
236 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Pavel Labath6ac84032017-02-27 11:05:34 +0000237 BreakpointSP bkpt_sp = GetSP();
Jim Ingham5e09c8c2014-12-16 23:40:14 +0000238
Pavel Labath6ac84032017-02-27 11:05:34 +0000239 LLDB_LOG(log, "breakpoint = {0}, count = {1}", bkpt_sp.get(), count);
Jim Ingham5e09c8c2014-12-16 23:40:14 +0000240
Pavel Labath6ac84032017-02-27 11:05:34 +0000241 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000242 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000243 bkpt_sp->GetTarget().GetAPIMutex());
244 bkpt_sp->SetIgnoreCount(count);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000245 }
246}
247
248void SBBreakpoint::SetCondition(const char *condition) {
Pavel Labath6ac84032017-02-27 11:05:34 +0000249 BreakpointSP bkpt_sp = GetSP();
250 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000251 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000252 bkpt_sp->GetTarget().GetAPIMutex());
253 bkpt_sp->SetCondition(condition);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000254 }
255}
256
257const char *SBBreakpoint::GetCondition() {
Pavel Labath6ac84032017-02-27 11:05:34 +0000258 BreakpointSP bkpt_sp = GetSP();
259 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000260 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000261 bkpt_sp->GetTarget().GetAPIMutex());
262 return bkpt_sp->GetConditionText();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000263 }
264 return nullptr;
265}
266
267uint32_t SBBreakpoint::GetHitCount() const {
268 uint32_t count = 0;
Pavel Labath6ac84032017-02-27 11:05:34 +0000269 BreakpointSP bkpt_sp = GetSP();
270 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000271 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000272 bkpt_sp->GetTarget().GetAPIMutex());
273 count = bkpt_sp->GetHitCount();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000274 }
275
276 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Pavel Labath6ac84032017-02-27 11:05:34 +0000277 LLDB_LOG(log, "breakpoint = {0}, count = {1}", bkpt_sp.get(), count);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000278
279 return count;
280}
281
282uint32_t SBBreakpoint::GetIgnoreCount() const {
283 uint32_t count = 0;
Pavel Labath6ac84032017-02-27 11:05:34 +0000284 BreakpointSP bkpt_sp = GetSP();
285 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000286 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000287 bkpt_sp->GetTarget().GetAPIMutex());
288 count = bkpt_sp->GetIgnoreCount();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000289 }
290
291 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Pavel Labath6ac84032017-02-27 11:05:34 +0000292 LLDB_LOG(log, "breakpoint = {0}, count = {1}", bkpt_sp.get(), count);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000293
294 return count;
295}
296
297void SBBreakpoint::SetThreadID(tid_t tid) {
Pavel Labath6ac84032017-02-27 11:05:34 +0000298 BreakpointSP bkpt_sp = GetSP();
299 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000300 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000301 bkpt_sp->GetTarget().GetAPIMutex());
302 bkpt_sp->SetThreadID(tid);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000303 }
304 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Pavel Labath6ac84032017-02-27 11:05:34 +0000305 LLDB_LOG(log, "breakpoint = {0}, tid = {1:x}", bkpt_sp.get(), tid);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000306}
307
308tid_t SBBreakpoint::GetThreadID() {
309 tid_t tid = LLDB_INVALID_THREAD_ID;
Pavel Labath6ac84032017-02-27 11:05:34 +0000310 BreakpointSP bkpt_sp = GetSP();
311 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000312 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000313 bkpt_sp->GetTarget().GetAPIMutex());
314 tid = bkpt_sp->GetThreadID();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000315 }
316
317 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Pavel Labath6ac84032017-02-27 11:05:34 +0000318 LLDB_LOG(log, "breakpoint = {0}, tid = {1:x}", bkpt_sp.get(), tid);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000319 return tid;
320}
321
322void SBBreakpoint::SetThreadIndex(uint32_t index) {
323 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Pavel Labath6ac84032017-02-27 11:05:34 +0000324 BreakpointSP bkpt_sp = GetSP();
325 LLDB_LOG(log, "breakpoint = {0}, index = {1}", bkpt_sp.get(), index);
326 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000327 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000328 bkpt_sp->GetTarget().GetAPIMutex());
329 bkpt_sp->GetOptions()->GetThreadSpec()->SetIndex(index);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000330 }
331}
332
333uint32_t SBBreakpoint::GetThreadIndex() const {
334 uint32_t thread_idx = UINT32_MAX;
Pavel Labath6ac84032017-02-27 11:05:34 +0000335 BreakpointSP bkpt_sp = GetSP();
336 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000337 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000338 bkpt_sp->GetTarget().GetAPIMutex());
Kate Stoneb9c1b512016-09-06 20:57:50 +0000339 const ThreadSpec *thread_spec =
Pavel Labath6ac84032017-02-27 11:05:34 +0000340 bkpt_sp->GetOptions()->GetThreadSpecNoCreate();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000341 if (thread_spec != nullptr)
342 thread_idx = thread_spec->GetIndex();
343 }
344 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Pavel Labath6ac84032017-02-27 11:05:34 +0000345 LLDB_LOG(log, "breakpoint = {0}, index = {1}", bkpt_sp.get(), thread_idx);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000346
347 return thread_idx;
348}
349
350void SBBreakpoint::SetThreadName(const char *thread_name) {
351 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Pavel Labath6ac84032017-02-27 11:05:34 +0000352 BreakpointSP bkpt_sp = GetSP();
353 LLDB_LOG(log, "breakpoint = {0}, name = {1}", bkpt_sp.get(), thread_name);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000354
Pavel Labath6ac84032017-02-27 11:05:34 +0000355 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000356 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000357 bkpt_sp->GetTarget().GetAPIMutex());
358 bkpt_sp->GetOptions()->GetThreadSpec()->SetName(thread_name);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000359 }
360}
361
362const char *SBBreakpoint::GetThreadName() const {
363 const char *name = nullptr;
Pavel Labath6ac84032017-02-27 11:05:34 +0000364 BreakpointSP bkpt_sp = GetSP();
365 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000366 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000367 bkpt_sp->GetTarget().GetAPIMutex());
Kate Stoneb9c1b512016-09-06 20:57:50 +0000368 const ThreadSpec *thread_spec =
Pavel Labath6ac84032017-02-27 11:05:34 +0000369 bkpt_sp->GetOptions()->GetThreadSpecNoCreate();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000370 if (thread_spec != nullptr)
371 name = thread_spec->GetName();
372 }
373 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Pavel Labath6ac84032017-02-27 11:05:34 +0000374 LLDB_LOG(log, "breakpoint = {0}, name = {1}", bkpt_sp.get(), name);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000375
376 return name;
377}
378
379void SBBreakpoint::SetQueueName(const char *queue_name) {
380 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Pavel Labath6ac84032017-02-27 11:05:34 +0000381 BreakpointSP bkpt_sp = GetSP();
382 LLDB_LOG(log, "breakpoint = {0}, queue_name = {1}", bkpt_sp.get(),
383 queue_name);
384 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000385 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000386 bkpt_sp->GetTarget().GetAPIMutex());
387 bkpt_sp->GetOptions()->GetThreadSpec()->SetQueueName(queue_name);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000388 }
389}
390
391const char *SBBreakpoint::GetQueueName() const {
392 const char *name = nullptr;
Pavel Labath6ac84032017-02-27 11:05:34 +0000393 BreakpointSP bkpt_sp = GetSP();
394 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000395 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000396 bkpt_sp->GetTarget().GetAPIMutex());
Kate Stoneb9c1b512016-09-06 20:57:50 +0000397 const ThreadSpec *thread_spec =
Pavel Labath6ac84032017-02-27 11:05:34 +0000398 bkpt_sp->GetOptions()->GetThreadSpecNoCreate();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000399 if (thread_spec)
400 name = thread_spec->GetQueueName();
401 }
402 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Pavel Labath6ac84032017-02-27 11:05:34 +0000403 LLDB_LOG(log, "breakpoint = {0}, name = {1}", bkpt_sp.get(), name);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000404
405 return name;
406}
407
408size_t SBBreakpoint::GetNumResolvedLocations() const {
409 size_t num_resolved = 0;
Pavel Labath6ac84032017-02-27 11:05:34 +0000410 BreakpointSP bkpt_sp = GetSP();
411 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000412 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000413 bkpt_sp->GetTarget().GetAPIMutex());
414 num_resolved = bkpt_sp->GetNumResolvedLocations();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000415 }
416 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Pavel Labath6ac84032017-02-27 11:05:34 +0000417 LLDB_LOG(log, "breakpoint = {0}, num_resolved = {1}", bkpt_sp.get(),
418 num_resolved);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000419 return num_resolved;
420}
421
422size_t SBBreakpoint::GetNumLocations() const {
Pavel Labath6ac84032017-02-27 11:05:34 +0000423 BreakpointSP bkpt_sp = GetSP();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000424 size_t num_locs = 0;
Pavel Labath6ac84032017-02-27 11:05:34 +0000425 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000426 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000427 bkpt_sp->GetTarget().GetAPIMutex());
428 num_locs = bkpt_sp->GetNumLocations();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000429 }
430 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Pavel Labath6ac84032017-02-27 11:05:34 +0000431 LLDB_LOG(log, "breakpoint = {0}, num_locs = {1}", bkpt_sp.get(), num_locs);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000432 return num_locs;
433}
434
Jim Ingham92d19602016-09-20 22:54:49 +0000435void SBBreakpoint::SetCommandLineCommands(SBStringList &commands) {
Pavel Labath6ac84032017-02-27 11:05:34 +0000436 BreakpointSP bkpt_sp = GetSP();
437 if (!bkpt_sp)
Jim Ingham92d19602016-09-20 22:54:49 +0000438 return;
439 if (commands.GetSize() == 0)
440 return;
441
442 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000443 bkpt_sp->GetTarget().GetAPIMutex());
Jim Ingham92d19602016-09-20 22:54:49 +0000444 std::unique_ptr<BreakpointOptions::CommandData> cmd_data_up(
Jim Inghamf7e07252016-09-26 19:47:37 +0000445 new BreakpointOptions::CommandData(*commands, eScriptLanguageNone));
Jim Ingham92d19602016-09-20 22:54:49 +0000446
Pavel Labath6ac84032017-02-27 11:05:34 +0000447 bkpt_sp->GetOptions()->SetCommandDataCallback(cmd_data_up);
Jim Ingham92d19602016-09-20 22:54:49 +0000448}
449
450bool SBBreakpoint::GetCommandLineCommands(SBStringList &commands) {
Pavel Labath6ac84032017-02-27 11:05:34 +0000451 BreakpointSP bkpt_sp = GetSP();
452 if (!bkpt_sp)
Jim Ingham92d19602016-09-20 22:54:49 +0000453 return false;
454 StringList command_list;
455 bool has_commands =
Pavel Labath6ac84032017-02-27 11:05:34 +0000456 bkpt_sp->GetOptions()->GetCommandLineCallbacks(command_list);
Jim Ingham92d19602016-09-20 22:54:49 +0000457 if (has_commands)
458 commands.AppendList(command_list);
459 return has_commands;
460}
461
Kate Stoneb9c1b512016-09-06 20:57:50 +0000462bool SBBreakpoint::GetDescription(SBStream &s) {
Jim Ingham6d1e4692016-09-16 01:41:27 +0000463 return GetDescription(s, true);
464}
465
466bool SBBreakpoint::GetDescription(SBStream &s, bool include_locations) {
Pavel Labath6ac84032017-02-27 11:05:34 +0000467 BreakpointSP bkpt_sp = GetSP();
468 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000469 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000470 bkpt_sp->GetTarget().GetAPIMutex());
471 s.Printf("SBBreakpoint: id = %i, ", bkpt_sp->GetID());
472 bkpt_sp->GetResolverDescription(s.get());
473 bkpt_sp->GetFilterDescription(s.get());
Jim Ingham6d1e4692016-09-16 01:41:27 +0000474 if (include_locations) {
Pavel Labath6ac84032017-02-27 11:05:34 +0000475 const size_t num_locations = bkpt_sp->GetNumLocations();
Jim Ingham6d1e4692016-09-16 01:41:27 +0000476 s.Printf(", locations = %" PRIu64, (uint64_t)num_locations);
477 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000478 return true;
479 }
480 s.Printf("No value");
481 return false;
482}
483
484bool SBBreakpoint::PrivateBreakpointHitCallback(void *baton,
485 StoppointCallbackContext *ctx,
486 lldb::user_id_t break_id,
487 lldb::user_id_t break_loc_id) {
488 ExecutionContext exe_ctx(ctx->exe_ctx_ref);
489 BreakpointSP bp_sp(
490 exe_ctx.GetTargetRef().GetBreakpointList().FindBreakpointByID(break_id));
491 if (baton && bp_sp) {
492 CallbackData *data = (CallbackData *)baton;
493 lldb_private::Breakpoint *bp = bp_sp.get();
494 if (bp && data->callback) {
495 Process *process = exe_ctx.GetProcessPtr();
496 if (process) {
497 SBProcess sb_process(process->shared_from_this());
498 SBThread sb_thread;
499 SBBreakpointLocation sb_location;
500 assert(bp_sp);
501 sb_location.SetLocation(bp_sp->FindLocationByID(break_loc_id));
502 Thread *thread = exe_ctx.GetThreadPtr();
503 if (thread)
504 sb_thread.SetThread(thread->shared_from_this());
505
506 return data->callback(data->callback_baton, sb_process, sb_thread,
507 sb_location);
508 }
Jim Ingham5e09c8c2014-12-16 23:40:14 +0000509 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000510 }
511 return true; // Return true if we should stop at this breakpoint
Jim Ingham5e09c8c2014-12-16 23:40:14 +0000512}
513
Kate Stoneb9c1b512016-09-06 20:57:50 +0000514void SBBreakpoint::SetCallback(BreakpointHitCallback callback, void *baton) {
515 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Pavel Labath6ac84032017-02-27 11:05:34 +0000516 BreakpointSP bkpt_sp = GetSP();
517 LLDB_LOG(log, "breakpoint = {0}, callback = {1}, baton = {2}", bkpt_sp.get(),
518 callback, baton);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000519
Pavel Labath6ac84032017-02-27 11:05:34 +0000520 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000521 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000522 bkpt_sp->GetTarget().GetAPIMutex());
Kate Stoneb9c1b512016-09-06 20:57:50 +0000523 BatonSP baton_sp(new SBBreakpointCallbackBaton(callback, baton));
Pavel Labath6ac84032017-02-27 11:05:34 +0000524 bkpt_sp->SetCallback(SBBreakpoint::PrivateBreakpointHitCallback, baton_sp,
525 false);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000526 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000527}
528
Kate Stoneb9c1b512016-09-06 20:57:50 +0000529void SBBreakpoint::SetScriptCallbackFunction(
530 const char *callback_function_name) {
531 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Pavel Labath6ac84032017-02-27 11:05:34 +0000532 BreakpointSP bkpt_sp = GetSP();
533 LLDB_LOG(log, "breakpoint = {0}, callback = {1}", bkpt_sp.get(),
534 callback_function_name);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000535
Pavel Labath6ac84032017-02-27 11:05:34 +0000536 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000537 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000538 bkpt_sp->GetTarget().GetAPIMutex());
539 BreakpointOptions *bp_options = bkpt_sp->GetOptions();
540 bkpt_sp->GetTarget()
Kate Stoneb9c1b512016-09-06 20:57:50 +0000541 .GetDebugger()
542 .GetCommandInterpreter()
543 .GetScriptInterpreter()
544 ->SetBreakpointCommandCallbackFunction(bp_options,
545 callback_function_name);
546 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000547}
548
Kate Stoneb9c1b512016-09-06 20:57:50 +0000549SBError SBBreakpoint::SetScriptCallbackBody(const char *callback_body_text) {
550 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Pavel Labath6ac84032017-02-27 11:05:34 +0000551 BreakpointSP bkpt_sp = GetSP();
552 LLDB_LOG(log, "breakpoint = {0}, callback body:\n{1}", bkpt_sp.get(),
553 callback_body_text);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000554
555 SBError sb_error;
Pavel Labath6ac84032017-02-27 11:05:34 +0000556 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000557 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000558 bkpt_sp->GetTarget().GetAPIMutex());
559 BreakpointOptions *bp_options = bkpt_sp->GetOptions();
Zachary Turner97206d52017-05-12 04:51:55 +0000560 Status error =
Pavel Labath6ac84032017-02-27 11:05:34 +0000561 bkpt_sp->GetTarget()
Kate Stoneb9c1b512016-09-06 20:57:50 +0000562 .GetDebugger()
563 .GetCommandInterpreter()
564 .GetScriptInterpreter()
565 ->SetBreakpointCommandCallback(bp_options, callback_body_text);
566 sb_error.SetError(error);
567 } else
568 sb_error.SetErrorString("invalid breakpoint");
569
570 return sb_error;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000571}
572
Kate Stoneb9c1b512016-09-06 20:57:50 +0000573bool SBBreakpoint::AddName(const char *new_name) {
574 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Pavel Labath6ac84032017-02-27 11:05:34 +0000575 BreakpointSP bkpt_sp = GetSP();
576 LLDB_LOG(log, "breakpoint = {0}, name = {1}", bkpt_sp.get(), new_name);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000577
Pavel Labath6ac84032017-02-27 11:05:34 +0000578 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000579 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000580 bkpt_sp->GetTarget().GetAPIMutex());
Zachary Turner97206d52017-05-12 04:51:55 +0000581 Status error; // Think I'm just going to swallow the error here, it's
582 // probably more annoying to have to provide it.
Pavel Labath6ac84032017-02-27 11:05:34 +0000583 return bkpt_sp->AddName(new_name, error);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000584 }
585
586 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000587}
588
Kate Stoneb9c1b512016-09-06 20:57:50 +0000589void SBBreakpoint::RemoveName(const char *name_to_remove) {
590 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Pavel Labath6ac84032017-02-27 11:05:34 +0000591 BreakpointSP bkpt_sp = GetSP();
592 LLDB_LOG(log, "breakpoint = {0}, name = {1}", bkpt_sp.get(), name_to_remove);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000593
Pavel Labath6ac84032017-02-27 11:05:34 +0000594 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000595 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000596 bkpt_sp->GetTarget().GetAPIMutex());
597 bkpt_sp->RemoveName(name_to_remove);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000598 }
599}
600
601bool SBBreakpoint::MatchesName(const char *name) {
602 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Pavel Labath6ac84032017-02-27 11:05:34 +0000603 BreakpointSP bkpt_sp = GetSP();
604 LLDB_LOG(log, "breakpoint = {0}, name = {1}", bkpt_sp.get(), name);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000605
Pavel Labath6ac84032017-02-27 11:05:34 +0000606 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000607 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000608 bkpt_sp->GetTarget().GetAPIMutex());
609 return bkpt_sp->MatchesName(name);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000610 }
611
612 return false;
613}
614
615void SBBreakpoint::GetNames(SBStringList &names) {
616 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
Pavel Labath6ac84032017-02-27 11:05:34 +0000617 BreakpointSP bkpt_sp = GetSP();
618 LLDB_LOG(log, "breakpoint = {0}", bkpt_sp.get());
Kate Stoneb9c1b512016-09-06 20:57:50 +0000619
Pavel Labath6ac84032017-02-27 11:05:34 +0000620 if (bkpt_sp) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000621 std::lock_guard<std::recursive_mutex> guard(
Pavel Labath6ac84032017-02-27 11:05:34 +0000622 bkpt_sp->GetTarget().GetAPIMutex());
Kate Stoneb9c1b512016-09-06 20:57:50 +0000623 std::vector<std::string> names_vec;
Pavel Labath6ac84032017-02-27 11:05:34 +0000624 bkpt_sp->GetNames(names_vec);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000625 for (std::string name : names_vec) {
626 names.AppendString(name.c_str());
627 }
628 }
629}
630
Kate Stoneb9c1b512016-09-06 20:57:50 +0000631bool SBBreakpoint::EventIsBreakpointEvent(const lldb::SBEvent &event) {
632 return Breakpoint::BreakpointEventData::GetEventDataFromEvent(event.get()) !=
633 nullptr;
Jim Inghame6bc6cb2012-02-08 05:23:15 +0000634}
635
Greg Clayton9fed0d82010-07-23 23:33:17 +0000636BreakpointEventType
Kate Stoneb9c1b512016-09-06 20:57:50 +0000637SBBreakpoint::GetBreakpointEventTypeFromEvent(const SBEvent &event) {
638 if (event.IsValid())
639 return Breakpoint::BreakpointEventData::GetBreakpointEventTypeFromEvent(
640 event.GetSP());
641 return eBreakpointEventTypeInvalidType;
Greg Clayton9fed0d82010-07-23 23:33:17 +0000642}
643
Kate Stoneb9c1b512016-09-06 20:57:50 +0000644SBBreakpoint SBBreakpoint::GetBreakpointFromEvent(const lldb::SBEvent &event) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000645 if (event.IsValid())
Pavel Labath6ac84032017-02-27 11:05:34 +0000646 return SBBreakpoint(
647 Breakpoint::BreakpointEventData::GetBreakpointFromEvent(event.GetSP()));
648 return SBBreakpoint();
Greg Clayton9fed0d82010-07-23 23:33:17 +0000649}
650
651SBBreakpointLocation
Kate Stoneb9c1b512016-09-06 20:57:50 +0000652SBBreakpoint::GetBreakpointLocationAtIndexFromEvent(const lldb::SBEvent &event,
653 uint32_t loc_idx) {
654 SBBreakpointLocation sb_breakpoint_loc;
655 if (event.IsValid())
656 sb_breakpoint_loc.SetLocation(
657 Breakpoint::BreakpointEventData::GetBreakpointLocationAtIndexFromEvent(
658 event.GetSP(), loc_idx));
659 return sb_breakpoint_loc;
Greg Clayton9fed0d82010-07-23 23:33:17 +0000660}
661
Jim Inghame6bc6cb2012-02-08 05:23:15 +0000662uint32_t
Kate Stoneb9c1b512016-09-06 20:57:50 +0000663SBBreakpoint::GetNumBreakpointLocationsFromEvent(const lldb::SBEvent &event) {
664 uint32_t num_locations = 0;
665 if (event.IsValid())
666 num_locations =
667 (Breakpoint::BreakpointEventData::GetNumBreakpointLocationsFromEvent(
668 event.GetSP()));
669 return num_locations;
Jim Inghame6bc6cb2012-02-08 05:23:15 +0000670}
Jim Ingham01f16662016-09-14 19:07:35 +0000671
Pavel Labath6ac84032017-02-27 11:05:34 +0000672BreakpointSP SBBreakpoint::GetSP() const { return m_opaque_wp.lock(); }
673
Jim Ingham01f16662016-09-14 19:07:35 +0000674// This is simple collection of breakpoint id's and their target.
Todd Fiala653e3f42016-11-11 21:06:40 +0000675class SBBreakpointListImpl {
Jim Ingham01f16662016-09-14 19:07:35 +0000676public:
Todd Fiala653e3f42016-11-11 21:06:40 +0000677 SBBreakpointListImpl(lldb::TargetSP target_sp) : m_target_wp() {
678 if (target_sp && target_sp->IsValid())
679 m_target_wp = target_sp;
Jim Ingham01f16662016-09-14 19:07:35 +0000680 }
681
682 ~SBBreakpointListImpl() = default;
683
684 size_t GetSize() { return m_break_ids.size(); }
685
686 BreakpointSP GetBreakpointAtIndex(size_t idx) {
687 if (idx >= m_break_ids.size())
688 return BreakpointSP();
689 TargetSP target_sp = m_target_wp.lock();
690 if (!target_sp)
691 return BreakpointSP();
692 lldb::break_id_t bp_id = m_break_ids[idx];
693 return target_sp->GetBreakpointList().FindBreakpointByID(bp_id);
694 }
695
Jim Ingham6d1e4692016-09-16 01:41:27 +0000696 BreakpointSP FindBreakpointByID(lldb::break_id_t desired_id) {
697 TargetSP target_sp = m_target_wp.lock();
698 if (!target_sp)
699 return BreakpointSP();
700
701 for (lldb::break_id_t &break_id : m_break_ids) {
702 if (break_id == desired_id)
703 return target_sp->GetBreakpointList().FindBreakpointByID(break_id);
704 }
705 return BreakpointSP();
706 }
707
Pavel Labath6ac84032017-02-27 11:05:34 +0000708 bool Append(BreakpointSP bkpt) {
Jim Ingham01f16662016-09-14 19:07:35 +0000709 TargetSP target_sp = m_target_wp.lock();
Pavel Labath6ac84032017-02-27 11:05:34 +0000710 if (!target_sp || !bkpt)
Jim Ingham01f16662016-09-14 19:07:35 +0000711 return false;
Pavel Labath6ac84032017-02-27 11:05:34 +0000712 if (bkpt->GetTargetSP() != target_sp)
Jim Ingham01f16662016-09-14 19:07:35 +0000713 return false;
Pavel Labath6ac84032017-02-27 11:05:34 +0000714 m_break_ids.push_back(bkpt->GetID());
Jim Ingham01f16662016-09-14 19:07:35 +0000715 return true;
716 }
717
Pavel Labath6ac84032017-02-27 11:05:34 +0000718 bool AppendIfUnique(BreakpointSP bkpt) {
Jim Ingham01f16662016-09-14 19:07:35 +0000719 TargetSP target_sp = m_target_wp.lock();
Pavel Labath6ac84032017-02-27 11:05:34 +0000720 if (!target_sp || !bkpt)
Jim Ingham01f16662016-09-14 19:07:35 +0000721 return false;
Pavel Labath6ac84032017-02-27 11:05:34 +0000722 if (bkpt->GetTargetSP() != target_sp)
Jim Ingham01f16662016-09-14 19:07:35 +0000723 return false;
Pavel Labath6ac84032017-02-27 11:05:34 +0000724 lldb::break_id_t bp_id = bkpt->GetID();
Jim Ingham01f16662016-09-14 19:07:35 +0000725 if (find(m_break_ids.begin(), m_break_ids.end(), bp_id) ==
726 m_break_ids.end())
727 return false;
728
Pavel Labath6ac84032017-02-27 11:05:34 +0000729 m_break_ids.push_back(bkpt->GetID());
Jim Ingham01f16662016-09-14 19:07:35 +0000730 return true;
731 }
732
733 bool AppendByID(lldb::break_id_t id) {
734 TargetSP target_sp = m_target_wp.lock();
735 if (!target_sp)
736 return false;
737 if (id == LLDB_INVALID_BREAK_ID)
738 return false;
739 m_break_ids.push_back(id);
740 return true;
741 }
742
743 void Clear() { m_break_ids.clear(); }
744
745 void CopyToBreakpointIDList(lldb_private::BreakpointIDList &bp_list) {
746 for (lldb::break_id_t id : m_break_ids) {
747 bp_list.AddBreakpointID(BreakpointID(id));
748 }
749 }
750
751 TargetSP GetTarget() { return m_target_wp.lock(); }
752
753private:
754 std::vector<lldb::break_id_t> m_break_ids;
755 TargetWP m_target_wp;
756};
757
758SBBreakpointList::SBBreakpointList(SBTarget &target)
Todd Fiala653e3f42016-11-11 21:06:40 +0000759 : m_opaque_sp(new SBBreakpointListImpl(target.GetSP())) {}
Jim Ingham01f16662016-09-14 19:07:35 +0000760
761SBBreakpointList::~SBBreakpointList() {}
762
763size_t SBBreakpointList::GetSize() const {
764 if (!m_opaque_sp)
765 return 0;
766 else
767 return m_opaque_sp->GetSize();
768}
769
770SBBreakpoint SBBreakpointList::GetBreakpointAtIndex(size_t idx) {
771 if (!m_opaque_sp)
772 return SBBreakpoint();
773
774 BreakpointSP bkpt_sp = m_opaque_sp->GetBreakpointAtIndex(idx);
775 return SBBreakpoint(bkpt_sp);
776}
777
Jim Ingham6d1e4692016-09-16 01:41:27 +0000778SBBreakpoint SBBreakpointList::FindBreakpointByID(lldb::break_id_t id) {
779 if (!m_opaque_sp)
780 return SBBreakpoint();
781 BreakpointSP bkpt_sp = m_opaque_sp->FindBreakpointByID(id);
782 return SBBreakpoint(bkpt_sp);
783}
784
Jim Ingham01f16662016-09-14 19:07:35 +0000785void SBBreakpointList::Append(const SBBreakpoint &sb_bkpt) {
786 if (!sb_bkpt.IsValid())
787 return;
788 if (!m_opaque_sp)
789 return;
Pavel Labath6ac84032017-02-27 11:05:34 +0000790 m_opaque_sp->Append(sb_bkpt.m_opaque_wp.lock());
Jim Ingham01f16662016-09-14 19:07:35 +0000791}
792
793void SBBreakpointList::AppendByID(lldb::break_id_t id) {
794 if (!m_opaque_sp)
795 return;
796 m_opaque_sp->AppendByID(id);
797}
798
799bool SBBreakpointList::AppendIfUnique(const SBBreakpoint &sb_bkpt) {
800 if (!sb_bkpt.IsValid())
801 return false;
802 if (!m_opaque_sp)
803 return false;
Pavel Labath6ac84032017-02-27 11:05:34 +0000804 return m_opaque_sp->AppendIfUnique(sb_bkpt.GetSP());
Jim Ingham01f16662016-09-14 19:07:35 +0000805}
806
807void SBBreakpointList::Clear() {
808 if (m_opaque_sp)
809 m_opaque_sp->Clear();
810}
811
812void SBBreakpointList::CopyToBreakpointIDList(
813 lldb_private::BreakpointIDList &bp_id_list) {
814 if (m_opaque_sp)
815 m_opaque_sp->CopyToBreakpointIDList(bp_id_list);
816}