130fdc8d8SChris Lattner //===-- SBBreakpoint.cpp ----------------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
330fdc8d8SChris Lattner //                     The LLVM Compiler Infrastructure
430fdc8d8SChris Lattner //
530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source
630fdc8d8SChris Lattner // License. See LICENSE.TXT for details.
730fdc8d8SChris Lattner //
830fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
930fdc8d8SChris Lattner 
10dbb0abbfSEugene Zelenko // C Includes
11dbb0abbfSEugene Zelenko // C++ Includes
12dbb0abbfSEugene Zelenko // Other libraries and framework includes
13dbb0abbfSEugene Zelenko // Project includes
1430fdc8d8SChris Lattner #include "lldb/API/SBBreakpoint.h"
1530fdc8d8SChris Lattner #include "lldb/API/SBBreakpointLocation.h"
1630fdc8d8SChris Lattner #include "lldb/API/SBDebugger.h"
179fed0d85SGreg Clayton #include "lldb/API/SBEvent.h"
1830fdc8d8SChris Lattner #include "lldb/API/SBProcess.h"
19dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
205e09c8c3SJim Ingham #include "lldb/API/SBStringList.h"
2130fdc8d8SChris Lattner #include "lldb/API/SBThread.h"
2230fdc8d8SChris Lattner 
2330fdc8d8SChris Lattner #include "lldb/Breakpoint/Breakpoint.h"
2401f16664SJim Ingham #include "lldb/Breakpoint/BreakpointIDList.h"
2530fdc8d8SChris Lattner #include "lldb/Breakpoint/BreakpointLocation.h"
2630fdc8d8SChris Lattner #include "lldb/Breakpoint/StoppointCallbackContext.h"
2730fdc8d8SChris Lattner #include "lldb/Core/Address.h"
28d80102e4SJim Ingham #include "lldb/Core/Debugger.h"
29ceb6b139SCaroline Tice #include "lldb/Core/Log.h"
3030fdc8d8SChris Lattner #include "lldb/Core/Stream.h"
3130fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
32d80102e4SJim Ingham #include "lldb/Interpreter/CommandInterpreter.h"
33d80102e4SJim Ingham #include "lldb/Interpreter/ScriptInterpreter.h"
3430fdc8d8SChris Lattner #include "lldb/Target/Process.h"
35d5944cd1SGreg Clayton #include "lldb/Target/SectionLoadList.h"
3630fdc8d8SChris Lattner #include "lldb/Target/Target.h"
3762b02c61SJim Ingham #include "lldb/Target/Thread.h"
3862b02c61SJim Ingham #include "lldb/Target/ThreadSpec.h"
3930fdc8d8SChris Lattner 
4030fdc8d8SChris Lattner #include "lldb/lldb-enumerations.h"
4130fdc8d8SChris Lattner 
424e4fbe82SZachary Turner #include "llvm/ADT/STLExtras.h"
434e4fbe82SZachary Turner 
4430fdc8d8SChris Lattner using namespace lldb;
4530fdc8d8SChris Lattner using namespace lldb_private;
4630fdc8d8SChris Lattner 
47b9c1b51eSKate Stone struct CallbackData {
4830fdc8d8SChris Lattner   SBBreakpoint::BreakpointHitCallback callback;
4930fdc8d8SChris Lattner   void *callback_baton;
5030fdc8d8SChris Lattner };
5130fdc8d8SChris Lattner 
524e4fbe82SZachary Turner class SBBreakpointCallbackBaton : public TypedBaton<CallbackData> {
5330fdc8d8SChris Lattner public:
54b9c1b51eSKate Stone   SBBreakpointCallbackBaton(SBBreakpoint::BreakpointHitCallback callback,
55b9c1b51eSKate Stone                             void *baton)
564e4fbe82SZachary Turner       : TypedBaton(llvm::make_unique<CallbackData>()) {
574e4fbe82SZachary Turner     getItem()->callback = callback;
584e4fbe82SZachary Turner     getItem()->callback_baton = baton;
5930fdc8d8SChris Lattner   }
6030fdc8d8SChris Lattner };
6130fdc8d8SChris Lattner 
62b9c1b51eSKate Stone SBBreakpoint::SBBreakpoint() : m_opaque_sp() {}
6330fdc8d8SChris Lattner 
64b9c1b51eSKate Stone SBBreakpoint::SBBreakpoint(const SBBreakpoint &rhs)
65b9c1b51eSKate Stone     : m_opaque_sp(rhs.m_opaque_sp) {}
6630fdc8d8SChris Lattner 
67b9c1b51eSKate Stone SBBreakpoint::SBBreakpoint(const lldb::BreakpointSP &bp_sp)
68b9c1b51eSKate Stone     : m_opaque_sp(bp_sp) {}
6930fdc8d8SChris Lattner 
70dbb0abbfSEugene Zelenko SBBreakpoint::~SBBreakpoint() = default;
7130fdc8d8SChris Lattner 
72b9c1b51eSKate Stone const SBBreakpoint &SBBreakpoint::operator=(const SBBreakpoint &rhs) {
7330fdc8d8SChris Lattner   if (this != &rhs)
746611103cSGreg Clayton     m_opaque_sp = rhs.m_opaque_sp;
7530fdc8d8SChris Lattner   return *this;
7630fdc8d8SChris Lattner }
7730fdc8d8SChris Lattner 
78b9c1b51eSKate Stone bool SBBreakpoint::operator==(const lldb::SBBreakpoint &rhs) {
79ac2eb9b1SGreg Clayton   if (m_opaque_sp && rhs.m_opaque_sp)
80ac2eb9b1SGreg Clayton     return m_opaque_sp.get() == rhs.m_opaque_sp.get();
81ac2eb9b1SGreg Clayton   return false;
82ac2eb9b1SGreg Clayton }
83ac2eb9b1SGreg Clayton 
84b9c1b51eSKate Stone bool SBBreakpoint::operator!=(const lldb::SBBreakpoint &rhs) {
85c3387333SEnrico Granata   if (m_opaque_sp && rhs.m_opaque_sp)
86c3387333SEnrico Granata     return m_opaque_sp.get() != rhs.m_opaque_sp.get();
87c3387333SEnrico Granata   return (m_opaque_sp && !rhs.m_opaque_sp) || (rhs.m_opaque_sp && !m_opaque_sp);
88c3387333SEnrico Granata }
89c3387333SEnrico Granata 
90b9c1b51eSKate Stone break_id_t SBBreakpoint::GetID() const {
915160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
92ceb6b139SCaroline Tice 
93af67cecdSGreg Clayton   break_id_t break_id = LLDB_INVALID_BREAK_ID;
946611103cSGreg Clayton   if (m_opaque_sp)
95af67cecdSGreg Clayton     break_id = m_opaque_sp->GetID();
96af67cecdSGreg Clayton 
97b9c1b51eSKate Stone   if (log) {
98af67cecdSGreg Clayton     if (break_id == LLDB_INVALID_BREAK_ID)
99324a1036SSaleem Abdulrasool       log->Printf("SBBreakpoint(%p)::GetID () => LLDB_INVALID_BREAK_ID",
100324a1036SSaleem Abdulrasool                   static_cast<void *>(m_opaque_sp.get()));
101af67cecdSGreg Clayton     else
102324a1036SSaleem Abdulrasool       log->Printf("SBBreakpoint(%p)::GetID () => %u",
103324a1036SSaleem Abdulrasool                   static_cast<void *>(m_opaque_sp.get()), break_id);
104ceb6b139SCaroline Tice   }
105ceb6b139SCaroline Tice 
106af67cecdSGreg Clayton   return break_id;
10730fdc8d8SChris Lattner }
10830fdc8d8SChris Lattner 
109b9c1b51eSKate Stone bool SBBreakpoint::IsValid() const {
110e029fa57SJim Ingham   if (!m_opaque_sp)
111e029fa57SJim Ingham     return false;
112e029fa57SJim Ingham   else if (m_opaque_sp->GetTarget().GetBreakpointByID(m_opaque_sp->GetID()))
113e029fa57SJim Ingham     return true;
114e029fa57SJim Ingham   else
115e029fa57SJim Ingham     return false;
11630fdc8d8SChris Lattner }
11730fdc8d8SChris Lattner 
118b9c1b51eSKate Stone void SBBreakpoint::ClearAllBreakpointSites() {
119b9c1b51eSKate Stone   if (m_opaque_sp) {
120b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
121b9c1b51eSKate Stone         m_opaque_sp->GetTarget().GetAPIMutex());
1226611103cSGreg Clayton     m_opaque_sp->ClearAllBreakpointSites();
12330fdc8d8SChris Lattner   }
124af67cecdSGreg Clayton }
12530fdc8d8SChris Lattner 
126b9c1b51eSKate Stone SBBreakpointLocation SBBreakpoint::FindLocationByAddress(addr_t vm_addr) {
12730fdc8d8SChris Lattner   SBBreakpointLocation sb_bp_location;
12830fdc8d8SChris Lattner 
129b9c1b51eSKate Stone   if (m_opaque_sp) {
130b9c1b51eSKate Stone     if (vm_addr != LLDB_INVALID_ADDRESS) {
131b9c1b51eSKate Stone       std::lock_guard<std::recursive_mutex> guard(
132b9c1b51eSKate Stone           m_opaque_sp->GetTarget().GetAPIMutex());
13330fdc8d8SChris Lattner       Address address;
134f5e56de0SGreg Clayton       Target &target = m_opaque_sp->GetTarget();
135b9c1b51eSKate Stone       if (!target.GetSectionLoadList().ResolveLoadAddress(vm_addr, address)) {
136e72dfb32SGreg Clayton         address.SetRawAddress(vm_addr);
13730fdc8d8SChris Lattner       }
1386611103cSGreg Clayton       sb_bp_location.SetLocation(m_opaque_sp->FindLocationByAddress(address));
13930fdc8d8SChris Lattner     }
14030fdc8d8SChris Lattner   }
14130fdc8d8SChris Lattner   return sb_bp_location;
14230fdc8d8SChris Lattner }
14330fdc8d8SChris Lattner 
144b9c1b51eSKate Stone break_id_t SBBreakpoint::FindLocationIDByAddress(addr_t vm_addr) {
145af67cecdSGreg Clayton   break_id_t break_id = LLDB_INVALID_BREAK_ID;
14630fdc8d8SChris Lattner 
147b9c1b51eSKate Stone   if (m_opaque_sp && vm_addr != LLDB_INVALID_ADDRESS) {
148b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
149b9c1b51eSKate Stone         m_opaque_sp->GetTarget().GetAPIMutex());
15030fdc8d8SChris Lattner     Address address;
151f5e56de0SGreg Clayton     Target &target = m_opaque_sp->GetTarget();
152b9c1b51eSKate Stone     if (!target.GetSectionLoadList().ResolveLoadAddress(vm_addr, address)) {
153e72dfb32SGreg Clayton       address.SetRawAddress(vm_addr);
15430fdc8d8SChris Lattner     }
155af67cecdSGreg Clayton     break_id = m_opaque_sp->FindLocationIDByAddress(address);
15630fdc8d8SChris Lattner   }
15730fdc8d8SChris Lattner 
158af67cecdSGreg Clayton   return break_id;
15930fdc8d8SChris Lattner }
16030fdc8d8SChris Lattner 
161b9c1b51eSKate Stone SBBreakpointLocation SBBreakpoint::FindLocationByID(break_id_t bp_loc_id) {
16230fdc8d8SChris Lattner   SBBreakpointLocation sb_bp_location;
16330fdc8d8SChris Lattner 
164b9c1b51eSKate Stone   if (m_opaque_sp) {
165b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
166b9c1b51eSKate Stone         m_opaque_sp->GetTarget().GetAPIMutex());
1676611103cSGreg Clayton     sb_bp_location.SetLocation(m_opaque_sp->FindLocationByID(bp_loc_id));
168af67cecdSGreg Clayton   }
16930fdc8d8SChris Lattner 
17030fdc8d8SChris Lattner   return sb_bp_location;
17130fdc8d8SChris Lattner }
17230fdc8d8SChris Lattner 
173b9c1b51eSKate Stone SBBreakpointLocation SBBreakpoint::GetLocationAtIndex(uint32_t index) {
17430fdc8d8SChris Lattner   SBBreakpointLocation sb_bp_location;
17530fdc8d8SChris Lattner 
176b9c1b51eSKate Stone   if (m_opaque_sp) {
177b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
178b9c1b51eSKate Stone         m_opaque_sp->GetTarget().GetAPIMutex());
1796611103cSGreg Clayton     sb_bp_location.SetLocation(m_opaque_sp->GetLocationAtIndex(index));
180af67cecdSGreg Clayton   }
18130fdc8d8SChris Lattner 
18230fdc8d8SChris Lattner   return sb_bp_location;
18330fdc8d8SChris Lattner }
18430fdc8d8SChris Lattner 
185b9c1b51eSKate Stone void SBBreakpoint::SetEnabled(bool enable) {
1865160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
187ceb6b139SCaroline Tice 
188ceb6b139SCaroline Tice   if (log)
189324a1036SSaleem Abdulrasool     log->Printf("SBBreakpoint(%p)::SetEnabled (enabled=%i)",
190324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_sp.get()), enable);
191ceb6b139SCaroline Tice 
192b9c1b51eSKate Stone   if (m_opaque_sp) {
193b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
194b9c1b51eSKate Stone         m_opaque_sp->GetTarget().GetAPIMutex());
1956611103cSGreg Clayton     m_opaque_sp->SetEnabled(enable);
19630fdc8d8SChris Lattner   }
197af67cecdSGreg Clayton }
19830fdc8d8SChris Lattner 
199b9c1b51eSKate Stone bool SBBreakpoint::IsEnabled() {
200b9c1b51eSKate Stone   if (m_opaque_sp) {
201b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
202b9c1b51eSKate Stone         m_opaque_sp->GetTarget().GetAPIMutex());
2036611103cSGreg Clayton     return m_opaque_sp->IsEnabled();
204b9c1b51eSKate Stone   } else
20530fdc8d8SChris Lattner     return false;
20630fdc8d8SChris Lattner }
20730fdc8d8SChris Lattner 
208b9c1b51eSKate Stone void SBBreakpoint::SetOneShot(bool one_shot) {
2095160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
210ca36cd16SJim Ingham 
211ca36cd16SJim Ingham   if (log)
212324a1036SSaleem Abdulrasool     log->Printf("SBBreakpoint(%p)::SetOneShot (one_shot=%i)",
213324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_sp.get()), one_shot);
214ca36cd16SJim Ingham 
215b9c1b51eSKate Stone   if (m_opaque_sp) {
216b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
217b9c1b51eSKate Stone         m_opaque_sp->GetTarget().GetAPIMutex());
218ca36cd16SJim Ingham     m_opaque_sp->SetOneShot(one_shot);
219ca36cd16SJim Ingham   }
220ca36cd16SJim Ingham }
221ca36cd16SJim Ingham 
222b9c1b51eSKate Stone bool SBBreakpoint::IsOneShot() const {
223b9c1b51eSKate Stone   if (m_opaque_sp) {
224b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
225b9c1b51eSKate Stone         m_opaque_sp->GetTarget().GetAPIMutex());
226ca36cd16SJim Ingham     return m_opaque_sp->IsOneShot();
227b9c1b51eSKate Stone   } else
228ca36cd16SJim Ingham     return false;
229ca36cd16SJim Ingham }
230ca36cd16SJim Ingham 
231b9c1b51eSKate Stone bool SBBreakpoint::IsInternal() {
232b9c1b51eSKate Stone   if (m_opaque_sp) {
233b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
234b9c1b51eSKate Stone         m_opaque_sp->GetTarget().GetAPIMutex());
23511c8108dSJim Ingham     return m_opaque_sp->IsInternal();
236b9c1b51eSKate Stone   } else
23711c8108dSJim Ingham     return false;
23811c8108dSJim Ingham }
23911c8108dSJim Ingham 
240b9c1b51eSKate Stone void SBBreakpoint::SetIgnoreCount(uint32_t count) {
2415160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
242ceb6b139SCaroline Tice 
243ceb6b139SCaroline Tice   if (log)
244324a1036SSaleem Abdulrasool     log->Printf("SBBreakpoint(%p)::SetIgnoreCount (count=%u)",
245324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_sp.get()), count);
246ceb6b139SCaroline Tice 
247b9c1b51eSKate Stone   if (m_opaque_sp) {
248b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
249b9c1b51eSKate Stone         m_opaque_sp->GetTarget().GetAPIMutex());
2506611103cSGreg Clayton     m_opaque_sp->SetIgnoreCount(count);
25130fdc8d8SChris Lattner   }
252af67cecdSGreg Clayton }
25330fdc8d8SChris Lattner 
254b9c1b51eSKate Stone void SBBreakpoint::SetCondition(const char *condition) {
255b9c1b51eSKate Stone   if (m_opaque_sp) {
256b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
257b9c1b51eSKate Stone         m_opaque_sp->GetTarget().GetAPIMutex());
258041a12fcSJim Ingham     m_opaque_sp->SetCondition(condition);
259041a12fcSJim Ingham   }
260af67cecdSGreg Clayton }
261041a12fcSJim Ingham 
262b9c1b51eSKate Stone const char *SBBreakpoint::GetCondition() {
263b9c1b51eSKate Stone   if (m_opaque_sp) {
264b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
265b9c1b51eSKate Stone         m_opaque_sp->GetTarget().GetAPIMutex());
266041a12fcSJim Ingham     return m_opaque_sp->GetConditionText();
267041a12fcSJim Ingham   }
268dbb0abbfSEugene Zelenko   return nullptr;
269af67cecdSGreg Clayton }
270041a12fcSJim Ingham 
271b9c1b51eSKate Stone uint32_t SBBreakpoint::GetHitCount() const {
2724838131bSGreg Clayton   uint32_t count = 0;
273b9c1b51eSKate Stone   if (m_opaque_sp) {
274b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
275b9c1b51eSKate Stone         m_opaque_sp->GetTarget().GetAPIMutex());
2764838131bSGreg Clayton     count = m_opaque_sp->GetHitCount();
277af67cecdSGreg Clayton   }
2784838131bSGreg Clayton 
2795160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
280ceb6b139SCaroline Tice   if (log)
281324a1036SSaleem Abdulrasool     log->Printf("SBBreakpoint(%p)::GetHitCount () => %u",
282324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_sp.get()), count);
2834838131bSGreg Clayton 
2844838131bSGreg Clayton   return count;
285ceb6b139SCaroline Tice }
2869fed0d85SGreg Clayton 
287b9c1b51eSKate Stone uint32_t SBBreakpoint::GetIgnoreCount() const {
2884838131bSGreg Clayton   uint32_t count = 0;
289b9c1b51eSKate Stone   if (m_opaque_sp) {
290b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
291b9c1b51eSKate Stone         m_opaque_sp->GetTarget().GetAPIMutex());
2924838131bSGreg Clayton     count = m_opaque_sp->GetIgnoreCount();
293af67cecdSGreg Clayton   }
2944838131bSGreg Clayton 
2955160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
2964838131bSGreg Clayton   if (log)
297324a1036SSaleem Abdulrasool     log->Printf("SBBreakpoint(%p)::GetIgnoreCount () => %u",
298324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_sp.get()), count);
2994838131bSGreg Clayton 
3004838131bSGreg Clayton   return count;
30130fdc8d8SChris Lattner }
30230fdc8d8SChris Lattner 
303b9c1b51eSKate Stone void SBBreakpoint::SetThreadID(tid_t tid) {
304b9c1b51eSKate Stone   if (m_opaque_sp) {
305b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
306b9c1b51eSKate Stone         m_opaque_sp->GetTarget().GetAPIMutex());
3074838131bSGreg Clayton     m_opaque_sp->SetThreadID(tid);
308af67cecdSGreg Clayton   }
3095160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
3104838131bSGreg Clayton   if (log)
311324a1036SSaleem Abdulrasool     log->Printf("SBBreakpoint(%p)::SetThreadID (tid=0x%4.4" PRIx64 ")",
312324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_sp.get()), tid);
31330fdc8d8SChris Lattner }
31430fdc8d8SChris Lattner 
315b9c1b51eSKate Stone tid_t SBBreakpoint::GetThreadID() {
3164838131bSGreg Clayton   tid_t tid = LLDB_INVALID_THREAD_ID;
317b9c1b51eSKate Stone   if (m_opaque_sp) {
318b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
319b9c1b51eSKate Stone         m_opaque_sp->GetTarget().GetAPIMutex());
3204838131bSGreg Clayton     tid = m_opaque_sp->GetThreadID();
321af67cecdSGreg Clayton   }
32230fdc8d8SChris Lattner 
3235160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
3244838131bSGreg Clayton   if (log)
325324a1036SSaleem Abdulrasool     log->Printf("SBBreakpoint(%p)::GetThreadID () => 0x%4.4" PRIx64,
326324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_sp.get()), tid);
3274838131bSGreg Clayton   return tid;
32830fdc8d8SChris Lattner }
32930fdc8d8SChris Lattner 
330b9c1b51eSKate Stone void SBBreakpoint::SetThreadIndex(uint32_t index) {
3315160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
3324838131bSGreg Clayton   if (log)
333324a1036SSaleem Abdulrasool     log->Printf("SBBreakpoint(%p)::SetThreadIndex (%u)",
334324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_sp.get()), index);
335b9c1b51eSKate Stone   if (m_opaque_sp) {
336b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
337b9c1b51eSKate Stone         m_opaque_sp->GetTarget().GetAPIMutex());
3386611103cSGreg Clayton     m_opaque_sp->GetOptions()->GetThreadSpec()->SetIndex(index);
33962b02c61SJim Ingham   }
340af67cecdSGreg Clayton }
34162b02c61SJim Ingham 
342b9c1b51eSKate Stone uint32_t SBBreakpoint::GetThreadIndex() const {
343bdf4c6acSGreg Clayton   uint32_t thread_idx = UINT32_MAX;
344b9c1b51eSKate Stone   if (m_opaque_sp) {
345b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
346b9c1b51eSKate Stone         m_opaque_sp->GetTarget().GetAPIMutex());
347b9c1b51eSKate Stone     const ThreadSpec *thread_spec =
348b9c1b51eSKate Stone         m_opaque_sp->GetOptions()->GetThreadSpecNoCreate();
349dbb0abbfSEugene Zelenko     if (thread_spec != nullptr)
3504838131bSGreg Clayton       thread_idx = thread_spec->GetIndex();
35162b02c61SJim Ingham   }
3525160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
3534838131bSGreg Clayton   if (log)
354324a1036SSaleem Abdulrasool     log->Printf("SBBreakpoint(%p)::GetThreadIndex () => %u",
355324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_sp.get()), thread_idx);
3564838131bSGreg Clayton 
357763d1a17SJohnny Chen   return thread_idx;
35862b02c61SJim Ingham }
35962b02c61SJim Ingham 
360b9c1b51eSKate Stone void SBBreakpoint::SetThreadName(const char *thread_name) {
3615160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
3624838131bSGreg Clayton   if (log)
363324a1036SSaleem Abdulrasool     log->Printf("SBBreakpoint(%p)::SetThreadName (%s)",
364324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_sp.get()), thread_name);
3654838131bSGreg Clayton 
366b9c1b51eSKate Stone   if (m_opaque_sp) {
367b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
368b9c1b51eSKate Stone         m_opaque_sp->GetTarget().GetAPIMutex());
3696611103cSGreg Clayton     m_opaque_sp->GetOptions()->GetThreadSpec()->SetName(thread_name);
37062b02c61SJim Ingham   }
371af67cecdSGreg Clayton }
37262b02c61SJim Ingham 
373b9c1b51eSKate Stone const char *SBBreakpoint::GetThreadName() const {
374dbb0abbfSEugene Zelenko   const char *name = nullptr;
375b9c1b51eSKate Stone   if (m_opaque_sp) {
376b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
377b9c1b51eSKate Stone         m_opaque_sp->GetTarget().GetAPIMutex());
378b9c1b51eSKate Stone     const ThreadSpec *thread_spec =
379b9c1b51eSKate Stone         m_opaque_sp->GetOptions()->GetThreadSpecNoCreate();
380dbb0abbfSEugene Zelenko     if (thread_spec != nullptr)
3814838131bSGreg Clayton       name = thread_spec->GetName();
38262b02c61SJim Ingham   }
3835160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
3844838131bSGreg Clayton   if (log)
385324a1036SSaleem Abdulrasool     log->Printf("SBBreakpoint(%p)::GetThreadName () => %s",
386324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_sp.get()), name);
3874838131bSGreg Clayton 
3884838131bSGreg Clayton   return name;
38962b02c61SJim Ingham }
39062b02c61SJim Ingham 
391b9c1b51eSKate Stone void SBBreakpoint::SetQueueName(const char *queue_name) {
3925160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
3934838131bSGreg Clayton   if (log)
394324a1036SSaleem Abdulrasool     log->Printf("SBBreakpoint(%p)::SetQueueName (%s)",
395324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_sp.get()), queue_name);
396b9c1b51eSKate Stone   if (m_opaque_sp) {
397b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
398b9c1b51eSKate Stone         m_opaque_sp->GetTarget().GetAPIMutex());
3996611103cSGreg Clayton     m_opaque_sp->GetOptions()->GetThreadSpec()->SetQueueName(queue_name);
40062b02c61SJim Ingham   }
401af67cecdSGreg Clayton }
40262b02c61SJim Ingham 
403b9c1b51eSKate Stone const char *SBBreakpoint::GetQueueName() const {
404dbb0abbfSEugene Zelenko   const char *name = nullptr;
405b9c1b51eSKate Stone   if (m_opaque_sp) {
406b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
407b9c1b51eSKate Stone         m_opaque_sp->GetTarget().GetAPIMutex());
408b9c1b51eSKate Stone     const ThreadSpec *thread_spec =
409b9c1b51eSKate Stone         m_opaque_sp->GetOptions()->GetThreadSpecNoCreate();
410af67cecdSGreg Clayton     if (thread_spec)
4114838131bSGreg Clayton       name = thread_spec->GetQueueName();
41262b02c61SJim Ingham   }
4135160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
4144838131bSGreg Clayton   if (log)
415324a1036SSaleem Abdulrasool     log->Printf("SBBreakpoint(%p)::GetQueueName () => %s",
416324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_sp.get()), name);
4174838131bSGreg Clayton 
4184838131bSGreg Clayton   return name;
41962b02c61SJim Ingham }
42062b02c61SJim Ingham 
421b9c1b51eSKate Stone size_t SBBreakpoint::GetNumResolvedLocations() const {
4224838131bSGreg Clayton   size_t num_resolved = 0;
423b9c1b51eSKate Stone   if (m_opaque_sp) {
424b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
425b9c1b51eSKate Stone         m_opaque_sp->GetTarget().GetAPIMutex());
4264838131bSGreg Clayton     num_resolved = m_opaque_sp->GetNumResolvedLocations();
427af67cecdSGreg Clayton   }
4285160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
4294838131bSGreg Clayton   if (log)
430324a1036SSaleem Abdulrasool     log->Printf("SBBreakpoint(%p)::GetNumResolvedLocations () => %" PRIu64,
431324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_sp.get()),
432324a1036SSaleem Abdulrasool                 static_cast<uint64_t>(num_resolved));
4334838131bSGreg Clayton   return num_resolved;
43430fdc8d8SChris Lattner }
43530fdc8d8SChris Lattner 
436b9c1b51eSKate Stone size_t SBBreakpoint::GetNumLocations() const {
4374838131bSGreg Clayton   size_t num_locs = 0;
438b9c1b51eSKate Stone   if (m_opaque_sp) {
439b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
440b9c1b51eSKate Stone         m_opaque_sp->GetTarget().GetAPIMutex());
4414838131bSGreg Clayton     num_locs = m_opaque_sp->GetNumLocations();
442af67cecdSGreg Clayton   }
4435160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
4444838131bSGreg Clayton   if (log)
445324a1036SSaleem Abdulrasool     log->Printf("SBBreakpoint(%p)::GetNumLocations () => %" PRIu64,
446324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_sp.get()),
447324a1036SSaleem Abdulrasool                 static_cast<uint64_t>(num_locs));
4484838131bSGreg Clayton   return num_locs;
44930fdc8d8SChris Lattner }
45030fdc8d8SChris Lattner 
45192d1960eSJim Ingham void SBBreakpoint::SetCommandLineCommands(SBStringList &commands) {
45292d1960eSJim Ingham   if (!m_opaque_sp)
45392d1960eSJim Ingham     return;
45492d1960eSJim Ingham   if (commands.GetSize() == 0)
45592d1960eSJim Ingham     return;
45692d1960eSJim Ingham 
45792d1960eSJim Ingham   std::lock_guard<std::recursive_mutex> guard(
45892d1960eSJim Ingham       m_opaque_sp->GetTarget().GetAPIMutex());
45992d1960eSJim Ingham   std::unique_ptr<BreakpointOptions::CommandData> cmd_data_up(
460f7e07256SJim Ingham       new BreakpointOptions::CommandData(*commands, eScriptLanguageNone));
46192d1960eSJim Ingham 
46292d1960eSJim Ingham   m_opaque_sp->GetOptions()->SetCommandDataCallback(cmd_data_up);
46392d1960eSJim Ingham }
46492d1960eSJim Ingham 
46592d1960eSJim Ingham bool SBBreakpoint::GetCommandLineCommands(SBStringList &commands) {
46692d1960eSJim Ingham   if (!m_opaque_sp)
46792d1960eSJim Ingham     return false;
46892d1960eSJim Ingham   StringList command_list;
46992d1960eSJim Ingham   bool has_commands =
47092d1960eSJim Ingham       m_opaque_sp->GetOptions()->GetCommandLineCallbacks(command_list);
47192d1960eSJim Ingham   if (has_commands)
47292d1960eSJim Ingham     commands.AppendList(command_list);
47392d1960eSJim Ingham   return has_commands;
47492d1960eSJim Ingham }
47592d1960eSJim Ingham 
476b9c1b51eSKate Stone bool SBBreakpoint::GetDescription(SBStream &s) {
4776d1e4696SJim Ingham   return GetDescription(s, true);
4786d1e4696SJim Ingham }
4796d1e4696SJim Ingham 
4806d1e4696SJim Ingham bool SBBreakpoint::GetDescription(SBStream &s, bool include_locations) {
481b9c1b51eSKate Stone   if (m_opaque_sp) {
482b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
483b9c1b51eSKate Stone         m_opaque_sp->GetTarget().GetAPIMutex());
48405faeb71SGreg Clayton     s.Printf("SBBreakpoint: id = %i, ", m_opaque_sp->GetID());
48505faeb71SGreg Clayton     m_opaque_sp->GetResolverDescription(s.get());
48605faeb71SGreg Clayton     m_opaque_sp->GetFilterDescription(s.get());
4876d1e4696SJim Ingham     if (include_locations) {
48805faeb71SGreg Clayton       const size_t num_locations = m_opaque_sp->GetNumLocations();
489d01b2953SDaniel Malea       s.Printf(", locations = %" PRIu64, (uint64_t)num_locations);
4906d1e4696SJim Ingham     }
491dde9cff3SCaroline Tice     return true;
492dde9cff3SCaroline Tice   }
49305faeb71SGreg Clayton   s.Printf("No value");
49405faeb71SGreg Clayton   return false;
49505faeb71SGreg Clayton }
496dde9cff3SCaroline Tice 
497b9c1b51eSKate Stone bool SBBreakpoint::PrivateBreakpointHitCallback(void *baton,
49830fdc8d8SChris Lattner                                                 StoppointCallbackContext *ctx,
49930fdc8d8SChris Lattner                                                 lldb::user_id_t break_id,
500b9c1b51eSKate Stone                                                 lldb::user_id_t break_loc_id) {
5011ac04c30SGreg Clayton   ExecutionContext exe_ctx(ctx->exe_ctx_ref);
502b9c1b51eSKate Stone   BreakpointSP bp_sp(
503b9c1b51eSKate Stone       exe_ctx.GetTargetRef().GetBreakpointList().FindBreakpointByID(break_id));
504b9c1b51eSKate Stone   if (baton && bp_sp) {
50530fdc8d8SChris Lattner     CallbackData *data = (CallbackData *)baton;
50630fdc8d8SChris Lattner     lldb_private::Breakpoint *bp = bp_sp.get();
507b9c1b51eSKate Stone     if (bp && data->callback) {
5081ac04c30SGreg Clayton       Process *process = exe_ctx.GetProcessPtr();
509b9c1b51eSKate Stone       if (process) {
510e1cd1be6SGreg Clayton         SBProcess sb_process(process->shared_from_this());
51130fdc8d8SChris Lattner         SBThread sb_thread;
51230fdc8d8SChris Lattner         SBBreakpointLocation sb_location;
51330fdc8d8SChris Lattner         assert(bp_sp);
51430fdc8d8SChris Lattner         sb_location.SetLocation(bp_sp->FindLocationByID(break_loc_id));
5151ac04c30SGreg Clayton         Thread *thread = exe_ctx.GetThreadPtr();
516c14ee32dSGreg Clayton         if (thread)
517e1cd1be6SGreg Clayton           sb_thread.SetThread(thread->shared_from_this());
51830fdc8d8SChris Lattner 
519b9c1b51eSKate Stone         return data->callback(data->callback_baton, sb_process, sb_thread,
52030fdc8d8SChris Lattner                               sb_location);
52130fdc8d8SChris Lattner       }
52230fdc8d8SChris Lattner     }
52330fdc8d8SChris Lattner   }
52430fdc8d8SChris Lattner   return true; // Return true if we should stop at this breakpoint
52530fdc8d8SChris Lattner }
52630fdc8d8SChris Lattner 
527b9c1b51eSKate Stone void SBBreakpoint::SetCallback(BreakpointHitCallback callback, void *baton) {
5285160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
529ceb6b139SCaroline Tice 
530b9c1b51eSKate Stone   if (log) {
531324a1036SSaleem Abdulrasool     void *pointer = &callback;
532324a1036SSaleem Abdulrasool     log->Printf("SBBreakpoint(%p)::SetCallback (callback=%p, baton=%p)",
533324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_sp.get()),
534324a1036SSaleem Abdulrasool                 *static_cast<void **>(&pointer), static_cast<void *>(baton));
535324a1036SSaleem Abdulrasool   }
536ceb6b139SCaroline Tice 
537b9c1b51eSKate Stone   if (m_opaque_sp) {
538b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
539b9c1b51eSKate Stone         m_opaque_sp->GetTarget().GetAPIMutex());
54030fdc8d8SChris Lattner     BatonSP baton_sp(new SBBreakpointCallbackBaton(callback, baton));
541b9c1b51eSKate Stone     m_opaque_sp->SetCallback(SBBreakpoint::PrivateBreakpointHitCallback,
542b9c1b51eSKate Stone                              baton_sp, false);
54330fdc8d8SChris Lattner   }
54430fdc8d8SChris Lattner }
54530fdc8d8SChris Lattner 
546b9c1b51eSKate Stone void SBBreakpoint::SetScriptCallbackFunction(
547b9c1b51eSKate Stone     const char *callback_function_name) {
548d80102e4SJim Ingham   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
549d80102e4SJim Ingham 
550d80102e4SJim Ingham   if (log)
551324a1036SSaleem Abdulrasool     log->Printf("SBBreakpoint(%p)::SetScriptCallbackFunction (callback=%s)",
552b9c1b51eSKate Stone                 static_cast<void *>(m_opaque_sp.get()), callback_function_name);
553d80102e4SJim Ingham 
554b9c1b51eSKate Stone   if (m_opaque_sp) {
555b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
556b9c1b51eSKate Stone         m_opaque_sp->GetTarget().GetAPIMutex());
557d80102e4SJim Ingham     BreakpointOptions *bp_options = m_opaque_sp->GetOptions();
558b9c1b51eSKate Stone     m_opaque_sp->GetTarget()
559b9c1b51eSKate Stone         .GetDebugger()
560b9c1b51eSKate Stone         .GetCommandInterpreter()
561b9c1b51eSKate Stone         .GetScriptInterpreter()
562b9c1b51eSKate Stone         ->SetBreakpointCommandCallbackFunction(bp_options,
563d80102e4SJim Ingham                                                callback_function_name);
564d80102e4SJim Ingham   }
565d80102e4SJim Ingham }
566d80102e4SJim Ingham 
567b9c1b51eSKate Stone SBError SBBreakpoint::SetScriptCallbackBody(const char *callback_body_text) {
568d80102e4SJim Ingham   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
569d80102e4SJim Ingham 
570d80102e4SJim Ingham   if (log)
571324a1036SSaleem Abdulrasool     log->Printf("SBBreakpoint(%p)::SetScriptCallbackBody: callback body:\n%s)",
572324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_sp.get()), callback_body_text);
573d80102e4SJim Ingham 
574d80102e4SJim Ingham   SBError sb_error;
575b9c1b51eSKate Stone   if (m_opaque_sp) {
576b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
577b9c1b51eSKate Stone         m_opaque_sp->GetTarget().GetAPIMutex());
578d80102e4SJim Ingham     BreakpointOptions *bp_options = m_opaque_sp->GetOptions();
579b9c1b51eSKate Stone     Error error =
580b9c1b51eSKate Stone         m_opaque_sp->GetTarget()
581b9c1b51eSKate Stone             .GetDebugger()
582b9c1b51eSKate Stone             .GetCommandInterpreter()
583b9c1b51eSKate Stone             .GetScriptInterpreter()
584b9c1b51eSKate Stone             ->SetBreakpointCommandCallback(bp_options, callback_body_text);
585d80102e4SJim Ingham     sb_error.SetError(error);
586b9c1b51eSKate Stone   } else
587d80102e4SJim Ingham     sb_error.SetErrorString("invalid breakpoint");
588d80102e4SJim Ingham 
589d80102e4SJim Ingham   return sb_error;
590d80102e4SJim Ingham }
59130fdc8d8SChris Lattner 
592b9c1b51eSKate Stone bool SBBreakpoint::AddName(const char *new_name) {
5935e09c8c3SJim Ingham   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
5945e09c8c3SJim Ingham 
5955e09c8c3SJim Ingham   if (log)
5965e09c8c3SJim Ingham     log->Printf("SBBreakpoint(%p)::AddName (name=%s)",
597b9c1b51eSKate Stone                 static_cast<void *>(m_opaque_sp.get()), new_name);
5985e09c8c3SJim Ingham 
599b9c1b51eSKate Stone   if (m_opaque_sp) {
600b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
601b9c1b51eSKate Stone         m_opaque_sp->GetTarget().GetAPIMutex());
602b9c1b51eSKate Stone     Error error; // Think I'm just going to swallow the error here, it's
603b9c1b51eSKate Stone                  // probably more annoying to have to provide it.
6045e09c8c3SJim Ingham     return m_opaque_sp->AddName(new_name, error);
6055e09c8c3SJim Ingham   }
6065e09c8c3SJim Ingham 
6075e09c8c3SJim Ingham   return false;
6085e09c8c3SJim Ingham }
6095e09c8c3SJim Ingham 
610b9c1b51eSKate Stone void SBBreakpoint::RemoveName(const char *name_to_remove) {
6115e09c8c3SJim Ingham   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
6125e09c8c3SJim Ingham 
6135e09c8c3SJim Ingham   if (log)
6145e09c8c3SJim Ingham     log->Printf("SBBreakpoint(%p)::RemoveName (name=%s)",
615b9c1b51eSKate Stone                 static_cast<void *>(m_opaque_sp.get()), name_to_remove);
6165e09c8c3SJim Ingham 
617b9c1b51eSKate Stone   if (m_opaque_sp) {
618b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
619b9c1b51eSKate Stone         m_opaque_sp->GetTarget().GetAPIMutex());
6205e09c8c3SJim Ingham     m_opaque_sp->RemoveName(name_to_remove);
6215e09c8c3SJim Ingham   }
6225e09c8c3SJim Ingham }
6235e09c8c3SJim Ingham 
624b9c1b51eSKate Stone bool SBBreakpoint::MatchesName(const char *name) {
6255e09c8c3SJim Ingham   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
6265e09c8c3SJim Ingham 
6275e09c8c3SJim Ingham   if (log)
6285e09c8c3SJim Ingham     log->Printf("SBBreakpoint(%p)::MatchesName (name=%s)",
629b9c1b51eSKate Stone                 static_cast<void *>(m_opaque_sp.get()), name);
6305e09c8c3SJim Ingham 
631b9c1b51eSKate Stone   if (m_opaque_sp) {
632b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
633b9c1b51eSKate Stone         m_opaque_sp->GetTarget().GetAPIMutex());
6345e09c8c3SJim Ingham     return m_opaque_sp->MatchesName(name);
6355e09c8c3SJim Ingham   }
6365e09c8c3SJim Ingham 
6375e09c8c3SJim Ingham   return false;
6385e09c8c3SJim Ingham }
6395e09c8c3SJim Ingham 
640b9c1b51eSKate Stone void SBBreakpoint::GetNames(SBStringList &names) {
6415e09c8c3SJim Ingham   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
6425e09c8c3SJim Ingham 
6435e09c8c3SJim Ingham   if (log)
6445e09c8c3SJim Ingham     log->Printf("SBBreakpoint(%p)::GetNames ()",
6455e09c8c3SJim Ingham                 static_cast<void *>(m_opaque_sp.get()));
6465e09c8c3SJim Ingham 
647b9c1b51eSKate Stone   if (m_opaque_sp) {
648b9c1b51eSKate Stone     std::lock_guard<std::recursive_mutex> guard(
649b9c1b51eSKate Stone         m_opaque_sp->GetTarget().GetAPIMutex());
6505e09c8c3SJim Ingham     std::vector<std::string> names_vec;
6515e09c8c3SJim Ingham     m_opaque_sp->GetNames(names_vec);
652b9c1b51eSKate Stone     for (std::string name : names_vec) {
6535e09c8c3SJim Ingham       names.AppendString(name.c_str());
6545e09c8c3SJim Ingham     }
6555e09c8c3SJim Ingham   }
6565e09c8c3SJim Ingham }
6575e09c8c3SJim Ingham 
658b9c1b51eSKate Stone lldb_private::Breakpoint *SBBreakpoint::operator->() const {
6596611103cSGreg Clayton   return m_opaque_sp.get();
66030fdc8d8SChris Lattner }
66130fdc8d8SChris Lattner 
662b9c1b51eSKate Stone lldb_private::Breakpoint *SBBreakpoint::get() const {
6636611103cSGreg Clayton   return m_opaque_sp.get();
66430fdc8d8SChris Lattner }
66530fdc8d8SChris Lattner 
666b9c1b51eSKate Stone lldb::BreakpointSP &SBBreakpoint::operator*() { return m_opaque_sp; }
667b9c1b51eSKate Stone 
668b9c1b51eSKate Stone const lldb::BreakpointSP &SBBreakpoint::operator*() const {
6696611103cSGreg Clayton   return m_opaque_sp;
67030fdc8d8SChris Lattner }
67130fdc8d8SChris Lattner 
672b9c1b51eSKate Stone bool SBBreakpoint::EventIsBreakpointEvent(const lldb::SBEvent &event) {
673b9c1b51eSKate Stone   return Breakpoint::BreakpointEventData::GetEventDataFromEvent(event.get()) !=
674b9c1b51eSKate Stone          nullptr;
675e6bc6cb9SJim Ingham }
676e6bc6cb9SJim Ingham 
6779fed0d85SGreg Clayton BreakpointEventType
678b9c1b51eSKate Stone SBBreakpoint::GetBreakpointEventTypeFromEvent(const SBEvent &event) {
6799fed0d85SGreg Clayton   if (event.IsValid())
680b9c1b51eSKate Stone     return Breakpoint::BreakpointEventData::GetBreakpointEventTypeFromEvent(
681b9c1b51eSKate Stone         event.GetSP());
6829fed0d85SGreg Clayton   return eBreakpointEventTypeInvalidType;
6839fed0d85SGreg Clayton }
6849fed0d85SGreg Clayton 
685b9c1b51eSKate Stone SBBreakpoint SBBreakpoint::GetBreakpointFromEvent(const lldb::SBEvent &event) {
6869fed0d85SGreg Clayton   SBBreakpoint sb_breakpoint;
6879fed0d85SGreg Clayton   if (event.IsValid())
688b9c1b51eSKate Stone     sb_breakpoint.m_opaque_sp =
689b9c1b51eSKate Stone         Breakpoint::BreakpointEventData::GetBreakpointFromEvent(event.GetSP());
6909fed0d85SGreg Clayton   return sb_breakpoint;
6919fed0d85SGreg Clayton }
6929fed0d85SGreg Clayton 
6939fed0d85SGreg Clayton SBBreakpointLocation
694b9c1b51eSKate Stone SBBreakpoint::GetBreakpointLocationAtIndexFromEvent(const lldb::SBEvent &event,
695b9c1b51eSKate Stone                                                     uint32_t loc_idx) {
6969fed0d85SGreg Clayton   SBBreakpointLocation sb_breakpoint_loc;
6979fed0d85SGreg Clayton   if (event.IsValid())
698b9c1b51eSKate Stone     sb_breakpoint_loc.SetLocation(
699b9c1b51eSKate Stone         Breakpoint::BreakpointEventData::GetBreakpointLocationAtIndexFromEvent(
700b9c1b51eSKate Stone             event.GetSP(), loc_idx));
7019fed0d85SGreg Clayton   return sb_breakpoint_loc;
7029fed0d85SGreg Clayton }
7039fed0d85SGreg Clayton 
704e6bc6cb9SJim Ingham uint32_t
705b9c1b51eSKate Stone SBBreakpoint::GetNumBreakpointLocationsFromEvent(const lldb::SBEvent &event) {
706e6bc6cb9SJim Ingham   uint32_t num_locations = 0;
707e6bc6cb9SJim Ingham   if (event.IsValid())
708b9c1b51eSKate Stone     num_locations =
709b9c1b51eSKate Stone         (Breakpoint::BreakpointEventData::GetNumBreakpointLocationsFromEvent(
710b9c1b51eSKate Stone             event.GetSP()));
711e6bc6cb9SJim Ingham   return num_locations;
712e6bc6cb9SJim Ingham }
71301f16664SJim Ingham 
71401f16664SJim Ingham // This is simple collection of breakpoint id's and their target.
715*653e3f4eSTodd Fiala class SBBreakpointListImpl {
71601f16664SJim Ingham public:
717*653e3f4eSTodd Fiala   SBBreakpointListImpl(lldb::TargetSP target_sp) : m_target_wp() {
718*653e3f4eSTodd Fiala     if (target_sp && target_sp->IsValid())
719*653e3f4eSTodd Fiala       m_target_wp = target_sp;
72001f16664SJim Ingham   }
72101f16664SJim Ingham 
72201f16664SJim Ingham   ~SBBreakpointListImpl() = default;
72301f16664SJim Ingham 
72401f16664SJim Ingham   size_t GetSize() { return m_break_ids.size(); }
72501f16664SJim Ingham 
72601f16664SJim Ingham   BreakpointSP GetBreakpointAtIndex(size_t idx) {
72701f16664SJim Ingham     if (idx >= m_break_ids.size())
72801f16664SJim Ingham       return BreakpointSP();
72901f16664SJim Ingham     TargetSP target_sp = m_target_wp.lock();
73001f16664SJim Ingham     if (!target_sp)
73101f16664SJim Ingham       return BreakpointSP();
73201f16664SJim Ingham     lldb::break_id_t bp_id = m_break_ids[idx];
73301f16664SJim Ingham     return target_sp->GetBreakpointList().FindBreakpointByID(bp_id);
73401f16664SJim Ingham   }
73501f16664SJim Ingham 
7366d1e4696SJim Ingham   BreakpointSP FindBreakpointByID(lldb::break_id_t desired_id) {
7376d1e4696SJim Ingham     TargetSP target_sp = m_target_wp.lock();
7386d1e4696SJim Ingham     if (!target_sp)
7396d1e4696SJim Ingham       return BreakpointSP();
7406d1e4696SJim Ingham 
7416d1e4696SJim Ingham     for (lldb::break_id_t &break_id : m_break_ids) {
7426d1e4696SJim Ingham       if (break_id == desired_id)
7436d1e4696SJim Ingham         return target_sp->GetBreakpointList().FindBreakpointByID(break_id);
7446d1e4696SJim Ingham     }
7456d1e4696SJim Ingham     return BreakpointSP();
7466d1e4696SJim Ingham   }
7476d1e4696SJim Ingham 
74801f16664SJim Ingham   bool Append(Breakpoint &bkpt) {
74901f16664SJim Ingham     TargetSP target_sp = m_target_wp.lock();
75001f16664SJim Ingham     if (!target_sp)
75101f16664SJim Ingham       return false;
75201f16664SJim Ingham     if (bkpt.GetTargetSP() != target_sp)
75301f16664SJim Ingham       return false;
75401f16664SJim Ingham     m_break_ids.push_back(bkpt.GetID());
75501f16664SJim Ingham     return true;
75601f16664SJim Ingham   }
75701f16664SJim Ingham 
75801f16664SJim Ingham   bool AppendIfUnique(Breakpoint &bkpt) {
75901f16664SJim Ingham     TargetSP target_sp = m_target_wp.lock();
76001f16664SJim Ingham     if (!target_sp)
76101f16664SJim Ingham       return false;
76201f16664SJim Ingham     if (bkpt.GetTargetSP() != target_sp)
76301f16664SJim Ingham       return false;
76401f16664SJim Ingham     lldb::break_id_t bp_id = bkpt.GetID();
76501f16664SJim Ingham     if (find(m_break_ids.begin(), m_break_ids.end(), bp_id) ==
76601f16664SJim Ingham         m_break_ids.end())
76701f16664SJim Ingham       return false;
76801f16664SJim Ingham 
76901f16664SJim Ingham     m_break_ids.push_back(bkpt.GetID());
77001f16664SJim Ingham     return true;
77101f16664SJim Ingham   }
77201f16664SJim Ingham 
77301f16664SJim Ingham   bool AppendByID(lldb::break_id_t id) {
77401f16664SJim Ingham     TargetSP target_sp = m_target_wp.lock();
77501f16664SJim Ingham     if (!target_sp)
77601f16664SJim Ingham       return false;
77701f16664SJim Ingham     if (id == LLDB_INVALID_BREAK_ID)
77801f16664SJim Ingham       return false;
77901f16664SJim Ingham     m_break_ids.push_back(id);
78001f16664SJim Ingham     return true;
78101f16664SJim Ingham   }
78201f16664SJim Ingham 
78301f16664SJim Ingham   void Clear() { m_break_ids.clear(); }
78401f16664SJim Ingham 
78501f16664SJim Ingham   void CopyToBreakpointIDList(lldb_private::BreakpointIDList &bp_list) {
78601f16664SJim Ingham     for (lldb::break_id_t id : m_break_ids) {
78701f16664SJim Ingham       bp_list.AddBreakpointID(BreakpointID(id));
78801f16664SJim Ingham     }
78901f16664SJim Ingham   }
79001f16664SJim Ingham 
79101f16664SJim Ingham   TargetSP GetTarget() { return m_target_wp.lock(); }
79201f16664SJim Ingham 
79301f16664SJim Ingham private:
79401f16664SJim Ingham   std::vector<lldb::break_id_t> m_break_ids;
79501f16664SJim Ingham   TargetWP m_target_wp;
79601f16664SJim Ingham };
79701f16664SJim Ingham 
79801f16664SJim Ingham SBBreakpointList::SBBreakpointList(SBTarget &target)
799*653e3f4eSTodd Fiala     : m_opaque_sp(new SBBreakpointListImpl(target.GetSP())) {}
80001f16664SJim Ingham 
80101f16664SJim Ingham SBBreakpointList::~SBBreakpointList() {}
80201f16664SJim Ingham 
80301f16664SJim Ingham size_t SBBreakpointList::GetSize() const {
80401f16664SJim Ingham   if (!m_opaque_sp)
80501f16664SJim Ingham     return 0;
80601f16664SJim Ingham   else
80701f16664SJim Ingham     return m_opaque_sp->GetSize();
80801f16664SJim Ingham }
80901f16664SJim Ingham 
81001f16664SJim Ingham SBBreakpoint SBBreakpointList::GetBreakpointAtIndex(size_t idx) {
81101f16664SJim Ingham   if (!m_opaque_sp)
81201f16664SJim Ingham     return SBBreakpoint();
81301f16664SJim Ingham 
81401f16664SJim Ingham   BreakpointSP bkpt_sp = m_opaque_sp->GetBreakpointAtIndex(idx);
81501f16664SJim Ingham   return SBBreakpoint(bkpt_sp);
81601f16664SJim Ingham }
81701f16664SJim Ingham 
8186d1e4696SJim Ingham SBBreakpoint SBBreakpointList::FindBreakpointByID(lldb::break_id_t id) {
8196d1e4696SJim Ingham   if (!m_opaque_sp)
8206d1e4696SJim Ingham     return SBBreakpoint();
8216d1e4696SJim Ingham   BreakpointSP bkpt_sp = m_opaque_sp->FindBreakpointByID(id);
8226d1e4696SJim Ingham   return SBBreakpoint(bkpt_sp);
8236d1e4696SJim Ingham }
8246d1e4696SJim Ingham 
82501f16664SJim Ingham void SBBreakpointList::Append(const SBBreakpoint &sb_bkpt) {
82601f16664SJim Ingham   if (!sb_bkpt.IsValid())
82701f16664SJim Ingham     return;
82801f16664SJim Ingham   if (!m_opaque_sp)
82901f16664SJim Ingham     return;
83001f16664SJim Ingham   m_opaque_sp->Append(*sb_bkpt.get());
83101f16664SJim Ingham }
83201f16664SJim Ingham 
83301f16664SJim Ingham void SBBreakpointList::AppendByID(lldb::break_id_t id) {
83401f16664SJim Ingham   if (!m_opaque_sp)
83501f16664SJim Ingham     return;
83601f16664SJim Ingham   m_opaque_sp->AppendByID(id);
83701f16664SJim Ingham }
83801f16664SJim Ingham 
83901f16664SJim Ingham bool SBBreakpointList::AppendIfUnique(const SBBreakpoint &sb_bkpt) {
84001f16664SJim Ingham   if (!sb_bkpt.IsValid())
84101f16664SJim Ingham     return false;
84201f16664SJim Ingham   if (!m_opaque_sp)
84301f16664SJim Ingham     return false;
84401f16664SJim Ingham   return m_opaque_sp->AppendIfUnique(*sb_bkpt.get());
84501f16664SJim Ingham }
84601f16664SJim Ingham 
84701f16664SJim Ingham void SBBreakpointList::Clear() {
84801f16664SJim Ingham   if (m_opaque_sp)
84901f16664SJim Ingham     m_opaque_sp->Clear();
85001f16664SJim Ingham }
85101f16664SJim Ingham 
85201f16664SJim Ingham void SBBreakpointList::CopyToBreakpointIDList(
85301f16664SJim Ingham     lldb_private::BreakpointIDList &bp_id_list) {
85401f16664SJim Ingham   if (m_opaque_sp)
85501f16664SJim Ingham     m_opaque_sp->CopyToBreakpointIDList(bp_id_list);
85601f16664SJim Ingham }
857