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 
1030fdc8d8SChris Lattner #include "lldb/API/SBBreakpoint.h"
1130fdc8d8SChris Lattner #include "lldb/API/SBBreakpointLocation.h"
1230fdc8d8SChris Lattner #include "lldb/API/SBDebugger.h"
139fed0d85SGreg Clayton #include "lldb/API/SBEvent.h"
1430fdc8d8SChris Lattner #include "lldb/API/SBProcess.h"
15dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
1630fdc8d8SChris Lattner #include "lldb/API/SBThread.h"
1730fdc8d8SChris Lattner 
1830fdc8d8SChris Lattner #include "lldb/Breakpoint/Breakpoint.h"
1930fdc8d8SChris Lattner #include "lldb/Breakpoint/BreakpointLocation.h"
2030fdc8d8SChris Lattner #include "lldb/Breakpoint/StoppointCallbackContext.h"
2130fdc8d8SChris Lattner #include "lldb/Core/Address.h"
22ceb6b139SCaroline Tice #include "lldb/Core/Log.h"
2330fdc8d8SChris Lattner #include "lldb/Core/Stream.h"
2430fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
2530fdc8d8SChris Lattner #include "lldb/Target/Process.h"
2630fdc8d8SChris Lattner #include "lldb/Target/Target.h"
2762b02c61SJim Ingham #include "lldb/Target/Thread.h"
2862b02c61SJim Ingham #include "lldb/Target/ThreadSpec.h"
2930fdc8d8SChris Lattner 
3030fdc8d8SChris Lattner 
3130fdc8d8SChris Lattner #include "lldb/lldb-enumerations.h"
3230fdc8d8SChris Lattner 
3330fdc8d8SChris Lattner using namespace lldb;
3430fdc8d8SChris Lattner using namespace lldb_private;
3530fdc8d8SChris Lattner 
3630fdc8d8SChris Lattner struct CallbackData
3730fdc8d8SChris Lattner {
3830fdc8d8SChris Lattner     SBBreakpoint::BreakpointHitCallback callback;
3930fdc8d8SChris Lattner     void *callback_baton;
4030fdc8d8SChris Lattner };
4130fdc8d8SChris Lattner 
4230fdc8d8SChris Lattner class SBBreakpointCallbackBaton : public Baton
4330fdc8d8SChris Lattner {
4430fdc8d8SChris Lattner public:
4530fdc8d8SChris Lattner 
4630fdc8d8SChris Lattner     SBBreakpointCallbackBaton (SBBreakpoint::BreakpointHitCallback callback, void *baton) :
4730fdc8d8SChris Lattner         Baton (new CallbackData)
4830fdc8d8SChris Lattner     {
4930fdc8d8SChris Lattner         CallbackData *data = (CallbackData *)m_data;
5030fdc8d8SChris Lattner         data->callback = callback;
5130fdc8d8SChris Lattner         data->callback_baton = baton;
5230fdc8d8SChris Lattner     }
5330fdc8d8SChris Lattner 
5430fdc8d8SChris Lattner     virtual ~SBBreakpointCallbackBaton()
5530fdc8d8SChris Lattner     {
5630fdc8d8SChris Lattner         CallbackData *data = (CallbackData *)m_data;
5730fdc8d8SChris Lattner 
5830fdc8d8SChris Lattner         if (data)
5930fdc8d8SChris Lattner         {
6030fdc8d8SChris Lattner             delete data;
6130fdc8d8SChris Lattner             m_data = NULL;
6230fdc8d8SChris Lattner         }
6330fdc8d8SChris Lattner     }
6430fdc8d8SChris Lattner };
6530fdc8d8SChris Lattner 
6630fdc8d8SChris Lattner 
6730fdc8d8SChris Lattner SBBreakpoint::SBBreakpoint () :
686611103cSGreg Clayton     m_opaque_sp ()
6930fdc8d8SChris Lattner {
7030fdc8d8SChris Lattner }
7130fdc8d8SChris Lattner 
7230fdc8d8SChris Lattner SBBreakpoint::SBBreakpoint (const SBBreakpoint& rhs) :
736611103cSGreg Clayton     m_opaque_sp (rhs.m_opaque_sp)
7430fdc8d8SChris Lattner {
7530fdc8d8SChris Lattner }
7630fdc8d8SChris Lattner 
7730fdc8d8SChris Lattner 
7830fdc8d8SChris Lattner SBBreakpoint::SBBreakpoint (const lldb::BreakpointSP &bp_sp) :
796611103cSGreg Clayton     m_opaque_sp (bp_sp)
8030fdc8d8SChris Lattner {
8130fdc8d8SChris Lattner }
8230fdc8d8SChris Lattner 
8330fdc8d8SChris Lattner SBBreakpoint::~SBBreakpoint()
8430fdc8d8SChris Lattner {
8530fdc8d8SChris Lattner }
8630fdc8d8SChris Lattner 
8730fdc8d8SChris Lattner const SBBreakpoint &
8830fdc8d8SChris Lattner SBBreakpoint::operator = (const SBBreakpoint& rhs)
8930fdc8d8SChris Lattner {
9030fdc8d8SChris Lattner     if (this != &rhs)
916611103cSGreg Clayton         m_opaque_sp = rhs.m_opaque_sp;
9230fdc8d8SChris Lattner     return *this;
9330fdc8d8SChris Lattner }
9430fdc8d8SChris Lattner 
95ac2eb9b1SGreg Clayton bool
96ac2eb9b1SGreg Clayton SBBreakpoint::operator == (const lldb::SBBreakpoint& rhs)
97ac2eb9b1SGreg Clayton {
98ac2eb9b1SGreg Clayton     if (m_opaque_sp && rhs.m_opaque_sp)
99ac2eb9b1SGreg Clayton         return m_opaque_sp.get() == rhs.m_opaque_sp.get();
100ac2eb9b1SGreg Clayton     return false;
101ac2eb9b1SGreg Clayton }
102ac2eb9b1SGreg Clayton 
10330fdc8d8SChris Lattner break_id_t
10430fdc8d8SChris Lattner SBBreakpoint::GetID () const
10530fdc8d8SChris Lattner {
1062d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
107ceb6b139SCaroline Tice 
108af67cecdSGreg Clayton     break_id_t break_id = LLDB_INVALID_BREAK_ID;
1096611103cSGreg Clayton     if (m_opaque_sp)
110af67cecdSGreg Clayton         break_id = m_opaque_sp->GetID();
111af67cecdSGreg Clayton 
112ceb6b139SCaroline Tice     if (log)
113af67cecdSGreg Clayton     {
114af67cecdSGreg Clayton         if (break_id == LLDB_INVALID_BREAK_ID)
115af67cecdSGreg Clayton             log->Printf ("SBBreakpoint(%p)::GetID () => LLDB_INVALID_BREAK_ID", m_opaque_sp.get());
116af67cecdSGreg Clayton         else
1174838131bSGreg Clayton             log->Printf ("SBBreakpoint(%p)::GetID () => %u", m_opaque_sp.get(), break_id);
118ceb6b139SCaroline Tice     }
119ceb6b139SCaroline Tice 
120af67cecdSGreg Clayton     return break_id;
12130fdc8d8SChris Lattner }
12230fdc8d8SChris Lattner 
12330fdc8d8SChris Lattner 
12430fdc8d8SChris Lattner bool
12530fdc8d8SChris Lattner SBBreakpoint::IsValid() const
12630fdc8d8SChris Lattner {
127f94e1791SJim Ingham     return (bool) m_opaque_sp;
12830fdc8d8SChris Lattner }
12930fdc8d8SChris Lattner 
13030fdc8d8SChris Lattner void
13130fdc8d8SChris Lattner SBBreakpoint::ClearAllBreakpointSites ()
13230fdc8d8SChris Lattner {
1336611103cSGreg Clayton     if (m_opaque_sp)
134af67cecdSGreg Clayton     {
135af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
1366611103cSGreg Clayton         m_opaque_sp->ClearAllBreakpointSites ();
13730fdc8d8SChris Lattner     }
138af67cecdSGreg Clayton }
13930fdc8d8SChris Lattner 
14030fdc8d8SChris Lattner SBBreakpointLocation
14130fdc8d8SChris Lattner SBBreakpoint::FindLocationByAddress (addr_t vm_addr)
14230fdc8d8SChris Lattner {
14330fdc8d8SChris Lattner     SBBreakpointLocation sb_bp_location;
14430fdc8d8SChris Lattner 
1456611103cSGreg Clayton     if (m_opaque_sp)
14630fdc8d8SChris Lattner     {
14730fdc8d8SChris Lattner         if (vm_addr != LLDB_INVALID_ADDRESS)
14830fdc8d8SChris Lattner         {
149af67cecdSGreg Clayton             Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
15030fdc8d8SChris Lattner             Address address;
151f5e56de0SGreg Clayton             Target &target = m_opaque_sp->GetTarget();
152f5e56de0SGreg Clayton             if (target.GetSectionLoadList().ResolveLoadAddress (vm_addr, address) == false)
15330fdc8d8SChris Lattner             {
154e72dfb32SGreg Clayton                 address.SetRawAddress (vm_addr);
15530fdc8d8SChris Lattner             }
1566611103cSGreg Clayton             sb_bp_location.SetLocation (m_opaque_sp->FindLocationByAddress (address));
15730fdc8d8SChris Lattner         }
15830fdc8d8SChris Lattner     }
15930fdc8d8SChris Lattner     return sb_bp_location;
16030fdc8d8SChris Lattner }
16130fdc8d8SChris Lattner 
16230fdc8d8SChris Lattner break_id_t
16330fdc8d8SChris Lattner SBBreakpoint::FindLocationIDByAddress (addr_t vm_addr)
16430fdc8d8SChris Lattner {
165af67cecdSGreg Clayton     break_id_t break_id = LLDB_INVALID_BREAK_ID;
16630fdc8d8SChris Lattner 
167af67cecdSGreg Clayton     if (m_opaque_sp && vm_addr != LLDB_INVALID_ADDRESS)
16830fdc8d8SChris Lattner     {
169af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
17030fdc8d8SChris Lattner         Address address;
171f5e56de0SGreg Clayton         Target &target = m_opaque_sp->GetTarget();
172f5e56de0SGreg Clayton         if (target.GetSectionLoadList().ResolveLoadAddress (vm_addr, address) == false)
17330fdc8d8SChris Lattner         {
174e72dfb32SGreg Clayton             address.SetRawAddress (vm_addr);
17530fdc8d8SChris Lattner         }
176af67cecdSGreg Clayton         break_id = m_opaque_sp->FindLocationIDByAddress (address);
17730fdc8d8SChris Lattner     }
17830fdc8d8SChris Lattner 
179af67cecdSGreg Clayton     return break_id;
18030fdc8d8SChris Lattner }
18130fdc8d8SChris Lattner 
18230fdc8d8SChris Lattner SBBreakpointLocation
18330fdc8d8SChris Lattner SBBreakpoint::FindLocationByID (break_id_t bp_loc_id)
18430fdc8d8SChris Lattner {
18530fdc8d8SChris Lattner     SBBreakpointLocation sb_bp_location;
18630fdc8d8SChris Lattner 
1876611103cSGreg Clayton     if (m_opaque_sp)
188af67cecdSGreg Clayton     {
189af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
1906611103cSGreg Clayton         sb_bp_location.SetLocation (m_opaque_sp->FindLocationByID (bp_loc_id));
191af67cecdSGreg Clayton     }
19230fdc8d8SChris Lattner 
19330fdc8d8SChris Lattner     return sb_bp_location;
19430fdc8d8SChris Lattner }
19530fdc8d8SChris Lattner 
19630fdc8d8SChris Lattner SBBreakpointLocation
19730fdc8d8SChris Lattner SBBreakpoint::GetLocationAtIndex (uint32_t index)
19830fdc8d8SChris Lattner {
19930fdc8d8SChris Lattner     SBBreakpointLocation sb_bp_location;
20030fdc8d8SChris Lattner 
2016611103cSGreg Clayton     if (m_opaque_sp)
202af67cecdSGreg Clayton     {
203af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
2046611103cSGreg Clayton         sb_bp_location.SetLocation (m_opaque_sp->GetLocationAtIndex (index));
205af67cecdSGreg Clayton     }
20630fdc8d8SChris Lattner 
20730fdc8d8SChris Lattner     return sb_bp_location;
20830fdc8d8SChris Lattner }
20930fdc8d8SChris Lattner 
21030fdc8d8SChris Lattner void
21130fdc8d8SChris Lattner SBBreakpoint::SetEnabled (bool enable)
21230fdc8d8SChris Lattner {
2132d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
214ceb6b139SCaroline Tice 
215ceb6b139SCaroline Tice     if (log)
2164838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::SetEnabled (enabled=%i)", m_opaque_sp.get(), enable);
217ceb6b139SCaroline Tice 
2186611103cSGreg Clayton     if (m_opaque_sp)
219af67cecdSGreg Clayton     {
220af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
2216611103cSGreg Clayton         m_opaque_sp->SetEnabled (enable);
22230fdc8d8SChris Lattner     }
223af67cecdSGreg Clayton }
22430fdc8d8SChris Lattner 
22530fdc8d8SChris Lattner bool
22630fdc8d8SChris Lattner SBBreakpoint::IsEnabled ()
22730fdc8d8SChris Lattner {
2286611103cSGreg Clayton     if (m_opaque_sp)
229af67cecdSGreg Clayton     {
230af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
2316611103cSGreg Clayton         return m_opaque_sp->IsEnabled();
232af67cecdSGreg Clayton     }
23330fdc8d8SChris Lattner     else
23430fdc8d8SChris Lattner         return false;
23530fdc8d8SChris Lattner }
23630fdc8d8SChris Lattner 
237*ca36cd16SJim Ingham void
238*ca36cd16SJim Ingham SBBreakpoint::SetOneShot (bool one_shot)
239*ca36cd16SJim Ingham {
240*ca36cd16SJim Ingham     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
241*ca36cd16SJim Ingham 
242*ca36cd16SJim Ingham     if (log)
243*ca36cd16SJim Ingham         log->Printf ("SBBreakpoint(%p)::SetOneShot (one_shot=%i)", m_opaque_sp.get(), one_shot);
244*ca36cd16SJim Ingham 
245*ca36cd16SJim Ingham     if (m_opaque_sp)
246*ca36cd16SJim Ingham     {
247*ca36cd16SJim Ingham         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
248*ca36cd16SJim Ingham         m_opaque_sp->SetOneShot (one_shot);
249*ca36cd16SJim Ingham     }
250*ca36cd16SJim Ingham }
251*ca36cd16SJim Ingham 
252*ca36cd16SJim Ingham bool
253*ca36cd16SJim Ingham SBBreakpoint::IsOneShot () const
254*ca36cd16SJim Ingham {
255*ca36cd16SJim Ingham     if (m_opaque_sp)
256*ca36cd16SJim Ingham     {
257*ca36cd16SJim Ingham         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
258*ca36cd16SJim Ingham         return m_opaque_sp->IsOneShot();
259*ca36cd16SJim Ingham     }
260*ca36cd16SJim Ingham     else
261*ca36cd16SJim Ingham         return false;
262*ca36cd16SJim Ingham }
263*ca36cd16SJim Ingham 
26411c8108dSJim Ingham bool
26511c8108dSJim Ingham SBBreakpoint::IsInternal ()
26611c8108dSJim Ingham {
26711c8108dSJim Ingham     if (m_opaque_sp)
26811c8108dSJim Ingham     {
26911c8108dSJim Ingham         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
27011c8108dSJim Ingham         return m_opaque_sp->IsInternal();
27111c8108dSJim Ingham     }
27211c8108dSJim Ingham     else
27311c8108dSJim Ingham         return false;
27411c8108dSJim Ingham }
27511c8108dSJim Ingham 
27630fdc8d8SChris Lattner void
277c982c768SGreg Clayton SBBreakpoint::SetIgnoreCount (uint32_t count)
27830fdc8d8SChris Lattner {
2792d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
280ceb6b139SCaroline Tice 
281ceb6b139SCaroline Tice     if (log)
2824838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::SetIgnoreCount (count=%u)", m_opaque_sp.get(), count);
283ceb6b139SCaroline Tice 
2846611103cSGreg Clayton     if (m_opaque_sp)
285af67cecdSGreg Clayton     {
286af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
2876611103cSGreg Clayton         m_opaque_sp->SetIgnoreCount (count);
28830fdc8d8SChris Lattner     }
289af67cecdSGreg Clayton }
29030fdc8d8SChris Lattner 
291041a12fcSJim Ingham void
292041a12fcSJim Ingham SBBreakpoint::SetCondition (const char *condition)
293041a12fcSJim Ingham {
294af67cecdSGreg Clayton     if (m_opaque_sp)
295af67cecdSGreg Clayton     {
296af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
297041a12fcSJim Ingham         m_opaque_sp->SetCondition (condition);
298041a12fcSJim Ingham     }
299af67cecdSGreg Clayton }
300041a12fcSJim Ingham 
301041a12fcSJim Ingham const char *
302041a12fcSJim Ingham SBBreakpoint::GetCondition ()
303041a12fcSJim Ingham {
304af67cecdSGreg Clayton     if (m_opaque_sp)
305af67cecdSGreg Clayton     {
306af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
307041a12fcSJim Ingham         return m_opaque_sp->GetConditionText ();
308041a12fcSJim Ingham     }
309af67cecdSGreg Clayton     return NULL;
310af67cecdSGreg Clayton }
311041a12fcSJim Ingham 
312c982c768SGreg Clayton uint32_t
3139fed0d85SGreg Clayton SBBreakpoint::GetHitCount () const
3149fed0d85SGreg Clayton {
3154838131bSGreg Clayton     uint32_t count = 0;
3169fed0d85SGreg Clayton     if (m_opaque_sp)
317af67cecdSGreg Clayton     {
318af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
3194838131bSGreg Clayton         count = m_opaque_sp->GetHitCount();
320af67cecdSGreg Clayton     }
3214838131bSGreg Clayton 
3222d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
323ceb6b139SCaroline Tice     if (log)
3244838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::GetHitCount () => %u", m_opaque_sp.get(), count);
3254838131bSGreg Clayton 
3264838131bSGreg Clayton     return count;
327ceb6b139SCaroline Tice }
3289fed0d85SGreg Clayton 
3299fed0d85SGreg Clayton uint32_t
33030fdc8d8SChris Lattner SBBreakpoint::GetIgnoreCount () const
33130fdc8d8SChris Lattner {
3324838131bSGreg Clayton     uint32_t count = 0;
3336611103cSGreg Clayton     if (m_opaque_sp)
334af67cecdSGreg Clayton     {
335af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
3364838131bSGreg Clayton         count = m_opaque_sp->GetIgnoreCount();
337af67cecdSGreg Clayton     }
3384838131bSGreg Clayton 
3392d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3404838131bSGreg Clayton     if (log)
3414838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::GetIgnoreCount () => %u", m_opaque_sp.get(), count);
3424838131bSGreg Clayton 
3434838131bSGreg Clayton     return count;
34430fdc8d8SChris Lattner }
34530fdc8d8SChris Lattner 
34630fdc8d8SChris Lattner void
3474838131bSGreg Clayton SBBreakpoint::SetThreadID (tid_t tid)
34830fdc8d8SChris Lattner {
3496611103cSGreg Clayton     if (m_opaque_sp)
350af67cecdSGreg Clayton     {
351af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
3524838131bSGreg Clayton         m_opaque_sp->SetThreadID (tid);
353af67cecdSGreg Clayton     }
3542d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3554838131bSGreg Clayton     if (log)
35661e7a58cSGreg Clayton         log->Printf ("SBBreakpoint(%p)::SetThreadID (tid=0x%4.4llx)", m_opaque_sp.get(), tid);
3574838131bSGreg Clayton 
35830fdc8d8SChris Lattner }
35930fdc8d8SChris Lattner 
36030fdc8d8SChris Lattner tid_t
36130fdc8d8SChris Lattner SBBreakpoint::GetThreadID ()
36230fdc8d8SChris Lattner {
3634838131bSGreg Clayton     tid_t tid = LLDB_INVALID_THREAD_ID;
3646611103cSGreg Clayton     if (m_opaque_sp)
365af67cecdSGreg Clayton     {
366af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
3674838131bSGreg Clayton         tid = m_opaque_sp->GetThreadID();
368af67cecdSGreg Clayton     }
36930fdc8d8SChris Lattner 
3702d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3714838131bSGreg Clayton     if (log)
37261e7a58cSGreg Clayton         log->Printf ("SBBreakpoint(%p)::GetThreadID () => 0x%4.4llx", m_opaque_sp.get(), tid);
3734838131bSGreg Clayton     return tid;
37430fdc8d8SChris Lattner }
37530fdc8d8SChris Lattner 
37662b02c61SJim Ingham void
37762b02c61SJim Ingham SBBreakpoint::SetThreadIndex (uint32_t index)
37862b02c61SJim Ingham {
3792d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3804838131bSGreg Clayton     if (log)
3814838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::SetThreadIndex (%u)", m_opaque_sp.get(), index);
3826611103cSGreg Clayton     if (m_opaque_sp)
383af67cecdSGreg Clayton     {
384af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
3856611103cSGreg Clayton         m_opaque_sp->GetOptions()->GetThreadSpec()->SetIndex (index);
38662b02c61SJim Ingham     }
387af67cecdSGreg Clayton }
38862b02c61SJim Ingham 
38962b02c61SJim Ingham uint32_t
39062b02c61SJim Ingham SBBreakpoint::GetThreadIndex() const
39162b02c61SJim Ingham {
392bdf4c6acSGreg Clayton     uint32_t thread_idx = UINT32_MAX;
3936611103cSGreg Clayton     if (m_opaque_sp)
39462b02c61SJim Ingham     {
395af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
396af67cecdSGreg Clayton         const ThreadSpec *thread_spec = m_opaque_sp->GetOptions()->GetThreadSpecNoCreate();
397763d1a17SJohnny Chen         if (thread_spec != NULL)
3984838131bSGreg Clayton             thread_idx = thread_spec->GetIndex();
39962b02c61SJim Ingham     }
4002d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4014838131bSGreg Clayton     if (log)
402bdf4c6acSGreg Clayton         log->Printf ("SBBreakpoint(%p)::GetThreadIndex () => %u", m_opaque_sp.get(), thread_idx);
4034838131bSGreg Clayton 
404763d1a17SJohnny Chen     return thread_idx;
40562b02c61SJim Ingham }
40662b02c61SJim Ingham 
40762b02c61SJim Ingham 
40862b02c61SJim Ingham void
40962b02c61SJim Ingham SBBreakpoint::SetThreadName (const char *thread_name)
41062b02c61SJim Ingham {
4112d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4124838131bSGreg Clayton     if (log)
4134838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::SetThreadName (%s)", m_opaque_sp.get(), thread_name);
4144838131bSGreg Clayton 
4156611103cSGreg Clayton     if (m_opaque_sp)
416af67cecdSGreg Clayton     {
417af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
4186611103cSGreg Clayton         m_opaque_sp->GetOptions()->GetThreadSpec()->SetName (thread_name);
41962b02c61SJim Ingham     }
420af67cecdSGreg Clayton }
42162b02c61SJim Ingham 
42262b02c61SJim Ingham const char *
42362b02c61SJim Ingham SBBreakpoint::GetThreadName () const
42462b02c61SJim Ingham {
4254838131bSGreg Clayton     const char *name = NULL;
4266611103cSGreg Clayton     if (m_opaque_sp)
42762b02c61SJim Ingham     {
428af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
429af67cecdSGreg Clayton         const ThreadSpec *thread_spec = m_opaque_sp->GetOptions()->GetThreadSpecNoCreate();
430763d1a17SJohnny Chen         if (thread_spec != NULL)
4314838131bSGreg Clayton             name = thread_spec->GetName();
43262b02c61SJim Ingham     }
4332d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4344838131bSGreg Clayton     if (log)
4354838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::GetThreadName () => %s", m_opaque_sp.get(), name);
4364838131bSGreg Clayton 
4374838131bSGreg Clayton     return name;
43862b02c61SJim Ingham }
43962b02c61SJim Ingham 
44062b02c61SJim Ingham void
44162b02c61SJim Ingham SBBreakpoint::SetQueueName (const char *queue_name)
44262b02c61SJim Ingham {
4432d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4444838131bSGreg Clayton     if (log)
4454838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::SetQueueName (%s)", m_opaque_sp.get(), queue_name);
4466611103cSGreg Clayton     if (m_opaque_sp)
447af67cecdSGreg Clayton     {
448af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
4496611103cSGreg Clayton         m_opaque_sp->GetOptions()->GetThreadSpec()->SetQueueName (queue_name);
45062b02c61SJim Ingham     }
451af67cecdSGreg Clayton }
45262b02c61SJim Ingham 
45362b02c61SJim Ingham const char *
45462b02c61SJim Ingham SBBreakpoint::GetQueueName () const
45562b02c61SJim Ingham {
4564838131bSGreg Clayton     const char *name = NULL;
4576611103cSGreg Clayton     if (m_opaque_sp)
45862b02c61SJim Ingham     {
459af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
460af67cecdSGreg Clayton         const ThreadSpec *thread_spec = m_opaque_sp->GetOptions()->GetThreadSpecNoCreate();
461af67cecdSGreg Clayton         if (thread_spec)
4624838131bSGreg Clayton             name = thread_spec->GetQueueName();
46362b02c61SJim Ingham     }
4642d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4654838131bSGreg Clayton     if (log)
4664838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::GetQueueName () => %s", m_opaque_sp.get(), name);
4674838131bSGreg Clayton 
4684838131bSGreg Clayton     return name;
46962b02c61SJim Ingham }
47062b02c61SJim Ingham 
47130fdc8d8SChris Lattner size_t
47230fdc8d8SChris Lattner SBBreakpoint::GetNumResolvedLocations() const
47330fdc8d8SChris Lattner {
4744838131bSGreg Clayton     size_t num_resolved = 0;
4756611103cSGreg Clayton     if (m_opaque_sp)
476af67cecdSGreg Clayton     {
477af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
4784838131bSGreg Clayton         num_resolved = m_opaque_sp->GetNumResolvedLocations();
479af67cecdSGreg Clayton     }
4802d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4814838131bSGreg Clayton     if (log)
48243e0af06SGreg Clayton         log->Printf ("SBBreakpoint(%p)::GetNumResolvedLocations () => %llu", m_opaque_sp.get(), (uint64_t)num_resolved);
4834838131bSGreg Clayton     return num_resolved;
48430fdc8d8SChris Lattner }
48530fdc8d8SChris Lattner 
48630fdc8d8SChris Lattner size_t
48730fdc8d8SChris Lattner SBBreakpoint::GetNumLocations() const
48830fdc8d8SChris Lattner {
4894838131bSGreg Clayton     size_t num_locs = 0;
4906611103cSGreg Clayton     if (m_opaque_sp)
491af67cecdSGreg Clayton     {
492af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
4934838131bSGreg Clayton         num_locs = m_opaque_sp->GetNumLocations();
494af67cecdSGreg Clayton     }
4952d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4964838131bSGreg Clayton     if (log)
49743e0af06SGreg Clayton         log->Printf ("SBBreakpoint(%p)::GetNumLocations () => %llu", m_opaque_sp.get(), (uint64_t)num_locs);
4984838131bSGreg Clayton     return num_locs;
49930fdc8d8SChris Lattner }
50030fdc8d8SChris Lattner 
501dde9cff3SCaroline Tice bool
50205faeb71SGreg Clayton SBBreakpoint::GetDescription (SBStream &s)
50330fdc8d8SChris Lattner {
5046611103cSGreg Clayton     if (m_opaque_sp)
50530fdc8d8SChris Lattner     {
506af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
50705faeb71SGreg Clayton         s.Printf("SBBreakpoint: id = %i, ", m_opaque_sp->GetID());
50805faeb71SGreg Clayton         m_opaque_sp->GetResolverDescription (s.get());
50905faeb71SGreg Clayton         m_opaque_sp->GetFilterDescription (s.get());
51005faeb71SGreg Clayton         const size_t num_locations = m_opaque_sp->GetNumLocations ();
51143e0af06SGreg Clayton         s.Printf(", locations = %llu", (uint64_t)num_locations);
512dde9cff3SCaroline Tice         return true;
513dde9cff3SCaroline Tice     }
51405faeb71SGreg Clayton     s.Printf ("No value");
51505faeb71SGreg Clayton     return false;
51605faeb71SGreg Clayton }
517dde9cff3SCaroline Tice 
51830fdc8d8SChris Lattner bool
51930fdc8d8SChris Lattner SBBreakpoint::PrivateBreakpointHitCallback
52030fdc8d8SChris Lattner (
52130fdc8d8SChris Lattner     void *baton,
52230fdc8d8SChris Lattner     StoppointCallbackContext *ctx,
52330fdc8d8SChris Lattner     lldb::user_id_t break_id,
52430fdc8d8SChris Lattner     lldb::user_id_t break_loc_id
52530fdc8d8SChris Lattner )
52630fdc8d8SChris Lattner {
5271ac04c30SGreg Clayton     ExecutionContext exe_ctx (ctx->exe_ctx_ref);
5281ac04c30SGreg Clayton     BreakpointSP bp_sp(exe_ctx.GetTargetRef().GetBreakpointList().FindBreakpointByID(break_id));
52930fdc8d8SChris Lattner     if (baton && bp_sp)
53030fdc8d8SChris Lattner     {
53130fdc8d8SChris Lattner         CallbackData *data = (CallbackData *)baton;
53230fdc8d8SChris Lattner         lldb_private::Breakpoint *bp = bp_sp.get();
53330fdc8d8SChris Lattner         if (bp && data->callback)
53430fdc8d8SChris Lattner         {
5351ac04c30SGreg Clayton             Process *process = exe_ctx.GetProcessPtr();
536c14ee32dSGreg Clayton             if (process)
53730fdc8d8SChris Lattner             {
538e1cd1be6SGreg Clayton                 SBProcess sb_process (process->shared_from_this());
53930fdc8d8SChris Lattner                 SBThread sb_thread;
54030fdc8d8SChris Lattner                 SBBreakpointLocation sb_location;
54130fdc8d8SChris Lattner                 assert (bp_sp);
54230fdc8d8SChris Lattner                 sb_location.SetLocation (bp_sp->FindLocationByID (break_loc_id));
5431ac04c30SGreg Clayton                 Thread *thread = exe_ctx.GetThreadPtr();
544c14ee32dSGreg Clayton                 if (thread)
545e1cd1be6SGreg Clayton                     sb_thread.SetThread(thread->shared_from_this());
54630fdc8d8SChris Lattner 
54730fdc8d8SChris Lattner                 return data->callback (data->callback_baton,
54830fdc8d8SChris Lattner                                           sb_process,
54930fdc8d8SChris Lattner                                           sb_thread,
55030fdc8d8SChris Lattner                                           sb_location);
55130fdc8d8SChris Lattner             }
55230fdc8d8SChris Lattner         }
55330fdc8d8SChris Lattner     }
55430fdc8d8SChris Lattner     return true;    // Return true if we should stop at this breakpoint
55530fdc8d8SChris Lattner }
55630fdc8d8SChris Lattner 
55730fdc8d8SChris Lattner void
55830fdc8d8SChris Lattner SBBreakpoint::SetCallback (BreakpointHitCallback callback, void *baton)
55930fdc8d8SChris Lattner {
5602d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
561ceb6b139SCaroline Tice 
562ceb6b139SCaroline Tice     if (log)
5634838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::SetCallback (callback=%p, baton=%p)", m_opaque_sp.get(), callback, baton);
564ceb6b139SCaroline Tice 
565c14ee32dSGreg Clayton     if (m_opaque_sp)
56630fdc8d8SChris Lattner     {
567af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
56830fdc8d8SChris Lattner         BatonSP baton_sp(new SBBreakpointCallbackBaton (callback, baton));
5696611103cSGreg Clayton         m_opaque_sp->SetCallback (SBBreakpoint::PrivateBreakpointHitCallback, baton_sp, false);
57030fdc8d8SChris Lattner     }
57130fdc8d8SChris Lattner }
57230fdc8d8SChris Lattner 
57330fdc8d8SChris Lattner 
57430fdc8d8SChris Lattner lldb_private::Breakpoint *
57530fdc8d8SChris Lattner SBBreakpoint::operator->() const
57630fdc8d8SChris Lattner {
5776611103cSGreg Clayton     return m_opaque_sp.get();
57830fdc8d8SChris Lattner }
57930fdc8d8SChris Lattner 
58030fdc8d8SChris Lattner lldb_private::Breakpoint *
58130fdc8d8SChris Lattner SBBreakpoint::get() const
58230fdc8d8SChris Lattner {
5836611103cSGreg Clayton     return m_opaque_sp.get();
58430fdc8d8SChris Lattner }
58530fdc8d8SChris Lattner 
58630fdc8d8SChris Lattner lldb::BreakpointSP &
58730fdc8d8SChris Lattner SBBreakpoint::operator *()
58830fdc8d8SChris Lattner {
5896611103cSGreg Clayton     return m_opaque_sp;
59030fdc8d8SChris Lattner }
59130fdc8d8SChris Lattner 
59230fdc8d8SChris Lattner const lldb::BreakpointSP &
59330fdc8d8SChris Lattner SBBreakpoint::operator *() const
59430fdc8d8SChris Lattner {
5956611103cSGreg Clayton     return m_opaque_sp;
59630fdc8d8SChris Lattner }
59730fdc8d8SChris Lattner 
598e6bc6cb9SJim Ingham bool
599e6bc6cb9SJim Ingham SBBreakpoint::EventIsBreakpointEvent (const lldb::SBEvent &event)
600e6bc6cb9SJim Ingham {
601e6bc6cb9SJim Ingham     return Breakpoint::BreakpointEventData::GetEventDataFromEvent(event.get()) != NULL;
602e6bc6cb9SJim Ingham 
603e6bc6cb9SJim Ingham }
604e6bc6cb9SJim Ingham 
6059fed0d85SGreg Clayton BreakpointEventType
6069fed0d85SGreg Clayton SBBreakpoint::GetBreakpointEventTypeFromEvent (const SBEvent& event)
6079fed0d85SGreg Clayton {
6089fed0d85SGreg Clayton     if (event.IsValid())
6099fed0d85SGreg Clayton         return Breakpoint::BreakpointEventData::GetBreakpointEventTypeFromEvent (event.GetSP());
6109fed0d85SGreg Clayton     return eBreakpointEventTypeInvalidType;
6119fed0d85SGreg Clayton }
6129fed0d85SGreg Clayton 
6139fed0d85SGreg Clayton SBBreakpoint
6149fed0d85SGreg Clayton SBBreakpoint::GetBreakpointFromEvent (const lldb::SBEvent& event)
6159fed0d85SGreg Clayton {
6169fed0d85SGreg Clayton     SBBreakpoint sb_breakpoint;
6179fed0d85SGreg Clayton     if (event.IsValid())
6189fed0d85SGreg Clayton         sb_breakpoint.m_opaque_sp = Breakpoint::BreakpointEventData::GetBreakpointFromEvent (event.GetSP());
6199fed0d85SGreg Clayton     return sb_breakpoint;
6209fed0d85SGreg Clayton }
6219fed0d85SGreg Clayton 
6229fed0d85SGreg Clayton SBBreakpointLocation
6239fed0d85SGreg Clayton SBBreakpoint::GetBreakpointLocationAtIndexFromEvent (const lldb::SBEvent& event, uint32_t loc_idx)
6249fed0d85SGreg Clayton {
6259fed0d85SGreg Clayton     SBBreakpointLocation sb_breakpoint_loc;
6269fed0d85SGreg Clayton     if (event.IsValid())
6279fed0d85SGreg Clayton         sb_breakpoint_loc.SetLocation (Breakpoint::BreakpointEventData::GetBreakpointLocationAtIndexFromEvent (event.GetSP(), loc_idx));
6289fed0d85SGreg Clayton     return sb_breakpoint_loc;
6299fed0d85SGreg Clayton }
6309fed0d85SGreg Clayton 
631e6bc6cb9SJim Ingham uint32_t
632e6bc6cb9SJim Ingham SBBreakpoint::GetNumBreakpointLocationsFromEvent (const lldb::SBEvent &event)
633e6bc6cb9SJim Ingham {
634e6bc6cb9SJim Ingham     uint32_t num_locations = 0;
635e6bc6cb9SJim Ingham     if (event.IsValid())
636e6bc6cb9SJim Ingham         num_locations = (Breakpoint::BreakpointEventData::GetNumBreakpointLocationsFromEvent (event.GetSP()));
637e6bc6cb9SJim Ingham     return num_locations;
638e6bc6cb9SJim Ingham }
639e6bc6cb9SJim Ingham 
6409fed0d85SGreg Clayton 
641