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 
10*dbb0abbfSEugene Zelenko // C Includes
11*dbb0abbfSEugene Zelenko // C++ Includes
12*dbb0abbfSEugene Zelenko // Other libraries and framework includes
13*dbb0abbfSEugene 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"
2430fdc8d8SChris Lattner #include "lldb/Breakpoint/BreakpointLocation.h"
2530fdc8d8SChris Lattner #include "lldb/Breakpoint/StoppointCallbackContext.h"
2630fdc8d8SChris Lattner #include "lldb/Core/Address.h"
27d80102e4SJim Ingham #include "lldb/Core/Debugger.h"
28ceb6b139SCaroline Tice #include "lldb/Core/Log.h"
2930fdc8d8SChris Lattner #include "lldb/Core/Stream.h"
3030fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
31d80102e4SJim Ingham #include "lldb/Interpreter/CommandInterpreter.h"
32d80102e4SJim Ingham #include "lldb/Interpreter/ScriptInterpreter.h"
3330fdc8d8SChris Lattner #include "lldb/Target/Process.h"
34d5944cd1SGreg Clayton #include "lldb/Target/SectionLoadList.h"
3530fdc8d8SChris Lattner #include "lldb/Target/Target.h"
3662b02c61SJim Ingham #include "lldb/Target/Thread.h"
3762b02c61SJim Ingham #include "lldb/Target/ThreadSpec.h"
3830fdc8d8SChris Lattner 
3930fdc8d8SChris Lattner #include "lldb/lldb-enumerations.h"
4030fdc8d8SChris Lattner 
4130fdc8d8SChris Lattner using namespace lldb;
4230fdc8d8SChris Lattner using namespace lldb_private;
4330fdc8d8SChris Lattner 
4430fdc8d8SChris Lattner struct CallbackData
4530fdc8d8SChris Lattner {
4630fdc8d8SChris Lattner     SBBreakpoint::BreakpointHitCallback callback;
4730fdc8d8SChris Lattner     void *callback_baton;
4830fdc8d8SChris Lattner };
4930fdc8d8SChris Lattner 
5030fdc8d8SChris Lattner class SBBreakpointCallbackBaton : public Baton
5130fdc8d8SChris Lattner {
5230fdc8d8SChris Lattner public:
5330fdc8d8SChris Lattner     SBBreakpointCallbackBaton (SBBreakpoint::BreakpointHitCallback callback, void *baton) :
5430fdc8d8SChris Lattner         Baton (new CallbackData)
5530fdc8d8SChris Lattner     {
5630fdc8d8SChris Lattner         CallbackData *data = (CallbackData *)m_data;
5730fdc8d8SChris Lattner         data->callback = callback;
5830fdc8d8SChris Lattner         data->callback_baton = baton;
5930fdc8d8SChris Lattner     }
6030fdc8d8SChris Lattner 
61*dbb0abbfSEugene Zelenko     ~SBBreakpointCallbackBaton() override
6230fdc8d8SChris Lattner     {
6330fdc8d8SChris Lattner         CallbackData *data = (CallbackData *)m_data;
6430fdc8d8SChris Lattner 
6530fdc8d8SChris Lattner         if (data)
6630fdc8d8SChris Lattner         {
6730fdc8d8SChris Lattner             delete data;
68*dbb0abbfSEugene Zelenko             m_data = nullptr;
6930fdc8d8SChris Lattner         }
7030fdc8d8SChris Lattner     }
7130fdc8d8SChris Lattner };
7230fdc8d8SChris Lattner 
7330fdc8d8SChris Lattner SBBreakpoint::SBBreakpoint () :
746611103cSGreg Clayton     m_opaque_sp ()
7530fdc8d8SChris Lattner {
7630fdc8d8SChris Lattner }
7730fdc8d8SChris Lattner 
7830fdc8d8SChris Lattner SBBreakpoint::SBBreakpoint (const SBBreakpoint& rhs) :
796611103cSGreg Clayton     m_opaque_sp (rhs.m_opaque_sp)
8030fdc8d8SChris Lattner {
8130fdc8d8SChris Lattner }
8230fdc8d8SChris Lattner 
8330fdc8d8SChris Lattner SBBreakpoint::SBBreakpoint (const lldb::BreakpointSP &bp_sp) :
846611103cSGreg Clayton     m_opaque_sp (bp_sp)
8530fdc8d8SChris Lattner {
8630fdc8d8SChris Lattner }
8730fdc8d8SChris Lattner 
88*dbb0abbfSEugene Zelenko SBBreakpoint::~SBBreakpoint() = default;
8930fdc8d8SChris Lattner 
9030fdc8d8SChris Lattner const SBBreakpoint &
9130fdc8d8SChris Lattner SBBreakpoint::operator = (const SBBreakpoint& rhs)
9230fdc8d8SChris Lattner {
9330fdc8d8SChris Lattner     if (this != &rhs)
946611103cSGreg Clayton         m_opaque_sp = rhs.m_opaque_sp;
9530fdc8d8SChris Lattner     return *this;
9630fdc8d8SChris Lattner }
9730fdc8d8SChris Lattner 
98ac2eb9b1SGreg Clayton bool
99ac2eb9b1SGreg Clayton SBBreakpoint::operator == (const lldb::SBBreakpoint& rhs)
100ac2eb9b1SGreg Clayton {
101ac2eb9b1SGreg Clayton     if (m_opaque_sp && rhs.m_opaque_sp)
102ac2eb9b1SGreg Clayton         return m_opaque_sp.get() == rhs.m_opaque_sp.get();
103ac2eb9b1SGreg Clayton     return false;
104ac2eb9b1SGreg Clayton }
105ac2eb9b1SGreg Clayton 
106c3387333SEnrico Granata bool
107c3387333SEnrico Granata SBBreakpoint::operator != (const lldb::SBBreakpoint& rhs)
108c3387333SEnrico Granata {
109c3387333SEnrico Granata     if (m_opaque_sp && rhs.m_opaque_sp)
110c3387333SEnrico Granata         return m_opaque_sp.get() != rhs.m_opaque_sp.get();
111c3387333SEnrico Granata     return (m_opaque_sp && !rhs.m_opaque_sp) || (rhs.m_opaque_sp && !m_opaque_sp);
112c3387333SEnrico Granata }
113c3387333SEnrico Granata 
11430fdc8d8SChris Lattner break_id_t
11530fdc8d8SChris Lattner SBBreakpoint::GetID () const
11630fdc8d8SChris Lattner {
1175160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
118ceb6b139SCaroline Tice 
119af67cecdSGreg Clayton     break_id_t break_id = LLDB_INVALID_BREAK_ID;
1206611103cSGreg Clayton     if (m_opaque_sp)
121af67cecdSGreg Clayton         break_id = m_opaque_sp->GetID();
122af67cecdSGreg Clayton 
123ceb6b139SCaroline Tice     if (log)
124af67cecdSGreg Clayton     {
125af67cecdSGreg Clayton         if (break_id == LLDB_INVALID_BREAK_ID)
126324a1036SSaleem Abdulrasool             log->Printf ("SBBreakpoint(%p)::GetID () => LLDB_INVALID_BREAK_ID",
127324a1036SSaleem Abdulrasool                          static_cast<void*>(m_opaque_sp.get()));
128af67cecdSGreg Clayton         else
129324a1036SSaleem Abdulrasool             log->Printf ("SBBreakpoint(%p)::GetID () => %u",
130324a1036SSaleem Abdulrasool                          static_cast<void*>(m_opaque_sp.get()), break_id);
131ceb6b139SCaroline Tice     }
132ceb6b139SCaroline Tice 
133af67cecdSGreg Clayton     return break_id;
13430fdc8d8SChris Lattner }
13530fdc8d8SChris Lattner 
13630fdc8d8SChris Lattner bool
13730fdc8d8SChris Lattner SBBreakpoint::IsValid() const
13830fdc8d8SChris Lattner {
139e029fa57SJim Ingham     if (!m_opaque_sp)
140e029fa57SJim Ingham         return false;
141e029fa57SJim Ingham     else if (m_opaque_sp->GetTarget().GetBreakpointByID(m_opaque_sp->GetID()))
142e029fa57SJim Ingham        return true;
143e029fa57SJim Ingham     else
144e029fa57SJim Ingham         return false;
14530fdc8d8SChris Lattner }
14630fdc8d8SChris Lattner 
14730fdc8d8SChris Lattner void
14830fdc8d8SChris Lattner SBBreakpoint::ClearAllBreakpointSites ()
14930fdc8d8SChris Lattner {
1506611103cSGreg Clayton     if (m_opaque_sp)
151af67cecdSGreg Clayton     {
152af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
1536611103cSGreg Clayton         m_opaque_sp->ClearAllBreakpointSites ();
15430fdc8d8SChris Lattner     }
155af67cecdSGreg Clayton }
15630fdc8d8SChris Lattner 
15730fdc8d8SChris Lattner SBBreakpointLocation
15830fdc8d8SChris Lattner SBBreakpoint::FindLocationByAddress (addr_t vm_addr)
15930fdc8d8SChris Lattner {
16030fdc8d8SChris Lattner     SBBreakpointLocation sb_bp_location;
16130fdc8d8SChris Lattner 
1626611103cSGreg Clayton     if (m_opaque_sp)
16330fdc8d8SChris Lattner     {
16430fdc8d8SChris Lattner         if (vm_addr != LLDB_INVALID_ADDRESS)
16530fdc8d8SChris Lattner         {
166af67cecdSGreg Clayton             Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
16730fdc8d8SChris Lattner             Address address;
168f5e56de0SGreg Clayton             Target &target = m_opaque_sp->GetTarget();
169*dbb0abbfSEugene Zelenko             if (!target.GetSectionLoadList().ResolveLoadAddress(vm_addr, address))
17030fdc8d8SChris Lattner             {
171e72dfb32SGreg Clayton                 address.SetRawAddress (vm_addr);
17230fdc8d8SChris Lattner             }
1736611103cSGreg Clayton             sb_bp_location.SetLocation (m_opaque_sp->FindLocationByAddress (address));
17430fdc8d8SChris Lattner         }
17530fdc8d8SChris Lattner     }
17630fdc8d8SChris Lattner     return sb_bp_location;
17730fdc8d8SChris Lattner }
17830fdc8d8SChris Lattner 
17930fdc8d8SChris Lattner break_id_t
18030fdc8d8SChris Lattner SBBreakpoint::FindLocationIDByAddress (addr_t vm_addr)
18130fdc8d8SChris Lattner {
182af67cecdSGreg Clayton     break_id_t break_id = LLDB_INVALID_BREAK_ID;
18330fdc8d8SChris Lattner 
184af67cecdSGreg Clayton     if (m_opaque_sp && vm_addr != LLDB_INVALID_ADDRESS)
18530fdc8d8SChris Lattner     {
186af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
18730fdc8d8SChris Lattner         Address address;
188f5e56de0SGreg Clayton         Target &target = m_opaque_sp->GetTarget();
189*dbb0abbfSEugene Zelenko         if (!target.GetSectionLoadList().ResolveLoadAddress(vm_addr, address))
19030fdc8d8SChris Lattner         {
191e72dfb32SGreg Clayton             address.SetRawAddress (vm_addr);
19230fdc8d8SChris Lattner         }
193af67cecdSGreg Clayton         break_id = m_opaque_sp->FindLocationIDByAddress (address);
19430fdc8d8SChris Lattner     }
19530fdc8d8SChris Lattner 
196af67cecdSGreg Clayton     return break_id;
19730fdc8d8SChris Lattner }
19830fdc8d8SChris Lattner 
19930fdc8d8SChris Lattner SBBreakpointLocation
20030fdc8d8SChris Lattner SBBreakpoint::FindLocationByID (break_id_t bp_loc_id)
20130fdc8d8SChris Lattner {
20230fdc8d8SChris Lattner     SBBreakpointLocation sb_bp_location;
20330fdc8d8SChris Lattner 
2046611103cSGreg Clayton     if (m_opaque_sp)
205af67cecdSGreg Clayton     {
206af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
2076611103cSGreg Clayton         sb_bp_location.SetLocation (m_opaque_sp->FindLocationByID (bp_loc_id));
208af67cecdSGreg Clayton     }
20930fdc8d8SChris Lattner 
21030fdc8d8SChris Lattner     return sb_bp_location;
21130fdc8d8SChris Lattner }
21230fdc8d8SChris Lattner 
21330fdc8d8SChris Lattner SBBreakpointLocation
21430fdc8d8SChris Lattner SBBreakpoint::GetLocationAtIndex (uint32_t index)
21530fdc8d8SChris Lattner {
21630fdc8d8SChris Lattner     SBBreakpointLocation sb_bp_location;
21730fdc8d8SChris Lattner 
2186611103cSGreg Clayton     if (m_opaque_sp)
219af67cecdSGreg Clayton     {
220af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
2216611103cSGreg Clayton         sb_bp_location.SetLocation (m_opaque_sp->GetLocationAtIndex (index));
222af67cecdSGreg Clayton     }
22330fdc8d8SChris Lattner 
22430fdc8d8SChris Lattner     return sb_bp_location;
22530fdc8d8SChris Lattner }
22630fdc8d8SChris Lattner 
22730fdc8d8SChris Lattner void
22830fdc8d8SChris Lattner SBBreakpoint::SetEnabled (bool enable)
22930fdc8d8SChris Lattner {
2305160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
231ceb6b139SCaroline Tice 
232ceb6b139SCaroline Tice     if (log)
233324a1036SSaleem Abdulrasool         log->Printf ("SBBreakpoint(%p)::SetEnabled (enabled=%i)",
234324a1036SSaleem Abdulrasool                      static_cast<void*>(m_opaque_sp.get()), enable);
235ceb6b139SCaroline Tice 
2366611103cSGreg Clayton     if (m_opaque_sp)
237af67cecdSGreg Clayton     {
238af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
2396611103cSGreg Clayton         m_opaque_sp->SetEnabled (enable);
24030fdc8d8SChris Lattner     }
241af67cecdSGreg Clayton }
24230fdc8d8SChris Lattner 
24330fdc8d8SChris Lattner bool
24430fdc8d8SChris Lattner SBBreakpoint::IsEnabled ()
24530fdc8d8SChris Lattner {
2466611103cSGreg Clayton     if (m_opaque_sp)
247af67cecdSGreg Clayton     {
248af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
2496611103cSGreg Clayton         return m_opaque_sp->IsEnabled();
250af67cecdSGreg Clayton     }
25130fdc8d8SChris Lattner     else
25230fdc8d8SChris Lattner         return false;
25330fdc8d8SChris Lattner }
25430fdc8d8SChris Lattner 
255ca36cd16SJim Ingham void
256ca36cd16SJim Ingham SBBreakpoint::SetOneShot (bool one_shot)
257ca36cd16SJim Ingham {
2585160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
259ca36cd16SJim Ingham 
260ca36cd16SJim Ingham     if (log)
261324a1036SSaleem Abdulrasool         log->Printf ("SBBreakpoint(%p)::SetOneShot (one_shot=%i)",
262324a1036SSaleem Abdulrasool                      static_cast<void*>(m_opaque_sp.get()), one_shot);
263ca36cd16SJim Ingham 
264ca36cd16SJim Ingham     if (m_opaque_sp)
265ca36cd16SJim Ingham     {
266ca36cd16SJim Ingham         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
267ca36cd16SJim Ingham         m_opaque_sp->SetOneShot (one_shot);
268ca36cd16SJim Ingham     }
269ca36cd16SJim Ingham }
270ca36cd16SJim Ingham 
271ca36cd16SJim Ingham bool
272ca36cd16SJim Ingham SBBreakpoint::IsOneShot () const
273ca36cd16SJim Ingham {
274ca36cd16SJim Ingham     if (m_opaque_sp)
275ca36cd16SJim Ingham     {
276ca36cd16SJim Ingham         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
277ca36cd16SJim Ingham         return m_opaque_sp->IsOneShot();
278ca36cd16SJim Ingham     }
279ca36cd16SJim Ingham     else
280ca36cd16SJim Ingham         return false;
281ca36cd16SJim Ingham }
282ca36cd16SJim Ingham 
28311c8108dSJim Ingham bool
28411c8108dSJim Ingham SBBreakpoint::IsInternal ()
28511c8108dSJim Ingham {
28611c8108dSJim Ingham     if (m_opaque_sp)
28711c8108dSJim Ingham     {
28811c8108dSJim Ingham         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
28911c8108dSJim Ingham         return m_opaque_sp->IsInternal();
29011c8108dSJim Ingham     }
29111c8108dSJim Ingham     else
29211c8108dSJim Ingham         return false;
29311c8108dSJim Ingham }
29411c8108dSJim Ingham 
29530fdc8d8SChris Lattner void
296c982c768SGreg Clayton SBBreakpoint::SetIgnoreCount (uint32_t count)
29730fdc8d8SChris Lattner {
2985160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
299ceb6b139SCaroline Tice 
300ceb6b139SCaroline Tice     if (log)
301324a1036SSaleem Abdulrasool         log->Printf ("SBBreakpoint(%p)::SetIgnoreCount (count=%u)",
302324a1036SSaleem Abdulrasool                      static_cast<void*>(m_opaque_sp.get()), count);
303ceb6b139SCaroline Tice 
3046611103cSGreg Clayton     if (m_opaque_sp)
305af67cecdSGreg Clayton     {
306af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
3076611103cSGreg Clayton         m_opaque_sp->SetIgnoreCount (count);
30830fdc8d8SChris Lattner     }
309af67cecdSGreg Clayton }
31030fdc8d8SChris Lattner 
311041a12fcSJim Ingham void
312041a12fcSJim Ingham SBBreakpoint::SetCondition (const char *condition)
313041a12fcSJim Ingham {
314af67cecdSGreg Clayton     if (m_opaque_sp)
315af67cecdSGreg Clayton     {
316af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
317041a12fcSJim Ingham         m_opaque_sp->SetCondition (condition);
318041a12fcSJim Ingham     }
319af67cecdSGreg Clayton }
320041a12fcSJim Ingham 
321041a12fcSJim Ingham const char *
322041a12fcSJim Ingham SBBreakpoint::GetCondition ()
323041a12fcSJim Ingham {
324af67cecdSGreg Clayton     if (m_opaque_sp)
325af67cecdSGreg Clayton     {
326af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
327041a12fcSJim Ingham         return m_opaque_sp->GetConditionText ();
328041a12fcSJim Ingham     }
329*dbb0abbfSEugene Zelenko     return nullptr;
330af67cecdSGreg Clayton }
331041a12fcSJim Ingham 
332c982c768SGreg Clayton uint32_t
3339fed0d85SGreg Clayton SBBreakpoint::GetHitCount () const
3349fed0d85SGreg Clayton {
3354838131bSGreg Clayton     uint32_t count = 0;
3369fed0d85SGreg Clayton     if (m_opaque_sp)
337af67cecdSGreg Clayton     {
338af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
3394838131bSGreg Clayton         count = m_opaque_sp->GetHitCount();
340af67cecdSGreg Clayton     }
3414838131bSGreg Clayton 
3425160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
343ceb6b139SCaroline Tice     if (log)
344324a1036SSaleem Abdulrasool         log->Printf ("SBBreakpoint(%p)::GetHitCount () => %u",
345324a1036SSaleem Abdulrasool                      static_cast<void*>(m_opaque_sp.get()), count);
3464838131bSGreg Clayton 
3474838131bSGreg Clayton     return count;
348ceb6b139SCaroline Tice }
3499fed0d85SGreg Clayton 
3509fed0d85SGreg Clayton uint32_t
35130fdc8d8SChris Lattner SBBreakpoint::GetIgnoreCount () const
35230fdc8d8SChris Lattner {
3534838131bSGreg Clayton     uint32_t count = 0;
3546611103cSGreg Clayton     if (m_opaque_sp)
355af67cecdSGreg Clayton     {
356af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
3574838131bSGreg Clayton         count = m_opaque_sp->GetIgnoreCount();
358af67cecdSGreg Clayton     }
3594838131bSGreg Clayton 
3605160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3614838131bSGreg Clayton     if (log)
362324a1036SSaleem Abdulrasool         log->Printf ("SBBreakpoint(%p)::GetIgnoreCount () => %u",
363324a1036SSaleem Abdulrasool                      static_cast<void*>(m_opaque_sp.get()), count);
3644838131bSGreg Clayton 
3654838131bSGreg Clayton     return count;
36630fdc8d8SChris Lattner }
36730fdc8d8SChris Lattner 
36830fdc8d8SChris Lattner void
3694838131bSGreg Clayton SBBreakpoint::SetThreadID (tid_t tid)
37030fdc8d8SChris Lattner {
3716611103cSGreg Clayton     if (m_opaque_sp)
372af67cecdSGreg Clayton     {
373af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
3744838131bSGreg Clayton         m_opaque_sp->SetThreadID (tid);
375af67cecdSGreg Clayton     }
3765160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3774838131bSGreg Clayton     if (log)
378324a1036SSaleem Abdulrasool         log->Printf ("SBBreakpoint(%p)::SetThreadID (tid=0x%4.4" PRIx64 ")",
379324a1036SSaleem Abdulrasool                      static_cast<void*>(m_opaque_sp.get()), tid);
38030fdc8d8SChris Lattner }
38130fdc8d8SChris Lattner 
38230fdc8d8SChris Lattner tid_t
38330fdc8d8SChris Lattner SBBreakpoint::GetThreadID ()
38430fdc8d8SChris Lattner {
3854838131bSGreg Clayton     tid_t tid = LLDB_INVALID_THREAD_ID;
3866611103cSGreg Clayton     if (m_opaque_sp)
387af67cecdSGreg Clayton     {
388af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
3894838131bSGreg Clayton         tid = m_opaque_sp->GetThreadID();
390af67cecdSGreg Clayton     }
39130fdc8d8SChris Lattner 
3925160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3934838131bSGreg Clayton     if (log)
394324a1036SSaleem Abdulrasool         log->Printf ("SBBreakpoint(%p)::GetThreadID () => 0x%4.4" PRIx64,
395324a1036SSaleem Abdulrasool                      static_cast<void*>(m_opaque_sp.get()), tid);
3964838131bSGreg Clayton     return tid;
39730fdc8d8SChris Lattner }
39830fdc8d8SChris Lattner 
39962b02c61SJim Ingham void
40062b02c61SJim Ingham SBBreakpoint::SetThreadIndex (uint32_t index)
40162b02c61SJim Ingham {
4025160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4034838131bSGreg Clayton     if (log)
404324a1036SSaleem Abdulrasool         log->Printf ("SBBreakpoint(%p)::SetThreadIndex (%u)",
405324a1036SSaleem Abdulrasool                      static_cast<void*>(m_opaque_sp.get()), index);
4066611103cSGreg Clayton     if (m_opaque_sp)
407af67cecdSGreg Clayton     {
408af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
4096611103cSGreg Clayton         m_opaque_sp->GetOptions()->GetThreadSpec()->SetIndex (index);
41062b02c61SJim Ingham     }
411af67cecdSGreg Clayton }
41262b02c61SJim Ingham 
41362b02c61SJim Ingham uint32_t
41462b02c61SJim Ingham SBBreakpoint::GetThreadIndex() const
41562b02c61SJim Ingham {
416bdf4c6acSGreg Clayton     uint32_t thread_idx = UINT32_MAX;
4176611103cSGreg Clayton     if (m_opaque_sp)
41862b02c61SJim Ingham     {
419af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
420af67cecdSGreg Clayton         const ThreadSpec *thread_spec = m_opaque_sp->GetOptions()->GetThreadSpecNoCreate();
421*dbb0abbfSEugene Zelenko         if (thread_spec != nullptr)
4224838131bSGreg Clayton             thread_idx = thread_spec->GetIndex();
42362b02c61SJim Ingham     }
4245160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4254838131bSGreg Clayton     if (log)
426324a1036SSaleem Abdulrasool         log->Printf ("SBBreakpoint(%p)::GetThreadIndex () => %u",
427324a1036SSaleem Abdulrasool                      static_cast<void*>(m_opaque_sp.get()), thread_idx);
4284838131bSGreg Clayton 
429763d1a17SJohnny Chen     return thread_idx;
43062b02c61SJim Ingham }
43162b02c61SJim Ingham 
43262b02c61SJim Ingham void
43362b02c61SJim Ingham SBBreakpoint::SetThreadName (const char *thread_name)
43462b02c61SJim Ingham {
4355160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4364838131bSGreg Clayton     if (log)
437324a1036SSaleem Abdulrasool         log->Printf ("SBBreakpoint(%p)::SetThreadName (%s)",
438324a1036SSaleem Abdulrasool                      static_cast<void*>(m_opaque_sp.get()), thread_name);
4394838131bSGreg Clayton 
4406611103cSGreg Clayton     if (m_opaque_sp)
441af67cecdSGreg Clayton     {
442af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
4436611103cSGreg Clayton         m_opaque_sp->GetOptions()->GetThreadSpec()->SetName (thread_name);
44462b02c61SJim Ingham     }
445af67cecdSGreg Clayton }
44662b02c61SJim Ingham 
44762b02c61SJim Ingham const char *
44862b02c61SJim Ingham SBBreakpoint::GetThreadName () const
44962b02c61SJim Ingham {
450*dbb0abbfSEugene Zelenko     const char *name = nullptr;
4516611103cSGreg Clayton     if (m_opaque_sp)
45262b02c61SJim Ingham     {
453af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
454af67cecdSGreg Clayton         const ThreadSpec *thread_spec = m_opaque_sp->GetOptions()->GetThreadSpecNoCreate();
455*dbb0abbfSEugene Zelenko         if (thread_spec != nullptr)
4564838131bSGreg Clayton             name = thread_spec->GetName();
45762b02c61SJim Ingham     }
4585160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4594838131bSGreg Clayton     if (log)
460324a1036SSaleem Abdulrasool         log->Printf ("SBBreakpoint(%p)::GetThreadName () => %s",
461324a1036SSaleem Abdulrasool                      static_cast<void*>(m_opaque_sp.get()), name);
4624838131bSGreg Clayton 
4634838131bSGreg Clayton     return name;
46462b02c61SJim Ingham }
46562b02c61SJim Ingham 
46662b02c61SJim Ingham void
46762b02c61SJim Ingham SBBreakpoint::SetQueueName (const char *queue_name)
46862b02c61SJim Ingham {
4695160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4704838131bSGreg Clayton     if (log)
471324a1036SSaleem Abdulrasool         log->Printf ("SBBreakpoint(%p)::SetQueueName (%s)",
472324a1036SSaleem Abdulrasool                      static_cast<void*>(m_opaque_sp.get()), queue_name);
4736611103cSGreg Clayton     if (m_opaque_sp)
474af67cecdSGreg Clayton     {
475af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
4766611103cSGreg Clayton         m_opaque_sp->GetOptions()->GetThreadSpec()->SetQueueName (queue_name);
47762b02c61SJim Ingham     }
478af67cecdSGreg Clayton }
47962b02c61SJim Ingham 
48062b02c61SJim Ingham const char *
48162b02c61SJim Ingham SBBreakpoint::GetQueueName () const
48262b02c61SJim Ingham {
483*dbb0abbfSEugene Zelenko     const char *name = nullptr;
4846611103cSGreg Clayton     if (m_opaque_sp)
48562b02c61SJim Ingham     {
486af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
487af67cecdSGreg Clayton         const ThreadSpec *thread_spec = m_opaque_sp->GetOptions()->GetThreadSpecNoCreate();
488af67cecdSGreg Clayton         if (thread_spec)
4894838131bSGreg Clayton             name = thread_spec->GetQueueName();
49062b02c61SJim Ingham     }
4915160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4924838131bSGreg Clayton     if (log)
493324a1036SSaleem Abdulrasool         log->Printf ("SBBreakpoint(%p)::GetQueueName () => %s",
494324a1036SSaleem Abdulrasool                      static_cast<void*>(m_opaque_sp.get()), name);
4954838131bSGreg Clayton 
4964838131bSGreg Clayton     return name;
49762b02c61SJim Ingham }
49862b02c61SJim Ingham 
49930fdc8d8SChris Lattner size_t
50030fdc8d8SChris Lattner SBBreakpoint::GetNumResolvedLocations() const
50130fdc8d8SChris Lattner {
5024838131bSGreg Clayton     size_t num_resolved = 0;
5036611103cSGreg Clayton     if (m_opaque_sp)
504af67cecdSGreg Clayton     {
505af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
5064838131bSGreg Clayton         num_resolved = m_opaque_sp->GetNumResolvedLocations();
507af67cecdSGreg Clayton     }
5085160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
5094838131bSGreg Clayton     if (log)
510324a1036SSaleem Abdulrasool         log->Printf ("SBBreakpoint(%p)::GetNumResolvedLocations () => %" PRIu64,
511324a1036SSaleem Abdulrasool                      static_cast<void*>(m_opaque_sp.get()),
512324a1036SSaleem Abdulrasool                      static_cast<uint64_t>(num_resolved));
5134838131bSGreg Clayton     return num_resolved;
51430fdc8d8SChris Lattner }
51530fdc8d8SChris Lattner 
51630fdc8d8SChris Lattner size_t
51730fdc8d8SChris Lattner SBBreakpoint::GetNumLocations() const
51830fdc8d8SChris Lattner {
5194838131bSGreg Clayton     size_t num_locs = 0;
5206611103cSGreg Clayton     if (m_opaque_sp)
521af67cecdSGreg Clayton     {
522af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
5234838131bSGreg Clayton         num_locs = m_opaque_sp->GetNumLocations();
524af67cecdSGreg Clayton     }
5255160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
5264838131bSGreg Clayton     if (log)
527324a1036SSaleem Abdulrasool         log->Printf ("SBBreakpoint(%p)::GetNumLocations () => %" PRIu64,
528324a1036SSaleem Abdulrasool                      static_cast<void*>(m_opaque_sp.get()),
529324a1036SSaleem Abdulrasool                      static_cast<uint64_t>(num_locs));
5304838131bSGreg Clayton     return num_locs;
53130fdc8d8SChris Lattner }
53230fdc8d8SChris Lattner 
533dde9cff3SCaroline Tice bool
53405faeb71SGreg Clayton SBBreakpoint::GetDescription (SBStream &s)
53530fdc8d8SChris Lattner {
5366611103cSGreg Clayton     if (m_opaque_sp)
53730fdc8d8SChris Lattner     {
538af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
53905faeb71SGreg Clayton         s.Printf("SBBreakpoint: id = %i, ", m_opaque_sp->GetID());
54005faeb71SGreg Clayton         m_opaque_sp->GetResolverDescription (s.get());
54105faeb71SGreg Clayton         m_opaque_sp->GetFilterDescription (s.get());
54205faeb71SGreg Clayton         const size_t num_locations = m_opaque_sp->GetNumLocations ();
543d01b2953SDaniel Malea         s.Printf(", locations = %" PRIu64, (uint64_t)num_locations);
544dde9cff3SCaroline Tice         return true;
545dde9cff3SCaroline Tice     }
54605faeb71SGreg Clayton     s.Printf ("No value");
54705faeb71SGreg Clayton     return false;
54805faeb71SGreg Clayton }
549dde9cff3SCaroline Tice 
55030fdc8d8SChris Lattner bool
551*dbb0abbfSEugene Zelenko SBBreakpoint::PrivateBreakpointHitCallback(void *baton,
55230fdc8d8SChris Lattner                                            StoppointCallbackContext *ctx,
55330fdc8d8SChris Lattner                                            lldb::user_id_t break_id,
554*dbb0abbfSEugene Zelenko                                            lldb::user_id_t break_loc_id)
55530fdc8d8SChris Lattner {
5561ac04c30SGreg Clayton     ExecutionContext exe_ctx (ctx->exe_ctx_ref);
5571ac04c30SGreg Clayton     BreakpointSP bp_sp(exe_ctx.GetTargetRef().GetBreakpointList().FindBreakpointByID(break_id));
55830fdc8d8SChris Lattner     if (baton && bp_sp)
55930fdc8d8SChris Lattner     {
56030fdc8d8SChris Lattner         CallbackData *data = (CallbackData *)baton;
56130fdc8d8SChris Lattner         lldb_private::Breakpoint *bp = bp_sp.get();
56230fdc8d8SChris Lattner         if (bp && data->callback)
56330fdc8d8SChris Lattner         {
5641ac04c30SGreg Clayton             Process *process = exe_ctx.GetProcessPtr();
565c14ee32dSGreg Clayton             if (process)
56630fdc8d8SChris Lattner             {
567e1cd1be6SGreg Clayton                 SBProcess sb_process (process->shared_from_this());
56830fdc8d8SChris Lattner                 SBThread sb_thread;
56930fdc8d8SChris Lattner                 SBBreakpointLocation sb_location;
57030fdc8d8SChris Lattner                 assert (bp_sp);
57130fdc8d8SChris Lattner                 sb_location.SetLocation (bp_sp->FindLocationByID (break_loc_id));
5721ac04c30SGreg Clayton                 Thread *thread = exe_ctx.GetThreadPtr();
573c14ee32dSGreg Clayton                 if (thread)
574e1cd1be6SGreg Clayton                     sb_thread.SetThread(thread->shared_from_this());
57530fdc8d8SChris Lattner 
57630fdc8d8SChris Lattner                 return data->callback (data->callback_baton,
57730fdc8d8SChris Lattner                                           sb_process,
57830fdc8d8SChris Lattner                                           sb_thread,
57930fdc8d8SChris Lattner                                           sb_location);
58030fdc8d8SChris Lattner             }
58130fdc8d8SChris Lattner         }
58230fdc8d8SChris Lattner     }
58330fdc8d8SChris Lattner     return true;    // Return true if we should stop at this breakpoint
58430fdc8d8SChris Lattner }
58530fdc8d8SChris Lattner 
58630fdc8d8SChris Lattner void
58730fdc8d8SChris Lattner SBBreakpoint::SetCallback (BreakpointHitCallback callback, void *baton)
58830fdc8d8SChris Lattner {
5895160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
590ceb6b139SCaroline Tice 
591ceb6b139SCaroline Tice     if (log)
592324a1036SSaleem Abdulrasool     {
593324a1036SSaleem Abdulrasool         void *pointer = &callback;
594324a1036SSaleem Abdulrasool         log->Printf ("SBBreakpoint(%p)::SetCallback (callback=%p, baton=%p)",
595324a1036SSaleem Abdulrasool                      static_cast<void*>(m_opaque_sp.get()),
596324a1036SSaleem Abdulrasool                      *static_cast<void**>(&pointer), static_cast<void*>(baton));
597324a1036SSaleem Abdulrasool     }
598ceb6b139SCaroline Tice 
599c14ee32dSGreg Clayton     if (m_opaque_sp)
60030fdc8d8SChris Lattner     {
601af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
60230fdc8d8SChris Lattner         BatonSP baton_sp(new SBBreakpointCallbackBaton (callback, baton));
6036611103cSGreg Clayton         m_opaque_sp->SetCallback (SBBreakpoint::PrivateBreakpointHitCallback, baton_sp, false);
60430fdc8d8SChris Lattner     }
60530fdc8d8SChris Lattner }
60630fdc8d8SChris Lattner 
607d80102e4SJim Ingham void
608d80102e4SJim Ingham SBBreakpoint::SetScriptCallbackFunction (const char *callback_function_name)
609d80102e4SJim Ingham {
610d80102e4SJim Ingham     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
611d80102e4SJim Ingham 
612d80102e4SJim Ingham     if (log)
613324a1036SSaleem Abdulrasool         log->Printf ("SBBreakpoint(%p)::SetScriptCallbackFunction (callback=%s)",
614324a1036SSaleem Abdulrasool                      static_cast<void*>(m_opaque_sp.get()),
615324a1036SSaleem Abdulrasool                      callback_function_name);
616d80102e4SJim Ingham 
617d80102e4SJim Ingham     if (m_opaque_sp)
618d80102e4SJim Ingham     {
619d80102e4SJim Ingham         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
620d80102e4SJim Ingham         BreakpointOptions *bp_options = m_opaque_sp->GetOptions();
621d80102e4SJim Ingham         m_opaque_sp->GetTarget().GetDebugger().GetCommandInterpreter().GetScriptInterpreter()->SetBreakpointCommandCallbackFunction (bp_options,
622d80102e4SJim Ingham                                                                                                                                                    callback_function_name);
623d80102e4SJim Ingham     }
624d80102e4SJim Ingham }
625d80102e4SJim Ingham 
626d80102e4SJim Ingham SBError
627d80102e4SJim Ingham SBBreakpoint::SetScriptCallbackBody (const char *callback_body_text)
628d80102e4SJim Ingham {
629d80102e4SJim Ingham     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
630d80102e4SJim Ingham 
631d80102e4SJim Ingham     if (log)
632324a1036SSaleem Abdulrasool         log->Printf ("SBBreakpoint(%p)::SetScriptCallbackBody: callback body:\n%s)",
633324a1036SSaleem Abdulrasool                      static_cast<void*>(m_opaque_sp.get()), callback_body_text);
634d80102e4SJim Ingham 
635d80102e4SJim Ingham     SBError sb_error;
636d80102e4SJim Ingham     if (m_opaque_sp)
637d80102e4SJim Ingham     {
638d80102e4SJim Ingham         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
639d80102e4SJim Ingham         BreakpointOptions *bp_options = m_opaque_sp->GetOptions();
640d80102e4SJim Ingham         Error error =  m_opaque_sp->GetTarget().GetDebugger().GetCommandInterpreter().GetScriptInterpreter()->SetBreakpointCommandCallback (bp_options,
641d80102e4SJim Ingham                                                                                                                                     callback_body_text);
642d80102e4SJim Ingham         sb_error.SetError(error);
643d80102e4SJim Ingham     }
644d80102e4SJim Ingham     else
645d80102e4SJim Ingham         sb_error.SetErrorString("invalid breakpoint");
646d80102e4SJim Ingham 
647d80102e4SJim Ingham     return sb_error;
648d80102e4SJim Ingham }
64930fdc8d8SChris Lattner 
6505e09c8c3SJim Ingham bool
6515e09c8c3SJim Ingham SBBreakpoint::AddName (const char *new_name)
6525e09c8c3SJim Ingham {
6535e09c8c3SJim Ingham     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
6545e09c8c3SJim Ingham 
6555e09c8c3SJim Ingham     if (log)
6565e09c8c3SJim Ingham         log->Printf ("SBBreakpoint(%p)::AddName (name=%s)",
6575e09c8c3SJim Ingham                      static_cast<void*>(m_opaque_sp.get()),
6585e09c8c3SJim Ingham                      new_name);
6595e09c8c3SJim Ingham 
6605e09c8c3SJim Ingham     if (m_opaque_sp)
6615e09c8c3SJim Ingham     {
6625e09c8c3SJim Ingham         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
6635e09c8c3SJim Ingham         Error error;  // Think I'm just going to swallow the error here, it's probably more annoying to have to provide it.
6645e09c8c3SJim Ingham         return m_opaque_sp->AddName(new_name, error);
6655e09c8c3SJim Ingham     }
6665e09c8c3SJim Ingham 
6675e09c8c3SJim Ingham     return false;
6685e09c8c3SJim Ingham }
6695e09c8c3SJim Ingham 
6705e09c8c3SJim Ingham void
6715e09c8c3SJim Ingham SBBreakpoint::RemoveName (const char *name_to_remove)
6725e09c8c3SJim Ingham {
6735e09c8c3SJim Ingham     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
6745e09c8c3SJim Ingham 
6755e09c8c3SJim Ingham     if (log)
6765e09c8c3SJim Ingham         log->Printf ("SBBreakpoint(%p)::RemoveName (name=%s)",
6775e09c8c3SJim Ingham                      static_cast<void*>(m_opaque_sp.get()),
6785e09c8c3SJim Ingham                      name_to_remove);
6795e09c8c3SJim Ingham 
6805e09c8c3SJim Ingham     if (m_opaque_sp)
6815e09c8c3SJim Ingham     {
6825e09c8c3SJim Ingham         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
6835e09c8c3SJim Ingham         m_opaque_sp->RemoveName(name_to_remove);
6845e09c8c3SJim Ingham     }
6855e09c8c3SJim Ingham }
6865e09c8c3SJim Ingham 
6875e09c8c3SJim Ingham bool
6885e09c8c3SJim Ingham SBBreakpoint::MatchesName (const char *name)
6895e09c8c3SJim Ingham {
6905e09c8c3SJim Ingham     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
6915e09c8c3SJim Ingham 
6925e09c8c3SJim Ingham     if (log)
6935e09c8c3SJim Ingham         log->Printf ("SBBreakpoint(%p)::MatchesName (name=%s)",
6945e09c8c3SJim Ingham                      static_cast<void*>(m_opaque_sp.get()),
6955e09c8c3SJim Ingham                      name);
6965e09c8c3SJim Ingham 
6975e09c8c3SJim Ingham     if (m_opaque_sp)
6985e09c8c3SJim Ingham     {
6995e09c8c3SJim Ingham         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
7005e09c8c3SJim Ingham         return m_opaque_sp->MatchesName(name);
7015e09c8c3SJim Ingham     }
7025e09c8c3SJim Ingham 
7035e09c8c3SJim Ingham     return false;
7045e09c8c3SJim Ingham }
7055e09c8c3SJim Ingham 
7065e09c8c3SJim Ingham void
7075e09c8c3SJim Ingham SBBreakpoint::GetNames (SBStringList &names)
7085e09c8c3SJim Ingham {
7095e09c8c3SJim Ingham     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
7105e09c8c3SJim Ingham 
7115e09c8c3SJim Ingham     if (log)
7125e09c8c3SJim Ingham         log->Printf ("SBBreakpoint(%p)::GetNames ()",
7135e09c8c3SJim Ingham                      static_cast<void*>(m_opaque_sp.get()));
7145e09c8c3SJim Ingham 
7155e09c8c3SJim Ingham     if (m_opaque_sp)
7165e09c8c3SJim Ingham     {
7175e09c8c3SJim Ingham         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
7185e09c8c3SJim Ingham         std::vector<std::string> names_vec;
7195e09c8c3SJim Ingham         m_opaque_sp->GetNames(names_vec);
7205e09c8c3SJim Ingham         for (std::string name : names_vec)
7215e09c8c3SJim Ingham         {
7225e09c8c3SJim Ingham             names.AppendString (name.c_str());
7235e09c8c3SJim Ingham         }
7245e09c8c3SJim Ingham     }
7255e09c8c3SJim Ingham }
7265e09c8c3SJim Ingham 
72730fdc8d8SChris Lattner lldb_private::Breakpoint *
72830fdc8d8SChris Lattner SBBreakpoint::operator->() const
72930fdc8d8SChris Lattner {
7306611103cSGreg Clayton     return m_opaque_sp.get();
73130fdc8d8SChris Lattner }
73230fdc8d8SChris Lattner 
73330fdc8d8SChris Lattner lldb_private::Breakpoint *
73430fdc8d8SChris Lattner SBBreakpoint::get() const
73530fdc8d8SChris Lattner {
7366611103cSGreg Clayton     return m_opaque_sp.get();
73730fdc8d8SChris Lattner }
73830fdc8d8SChris Lattner 
73930fdc8d8SChris Lattner lldb::BreakpointSP &
74030fdc8d8SChris Lattner SBBreakpoint::operator *()
74130fdc8d8SChris Lattner {
7426611103cSGreg Clayton     return m_opaque_sp;
74330fdc8d8SChris Lattner }
74430fdc8d8SChris Lattner 
74530fdc8d8SChris Lattner const lldb::BreakpointSP &
74630fdc8d8SChris Lattner SBBreakpoint::operator *() const
74730fdc8d8SChris Lattner {
7486611103cSGreg Clayton     return m_opaque_sp;
74930fdc8d8SChris Lattner }
75030fdc8d8SChris Lattner 
751e6bc6cb9SJim Ingham bool
752e6bc6cb9SJim Ingham SBBreakpoint::EventIsBreakpointEvent (const lldb::SBEvent &event)
753e6bc6cb9SJim Ingham {
754*dbb0abbfSEugene Zelenko     return Breakpoint::BreakpointEventData::GetEventDataFromEvent(event.get()) != nullptr;
755e6bc6cb9SJim Ingham }
756e6bc6cb9SJim Ingham 
7579fed0d85SGreg Clayton BreakpointEventType
7589fed0d85SGreg Clayton SBBreakpoint::GetBreakpointEventTypeFromEvent (const SBEvent& event)
7599fed0d85SGreg Clayton {
7609fed0d85SGreg Clayton     if (event.IsValid())
7619fed0d85SGreg Clayton         return Breakpoint::BreakpointEventData::GetBreakpointEventTypeFromEvent (event.GetSP());
7629fed0d85SGreg Clayton     return eBreakpointEventTypeInvalidType;
7639fed0d85SGreg Clayton }
7649fed0d85SGreg Clayton 
7659fed0d85SGreg Clayton SBBreakpoint
7669fed0d85SGreg Clayton SBBreakpoint::GetBreakpointFromEvent (const lldb::SBEvent& event)
7679fed0d85SGreg Clayton {
7689fed0d85SGreg Clayton     SBBreakpoint sb_breakpoint;
7699fed0d85SGreg Clayton     if (event.IsValid())
7709fed0d85SGreg Clayton         sb_breakpoint.m_opaque_sp = Breakpoint::BreakpointEventData::GetBreakpointFromEvent (event.GetSP());
7719fed0d85SGreg Clayton     return sb_breakpoint;
7729fed0d85SGreg Clayton }
7739fed0d85SGreg Clayton 
7749fed0d85SGreg Clayton SBBreakpointLocation
7759fed0d85SGreg Clayton SBBreakpoint::GetBreakpointLocationAtIndexFromEvent (const lldb::SBEvent& event, uint32_t loc_idx)
7769fed0d85SGreg Clayton {
7779fed0d85SGreg Clayton     SBBreakpointLocation sb_breakpoint_loc;
7789fed0d85SGreg Clayton     if (event.IsValid())
7799fed0d85SGreg Clayton         sb_breakpoint_loc.SetLocation (Breakpoint::BreakpointEventData::GetBreakpointLocationAtIndexFromEvent (event.GetSP(), loc_idx));
7809fed0d85SGreg Clayton     return sb_breakpoint_loc;
7819fed0d85SGreg Clayton }
7829fed0d85SGreg Clayton 
783e6bc6cb9SJim Ingham uint32_t
784e6bc6cb9SJim Ingham SBBreakpoint::GetNumBreakpointLocationsFromEvent (const lldb::SBEvent &event)
785e6bc6cb9SJim Ingham {
786e6bc6cb9SJim Ingham     uint32_t num_locations = 0;
787e6bc6cb9SJim Ingham     if (event.IsValid())
788e6bc6cb9SJim Ingham         num_locations = (Breakpoint::BreakpointEventData::GetNumBreakpointLocationsFromEvent (event.GetSP()));
789e6bc6cb9SJim Ingham     return num_locations;
790e6bc6cb9SJim Ingham }
791