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"
2230fdc8d8SChris Lattner #include "lldb/Core/Stream.h"
2330fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
2430fdc8d8SChris Lattner #include "lldb/Target/Process.h"
2530fdc8d8SChris Lattner #include "lldb/Target/Target.h"
2662b02c61SJim Ingham #include "lldb/Target/Thread.h"
2762b02c61SJim Ingham #include "lldb/Target/ThreadSpec.h"
2830fdc8d8SChris Lattner 
2930fdc8d8SChris Lattner 
3030fdc8d8SChris Lattner #include "lldb/lldb-enumerations.h"
3130fdc8d8SChris Lattner 
3230fdc8d8SChris Lattner using namespace lldb;
3330fdc8d8SChris Lattner using namespace lldb_private;
3430fdc8d8SChris Lattner 
3530fdc8d8SChris Lattner struct CallbackData
3630fdc8d8SChris Lattner {
3730fdc8d8SChris Lattner     SBBreakpoint::BreakpointHitCallback callback;
3830fdc8d8SChris Lattner     void *callback_baton;
3930fdc8d8SChris Lattner };
4030fdc8d8SChris Lattner 
4130fdc8d8SChris Lattner class SBBreakpointCallbackBaton : public Baton
4230fdc8d8SChris Lattner {
4330fdc8d8SChris Lattner public:
4430fdc8d8SChris Lattner 
4530fdc8d8SChris Lattner     SBBreakpointCallbackBaton (SBBreakpoint::BreakpointHitCallback callback, void *baton) :
4630fdc8d8SChris Lattner         Baton (new CallbackData)
4730fdc8d8SChris Lattner     {
4830fdc8d8SChris Lattner         CallbackData *data = (CallbackData *)m_data;
4930fdc8d8SChris Lattner         data->callback = callback;
5030fdc8d8SChris Lattner         data->callback_baton = baton;
5130fdc8d8SChris Lattner     }
5230fdc8d8SChris Lattner 
5330fdc8d8SChris Lattner     virtual ~SBBreakpointCallbackBaton()
5430fdc8d8SChris Lattner     {
5530fdc8d8SChris Lattner         CallbackData *data = (CallbackData *)m_data;
5630fdc8d8SChris Lattner 
5730fdc8d8SChris Lattner         if (data)
5830fdc8d8SChris Lattner         {
5930fdc8d8SChris Lattner             delete data;
6030fdc8d8SChris Lattner             m_data = NULL;
6130fdc8d8SChris Lattner         }
6230fdc8d8SChris Lattner     }
6330fdc8d8SChris Lattner };
6430fdc8d8SChris Lattner 
6530fdc8d8SChris Lattner 
6630fdc8d8SChris Lattner SBBreakpoint::SBBreakpoint () :
676611103cSGreg Clayton     m_opaque_sp ()
6830fdc8d8SChris Lattner {
6930fdc8d8SChris Lattner }
7030fdc8d8SChris Lattner 
7130fdc8d8SChris Lattner SBBreakpoint::SBBreakpoint (const SBBreakpoint& rhs) :
726611103cSGreg Clayton     m_opaque_sp (rhs.m_opaque_sp)
7330fdc8d8SChris Lattner {
7430fdc8d8SChris Lattner }
7530fdc8d8SChris Lattner 
7630fdc8d8SChris Lattner 
7730fdc8d8SChris Lattner SBBreakpoint::SBBreakpoint (const lldb::BreakpointSP &bp_sp) :
786611103cSGreg Clayton     m_opaque_sp (bp_sp)
7930fdc8d8SChris Lattner {
8030fdc8d8SChris Lattner }
8130fdc8d8SChris Lattner 
8230fdc8d8SChris Lattner SBBreakpoint::~SBBreakpoint()
8330fdc8d8SChris Lattner {
8430fdc8d8SChris Lattner }
8530fdc8d8SChris Lattner 
8630fdc8d8SChris Lattner const SBBreakpoint &
8730fdc8d8SChris Lattner SBBreakpoint::operator = (const SBBreakpoint& rhs)
8830fdc8d8SChris Lattner {
8930fdc8d8SChris Lattner     if (this != &rhs)
9030fdc8d8SChris Lattner     {
916611103cSGreg Clayton         m_opaque_sp = rhs.m_opaque_sp;
9230fdc8d8SChris Lattner     }
9330fdc8d8SChris Lattner     return *this;
9430fdc8d8SChris Lattner }
9530fdc8d8SChris Lattner 
9630fdc8d8SChris Lattner break_id_t
9730fdc8d8SChris Lattner SBBreakpoint::GetID () const
9830fdc8d8SChris Lattner {
996611103cSGreg Clayton     if (m_opaque_sp)
1006611103cSGreg Clayton         return m_opaque_sp->GetID();
10130fdc8d8SChris Lattner     return LLDB_INVALID_BREAK_ID;
10230fdc8d8SChris Lattner }
10330fdc8d8SChris Lattner 
10430fdc8d8SChris Lattner 
10530fdc8d8SChris Lattner bool
10630fdc8d8SChris Lattner SBBreakpoint::IsValid() const
10730fdc8d8SChris Lattner {
1086611103cSGreg Clayton     return m_opaque_sp;
10930fdc8d8SChris Lattner }
11030fdc8d8SChris Lattner 
11130fdc8d8SChris Lattner void
11230fdc8d8SChris Lattner SBBreakpoint::ClearAllBreakpointSites ()
11330fdc8d8SChris Lattner {
1146611103cSGreg Clayton     if (m_opaque_sp)
1156611103cSGreg Clayton         m_opaque_sp->ClearAllBreakpointSites ();
11630fdc8d8SChris Lattner }
11730fdc8d8SChris Lattner 
11830fdc8d8SChris Lattner SBBreakpointLocation
11930fdc8d8SChris Lattner SBBreakpoint::FindLocationByAddress (addr_t vm_addr)
12030fdc8d8SChris Lattner {
12130fdc8d8SChris Lattner     SBBreakpointLocation sb_bp_location;
12230fdc8d8SChris Lattner 
1236611103cSGreg Clayton     if (m_opaque_sp)
12430fdc8d8SChris Lattner     {
12530fdc8d8SChris Lattner         if (vm_addr != LLDB_INVALID_ADDRESS)
12630fdc8d8SChris Lattner         {
12730fdc8d8SChris Lattner             Address address;
128f5e56de0SGreg Clayton             Target &target = m_opaque_sp->GetTarget();
129f5e56de0SGreg Clayton             if (target.GetSectionLoadList().ResolveLoadAddress (vm_addr, address) == false)
13030fdc8d8SChris Lattner             {
13130fdc8d8SChris Lattner                 address.SetSection (NULL);
13230fdc8d8SChris Lattner                 address.SetOffset (vm_addr);
13330fdc8d8SChris Lattner             }
1346611103cSGreg Clayton             sb_bp_location.SetLocation (m_opaque_sp->FindLocationByAddress (address));
13530fdc8d8SChris Lattner         }
13630fdc8d8SChris Lattner     }
13730fdc8d8SChris Lattner     return sb_bp_location;
13830fdc8d8SChris Lattner }
13930fdc8d8SChris Lattner 
14030fdc8d8SChris Lattner break_id_t
14130fdc8d8SChris Lattner SBBreakpoint::FindLocationIDByAddress (addr_t vm_addr)
14230fdc8d8SChris Lattner {
14330fdc8d8SChris Lattner     break_id_t lldb_id = (break_id_t) 0;
14430fdc8d8SChris Lattner 
1456611103cSGreg Clayton     if (m_opaque_sp)
14630fdc8d8SChris Lattner     {
14730fdc8d8SChris Lattner         if (vm_addr != LLDB_INVALID_ADDRESS)
14830fdc8d8SChris Lattner         {
14930fdc8d8SChris Lattner             Address address;
150f5e56de0SGreg Clayton             Target &target = m_opaque_sp->GetTarget();
151f5e56de0SGreg Clayton             if (target.GetSectionLoadList().ResolveLoadAddress (vm_addr, address) == false)
15230fdc8d8SChris Lattner             {
15330fdc8d8SChris Lattner                 address.SetSection (NULL);
15430fdc8d8SChris Lattner                 address.SetOffset (vm_addr);
15530fdc8d8SChris Lattner             }
1566611103cSGreg Clayton             lldb_id = m_opaque_sp->FindLocationIDByAddress (address);
15730fdc8d8SChris Lattner         }
15830fdc8d8SChris Lattner     }
15930fdc8d8SChris Lattner 
16030fdc8d8SChris Lattner     return lldb_id;
16130fdc8d8SChris Lattner }
16230fdc8d8SChris Lattner 
16330fdc8d8SChris Lattner SBBreakpointLocation
16430fdc8d8SChris Lattner SBBreakpoint::FindLocationByID (break_id_t bp_loc_id)
16530fdc8d8SChris Lattner {
16630fdc8d8SChris Lattner     SBBreakpointLocation sb_bp_location;
16730fdc8d8SChris Lattner 
1686611103cSGreg Clayton     if (m_opaque_sp)
1696611103cSGreg Clayton         sb_bp_location.SetLocation (m_opaque_sp->FindLocationByID (bp_loc_id));
17030fdc8d8SChris Lattner 
17130fdc8d8SChris Lattner     return sb_bp_location;
17230fdc8d8SChris Lattner }
17330fdc8d8SChris Lattner 
17430fdc8d8SChris Lattner SBBreakpointLocation
17530fdc8d8SChris Lattner SBBreakpoint::GetLocationAtIndex (uint32_t index)
17630fdc8d8SChris Lattner {
17730fdc8d8SChris Lattner     SBBreakpointLocation sb_bp_location;
17830fdc8d8SChris Lattner 
1796611103cSGreg Clayton     if (m_opaque_sp)
1806611103cSGreg Clayton         sb_bp_location.SetLocation (m_opaque_sp->GetLocationAtIndex (index));
18130fdc8d8SChris Lattner 
18230fdc8d8SChris Lattner     return sb_bp_location;
18330fdc8d8SChris Lattner }
18430fdc8d8SChris Lattner 
18530fdc8d8SChris Lattner void
18630fdc8d8SChris Lattner SBBreakpoint::SetEnabled (bool enable)
18730fdc8d8SChris Lattner {
1886611103cSGreg Clayton     if (m_opaque_sp)
1896611103cSGreg Clayton         m_opaque_sp->SetEnabled (enable);
19030fdc8d8SChris Lattner }
19130fdc8d8SChris Lattner 
19230fdc8d8SChris Lattner bool
19330fdc8d8SChris Lattner SBBreakpoint::IsEnabled ()
19430fdc8d8SChris Lattner {
1956611103cSGreg Clayton     if (m_opaque_sp)
1966611103cSGreg Clayton         return m_opaque_sp->IsEnabled();
19730fdc8d8SChris Lattner     else
19830fdc8d8SChris Lattner         return false;
19930fdc8d8SChris Lattner }
20030fdc8d8SChris Lattner 
20130fdc8d8SChris Lattner void
202c982c768SGreg Clayton SBBreakpoint::SetIgnoreCount (uint32_t count)
20330fdc8d8SChris Lattner {
2046611103cSGreg Clayton     if (m_opaque_sp)
2056611103cSGreg Clayton         m_opaque_sp->SetIgnoreCount (count);
20630fdc8d8SChris Lattner }
20730fdc8d8SChris Lattner 
208c982c768SGreg Clayton uint32_t
2099fed0d85SGreg Clayton SBBreakpoint::GetHitCount () const
2109fed0d85SGreg Clayton {
2119fed0d85SGreg Clayton     if (m_opaque_sp)
2129fed0d85SGreg Clayton         return m_opaque_sp->GetHitCount();
2139fed0d85SGreg Clayton     else
2149fed0d85SGreg Clayton         return 0;
2159fed0d85SGreg Clayton }
2169fed0d85SGreg Clayton 
2179fed0d85SGreg Clayton uint32_t
21830fdc8d8SChris Lattner SBBreakpoint::GetIgnoreCount () const
21930fdc8d8SChris Lattner {
2206611103cSGreg Clayton     if (m_opaque_sp)
2216611103cSGreg Clayton         return m_opaque_sp->GetIgnoreCount();
22230fdc8d8SChris Lattner     else
22330fdc8d8SChris Lattner         return 0;
22430fdc8d8SChris Lattner }
22530fdc8d8SChris Lattner 
22630fdc8d8SChris Lattner void
22730fdc8d8SChris Lattner SBBreakpoint::SetThreadID (tid_t sb_thread_id)
22830fdc8d8SChris Lattner {
2296611103cSGreg Clayton     if (m_opaque_sp)
2306611103cSGreg Clayton         m_opaque_sp->SetThreadID (sb_thread_id);
23130fdc8d8SChris Lattner }
23230fdc8d8SChris Lattner 
23330fdc8d8SChris Lattner tid_t
23430fdc8d8SChris Lattner SBBreakpoint::GetThreadID ()
23530fdc8d8SChris Lattner {
23630fdc8d8SChris Lattner     tid_t lldb_thread_id = LLDB_INVALID_THREAD_ID;
2376611103cSGreg Clayton     if (m_opaque_sp)
2386611103cSGreg Clayton         lldb_thread_id = m_opaque_sp->GetThreadID();
23930fdc8d8SChris Lattner 
24030fdc8d8SChris Lattner     return lldb_thread_id;
24130fdc8d8SChris Lattner }
24230fdc8d8SChris Lattner 
24362b02c61SJim Ingham void
24462b02c61SJim Ingham SBBreakpoint::SetThreadIndex (uint32_t index)
24562b02c61SJim Ingham {
2466611103cSGreg Clayton     if (m_opaque_sp)
2476611103cSGreg Clayton         m_opaque_sp->GetOptions()->GetThreadSpec()->SetIndex (index);
24862b02c61SJim Ingham }
24962b02c61SJim Ingham 
25062b02c61SJim Ingham uint32_t
25162b02c61SJim Ingham SBBreakpoint::GetThreadIndex() const
25262b02c61SJim Ingham {
2536611103cSGreg Clayton     if (m_opaque_sp)
25462b02c61SJim Ingham     {
2556611103cSGreg Clayton         const ThreadSpec *thread_spec = m_opaque_sp->GetOptions()->GetThreadSpec();
25662b02c61SJim Ingham         if (thread_spec == NULL)
25762b02c61SJim Ingham             return 0;
25862b02c61SJim Ingham         else
25962b02c61SJim Ingham             return thread_spec->GetIndex();
26062b02c61SJim Ingham     }
26162b02c61SJim Ingham     return 0;
26262b02c61SJim Ingham }
26362b02c61SJim Ingham 
26462b02c61SJim Ingham 
26562b02c61SJim Ingham void
26662b02c61SJim Ingham SBBreakpoint::SetThreadName (const char *thread_name)
26762b02c61SJim Ingham {
2686611103cSGreg Clayton     if (m_opaque_sp)
2696611103cSGreg Clayton         m_opaque_sp->GetOptions()->GetThreadSpec()->SetName (thread_name);
27062b02c61SJim Ingham }
27162b02c61SJim Ingham 
27262b02c61SJim Ingham const char *
27362b02c61SJim Ingham SBBreakpoint::GetThreadName () const
27462b02c61SJim Ingham {
2756611103cSGreg Clayton     if (m_opaque_sp)
27662b02c61SJim Ingham     {
2776611103cSGreg Clayton         const ThreadSpec *thread_spec = m_opaque_sp->GetOptions()->GetThreadSpec();
27862b02c61SJim Ingham         if (thread_spec == NULL)
27962b02c61SJim Ingham             return NULL;
28062b02c61SJim Ingham         else
28162b02c61SJim Ingham             return thread_spec->GetName();
28262b02c61SJim Ingham     }
28362b02c61SJim Ingham     return NULL;
28462b02c61SJim Ingham }
28562b02c61SJim Ingham 
28662b02c61SJim Ingham void
28762b02c61SJim Ingham SBBreakpoint::SetQueueName (const char *queue_name)
28862b02c61SJim Ingham {
2896611103cSGreg Clayton     if (m_opaque_sp)
2906611103cSGreg Clayton         m_opaque_sp->GetOptions()->GetThreadSpec()->SetQueueName (queue_name);
29162b02c61SJim Ingham }
29262b02c61SJim Ingham 
29362b02c61SJim Ingham const char *
29462b02c61SJim Ingham SBBreakpoint::GetQueueName () const
29562b02c61SJim Ingham {
2966611103cSGreg Clayton     if (m_opaque_sp)
29762b02c61SJim Ingham     {
2986611103cSGreg Clayton         const ThreadSpec *thread_spec = m_opaque_sp->GetOptions()->GetThreadSpec();
29962b02c61SJim Ingham         if (thread_spec == NULL)
30062b02c61SJim Ingham             return NULL;
30162b02c61SJim Ingham         else
30262b02c61SJim Ingham             return thread_spec->GetQueueName();
30362b02c61SJim Ingham     }
30462b02c61SJim Ingham     return NULL;
30562b02c61SJim Ingham }
30662b02c61SJim Ingham 
30730fdc8d8SChris Lattner size_t
30830fdc8d8SChris Lattner SBBreakpoint::GetNumResolvedLocations() const
30930fdc8d8SChris Lattner {
3106611103cSGreg Clayton     if (m_opaque_sp)
3116611103cSGreg Clayton         return m_opaque_sp->GetNumResolvedLocations();
31230fdc8d8SChris Lattner     else
31330fdc8d8SChris Lattner         return 0;
31430fdc8d8SChris Lattner }
31530fdc8d8SChris Lattner 
31630fdc8d8SChris Lattner size_t
31730fdc8d8SChris Lattner SBBreakpoint::GetNumLocations() const
31830fdc8d8SChris Lattner {
3196611103cSGreg Clayton     if (m_opaque_sp)
3206611103cSGreg Clayton         return m_opaque_sp->GetNumLocations();
32130fdc8d8SChris Lattner     else
32230fdc8d8SChris Lattner         return 0;
32330fdc8d8SChris Lattner }
32430fdc8d8SChris Lattner 
325dde9cff3SCaroline Tice bool
326*05faeb71SGreg Clayton SBBreakpoint::GetDescription (SBStream &s)
32730fdc8d8SChris Lattner {
3286611103cSGreg Clayton     if (m_opaque_sp)
32930fdc8d8SChris Lattner     {
330*05faeb71SGreg Clayton         s.Printf("SBBreakpoint: id = %i, ", m_opaque_sp->GetID());
331*05faeb71SGreg Clayton         m_opaque_sp->GetResolverDescription (s.get());
332*05faeb71SGreg Clayton         m_opaque_sp->GetFilterDescription (s.get());
333*05faeb71SGreg Clayton         const size_t num_locations = m_opaque_sp->GetNumLocations ();
334*05faeb71SGreg Clayton         s.Printf(", locations = %zu", num_locations);
335dde9cff3SCaroline Tice         return true;
336dde9cff3SCaroline Tice     }
337*05faeb71SGreg Clayton     s.Printf ("No value");
338*05faeb71SGreg Clayton     return false;
339*05faeb71SGreg Clayton }
340dde9cff3SCaroline Tice 
34130fdc8d8SChris Lattner bool
34230fdc8d8SChris Lattner SBBreakpoint::PrivateBreakpointHitCallback
34330fdc8d8SChris Lattner (
34430fdc8d8SChris Lattner     void *baton,
34530fdc8d8SChris Lattner     StoppointCallbackContext *ctx,
34630fdc8d8SChris Lattner     lldb::user_id_t break_id,
34730fdc8d8SChris Lattner     lldb::user_id_t break_loc_id
34830fdc8d8SChris Lattner )
34930fdc8d8SChris Lattner {
3506611103cSGreg Clayton     BreakpointSP bp_sp(ctx->exe_ctx.target->GetBreakpointList().FindBreakpointByID(break_id));
35130fdc8d8SChris Lattner     if (baton && bp_sp)
35230fdc8d8SChris Lattner     {
35330fdc8d8SChris Lattner         CallbackData *data = (CallbackData *)baton;
35430fdc8d8SChris Lattner         lldb_private::Breakpoint *bp = bp_sp.get();
35530fdc8d8SChris Lattner         if (bp && data->callback)
35630fdc8d8SChris Lattner         {
3576611103cSGreg Clayton             if (ctx->exe_ctx.process)
35830fdc8d8SChris Lattner             {
3596611103cSGreg Clayton                 SBProcess sb_process (ctx->exe_ctx.process->GetSP());
36030fdc8d8SChris Lattner                 SBThread sb_thread;
36130fdc8d8SChris Lattner                 SBBreakpointLocation sb_location;
36230fdc8d8SChris Lattner                 assert (bp_sp);
36330fdc8d8SChris Lattner                 sb_location.SetLocation (bp_sp->FindLocationByID (break_loc_id));
3646611103cSGreg Clayton                 if (ctx->exe_ctx.thread)
3656611103cSGreg Clayton                     sb_thread.SetThread(ctx->exe_ctx.thread->GetSP());
36630fdc8d8SChris Lattner 
36730fdc8d8SChris Lattner                 return data->callback (data->callback_baton,
36830fdc8d8SChris Lattner                                           sb_process,
36930fdc8d8SChris Lattner                                           sb_thread,
37030fdc8d8SChris Lattner                                           sb_location);
37130fdc8d8SChris Lattner             }
37230fdc8d8SChris Lattner         }
37330fdc8d8SChris Lattner     }
37430fdc8d8SChris Lattner     return true;    // Return true if we should stop at this breakpoint
37530fdc8d8SChris Lattner }
37630fdc8d8SChris Lattner 
37730fdc8d8SChris Lattner void
37830fdc8d8SChris Lattner SBBreakpoint::SetCallback (BreakpointHitCallback callback, void *baton)
37930fdc8d8SChris Lattner {
3806611103cSGreg Clayton     if (m_opaque_sp.get())
38130fdc8d8SChris Lattner     {
38230fdc8d8SChris Lattner         BatonSP baton_sp(new SBBreakpointCallbackBaton (callback, baton));
3836611103cSGreg Clayton         m_opaque_sp->SetCallback (SBBreakpoint::PrivateBreakpointHitCallback, baton_sp, false);
38430fdc8d8SChris Lattner     }
38530fdc8d8SChris Lattner }
38630fdc8d8SChris Lattner 
38730fdc8d8SChris Lattner 
38830fdc8d8SChris Lattner lldb_private::Breakpoint *
38930fdc8d8SChris Lattner SBBreakpoint::operator->() const
39030fdc8d8SChris Lattner {
3916611103cSGreg Clayton     return m_opaque_sp.get();
39230fdc8d8SChris Lattner }
39330fdc8d8SChris Lattner 
39430fdc8d8SChris Lattner lldb_private::Breakpoint *
39530fdc8d8SChris Lattner SBBreakpoint::get() const
39630fdc8d8SChris Lattner {
3976611103cSGreg Clayton     return m_opaque_sp.get();
39830fdc8d8SChris Lattner }
39930fdc8d8SChris Lattner 
40030fdc8d8SChris Lattner lldb::BreakpointSP &
40130fdc8d8SChris Lattner SBBreakpoint::operator *()
40230fdc8d8SChris Lattner {
4036611103cSGreg Clayton     return m_opaque_sp;
40430fdc8d8SChris Lattner }
40530fdc8d8SChris Lattner 
40630fdc8d8SChris Lattner const lldb::BreakpointSP &
40730fdc8d8SChris Lattner SBBreakpoint::operator *() const
40830fdc8d8SChris Lattner {
4096611103cSGreg Clayton     return m_opaque_sp;
41030fdc8d8SChris Lattner }
41130fdc8d8SChris Lattner 
4129fed0d85SGreg Clayton BreakpointEventType
4139fed0d85SGreg Clayton SBBreakpoint::GetBreakpointEventTypeFromEvent (const SBEvent& event)
4149fed0d85SGreg Clayton {
4159fed0d85SGreg Clayton     if (event.IsValid())
4169fed0d85SGreg Clayton         return Breakpoint::BreakpointEventData::GetBreakpointEventTypeFromEvent (event.GetSP());
4179fed0d85SGreg Clayton     return eBreakpointEventTypeInvalidType;
4189fed0d85SGreg Clayton }
4199fed0d85SGreg Clayton 
4209fed0d85SGreg Clayton SBBreakpoint
4219fed0d85SGreg Clayton SBBreakpoint::GetBreakpointFromEvent (const lldb::SBEvent& event)
4229fed0d85SGreg Clayton {
4239fed0d85SGreg Clayton     SBBreakpoint sb_breakpoint;
4249fed0d85SGreg Clayton     if (event.IsValid())
4259fed0d85SGreg Clayton         sb_breakpoint.m_opaque_sp = Breakpoint::BreakpointEventData::GetBreakpointFromEvent (event.GetSP());
4269fed0d85SGreg Clayton     return sb_breakpoint;
4279fed0d85SGreg Clayton }
4289fed0d85SGreg Clayton 
4299fed0d85SGreg Clayton SBBreakpointLocation
4309fed0d85SGreg Clayton SBBreakpoint::GetBreakpointLocationAtIndexFromEvent (const lldb::SBEvent& event, uint32_t loc_idx)
4319fed0d85SGreg Clayton {
4329fed0d85SGreg Clayton     SBBreakpointLocation sb_breakpoint_loc;
4339fed0d85SGreg Clayton     if (event.IsValid())
4349fed0d85SGreg Clayton         sb_breakpoint_loc.SetLocation (Breakpoint::BreakpointEventData::GetBreakpointLocationAtIndexFromEvent (event.GetSP(), loc_idx));
4359fed0d85SGreg Clayton     return sb_breakpoint_loc;
4369fed0d85SGreg Clayton }
4379fed0d85SGreg Clayton 
4389fed0d85SGreg Clayton 
439