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"
26*d5944cd1SGreg Clayton #include "lldb/Target/SectionLoadList.h"
2730fdc8d8SChris Lattner #include "lldb/Target/Target.h"
2862b02c61SJim Ingham #include "lldb/Target/Thread.h"
2962b02c61SJim Ingham #include "lldb/Target/ThreadSpec.h"
3030fdc8d8SChris Lattner 
3130fdc8d8SChris Lattner 
3230fdc8d8SChris Lattner #include "lldb/lldb-enumerations.h"
3330fdc8d8SChris Lattner 
3430fdc8d8SChris Lattner using namespace lldb;
3530fdc8d8SChris Lattner using namespace lldb_private;
3630fdc8d8SChris Lattner 
3730fdc8d8SChris Lattner struct CallbackData
3830fdc8d8SChris Lattner {
3930fdc8d8SChris Lattner     SBBreakpoint::BreakpointHitCallback callback;
4030fdc8d8SChris Lattner     void *callback_baton;
4130fdc8d8SChris Lattner };
4230fdc8d8SChris Lattner 
4330fdc8d8SChris Lattner class SBBreakpointCallbackBaton : public Baton
4430fdc8d8SChris Lattner {
4530fdc8d8SChris Lattner public:
4630fdc8d8SChris Lattner 
4730fdc8d8SChris Lattner     SBBreakpointCallbackBaton (SBBreakpoint::BreakpointHitCallback callback, void *baton) :
4830fdc8d8SChris Lattner         Baton (new CallbackData)
4930fdc8d8SChris Lattner     {
5030fdc8d8SChris Lattner         CallbackData *data = (CallbackData *)m_data;
5130fdc8d8SChris Lattner         data->callback = callback;
5230fdc8d8SChris Lattner         data->callback_baton = baton;
5330fdc8d8SChris Lattner     }
5430fdc8d8SChris Lattner 
5530fdc8d8SChris Lattner     virtual ~SBBreakpointCallbackBaton()
5630fdc8d8SChris Lattner     {
5730fdc8d8SChris Lattner         CallbackData *data = (CallbackData *)m_data;
5830fdc8d8SChris Lattner 
5930fdc8d8SChris Lattner         if (data)
6030fdc8d8SChris Lattner         {
6130fdc8d8SChris Lattner             delete data;
6230fdc8d8SChris Lattner             m_data = NULL;
6330fdc8d8SChris Lattner         }
6430fdc8d8SChris Lattner     }
6530fdc8d8SChris Lattner };
6630fdc8d8SChris Lattner 
6730fdc8d8SChris Lattner 
6830fdc8d8SChris Lattner SBBreakpoint::SBBreakpoint () :
696611103cSGreg Clayton     m_opaque_sp ()
7030fdc8d8SChris Lattner {
7130fdc8d8SChris Lattner }
7230fdc8d8SChris Lattner 
7330fdc8d8SChris Lattner SBBreakpoint::SBBreakpoint (const SBBreakpoint& rhs) :
746611103cSGreg Clayton     m_opaque_sp (rhs.m_opaque_sp)
7530fdc8d8SChris Lattner {
7630fdc8d8SChris Lattner }
7730fdc8d8SChris Lattner 
7830fdc8d8SChris Lattner 
7930fdc8d8SChris Lattner SBBreakpoint::SBBreakpoint (const lldb::BreakpointSP &bp_sp) :
806611103cSGreg Clayton     m_opaque_sp (bp_sp)
8130fdc8d8SChris Lattner {
8230fdc8d8SChris Lattner }
8330fdc8d8SChris Lattner 
8430fdc8d8SChris Lattner SBBreakpoint::~SBBreakpoint()
8530fdc8d8SChris Lattner {
8630fdc8d8SChris Lattner }
8730fdc8d8SChris Lattner 
8830fdc8d8SChris Lattner const SBBreakpoint &
8930fdc8d8SChris Lattner SBBreakpoint::operator = (const SBBreakpoint& rhs)
9030fdc8d8SChris Lattner {
9130fdc8d8SChris Lattner     if (this != &rhs)
926611103cSGreg Clayton         m_opaque_sp = rhs.m_opaque_sp;
9330fdc8d8SChris Lattner     return *this;
9430fdc8d8SChris Lattner }
9530fdc8d8SChris Lattner 
96ac2eb9b1SGreg Clayton bool
97ac2eb9b1SGreg Clayton SBBreakpoint::operator == (const lldb::SBBreakpoint& rhs)
98ac2eb9b1SGreg Clayton {
99ac2eb9b1SGreg Clayton     if (m_opaque_sp && rhs.m_opaque_sp)
100ac2eb9b1SGreg Clayton         return m_opaque_sp.get() == rhs.m_opaque_sp.get();
101ac2eb9b1SGreg Clayton     return false;
102ac2eb9b1SGreg Clayton }
103ac2eb9b1SGreg Clayton 
104c3387333SEnrico Granata bool
105c3387333SEnrico Granata SBBreakpoint::operator != (const lldb::SBBreakpoint& rhs)
106c3387333SEnrico Granata {
107c3387333SEnrico Granata     if (m_opaque_sp && rhs.m_opaque_sp)
108c3387333SEnrico Granata         return m_opaque_sp.get() != rhs.m_opaque_sp.get();
109c3387333SEnrico Granata     return (m_opaque_sp && !rhs.m_opaque_sp) || (rhs.m_opaque_sp && !m_opaque_sp);
110c3387333SEnrico Granata }
111c3387333SEnrico Granata 
11230fdc8d8SChris Lattner break_id_t
11330fdc8d8SChris Lattner SBBreakpoint::GetID () const
11430fdc8d8SChris Lattner {
1155160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
116ceb6b139SCaroline Tice 
117af67cecdSGreg Clayton     break_id_t break_id = LLDB_INVALID_BREAK_ID;
1186611103cSGreg Clayton     if (m_opaque_sp)
119af67cecdSGreg Clayton         break_id = m_opaque_sp->GetID();
120af67cecdSGreg Clayton 
121ceb6b139SCaroline Tice     if (log)
122af67cecdSGreg Clayton     {
123af67cecdSGreg Clayton         if (break_id == LLDB_INVALID_BREAK_ID)
124af67cecdSGreg Clayton             log->Printf ("SBBreakpoint(%p)::GetID () => LLDB_INVALID_BREAK_ID", m_opaque_sp.get());
125af67cecdSGreg Clayton         else
1264838131bSGreg Clayton             log->Printf ("SBBreakpoint(%p)::GetID () => %u", m_opaque_sp.get(), break_id);
127ceb6b139SCaroline Tice     }
128ceb6b139SCaroline Tice 
129af67cecdSGreg Clayton     return break_id;
13030fdc8d8SChris Lattner }
13130fdc8d8SChris Lattner 
13230fdc8d8SChris Lattner 
13330fdc8d8SChris Lattner bool
13430fdc8d8SChris Lattner SBBreakpoint::IsValid() const
13530fdc8d8SChris Lattner {
136f94e1791SJim Ingham     return (bool) m_opaque_sp;
13730fdc8d8SChris Lattner }
13830fdc8d8SChris Lattner 
13930fdc8d8SChris Lattner void
14030fdc8d8SChris Lattner SBBreakpoint::ClearAllBreakpointSites ()
14130fdc8d8SChris Lattner {
1426611103cSGreg Clayton     if (m_opaque_sp)
143af67cecdSGreg Clayton     {
144af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
1456611103cSGreg Clayton         m_opaque_sp->ClearAllBreakpointSites ();
14630fdc8d8SChris Lattner     }
147af67cecdSGreg Clayton }
14830fdc8d8SChris Lattner 
14930fdc8d8SChris Lattner SBBreakpointLocation
15030fdc8d8SChris Lattner SBBreakpoint::FindLocationByAddress (addr_t vm_addr)
15130fdc8d8SChris Lattner {
15230fdc8d8SChris Lattner     SBBreakpointLocation sb_bp_location;
15330fdc8d8SChris Lattner 
1546611103cSGreg Clayton     if (m_opaque_sp)
15530fdc8d8SChris Lattner     {
15630fdc8d8SChris Lattner         if (vm_addr != LLDB_INVALID_ADDRESS)
15730fdc8d8SChris Lattner         {
158af67cecdSGreg Clayton             Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
15930fdc8d8SChris Lattner             Address address;
160f5e56de0SGreg Clayton             Target &target = m_opaque_sp->GetTarget();
161f5e56de0SGreg Clayton             if (target.GetSectionLoadList().ResolveLoadAddress (vm_addr, address) == false)
16230fdc8d8SChris Lattner             {
163e72dfb32SGreg Clayton                 address.SetRawAddress (vm_addr);
16430fdc8d8SChris Lattner             }
1656611103cSGreg Clayton             sb_bp_location.SetLocation (m_opaque_sp->FindLocationByAddress (address));
16630fdc8d8SChris Lattner         }
16730fdc8d8SChris Lattner     }
16830fdc8d8SChris Lattner     return sb_bp_location;
16930fdc8d8SChris Lattner }
17030fdc8d8SChris Lattner 
17130fdc8d8SChris Lattner break_id_t
17230fdc8d8SChris Lattner SBBreakpoint::FindLocationIDByAddress (addr_t vm_addr)
17330fdc8d8SChris Lattner {
174af67cecdSGreg Clayton     break_id_t break_id = LLDB_INVALID_BREAK_ID;
17530fdc8d8SChris Lattner 
176af67cecdSGreg Clayton     if (m_opaque_sp && vm_addr != LLDB_INVALID_ADDRESS)
17730fdc8d8SChris Lattner     {
178af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
17930fdc8d8SChris Lattner         Address address;
180f5e56de0SGreg Clayton         Target &target = m_opaque_sp->GetTarget();
181f5e56de0SGreg Clayton         if (target.GetSectionLoadList().ResolveLoadAddress (vm_addr, address) == false)
18230fdc8d8SChris Lattner         {
183e72dfb32SGreg Clayton             address.SetRawAddress (vm_addr);
18430fdc8d8SChris Lattner         }
185af67cecdSGreg Clayton         break_id = m_opaque_sp->FindLocationIDByAddress (address);
18630fdc8d8SChris Lattner     }
18730fdc8d8SChris Lattner 
188af67cecdSGreg Clayton     return break_id;
18930fdc8d8SChris Lattner }
19030fdc8d8SChris Lattner 
19130fdc8d8SChris Lattner SBBreakpointLocation
19230fdc8d8SChris Lattner SBBreakpoint::FindLocationByID (break_id_t bp_loc_id)
19330fdc8d8SChris Lattner {
19430fdc8d8SChris Lattner     SBBreakpointLocation sb_bp_location;
19530fdc8d8SChris Lattner 
1966611103cSGreg Clayton     if (m_opaque_sp)
197af67cecdSGreg Clayton     {
198af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
1996611103cSGreg Clayton         sb_bp_location.SetLocation (m_opaque_sp->FindLocationByID (bp_loc_id));
200af67cecdSGreg Clayton     }
20130fdc8d8SChris Lattner 
20230fdc8d8SChris Lattner     return sb_bp_location;
20330fdc8d8SChris Lattner }
20430fdc8d8SChris Lattner 
20530fdc8d8SChris Lattner SBBreakpointLocation
20630fdc8d8SChris Lattner SBBreakpoint::GetLocationAtIndex (uint32_t index)
20730fdc8d8SChris Lattner {
20830fdc8d8SChris Lattner     SBBreakpointLocation sb_bp_location;
20930fdc8d8SChris Lattner 
2106611103cSGreg Clayton     if (m_opaque_sp)
211af67cecdSGreg Clayton     {
212af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
2136611103cSGreg Clayton         sb_bp_location.SetLocation (m_opaque_sp->GetLocationAtIndex (index));
214af67cecdSGreg Clayton     }
21530fdc8d8SChris Lattner 
21630fdc8d8SChris Lattner     return sb_bp_location;
21730fdc8d8SChris Lattner }
21830fdc8d8SChris Lattner 
21930fdc8d8SChris Lattner void
22030fdc8d8SChris Lattner SBBreakpoint::SetEnabled (bool enable)
22130fdc8d8SChris Lattner {
2225160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
223ceb6b139SCaroline Tice 
224ceb6b139SCaroline Tice     if (log)
2254838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::SetEnabled (enabled=%i)", m_opaque_sp.get(), enable);
226ceb6b139SCaroline Tice 
2276611103cSGreg Clayton     if (m_opaque_sp)
228af67cecdSGreg Clayton     {
229af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
2306611103cSGreg Clayton         m_opaque_sp->SetEnabled (enable);
23130fdc8d8SChris Lattner     }
232af67cecdSGreg Clayton }
23330fdc8d8SChris Lattner 
23430fdc8d8SChris Lattner bool
23530fdc8d8SChris Lattner SBBreakpoint::IsEnabled ()
23630fdc8d8SChris Lattner {
2376611103cSGreg Clayton     if (m_opaque_sp)
238af67cecdSGreg Clayton     {
239af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
2406611103cSGreg Clayton         return m_opaque_sp->IsEnabled();
241af67cecdSGreg Clayton     }
24230fdc8d8SChris Lattner     else
24330fdc8d8SChris Lattner         return false;
24430fdc8d8SChris Lattner }
24530fdc8d8SChris Lattner 
246ca36cd16SJim Ingham void
247ca36cd16SJim Ingham SBBreakpoint::SetOneShot (bool one_shot)
248ca36cd16SJim Ingham {
2495160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
250ca36cd16SJim Ingham 
251ca36cd16SJim Ingham     if (log)
252ca36cd16SJim Ingham         log->Printf ("SBBreakpoint(%p)::SetOneShot (one_shot=%i)", m_opaque_sp.get(), one_shot);
253ca36cd16SJim Ingham 
254ca36cd16SJim Ingham     if (m_opaque_sp)
255ca36cd16SJim Ingham     {
256ca36cd16SJim Ingham         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
257ca36cd16SJim Ingham         m_opaque_sp->SetOneShot (one_shot);
258ca36cd16SJim Ingham     }
259ca36cd16SJim Ingham }
260ca36cd16SJim Ingham 
261ca36cd16SJim Ingham bool
262ca36cd16SJim Ingham SBBreakpoint::IsOneShot () const
263ca36cd16SJim Ingham {
264ca36cd16SJim Ingham     if (m_opaque_sp)
265ca36cd16SJim Ingham     {
266ca36cd16SJim Ingham         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
267ca36cd16SJim Ingham         return m_opaque_sp->IsOneShot();
268ca36cd16SJim Ingham     }
269ca36cd16SJim Ingham     else
270ca36cd16SJim Ingham         return false;
271ca36cd16SJim Ingham }
272ca36cd16SJim Ingham 
27311c8108dSJim Ingham bool
27411c8108dSJim Ingham SBBreakpoint::IsInternal ()
27511c8108dSJim Ingham {
27611c8108dSJim Ingham     if (m_opaque_sp)
27711c8108dSJim Ingham     {
27811c8108dSJim Ingham         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
27911c8108dSJim Ingham         return m_opaque_sp->IsInternal();
28011c8108dSJim Ingham     }
28111c8108dSJim Ingham     else
28211c8108dSJim Ingham         return false;
28311c8108dSJim Ingham }
28411c8108dSJim Ingham 
28530fdc8d8SChris Lattner void
286c982c768SGreg Clayton SBBreakpoint::SetIgnoreCount (uint32_t count)
28730fdc8d8SChris Lattner {
2885160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
289ceb6b139SCaroline Tice 
290ceb6b139SCaroline Tice     if (log)
2914838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::SetIgnoreCount (count=%u)", m_opaque_sp.get(), count);
292ceb6b139SCaroline Tice 
2936611103cSGreg Clayton     if (m_opaque_sp)
294af67cecdSGreg Clayton     {
295af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
2966611103cSGreg Clayton         m_opaque_sp->SetIgnoreCount (count);
29730fdc8d8SChris Lattner     }
298af67cecdSGreg Clayton }
29930fdc8d8SChris Lattner 
300041a12fcSJim Ingham void
301041a12fcSJim Ingham SBBreakpoint::SetCondition (const char *condition)
302041a12fcSJim Ingham {
303af67cecdSGreg Clayton     if (m_opaque_sp)
304af67cecdSGreg Clayton     {
305af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
306041a12fcSJim Ingham         m_opaque_sp->SetCondition (condition);
307041a12fcSJim Ingham     }
308af67cecdSGreg Clayton }
309041a12fcSJim Ingham 
310041a12fcSJim Ingham const char *
311041a12fcSJim Ingham SBBreakpoint::GetCondition ()
312041a12fcSJim Ingham {
313af67cecdSGreg Clayton     if (m_opaque_sp)
314af67cecdSGreg Clayton     {
315af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
316041a12fcSJim Ingham         return m_opaque_sp->GetConditionText ();
317041a12fcSJim Ingham     }
318af67cecdSGreg Clayton     return NULL;
319af67cecdSGreg Clayton }
320041a12fcSJim Ingham 
321c982c768SGreg Clayton uint32_t
3229fed0d85SGreg Clayton SBBreakpoint::GetHitCount () const
3239fed0d85SGreg Clayton {
3244838131bSGreg Clayton     uint32_t count = 0;
3259fed0d85SGreg Clayton     if (m_opaque_sp)
326af67cecdSGreg Clayton     {
327af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
3284838131bSGreg Clayton         count = m_opaque_sp->GetHitCount();
329af67cecdSGreg Clayton     }
3304838131bSGreg Clayton 
3315160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
332ceb6b139SCaroline Tice     if (log)
3334838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::GetHitCount () => %u", m_opaque_sp.get(), count);
3344838131bSGreg Clayton 
3354838131bSGreg Clayton     return count;
336ceb6b139SCaroline Tice }
3379fed0d85SGreg Clayton 
3389fed0d85SGreg Clayton uint32_t
33930fdc8d8SChris Lattner SBBreakpoint::GetIgnoreCount () const
34030fdc8d8SChris Lattner {
3414838131bSGreg Clayton     uint32_t count = 0;
3426611103cSGreg Clayton     if (m_opaque_sp)
343af67cecdSGreg Clayton     {
344af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
3454838131bSGreg Clayton         count = m_opaque_sp->GetIgnoreCount();
346af67cecdSGreg Clayton     }
3474838131bSGreg Clayton 
3485160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3494838131bSGreg Clayton     if (log)
3504838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::GetIgnoreCount () => %u", m_opaque_sp.get(), count);
3514838131bSGreg Clayton 
3524838131bSGreg Clayton     return count;
35330fdc8d8SChris Lattner }
35430fdc8d8SChris Lattner 
35530fdc8d8SChris Lattner void
3564838131bSGreg Clayton SBBreakpoint::SetThreadID (tid_t tid)
35730fdc8d8SChris Lattner {
3586611103cSGreg Clayton     if (m_opaque_sp)
359af67cecdSGreg Clayton     {
360af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
3614838131bSGreg Clayton         m_opaque_sp->SetThreadID (tid);
362af67cecdSGreg Clayton     }
3635160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3644838131bSGreg Clayton     if (log)
365d01b2953SDaniel Malea         log->Printf ("SBBreakpoint(%p)::SetThreadID (tid=0x%4.4" PRIx64 ")", m_opaque_sp.get(), tid);
3664838131bSGreg Clayton 
36730fdc8d8SChris Lattner }
36830fdc8d8SChris Lattner 
36930fdc8d8SChris Lattner tid_t
37030fdc8d8SChris Lattner SBBreakpoint::GetThreadID ()
37130fdc8d8SChris Lattner {
3724838131bSGreg Clayton     tid_t tid = LLDB_INVALID_THREAD_ID;
3736611103cSGreg Clayton     if (m_opaque_sp)
374af67cecdSGreg Clayton     {
375af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
3764838131bSGreg Clayton         tid = m_opaque_sp->GetThreadID();
377af67cecdSGreg Clayton     }
37830fdc8d8SChris Lattner 
3795160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3804838131bSGreg Clayton     if (log)
381d01b2953SDaniel Malea         log->Printf ("SBBreakpoint(%p)::GetThreadID () => 0x%4.4" PRIx64, m_opaque_sp.get(), tid);
3824838131bSGreg Clayton     return tid;
38330fdc8d8SChris Lattner }
38430fdc8d8SChris Lattner 
38562b02c61SJim Ingham void
38662b02c61SJim Ingham SBBreakpoint::SetThreadIndex (uint32_t index)
38762b02c61SJim Ingham {
3885160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3894838131bSGreg Clayton     if (log)
3904838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::SetThreadIndex (%u)", m_opaque_sp.get(), index);
3916611103cSGreg Clayton     if (m_opaque_sp)
392af67cecdSGreg Clayton     {
393af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
3946611103cSGreg Clayton         m_opaque_sp->GetOptions()->GetThreadSpec()->SetIndex (index);
39562b02c61SJim Ingham     }
396af67cecdSGreg Clayton }
39762b02c61SJim Ingham 
39862b02c61SJim Ingham uint32_t
39962b02c61SJim Ingham SBBreakpoint::GetThreadIndex() const
40062b02c61SJim Ingham {
401bdf4c6acSGreg Clayton     uint32_t thread_idx = UINT32_MAX;
4026611103cSGreg Clayton     if (m_opaque_sp)
40362b02c61SJim Ingham     {
404af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
405af67cecdSGreg Clayton         const ThreadSpec *thread_spec = m_opaque_sp->GetOptions()->GetThreadSpecNoCreate();
406763d1a17SJohnny Chen         if (thread_spec != NULL)
4074838131bSGreg Clayton             thread_idx = thread_spec->GetIndex();
40862b02c61SJim Ingham     }
4095160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4104838131bSGreg Clayton     if (log)
411bdf4c6acSGreg Clayton         log->Printf ("SBBreakpoint(%p)::GetThreadIndex () => %u", m_opaque_sp.get(), thread_idx);
4124838131bSGreg Clayton 
413763d1a17SJohnny Chen     return thread_idx;
41462b02c61SJim Ingham }
41562b02c61SJim Ingham 
41662b02c61SJim Ingham 
41762b02c61SJim Ingham void
41862b02c61SJim Ingham SBBreakpoint::SetThreadName (const char *thread_name)
41962b02c61SJim Ingham {
4205160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4214838131bSGreg Clayton     if (log)
4224838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::SetThreadName (%s)", m_opaque_sp.get(), thread_name);
4234838131bSGreg Clayton 
4246611103cSGreg Clayton     if (m_opaque_sp)
425af67cecdSGreg Clayton     {
426af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
4276611103cSGreg Clayton         m_opaque_sp->GetOptions()->GetThreadSpec()->SetName (thread_name);
42862b02c61SJim Ingham     }
429af67cecdSGreg Clayton }
43062b02c61SJim Ingham 
43162b02c61SJim Ingham const char *
43262b02c61SJim Ingham SBBreakpoint::GetThreadName () const
43362b02c61SJim Ingham {
4344838131bSGreg Clayton     const char *name = NULL;
4356611103cSGreg Clayton     if (m_opaque_sp)
43662b02c61SJim Ingham     {
437af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
438af67cecdSGreg Clayton         const ThreadSpec *thread_spec = m_opaque_sp->GetOptions()->GetThreadSpecNoCreate();
439763d1a17SJohnny Chen         if (thread_spec != NULL)
4404838131bSGreg Clayton             name = thread_spec->GetName();
44162b02c61SJim Ingham     }
4425160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4434838131bSGreg Clayton     if (log)
4444838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::GetThreadName () => %s", m_opaque_sp.get(), name);
4454838131bSGreg Clayton 
4464838131bSGreg Clayton     return name;
44762b02c61SJim Ingham }
44862b02c61SJim Ingham 
44962b02c61SJim Ingham void
45062b02c61SJim Ingham SBBreakpoint::SetQueueName (const char *queue_name)
45162b02c61SJim Ingham {
4525160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4534838131bSGreg Clayton     if (log)
4544838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::SetQueueName (%s)", m_opaque_sp.get(), queue_name);
4556611103cSGreg Clayton     if (m_opaque_sp)
456af67cecdSGreg Clayton     {
457af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
4586611103cSGreg Clayton         m_opaque_sp->GetOptions()->GetThreadSpec()->SetQueueName (queue_name);
45962b02c61SJim Ingham     }
460af67cecdSGreg Clayton }
46162b02c61SJim Ingham 
46262b02c61SJim Ingham const char *
46362b02c61SJim Ingham SBBreakpoint::GetQueueName () const
46462b02c61SJim Ingham {
4654838131bSGreg Clayton     const char *name = NULL;
4666611103cSGreg Clayton     if (m_opaque_sp)
46762b02c61SJim Ingham     {
468af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
469af67cecdSGreg Clayton         const ThreadSpec *thread_spec = m_opaque_sp->GetOptions()->GetThreadSpecNoCreate();
470af67cecdSGreg Clayton         if (thread_spec)
4714838131bSGreg Clayton             name = thread_spec->GetQueueName();
47262b02c61SJim Ingham     }
4735160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4744838131bSGreg Clayton     if (log)
4754838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::GetQueueName () => %s", m_opaque_sp.get(), name);
4764838131bSGreg Clayton 
4774838131bSGreg Clayton     return name;
47862b02c61SJim Ingham }
47962b02c61SJim Ingham 
48030fdc8d8SChris Lattner size_t
48130fdc8d8SChris Lattner SBBreakpoint::GetNumResolvedLocations() const
48230fdc8d8SChris Lattner {
4834838131bSGreg Clayton     size_t num_resolved = 0;
4846611103cSGreg Clayton     if (m_opaque_sp)
485af67cecdSGreg Clayton     {
486af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
4874838131bSGreg Clayton         num_resolved = m_opaque_sp->GetNumResolvedLocations();
488af67cecdSGreg Clayton     }
4895160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4904838131bSGreg Clayton     if (log)
491d01b2953SDaniel Malea         log->Printf ("SBBreakpoint(%p)::GetNumResolvedLocations () => %" PRIu64, m_opaque_sp.get(), (uint64_t)num_resolved);
4924838131bSGreg Clayton     return num_resolved;
49330fdc8d8SChris Lattner }
49430fdc8d8SChris Lattner 
49530fdc8d8SChris Lattner size_t
49630fdc8d8SChris Lattner SBBreakpoint::GetNumLocations() const
49730fdc8d8SChris Lattner {
4984838131bSGreg Clayton     size_t num_locs = 0;
4996611103cSGreg Clayton     if (m_opaque_sp)
500af67cecdSGreg Clayton     {
501af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
5024838131bSGreg Clayton         num_locs = m_opaque_sp->GetNumLocations();
503af67cecdSGreg Clayton     }
5045160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
5054838131bSGreg Clayton     if (log)
506d01b2953SDaniel Malea         log->Printf ("SBBreakpoint(%p)::GetNumLocations () => %" PRIu64, m_opaque_sp.get(), (uint64_t)num_locs);
5074838131bSGreg Clayton     return num_locs;
50830fdc8d8SChris Lattner }
50930fdc8d8SChris Lattner 
510dde9cff3SCaroline Tice bool
51105faeb71SGreg Clayton SBBreakpoint::GetDescription (SBStream &s)
51230fdc8d8SChris Lattner {
5136611103cSGreg Clayton     if (m_opaque_sp)
51430fdc8d8SChris Lattner     {
515af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
51605faeb71SGreg Clayton         s.Printf("SBBreakpoint: id = %i, ", m_opaque_sp->GetID());
51705faeb71SGreg Clayton         m_opaque_sp->GetResolverDescription (s.get());
51805faeb71SGreg Clayton         m_opaque_sp->GetFilterDescription (s.get());
51905faeb71SGreg Clayton         const size_t num_locations = m_opaque_sp->GetNumLocations ();
520d01b2953SDaniel Malea         s.Printf(", locations = %" PRIu64, (uint64_t)num_locations);
521dde9cff3SCaroline Tice         return true;
522dde9cff3SCaroline Tice     }
52305faeb71SGreg Clayton     s.Printf ("No value");
52405faeb71SGreg Clayton     return false;
52505faeb71SGreg Clayton }
526dde9cff3SCaroline Tice 
52730fdc8d8SChris Lattner bool
52830fdc8d8SChris Lattner SBBreakpoint::PrivateBreakpointHitCallback
52930fdc8d8SChris Lattner (
53030fdc8d8SChris Lattner     void *baton,
53130fdc8d8SChris Lattner     StoppointCallbackContext *ctx,
53230fdc8d8SChris Lattner     lldb::user_id_t break_id,
53330fdc8d8SChris Lattner     lldb::user_id_t break_loc_id
53430fdc8d8SChris Lattner )
53530fdc8d8SChris Lattner {
5361ac04c30SGreg Clayton     ExecutionContext exe_ctx (ctx->exe_ctx_ref);
5371ac04c30SGreg Clayton     BreakpointSP bp_sp(exe_ctx.GetTargetRef().GetBreakpointList().FindBreakpointByID(break_id));
53830fdc8d8SChris Lattner     if (baton && bp_sp)
53930fdc8d8SChris Lattner     {
54030fdc8d8SChris Lattner         CallbackData *data = (CallbackData *)baton;
54130fdc8d8SChris Lattner         lldb_private::Breakpoint *bp = bp_sp.get();
54230fdc8d8SChris Lattner         if (bp && data->callback)
54330fdc8d8SChris Lattner         {
5441ac04c30SGreg Clayton             Process *process = exe_ctx.GetProcessPtr();
545c14ee32dSGreg Clayton             if (process)
54630fdc8d8SChris Lattner             {
547e1cd1be6SGreg Clayton                 SBProcess sb_process (process->shared_from_this());
54830fdc8d8SChris Lattner                 SBThread sb_thread;
54930fdc8d8SChris Lattner                 SBBreakpointLocation sb_location;
55030fdc8d8SChris Lattner                 assert (bp_sp);
55130fdc8d8SChris Lattner                 sb_location.SetLocation (bp_sp->FindLocationByID (break_loc_id));
5521ac04c30SGreg Clayton                 Thread *thread = exe_ctx.GetThreadPtr();
553c14ee32dSGreg Clayton                 if (thread)
554e1cd1be6SGreg Clayton                     sb_thread.SetThread(thread->shared_from_this());
55530fdc8d8SChris Lattner 
55630fdc8d8SChris Lattner                 return data->callback (data->callback_baton,
55730fdc8d8SChris Lattner                                           sb_process,
55830fdc8d8SChris Lattner                                           sb_thread,
55930fdc8d8SChris Lattner                                           sb_location);
56030fdc8d8SChris Lattner             }
56130fdc8d8SChris Lattner         }
56230fdc8d8SChris Lattner     }
56330fdc8d8SChris Lattner     return true;    // Return true if we should stop at this breakpoint
56430fdc8d8SChris Lattner }
56530fdc8d8SChris Lattner 
56630fdc8d8SChris Lattner void
56730fdc8d8SChris Lattner SBBreakpoint::SetCallback (BreakpointHitCallback callback, void *baton)
56830fdc8d8SChris Lattner {
5695160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
570ceb6b139SCaroline Tice 
571ceb6b139SCaroline Tice     if (log)
5724838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::SetCallback (callback=%p, baton=%p)", m_opaque_sp.get(), callback, baton);
573ceb6b139SCaroline Tice 
574c14ee32dSGreg Clayton     if (m_opaque_sp)
57530fdc8d8SChris Lattner     {
576af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
57730fdc8d8SChris Lattner         BatonSP baton_sp(new SBBreakpointCallbackBaton (callback, baton));
5786611103cSGreg Clayton         m_opaque_sp->SetCallback (SBBreakpoint::PrivateBreakpointHitCallback, baton_sp, false);
57930fdc8d8SChris Lattner     }
58030fdc8d8SChris Lattner }
58130fdc8d8SChris Lattner 
58230fdc8d8SChris Lattner 
58330fdc8d8SChris Lattner lldb_private::Breakpoint *
58430fdc8d8SChris Lattner SBBreakpoint::operator->() const
58530fdc8d8SChris Lattner {
5866611103cSGreg Clayton     return m_opaque_sp.get();
58730fdc8d8SChris Lattner }
58830fdc8d8SChris Lattner 
58930fdc8d8SChris Lattner lldb_private::Breakpoint *
59030fdc8d8SChris Lattner SBBreakpoint::get() const
59130fdc8d8SChris Lattner {
5926611103cSGreg Clayton     return m_opaque_sp.get();
59330fdc8d8SChris Lattner }
59430fdc8d8SChris Lattner 
59530fdc8d8SChris Lattner lldb::BreakpointSP &
59630fdc8d8SChris Lattner SBBreakpoint::operator *()
59730fdc8d8SChris Lattner {
5986611103cSGreg Clayton     return m_opaque_sp;
59930fdc8d8SChris Lattner }
60030fdc8d8SChris Lattner 
60130fdc8d8SChris Lattner const lldb::BreakpointSP &
60230fdc8d8SChris Lattner SBBreakpoint::operator *() const
60330fdc8d8SChris Lattner {
6046611103cSGreg Clayton     return m_opaque_sp;
60530fdc8d8SChris Lattner }
60630fdc8d8SChris Lattner 
607e6bc6cb9SJim Ingham bool
608e6bc6cb9SJim Ingham SBBreakpoint::EventIsBreakpointEvent (const lldb::SBEvent &event)
609e6bc6cb9SJim Ingham {
610e6bc6cb9SJim Ingham     return Breakpoint::BreakpointEventData::GetEventDataFromEvent(event.get()) != NULL;
611e6bc6cb9SJim Ingham 
612e6bc6cb9SJim Ingham }
613e6bc6cb9SJim Ingham 
6149fed0d85SGreg Clayton BreakpointEventType
6159fed0d85SGreg Clayton SBBreakpoint::GetBreakpointEventTypeFromEvent (const SBEvent& event)
6169fed0d85SGreg Clayton {
6179fed0d85SGreg Clayton     if (event.IsValid())
6189fed0d85SGreg Clayton         return Breakpoint::BreakpointEventData::GetBreakpointEventTypeFromEvent (event.GetSP());
6199fed0d85SGreg Clayton     return eBreakpointEventTypeInvalidType;
6209fed0d85SGreg Clayton }
6219fed0d85SGreg Clayton 
6229fed0d85SGreg Clayton SBBreakpoint
6239fed0d85SGreg Clayton SBBreakpoint::GetBreakpointFromEvent (const lldb::SBEvent& event)
6249fed0d85SGreg Clayton {
6259fed0d85SGreg Clayton     SBBreakpoint sb_breakpoint;
6269fed0d85SGreg Clayton     if (event.IsValid())
6279fed0d85SGreg Clayton         sb_breakpoint.m_opaque_sp = Breakpoint::BreakpointEventData::GetBreakpointFromEvent (event.GetSP());
6289fed0d85SGreg Clayton     return sb_breakpoint;
6299fed0d85SGreg Clayton }
6309fed0d85SGreg Clayton 
6319fed0d85SGreg Clayton SBBreakpointLocation
6329fed0d85SGreg Clayton SBBreakpoint::GetBreakpointLocationAtIndexFromEvent (const lldb::SBEvent& event, uint32_t loc_idx)
6339fed0d85SGreg Clayton {
6349fed0d85SGreg Clayton     SBBreakpointLocation sb_breakpoint_loc;
6359fed0d85SGreg Clayton     if (event.IsValid())
6369fed0d85SGreg Clayton         sb_breakpoint_loc.SetLocation (Breakpoint::BreakpointEventData::GetBreakpointLocationAtIndexFromEvent (event.GetSP(), loc_idx));
6379fed0d85SGreg Clayton     return sb_breakpoint_loc;
6389fed0d85SGreg Clayton }
6399fed0d85SGreg Clayton 
640e6bc6cb9SJim Ingham uint32_t
641e6bc6cb9SJim Ingham SBBreakpoint::GetNumBreakpointLocationsFromEvent (const lldb::SBEvent &event)
642e6bc6cb9SJim Ingham {
643e6bc6cb9SJim Ingham     uint32_t num_locations = 0;
644e6bc6cb9SJim Ingham     if (event.IsValid())
645e6bc6cb9SJim Ingham         num_locations = (Breakpoint::BreakpointEventData::GetNumBreakpointLocationsFromEvent (event.GetSP()));
646e6bc6cb9SJim Ingham     return num_locations;
647e6bc6cb9SJim Ingham }
648e6bc6cb9SJim Ingham 
6499fed0d85SGreg Clayton 
650