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 
9530fdc8d8SChris Lattner break_id_t
9630fdc8d8SChris Lattner SBBreakpoint::GetID () const
9730fdc8d8SChris Lattner {
98*2d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
99ceb6b139SCaroline Tice 
1006611103cSGreg Clayton     if (m_opaque_sp)
101ceb6b139SCaroline Tice     {
1024838131bSGreg Clayton         break_id_t break_id = m_opaque_sp->GetID();
103ceb6b139SCaroline Tice         if (log)
1044838131bSGreg Clayton             log->Printf ("SBBreakpoint(%p)::GetID () => %u", m_opaque_sp.get(), break_id);
1054838131bSGreg Clayton         return break_id;
106ceb6b139SCaroline Tice     }
107ceb6b139SCaroline Tice 
108ceb6b139SCaroline Tice     if (log)
1094838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::GetID () => LLDB_INVALID_BREAK_ID", m_opaque_sp.get());
110ceb6b139SCaroline Tice 
11130fdc8d8SChris Lattner     return LLDB_INVALID_BREAK_ID;
11230fdc8d8SChris Lattner }
11330fdc8d8SChris Lattner 
11430fdc8d8SChris Lattner 
11530fdc8d8SChris Lattner bool
11630fdc8d8SChris Lattner SBBreakpoint::IsValid() const
11730fdc8d8SChris Lattner {
1186611103cSGreg Clayton     return m_opaque_sp;
11930fdc8d8SChris Lattner }
12030fdc8d8SChris Lattner 
12130fdc8d8SChris Lattner void
12230fdc8d8SChris Lattner SBBreakpoint::ClearAllBreakpointSites ()
12330fdc8d8SChris Lattner {
1246611103cSGreg Clayton     if (m_opaque_sp)
1256611103cSGreg Clayton         m_opaque_sp->ClearAllBreakpointSites ();
12630fdc8d8SChris Lattner }
12730fdc8d8SChris Lattner 
12830fdc8d8SChris Lattner SBBreakpointLocation
12930fdc8d8SChris Lattner SBBreakpoint::FindLocationByAddress (addr_t vm_addr)
13030fdc8d8SChris Lattner {
13130fdc8d8SChris Lattner     SBBreakpointLocation sb_bp_location;
13230fdc8d8SChris Lattner 
1336611103cSGreg Clayton     if (m_opaque_sp)
13430fdc8d8SChris Lattner     {
13530fdc8d8SChris Lattner         if (vm_addr != LLDB_INVALID_ADDRESS)
13630fdc8d8SChris Lattner         {
13730fdc8d8SChris Lattner             Address address;
138f5e56de0SGreg Clayton             Target &target = m_opaque_sp->GetTarget();
139f5e56de0SGreg Clayton             if (target.GetSectionLoadList().ResolveLoadAddress (vm_addr, address) == false)
14030fdc8d8SChris Lattner             {
14130fdc8d8SChris Lattner                 address.SetSection (NULL);
14230fdc8d8SChris Lattner                 address.SetOffset (vm_addr);
14330fdc8d8SChris Lattner             }
1446611103cSGreg Clayton             sb_bp_location.SetLocation (m_opaque_sp->FindLocationByAddress (address));
14530fdc8d8SChris Lattner         }
14630fdc8d8SChris Lattner     }
14730fdc8d8SChris Lattner     return sb_bp_location;
14830fdc8d8SChris Lattner }
14930fdc8d8SChris Lattner 
15030fdc8d8SChris Lattner break_id_t
15130fdc8d8SChris Lattner SBBreakpoint::FindLocationIDByAddress (addr_t vm_addr)
15230fdc8d8SChris Lattner {
15330fdc8d8SChris Lattner     break_id_t lldb_id = (break_id_t) 0;
15430fdc8d8SChris Lattner 
1556611103cSGreg Clayton     if (m_opaque_sp)
15630fdc8d8SChris Lattner     {
15730fdc8d8SChris Lattner         if (vm_addr != LLDB_INVALID_ADDRESS)
15830fdc8d8SChris Lattner         {
15930fdc8d8SChris Lattner             Address address;
160f5e56de0SGreg Clayton             Target &target = m_opaque_sp->GetTarget();
161f5e56de0SGreg Clayton             if (target.GetSectionLoadList().ResolveLoadAddress (vm_addr, address) == false)
16230fdc8d8SChris Lattner             {
16330fdc8d8SChris Lattner                 address.SetSection (NULL);
16430fdc8d8SChris Lattner                 address.SetOffset (vm_addr);
16530fdc8d8SChris Lattner             }
1666611103cSGreg Clayton             lldb_id = m_opaque_sp->FindLocationIDByAddress (address);
16730fdc8d8SChris Lattner         }
16830fdc8d8SChris Lattner     }
16930fdc8d8SChris Lattner 
17030fdc8d8SChris Lattner     return lldb_id;
17130fdc8d8SChris Lattner }
17230fdc8d8SChris Lattner 
17330fdc8d8SChris Lattner SBBreakpointLocation
17430fdc8d8SChris Lattner SBBreakpoint::FindLocationByID (break_id_t bp_loc_id)
17530fdc8d8SChris Lattner {
17630fdc8d8SChris Lattner     SBBreakpointLocation sb_bp_location;
17730fdc8d8SChris Lattner 
1786611103cSGreg Clayton     if (m_opaque_sp)
1796611103cSGreg Clayton         sb_bp_location.SetLocation (m_opaque_sp->FindLocationByID (bp_loc_id));
18030fdc8d8SChris Lattner 
18130fdc8d8SChris Lattner     return sb_bp_location;
18230fdc8d8SChris Lattner }
18330fdc8d8SChris Lattner 
18430fdc8d8SChris Lattner SBBreakpointLocation
18530fdc8d8SChris Lattner SBBreakpoint::GetLocationAtIndex (uint32_t index)
18630fdc8d8SChris Lattner {
18730fdc8d8SChris Lattner     SBBreakpointLocation sb_bp_location;
18830fdc8d8SChris Lattner 
1896611103cSGreg Clayton     if (m_opaque_sp)
1906611103cSGreg Clayton         sb_bp_location.SetLocation (m_opaque_sp->GetLocationAtIndex (index));
19130fdc8d8SChris Lattner 
19230fdc8d8SChris Lattner     return sb_bp_location;
19330fdc8d8SChris Lattner }
19430fdc8d8SChris Lattner 
19530fdc8d8SChris Lattner void
19630fdc8d8SChris Lattner SBBreakpoint::SetEnabled (bool enable)
19730fdc8d8SChris Lattner {
198*2d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
199ceb6b139SCaroline Tice 
200ceb6b139SCaroline Tice     if (log)
2014838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::SetEnabled (enabled=%i)", m_opaque_sp.get(), enable);
202ceb6b139SCaroline Tice 
2036611103cSGreg Clayton     if (m_opaque_sp)
2046611103cSGreg Clayton         m_opaque_sp->SetEnabled (enable);
20530fdc8d8SChris Lattner }
20630fdc8d8SChris Lattner 
20730fdc8d8SChris Lattner bool
20830fdc8d8SChris Lattner SBBreakpoint::IsEnabled ()
20930fdc8d8SChris Lattner {
2106611103cSGreg Clayton     if (m_opaque_sp)
2116611103cSGreg Clayton         return m_opaque_sp->IsEnabled();
21230fdc8d8SChris Lattner     else
21330fdc8d8SChris Lattner         return false;
21430fdc8d8SChris Lattner }
21530fdc8d8SChris Lattner 
21630fdc8d8SChris Lattner void
217c982c768SGreg Clayton SBBreakpoint::SetIgnoreCount (uint32_t count)
21830fdc8d8SChris Lattner {
219*2d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
220ceb6b139SCaroline Tice 
221ceb6b139SCaroline Tice     if (log)
2224838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::SetIgnoreCount (count=%u)", m_opaque_sp.get(), count);
223ceb6b139SCaroline Tice 
2246611103cSGreg Clayton     if (m_opaque_sp)
2256611103cSGreg Clayton         m_opaque_sp->SetIgnoreCount (count);
22630fdc8d8SChris Lattner }
22730fdc8d8SChris Lattner 
228041a12fcSJim Ingham void
229041a12fcSJim Ingham SBBreakpoint::SetCondition (const char *condition)
230041a12fcSJim Ingham {
231041a12fcSJim Ingham     m_opaque_sp->SetCondition (condition);
232041a12fcSJim Ingham }
233041a12fcSJim Ingham 
234041a12fcSJim Ingham const char *
235041a12fcSJim Ingham SBBreakpoint::GetCondition ()
236041a12fcSJim Ingham {
237041a12fcSJim Ingham     return m_opaque_sp->GetConditionText ();
238041a12fcSJim Ingham }
239041a12fcSJim Ingham 
240c982c768SGreg Clayton uint32_t
2419fed0d85SGreg Clayton SBBreakpoint::GetHitCount () const
2429fed0d85SGreg Clayton {
2434838131bSGreg Clayton     uint32_t count = 0;
2449fed0d85SGreg Clayton     if (m_opaque_sp)
2454838131bSGreg Clayton         count = m_opaque_sp->GetHitCount();
2464838131bSGreg Clayton 
247*2d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
248ceb6b139SCaroline Tice     if (log)
2494838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::GetHitCount () => %u", m_opaque_sp.get(), count);
2504838131bSGreg Clayton 
2514838131bSGreg Clayton     return count;
252ceb6b139SCaroline Tice }
2539fed0d85SGreg Clayton 
2549fed0d85SGreg Clayton uint32_t
25530fdc8d8SChris Lattner SBBreakpoint::GetIgnoreCount () const
25630fdc8d8SChris Lattner {
2574838131bSGreg Clayton     uint32_t count = 0;
2586611103cSGreg Clayton     if (m_opaque_sp)
2594838131bSGreg Clayton         count = m_opaque_sp->GetIgnoreCount();
2604838131bSGreg Clayton 
261*2d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
2624838131bSGreg Clayton     if (log)
2634838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::GetIgnoreCount () => %u", m_opaque_sp.get(), count);
2644838131bSGreg Clayton 
2654838131bSGreg Clayton     return count;
26630fdc8d8SChris Lattner }
26730fdc8d8SChris Lattner 
26830fdc8d8SChris Lattner void
2694838131bSGreg Clayton SBBreakpoint::SetThreadID (tid_t tid)
27030fdc8d8SChris Lattner {
2716611103cSGreg Clayton     if (m_opaque_sp)
2724838131bSGreg Clayton         m_opaque_sp->SetThreadID (tid);
273*2d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
2744838131bSGreg Clayton     if (log)
2754838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::SetThreadID (tid=0x%4.4x)", m_opaque_sp.get(), tid);
2764838131bSGreg Clayton 
27730fdc8d8SChris Lattner }
27830fdc8d8SChris Lattner 
27930fdc8d8SChris Lattner tid_t
28030fdc8d8SChris Lattner SBBreakpoint::GetThreadID ()
28130fdc8d8SChris Lattner {
2824838131bSGreg Clayton     tid_t tid = LLDB_INVALID_THREAD_ID;
2836611103cSGreg Clayton     if (m_opaque_sp)
2844838131bSGreg Clayton         tid = m_opaque_sp->GetThreadID();
28530fdc8d8SChris Lattner 
286*2d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
2874838131bSGreg Clayton     if (log)
2884838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::GetThreadID () => 0x%4.4x", m_opaque_sp.get(), tid);
2894838131bSGreg Clayton     return tid;
29030fdc8d8SChris Lattner }
29130fdc8d8SChris Lattner 
29262b02c61SJim Ingham void
29362b02c61SJim Ingham SBBreakpoint::SetThreadIndex (uint32_t index)
29462b02c61SJim Ingham {
295*2d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
2964838131bSGreg Clayton     if (log)
2974838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::SetThreadIndex (%u)", m_opaque_sp.get(), index);
2986611103cSGreg Clayton     if (m_opaque_sp)
2996611103cSGreg Clayton         m_opaque_sp->GetOptions()->GetThreadSpec()->SetIndex (index);
30062b02c61SJim Ingham }
30162b02c61SJim Ingham 
30262b02c61SJim Ingham uint32_t
30362b02c61SJim Ingham SBBreakpoint::GetThreadIndex() const
30462b02c61SJim Ingham {
3054838131bSGreg Clayton     uint32_t thread_idx = 0;
3066611103cSGreg Clayton     if (m_opaque_sp)
30762b02c61SJim Ingham     {
3086611103cSGreg Clayton         const ThreadSpec *thread_spec = m_opaque_sp->GetOptions()->GetThreadSpec();
30962b02c61SJim Ingham         if (thread_spec == NULL)
3104838131bSGreg Clayton             thread_idx = thread_spec->GetIndex();
31162b02c61SJim Ingham     }
312*2d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3134838131bSGreg Clayton     if (log)
3144838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::GetThreadIndex () => %u", m_opaque_sp.get(), index);
3154838131bSGreg Clayton 
31662b02c61SJim Ingham     return 0;
31762b02c61SJim Ingham }
31862b02c61SJim Ingham 
31962b02c61SJim Ingham 
32062b02c61SJim Ingham void
32162b02c61SJim Ingham SBBreakpoint::SetThreadName (const char *thread_name)
32262b02c61SJim Ingham {
323*2d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3244838131bSGreg Clayton     if (log)
3254838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::SetThreadName (%s)", m_opaque_sp.get(), thread_name);
3264838131bSGreg Clayton 
3276611103cSGreg Clayton     if (m_opaque_sp)
3286611103cSGreg Clayton         m_opaque_sp->GetOptions()->GetThreadSpec()->SetName (thread_name);
32962b02c61SJim Ingham }
33062b02c61SJim Ingham 
33162b02c61SJim Ingham const char *
33262b02c61SJim Ingham SBBreakpoint::GetThreadName () const
33362b02c61SJim Ingham {
3344838131bSGreg Clayton     const char *name = NULL;
3356611103cSGreg Clayton     if (m_opaque_sp)
33662b02c61SJim Ingham     {
3376611103cSGreg Clayton         const ThreadSpec *thread_spec = m_opaque_sp->GetOptions()->GetThreadSpec();
33862b02c61SJim Ingham         if (thread_spec == NULL)
3394838131bSGreg Clayton             name = thread_spec->GetName();
34062b02c61SJim Ingham     }
341*2d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3424838131bSGreg Clayton     if (log)
3434838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::GetThreadName () => %s", m_opaque_sp.get(), name);
3444838131bSGreg Clayton 
3454838131bSGreg Clayton     return name;
34662b02c61SJim Ingham }
34762b02c61SJim Ingham 
34862b02c61SJim Ingham void
34962b02c61SJim Ingham SBBreakpoint::SetQueueName (const char *queue_name)
35062b02c61SJim Ingham {
351*2d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3524838131bSGreg Clayton     if (log)
3534838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::SetQueueName (%s)", m_opaque_sp.get(), queue_name);
3546611103cSGreg Clayton     if (m_opaque_sp)
3556611103cSGreg Clayton         m_opaque_sp->GetOptions()->GetThreadSpec()->SetQueueName (queue_name);
35662b02c61SJim Ingham }
35762b02c61SJim Ingham 
35862b02c61SJim Ingham const char *
35962b02c61SJim Ingham SBBreakpoint::GetQueueName () const
36062b02c61SJim Ingham {
3614838131bSGreg Clayton     const char *name = NULL;
3626611103cSGreg Clayton     if (m_opaque_sp)
36362b02c61SJim Ingham     {
3646611103cSGreg Clayton         const ThreadSpec *thread_spec = m_opaque_sp->GetOptions()->GetThreadSpec();
3654838131bSGreg Clayton             name = thread_spec->GetQueueName();
36662b02c61SJim Ingham     }
367*2d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3684838131bSGreg Clayton     if (log)
3694838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::GetQueueName () => %s", m_opaque_sp.get(), name);
3704838131bSGreg Clayton 
3714838131bSGreg Clayton     return name;
37262b02c61SJim Ingham }
37362b02c61SJim Ingham 
37430fdc8d8SChris Lattner size_t
37530fdc8d8SChris Lattner SBBreakpoint::GetNumResolvedLocations() const
37630fdc8d8SChris Lattner {
3774838131bSGreg Clayton     size_t num_resolved = 0;
3786611103cSGreg Clayton     if (m_opaque_sp)
3794838131bSGreg Clayton         num_resolved = m_opaque_sp->GetNumResolvedLocations();
380*2d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3814838131bSGreg Clayton     if (log)
3824838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::GetNumResolvedLocations () => %zu", m_opaque_sp.get(), num_resolved);
3834838131bSGreg Clayton     return num_resolved;
38430fdc8d8SChris Lattner }
38530fdc8d8SChris Lattner 
38630fdc8d8SChris Lattner size_t
38730fdc8d8SChris Lattner SBBreakpoint::GetNumLocations() const
38830fdc8d8SChris Lattner {
3894838131bSGreg Clayton     size_t num_locs = 0;
3906611103cSGreg Clayton     if (m_opaque_sp)
3914838131bSGreg Clayton         num_locs = m_opaque_sp->GetNumLocations();
392*2d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3934838131bSGreg Clayton     if (log)
3944838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::GetNumLocations () => %zu", m_opaque_sp.get(), num_locs);
3954838131bSGreg Clayton     return num_locs;
39630fdc8d8SChris Lattner }
39730fdc8d8SChris Lattner 
398dde9cff3SCaroline Tice bool
39905faeb71SGreg Clayton SBBreakpoint::GetDescription (SBStream &s)
40030fdc8d8SChris Lattner {
4016611103cSGreg Clayton     if (m_opaque_sp)
40230fdc8d8SChris Lattner     {
40305faeb71SGreg Clayton         s.Printf("SBBreakpoint: id = %i, ", m_opaque_sp->GetID());
40405faeb71SGreg Clayton         m_opaque_sp->GetResolverDescription (s.get());
40505faeb71SGreg Clayton         m_opaque_sp->GetFilterDescription (s.get());
40605faeb71SGreg Clayton         const size_t num_locations = m_opaque_sp->GetNumLocations ();
40705faeb71SGreg Clayton         s.Printf(", locations = %zu", num_locations);
408dde9cff3SCaroline Tice         return true;
409dde9cff3SCaroline Tice     }
41005faeb71SGreg Clayton     s.Printf ("No value");
41105faeb71SGreg Clayton     return false;
41205faeb71SGreg Clayton }
413dde9cff3SCaroline Tice 
41430fdc8d8SChris Lattner bool
41530fdc8d8SChris Lattner SBBreakpoint::PrivateBreakpointHitCallback
41630fdc8d8SChris Lattner (
41730fdc8d8SChris Lattner     void *baton,
41830fdc8d8SChris Lattner     StoppointCallbackContext *ctx,
41930fdc8d8SChris Lattner     lldb::user_id_t break_id,
42030fdc8d8SChris Lattner     lldb::user_id_t break_loc_id
42130fdc8d8SChris Lattner )
42230fdc8d8SChris Lattner {
4236611103cSGreg Clayton     BreakpointSP bp_sp(ctx->exe_ctx.target->GetBreakpointList().FindBreakpointByID(break_id));
42430fdc8d8SChris Lattner     if (baton && bp_sp)
42530fdc8d8SChris Lattner     {
42630fdc8d8SChris Lattner         CallbackData *data = (CallbackData *)baton;
42730fdc8d8SChris Lattner         lldb_private::Breakpoint *bp = bp_sp.get();
42830fdc8d8SChris Lattner         if (bp && data->callback)
42930fdc8d8SChris Lattner         {
4306611103cSGreg Clayton             if (ctx->exe_ctx.process)
43130fdc8d8SChris Lattner             {
4326611103cSGreg Clayton                 SBProcess sb_process (ctx->exe_ctx.process->GetSP());
43330fdc8d8SChris Lattner                 SBThread sb_thread;
43430fdc8d8SChris Lattner                 SBBreakpointLocation sb_location;
43530fdc8d8SChris Lattner                 assert (bp_sp);
43630fdc8d8SChris Lattner                 sb_location.SetLocation (bp_sp->FindLocationByID (break_loc_id));
4376611103cSGreg Clayton                 if (ctx->exe_ctx.thread)
4386611103cSGreg Clayton                     sb_thread.SetThread(ctx->exe_ctx.thread->GetSP());
43930fdc8d8SChris Lattner 
44030fdc8d8SChris Lattner                 return data->callback (data->callback_baton,
44130fdc8d8SChris Lattner                                           sb_process,
44230fdc8d8SChris Lattner                                           sb_thread,
44330fdc8d8SChris Lattner                                           sb_location);
44430fdc8d8SChris Lattner             }
44530fdc8d8SChris Lattner         }
44630fdc8d8SChris Lattner     }
44730fdc8d8SChris Lattner     return true;    // Return true if we should stop at this breakpoint
44830fdc8d8SChris Lattner }
44930fdc8d8SChris Lattner 
45030fdc8d8SChris Lattner void
45130fdc8d8SChris Lattner SBBreakpoint::SetCallback (BreakpointHitCallback callback, void *baton)
45230fdc8d8SChris Lattner {
453*2d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
454ceb6b139SCaroline Tice 
455ceb6b139SCaroline Tice     if (log)
4564838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::SetCallback (callback=%p, baton=%p)", m_opaque_sp.get(), callback, baton);
457ceb6b139SCaroline Tice 
4586611103cSGreg Clayton     if (m_opaque_sp.get())
45930fdc8d8SChris Lattner     {
46030fdc8d8SChris Lattner         BatonSP baton_sp(new SBBreakpointCallbackBaton (callback, baton));
4616611103cSGreg Clayton         m_opaque_sp->SetCallback (SBBreakpoint::PrivateBreakpointHitCallback, baton_sp, false);
46230fdc8d8SChris Lattner     }
46330fdc8d8SChris Lattner }
46430fdc8d8SChris Lattner 
46530fdc8d8SChris Lattner 
46630fdc8d8SChris Lattner lldb_private::Breakpoint *
46730fdc8d8SChris Lattner SBBreakpoint::operator->() const
46830fdc8d8SChris Lattner {
4696611103cSGreg Clayton     return m_opaque_sp.get();
47030fdc8d8SChris Lattner }
47130fdc8d8SChris Lattner 
47230fdc8d8SChris Lattner lldb_private::Breakpoint *
47330fdc8d8SChris Lattner SBBreakpoint::get() const
47430fdc8d8SChris Lattner {
4756611103cSGreg Clayton     return m_opaque_sp.get();
47630fdc8d8SChris Lattner }
47730fdc8d8SChris Lattner 
47830fdc8d8SChris Lattner lldb::BreakpointSP &
47930fdc8d8SChris Lattner SBBreakpoint::operator *()
48030fdc8d8SChris Lattner {
4816611103cSGreg Clayton     return m_opaque_sp;
48230fdc8d8SChris Lattner }
48330fdc8d8SChris Lattner 
48430fdc8d8SChris Lattner const lldb::BreakpointSP &
48530fdc8d8SChris Lattner SBBreakpoint::operator *() const
48630fdc8d8SChris Lattner {
4876611103cSGreg Clayton     return m_opaque_sp;
48830fdc8d8SChris Lattner }
48930fdc8d8SChris Lattner 
4909fed0d85SGreg Clayton BreakpointEventType
4919fed0d85SGreg Clayton SBBreakpoint::GetBreakpointEventTypeFromEvent (const SBEvent& event)
4929fed0d85SGreg Clayton {
4939fed0d85SGreg Clayton     if (event.IsValid())
4949fed0d85SGreg Clayton         return Breakpoint::BreakpointEventData::GetBreakpointEventTypeFromEvent (event.GetSP());
4959fed0d85SGreg Clayton     return eBreakpointEventTypeInvalidType;
4969fed0d85SGreg Clayton }
4979fed0d85SGreg Clayton 
4989fed0d85SGreg Clayton SBBreakpoint
4999fed0d85SGreg Clayton SBBreakpoint::GetBreakpointFromEvent (const lldb::SBEvent& event)
5009fed0d85SGreg Clayton {
5019fed0d85SGreg Clayton     SBBreakpoint sb_breakpoint;
5029fed0d85SGreg Clayton     if (event.IsValid())
5039fed0d85SGreg Clayton         sb_breakpoint.m_opaque_sp = Breakpoint::BreakpointEventData::GetBreakpointFromEvent (event.GetSP());
5049fed0d85SGreg Clayton     return sb_breakpoint;
5059fed0d85SGreg Clayton }
5069fed0d85SGreg Clayton 
5079fed0d85SGreg Clayton SBBreakpointLocation
5089fed0d85SGreg Clayton SBBreakpoint::GetBreakpointLocationAtIndexFromEvent (const lldb::SBEvent& event, uint32_t loc_idx)
5099fed0d85SGreg Clayton {
5109fed0d85SGreg Clayton     SBBreakpointLocation sb_breakpoint_loc;
5119fed0d85SGreg Clayton     if (event.IsValid())
5129fed0d85SGreg Clayton         sb_breakpoint_loc.SetLocation (Breakpoint::BreakpointEventData::GetBreakpointLocationAtIndexFromEvent (event.GetSP(), loc_idx));
5139fed0d85SGreg Clayton     return sb_breakpoint_loc;
5149fed0d85SGreg Clayton }
5159fed0d85SGreg Clayton 
5169fed0d85SGreg Clayton 
517