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"
1330fdc8d8SChris Lattner #include "lldb/API/SBProcess.h"
1430fdc8d8SChris Lattner #include "lldb/API/SBThread.h"
1530fdc8d8SChris Lattner 
1630fdc8d8SChris Lattner #include "lldb/Breakpoint/Breakpoint.h"
1730fdc8d8SChris Lattner #include "lldb/Breakpoint/BreakpointLocation.h"
1830fdc8d8SChris Lattner #include "lldb/Breakpoint/StoppointCallbackContext.h"
1930fdc8d8SChris Lattner #include "lldb/Core/Address.h"
2030fdc8d8SChris Lattner #include "lldb/Core/Stream.h"
2130fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
2230fdc8d8SChris Lattner #include "lldb/Target/Process.h"
2330fdc8d8SChris Lattner #include "lldb/Target/Target.h"
2462b02c61SJim Ingham #include "lldb/Target/Thread.h"
2562b02c61SJim Ingham #include "lldb/Target/ThreadSpec.h"
2630fdc8d8SChris Lattner 
2730fdc8d8SChris Lattner 
2830fdc8d8SChris Lattner #include "lldb/lldb-enumerations.h"
2930fdc8d8SChris Lattner 
3030fdc8d8SChris Lattner using namespace lldb;
3130fdc8d8SChris Lattner using namespace lldb_private;
3230fdc8d8SChris Lattner 
3330fdc8d8SChris Lattner struct CallbackData
3430fdc8d8SChris Lattner {
3530fdc8d8SChris Lattner     SBBreakpoint::BreakpointHitCallback callback;
3630fdc8d8SChris Lattner     void *callback_baton;
3730fdc8d8SChris Lattner };
3830fdc8d8SChris Lattner 
3930fdc8d8SChris Lattner class SBBreakpointCallbackBaton : public Baton
4030fdc8d8SChris Lattner {
4130fdc8d8SChris Lattner public:
4230fdc8d8SChris Lattner 
4330fdc8d8SChris Lattner     SBBreakpointCallbackBaton (SBBreakpoint::BreakpointHitCallback callback, void *baton) :
4430fdc8d8SChris Lattner         Baton (new CallbackData)
4530fdc8d8SChris Lattner     {
4630fdc8d8SChris Lattner         CallbackData *data = (CallbackData *)m_data;
4730fdc8d8SChris Lattner         data->callback = callback;
4830fdc8d8SChris Lattner         data->callback_baton = baton;
4930fdc8d8SChris Lattner     }
5030fdc8d8SChris Lattner 
5130fdc8d8SChris Lattner     virtual ~SBBreakpointCallbackBaton()
5230fdc8d8SChris Lattner     {
5330fdc8d8SChris Lattner         CallbackData *data = (CallbackData *)m_data;
5430fdc8d8SChris Lattner 
5530fdc8d8SChris Lattner         if (data)
5630fdc8d8SChris Lattner         {
5730fdc8d8SChris Lattner             delete data;
5830fdc8d8SChris Lattner             m_data = NULL;
5930fdc8d8SChris Lattner         }
6030fdc8d8SChris Lattner     }
6130fdc8d8SChris Lattner };
6230fdc8d8SChris Lattner 
6330fdc8d8SChris Lattner 
6430fdc8d8SChris Lattner SBBreakpoint::SBBreakpoint () :
656611103cSGreg Clayton     m_opaque_sp ()
6630fdc8d8SChris Lattner {
6730fdc8d8SChris Lattner }
6830fdc8d8SChris Lattner 
6930fdc8d8SChris Lattner SBBreakpoint::SBBreakpoint (const SBBreakpoint& rhs) :
706611103cSGreg Clayton     m_opaque_sp (rhs.m_opaque_sp)
7130fdc8d8SChris Lattner {
7230fdc8d8SChris Lattner }
7330fdc8d8SChris Lattner 
7430fdc8d8SChris Lattner 
7530fdc8d8SChris Lattner SBBreakpoint::SBBreakpoint (const lldb::BreakpointSP &bp_sp) :
766611103cSGreg Clayton     m_opaque_sp (bp_sp)
7730fdc8d8SChris Lattner {
7830fdc8d8SChris Lattner }
7930fdc8d8SChris Lattner 
8030fdc8d8SChris Lattner SBBreakpoint::~SBBreakpoint()
8130fdc8d8SChris Lattner {
8230fdc8d8SChris Lattner }
8330fdc8d8SChris Lattner 
8430fdc8d8SChris Lattner const SBBreakpoint &
8530fdc8d8SChris Lattner SBBreakpoint::operator = (const SBBreakpoint& rhs)
8630fdc8d8SChris Lattner {
8730fdc8d8SChris Lattner     if (this != &rhs)
8830fdc8d8SChris Lattner     {
896611103cSGreg Clayton         m_opaque_sp = rhs.m_opaque_sp;
9030fdc8d8SChris Lattner     }
9130fdc8d8SChris Lattner     return *this;
9230fdc8d8SChris Lattner }
9330fdc8d8SChris Lattner 
9430fdc8d8SChris Lattner break_id_t
9530fdc8d8SChris Lattner SBBreakpoint::GetID () const
9630fdc8d8SChris Lattner {
976611103cSGreg Clayton     if (m_opaque_sp)
986611103cSGreg Clayton         return m_opaque_sp->GetID();
9930fdc8d8SChris Lattner     return LLDB_INVALID_BREAK_ID;
10030fdc8d8SChris Lattner }
10130fdc8d8SChris Lattner 
10230fdc8d8SChris Lattner 
10330fdc8d8SChris Lattner bool
10430fdc8d8SChris Lattner SBBreakpoint::IsValid() const
10530fdc8d8SChris Lattner {
1066611103cSGreg Clayton     return m_opaque_sp;
10730fdc8d8SChris Lattner }
10830fdc8d8SChris Lattner 
10930fdc8d8SChris Lattner void
11030fdc8d8SChris Lattner SBBreakpoint::Dump (FILE *f)
11130fdc8d8SChris Lattner {
1126611103cSGreg Clayton     if (m_opaque_sp && f)
11330fdc8d8SChris Lattner     {
11430fdc8d8SChris Lattner         lldb_private::StreamFile str (f);
1156611103cSGreg Clayton         m_opaque_sp->Dump (&str);
11630fdc8d8SChris Lattner     }
11730fdc8d8SChris Lattner }
11830fdc8d8SChris Lattner 
11930fdc8d8SChris Lattner void
12030fdc8d8SChris Lattner SBBreakpoint::ClearAllBreakpointSites ()
12130fdc8d8SChris Lattner {
1226611103cSGreg Clayton     if (m_opaque_sp)
1236611103cSGreg Clayton         m_opaque_sp->ClearAllBreakpointSites ();
12430fdc8d8SChris Lattner }
12530fdc8d8SChris Lattner 
12630fdc8d8SChris Lattner SBBreakpointLocation
12730fdc8d8SChris Lattner SBBreakpoint::FindLocationByAddress (addr_t vm_addr)
12830fdc8d8SChris Lattner {
12930fdc8d8SChris Lattner     SBBreakpointLocation sb_bp_location;
13030fdc8d8SChris Lattner 
1316611103cSGreg Clayton     if (m_opaque_sp)
13230fdc8d8SChris Lattner     {
13330fdc8d8SChris Lattner         if (vm_addr != LLDB_INVALID_ADDRESS)
13430fdc8d8SChris Lattner         {
13530fdc8d8SChris Lattner             Address address;
1366611103cSGreg Clayton             Process *sb_process = m_opaque_sp->GetTarget().GetProcessSP().get();
13730fdc8d8SChris Lattner             if (sb_process == NULL || sb_process->ResolveLoadAddress (vm_addr, address) == false)
13830fdc8d8SChris Lattner             {
13930fdc8d8SChris Lattner                 address.SetSection (NULL);
14030fdc8d8SChris Lattner                 address.SetOffset (vm_addr);
14130fdc8d8SChris Lattner             }
1426611103cSGreg Clayton             sb_bp_location.SetLocation (m_opaque_sp->FindLocationByAddress (address));
14330fdc8d8SChris Lattner         }
14430fdc8d8SChris Lattner     }
14530fdc8d8SChris Lattner     return sb_bp_location;
14630fdc8d8SChris Lattner }
14730fdc8d8SChris Lattner 
14830fdc8d8SChris Lattner break_id_t
14930fdc8d8SChris Lattner SBBreakpoint::FindLocationIDByAddress (addr_t vm_addr)
15030fdc8d8SChris Lattner {
15130fdc8d8SChris Lattner     break_id_t lldb_id = (break_id_t) 0;
15230fdc8d8SChris Lattner 
1536611103cSGreg Clayton     if (m_opaque_sp)
15430fdc8d8SChris Lattner     {
15530fdc8d8SChris Lattner         if (vm_addr != LLDB_INVALID_ADDRESS)
15630fdc8d8SChris Lattner         {
15730fdc8d8SChris Lattner             Address address;
1586611103cSGreg Clayton             Process *sb_process = m_opaque_sp->GetTarget().GetProcessSP().get();
15930fdc8d8SChris Lattner             if (sb_process == NULL || sb_process->ResolveLoadAddress (vm_addr, address) == false)
16030fdc8d8SChris Lattner             {
16130fdc8d8SChris Lattner                 address.SetSection (NULL);
16230fdc8d8SChris Lattner                 address.SetOffset (vm_addr);
16330fdc8d8SChris Lattner             }
1646611103cSGreg Clayton             lldb_id = m_opaque_sp->FindLocationIDByAddress (address);
16530fdc8d8SChris Lattner         }
16630fdc8d8SChris Lattner     }
16730fdc8d8SChris Lattner 
16830fdc8d8SChris Lattner     return lldb_id;
16930fdc8d8SChris Lattner }
17030fdc8d8SChris Lattner 
17130fdc8d8SChris Lattner SBBreakpointLocation
17230fdc8d8SChris Lattner SBBreakpoint::FindLocationByID (break_id_t bp_loc_id)
17330fdc8d8SChris Lattner {
17430fdc8d8SChris Lattner     SBBreakpointLocation sb_bp_location;
17530fdc8d8SChris Lattner 
1766611103cSGreg Clayton     if (m_opaque_sp)
1776611103cSGreg Clayton         sb_bp_location.SetLocation (m_opaque_sp->FindLocationByID (bp_loc_id));
17830fdc8d8SChris Lattner 
17930fdc8d8SChris Lattner     return sb_bp_location;
18030fdc8d8SChris Lattner }
18130fdc8d8SChris Lattner 
18230fdc8d8SChris Lattner SBBreakpointLocation
18330fdc8d8SChris Lattner SBBreakpoint::GetLocationAtIndex (uint32_t index)
18430fdc8d8SChris Lattner {
18530fdc8d8SChris Lattner     SBBreakpointLocation sb_bp_location;
18630fdc8d8SChris Lattner 
1876611103cSGreg Clayton     if (m_opaque_sp)
1886611103cSGreg Clayton         sb_bp_location.SetLocation (m_opaque_sp->GetLocationAtIndex (index));
18930fdc8d8SChris Lattner 
19030fdc8d8SChris Lattner     return sb_bp_location;
19130fdc8d8SChris Lattner }
19230fdc8d8SChris Lattner 
19330fdc8d8SChris Lattner void
19430fdc8d8SChris Lattner SBBreakpoint::ListLocations (FILE* f, const char *description_level)
19530fdc8d8SChris Lattner {
1966611103cSGreg Clayton     if (m_opaque_sp && f)
19730fdc8d8SChris Lattner     {
19830fdc8d8SChris Lattner         DescriptionLevel level;
19930fdc8d8SChris Lattner         if (strcmp (description_level, "brief") == 0)
20030fdc8d8SChris Lattner             level = eDescriptionLevelBrief;
20130fdc8d8SChris Lattner         else if (strcmp (description_level, "full") == 0)
20230fdc8d8SChris Lattner             level = eDescriptionLevelFull;
20330fdc8d8SChris Lattner         else if (strcmp (description_level, "verbose") == 0)
20430fdc8d8SChris Lattner             level = eDescriptionLevelVerbose;
20530fdc8d8SChris Lattner         else
20630fdc8d8SChris Lattner             level = eDescriptionLevelBrief;
20730fdc8d8SChris Lattner 
20830fdc8d8SChris Lattner         StreamFile str (f);
20930fdc8d8SChris Lattner 
21030fdc8d8SChris Lattner         str.IndentMore();
2116611103cSGreg Clayton         int num_locs = m_opaque_sp->GetNumLocations();
21230fdc8d8SChris Lattner         for (int i = 0; i < num_locs; ++i)
21330fdc8d8SChris Lattner         {
2146611103cSGreg Clayton             BreakpointLocation *loc = m_opaque_sp->GetLocationAtIndex (i).get();
21530fdc8d8SChris Lattner             loc->GetDescription (&str, level);
21630fdc8d8SChris Lattner             str.EOL();
21730fdc8d8SChris Lattner         }
21830fdc8d8SChris Lattner     }
21930fdc8d8SChris Lattner }
22030fdc8d8SChris Lattner 
22130fdc8d8SChris Lattner void
22230fdc8d8SChris Lattner SBBreakpoint::SetEnabled (bool enable)
22330fdc8d8SChris Lattner {
2246611103cSGreg Clayton     if (m_opaque_sp)
2256611103cSGreg Clayton         m_opaque_sp->SetEnabled (enable);
22630fdc8d8SChris Lattner }
22730fdc8d8SChris Lattner 
22830fdc8d8SChris Lattner bool
22930fdc8d8SChris Lattner SBBreakpoint::IsEnabled ()
23030fdc8d8SChris Lattner {
2316611103cSGreg Clayton     if (m_opaque_sp)
2326611103cSGreg Clayton         return m_opaque_sp->IsEnabled();
23330fdc8d8SChris Lattner     else
23430fdc8d8SChris Lattner         return false;
23530fdc8d8SChris Lattner }
23630fdc8d8SChris Lattner 
23730fdc8d8SChris Lattner void
238*c982c768SGreg Clayton SBBreakpoint::SetIgnoreCount (uint32_t count)
23930fdc8d8SChris Lattner {
2406611103cSGreg Clayton     if (m_opaque_sp)
2416611103cSGreg Clayton         m_opaque_sp->SetIgnoreCount (count);
24230fdc8d8SChris Lattner }
24330fdc8d8SChris Lattner 
244*c982c768SGreg Clayton uint32_t
24530fdc8d8SChris Lattner SBBreakpoint::GetIgnoreCount () const
24630fdc8d8SChris Lattner {
2476611103cSGreg Clayton     if (m_opaque_sp)
2486611103cSGreg Clayton         return m_opaque_sp->GetIgnoreCount();
24930fdc8d8SChris Lattner     else
25030fdc8d8SChris Lattner         return 0;
25130fdc8d8SChris Lattner }
25230fdc8d8SChris Lattner 
25330fdc8d8SChris Lattner void
25430fdc8d8SChris Lattner SBBreakpoint::SetThreadID (tid_t sb_thread_id)
25530fdc8d8SChris Lattner {
2566611103cSGreg Clayton     if (m_opaque_sp)
2576611103cSGreg Clayton         m_opaque_sp->SetThreadID (sb_thread_id);
25830fdc8d8SChris Lattner }
25930fdc8d8SChris Lattner 
26030fdc8d8SChris Lattner tid_t
26130fdc8d8SChris Lattner SBBreakpoint::GetThreadID ()
26230fdc8d8SChris Lattner {
26330fdc8d8SChris Lattner     tid_t lldb_thread_id = LLDB_INVALID_THREAD_ID;
2646611103cSGreg Clayton     if (m_opaque_sp)
2656611103cSGreg Clayton         lldb_thread_id = m_opaque_sp->GetThreadID();
26630fdc8d8SChris Lattner 
26730fdc8d8SChris Lattner     return lldb_thread_id;
26830fdc8d8SChris Lattner }
26930fdc8d8SChris Lattner 
27062b02c61SJim Ingham void
27162b02c61SJim Ingham SBBreakpoint::SetThreadIndex (uint32_t index)
27262b02c61SJim Ingham {
2736611103cSGreg Clayton     if (m_opaque_sp)
2746611103cSGreg Clayton         m_opaque_sp->GetOptions()->GetThreadSpec()->SetIndex (index);
27562b02c61SJim Ingham }
27662b02c61SJim Ingham 
27762b02c61SJim Ingham uint32_t
27862b02c61SJim Ingham SBBreakpoint::GetThreadIndex() const
27962b02c61SJim Ingham {
2806611103cSGreg Clayton     if (m_opaque_sp)
28162b02c61SJim Ingham     {
2826611103cSGreg Clayton         const ThreadSpec *thread_spec = m_opaque_sp->GetOptions()->GetThreadSpec();
28362b02c61SJim Ingham         if (thread_spec == NULL)
28462b02c61SJim Ingham             return 0;
28562b02c61SJim Ingham         else
28662b02c61SJim Ingham             return thread_spec->GetIndex();
28762b02c61SJim Ingham     }
28862b02c61SJim Ingham     return 0;
28962b02c61SJim Ingham }
29062b02c61SJim Ingham 
29162b02c61SJim Ingham 
29262b02c61SJim Ingham void
29362b02c61SJim Ingham SBBreakpoint::SetThreadName (const char *thread_name)
29462b02c61SJim Ingham {
2956611103cSGreg Clayton     if (m_opaque_sp)
2966611103cSGreg Clayton         m_opaque_sp->GetOptions()->GetThreadSpec()->SetName (thread_name);
29762b02c61SJim Ingham }
29862b02c61SJim Ingham 
29962b02c61SJim Ingham const char *
30062b02c61SJim Ingham SBBreakpoint::GetThreadName () const
30162b02c61SJim Ingham {
3026611103cSGreg Clayton     if (m_opaque_sp)
30362b02c61SJim Ingham     {
3046611103cSGreg Clayton         const ThreadSpec *thread_spec = m_opaque_sp->GetOptions()->GetThreadSpec();
30562b02c61SJim Ingham         if (thread_spec == NULL)
30662b02c61SJim Ingham             return NULL;
30762b02c61SJim Ingham         else
30862b02c61SJim Ingham             return thread_spec->GetName();
30962b02c61SJim Ingham     }
31062b02c61SJim Ingham     return NULL;
31162b02c61SJim Ingham }
31262b02c61SJim Ingham 
31362b02c61SJim Ingham void
31462b02c61SJim Ingham SBBreakpoint::SetQueueName (const char *queue_name)
31562b02c61SJim Ingham {
3166611103cSGreg Clayton     if (m_opaque_sp)
3176611103cSGreg Clayton         m_opaque_sp->GetOptions()->GetThreadSpec()->SetQueueName (queue_name);
31862b02c61SJim Ingham }
31962b02c61SJim Ingham 
32062b02c61SJim Ingham const char *
32162b02c61SJim Ingham SBBreakpoint::GetQueueName () const
32262b02c61SJim Ingham {
3236611103cSGreg Clayton     if (m_opaque_sp)
32462b02c61SJim Ingham     {
3256611103cSGreg Clayton         const ThreadSpec *thread_spec = m_opaque_sp->GetOptions()->GetThreadSpec();
32662b02c61SJim Ingham         if (thread_spec == NULL)
32762b02c61SJim Ingham             return NULL;
32862b02c61SJim Ingham         else
32962b02c61SJim Ingham             return thread_spec->GetQueueName();
33062b02c61SJim Ingham     }
33162b02c61SJim Ingham     return NULL;
33262b02c61SJim Ingham }
33362b02c61SJim Ingham 
33430fdc8d8SChris Lattner size_t
33530fdc8d8SChris Lattner SBBreakpoint::GetNumResolvedLocations() const
33630fdc8d8SChris Lattner {
3376611103cSGreg Clayton     if (m_opaque_sp)
3386611103cSGreg Clayton         return m_opaque_sp->GetNumResolvedLocations();
33930fdc8d8SChris Lattner     else
34030fdc8d8SChris Lattner         return 0;
34130fdc8d8SChris Lattner }
34230fdc8d8SChris Lattner 
34330fdc8d8SChris Lattner size_t
34430fdc8d8SChris Lattner SBBreakpoint::GetNumLocations() const
34530fdc8d8SChris Lattner {
3466611103cSGreg Clayton     if (m_opaque_sp)
3476611103cSGreg Clayton         return m_opaque_sp->GetNumLocations();
34830fdc8d8SChris Lattner     else
34930fdc8d8SChris Lattner         return 0;
35030fdc8d8SChris Lattner }
35130fdc8d8SChris Lattner 
35230fdc8d8SChris Lattner void
35330fdc8d8SChris Lattner SBBreakpoint::GetDescription (FILE *f, const char *description_level, bool describe_locations)
35430fdc8d8SChris Lattner {
35530fdc8d8SChris Lattner     if (f == NULL)
35630fdc8d8SChris Lattner         return;
35730fdc8d8SChris Lattner 
3586611103cSGreg Clayton     if (m_opaque_sp)
35930fdc8d8SChris Lattner     {
36030fdc8d8SChris Lattner         DescriptionLevel level;
36130fdc8d8SChris Lattner         if (strcmp (description_level, "brief") == 0)
36230fdc8d8SChris Lattner             level = eDescriptionLevelBrief;
36330fdc8d8SChris Lattner         else if (strcmp (description_level, "full") == 0)
36430fdc8d8SChris Lattner             level = eDescriptionLevelFull;
36530fdc8d8SChris Lattner         else if (strcmp (description_level, "verbose") == 0)
36630fdc8d8SChris Lattner             level = eDescriptionLevelVerbose;
36730fdc8d8SChris Lattner         else
36830fdc8d8SChris Lattner             level = eDescriptionLevelBrief;
36930fdc8d8SChris Lattner 
37030fdc8d8SChris Lattner         StreamFile str (f);
37130fdc8d8SChris Lattner 
3726611103cSGreg Clayton         m_opaque_sp->GetDescription (&str, level);
37330fdc8d8SChris Lattner         str.EOL();
37430fdc8d8SChris Lattner         if (describe_locations)
37530fdc8d8SChris Lattner         {
37630fdc8d8SChris Lattner           //str.IndentMore();
3776611103cSGreg Clayton           // int num_locs = m_opaque_sp->GetNumLocations();
37830fdc8d8SChris Lattner           //  for (int i = 0; i < num_locs; ++i)
37930fdc8d8SChris Lattner           //  {
3806611103cSGreg Clayton           //      BreakpointLocation *loc = m_opaque_sp->FindLocationByIndex (i);
38130fdc8d8SChris Lattner           //      loc->GetDescription (&str, level);
38230fdc8d8SChris Lattner           //      str.EOL();
38330fdc8d8SChris Lattner           //  }
38430fdc8d8SChris Lattner             ListLocations (f, description_level);
38530fdc8d8SChris Lattner         }
38630fdc8d8SChris Lattner     }
38730fdc8d8SChris Lattner }
38830fdc8d8SChris Lattner 
38930fdc8d8SChris Lattner bool
39030fdc8d8SChris Lattner SBBreakpoint::PrivateBreakpointHitCallback
39130fdc8d8SChris Lattner (
39230fdc8d8SChris Lattner     void *baton,
39330fdc8d8SChris Lattner     StoppointCallbackContext *ctx,
39430fdc8d8SChris Lattner     lldb::user_id_t break_id,
39530fdc8d8SChris Lattner     lldb::user_id_t break_loc_id
39630fdc8d8SChris Lattner )
39730fdc8d8SChris Lattner {
3986611103cSGreg Clayton     BreakpointSP bp_sp(ctx->exe_ctx.target->GetBreakpointList().FindBreakpointByID(break_id));
39930fdc8d8SChris Lattner     if (baton && bp_sp)
40030fdc8d8SChris Lattner     {
40130fdc8d8SChris Lattner         CallbackData *data = (CallbackData *)baton;
40230fdc8d8SChris Lattner         lldb_private::Breakpoint *bp = bp_sp.get();
40330fdc8d8SChris Lattner         if (bp && data->callback)
40430fdc8d8SChris Lattner         {
4056611103cSGreg Clayton             if (ctx->exe_ctx.process)
40630fdc8d8SChris Lattner             {
4076611103cSGreg Clayton                 SBProcess sb_process (ctx->exe_ctx.process->GetSP());
40830fdc8d8SChris Lattner                 SBThread sb_thread;
40930fdc8d8SChris Lattner                 SBBreakpointLocation sb_location;
41030fdc8d8SChris Lattner                 assert (bp_sp);
41130fdc8d8SChris Lattner                 sb_location.SetLocation (bp_sp->FindLocationByID (break_loc_id));
4126611103cSGreg Clayton                 if (ctx->exe_ctx.thread)
4136611103cSGreg Clayton                     sb_thread.SetThread(ctx->exe_ctx.thread->GetSP());
41430fdc8d8SChris Lattner 
41530fdc8d8SChris Lattner                 return data->callback (data->callback_baton,
41630fdc8d8SChris Lattner                                           sb_process,
41730fdc8d8SChris Lattner                                           sb_thread,
41830fdc8d8SChris Lattner                                           sb_location);
41930fdc8d8SChris Lattner             }
42030fdc8d8SChris Lattner         }
42130fdc8d8SChris Lattner     }
42230fdc8d8SChris Lattner     return true;    // Return true if we should stop at this breakpoint
42330fdc8d8SChris Lattner }
42430fdc8d8SChris Lattner 
42530fdc8d8SChris Lattner void
42630fdc8d8SChris Lattner SBBreakpoint::SetCallback (BreakpointHitCallback callback, void *baton)
42730fdc8d8SChris Lattner {
4286611103cSGreg Clayton     if (m_opaque_sp.get())
42930fdc8d8SChris Lattner     {
43030fdc8d8SChris Lattner         BatonSP baton_sp(new SBBreakpointCallbackBaton (callback, baton));
4316611103cSGreg Clayton         m_opaque_sp->SetCallback (SBBreakpoint::PrivateBreakpointHitCallback, baton_sp, false);
43230fdc8d8SChris Lattner     }
43330fdc8d8SChris Lattner }
43430fdc8d8SChris Lattner 
43530fdc8d8SChris Lattner 
43630fdc8d8SChris Lattner lldb_private::Breakpoint *
43730fdc8d8SChris Lattner SBBreakpoint::operator->() const
43830fdc8d8SChris Lattner {
4396611103cSGreg Clayton     return m_opaque_sp.get();
44030fdc8d8SChris Lattner }
44130fdc8d8SChris Lattner 
44230fdc8d8SChris Lattner lldb_private::Breakpoint *
44330fdc8d8SChris Lattner SBBreakpoint::get() const
44430fdc8d8SChris Lattner {
4456611103cSGreg Clayton     return m_opaque_sp.get();
44630fdc8d8SChris Lattner }
44730fdc8d8SChris Lattner 
44830fdc8d8SChris Lattner lldb::BreakpointSP &
44930fdc8d8SChris Lattner SBBreakpoint::operator *()
45030fdc8d8SChris Lattner {
4516611103cSGreg Clayton     return m_opaque_sp;
45230fdc8d8SChris Lattner }
45330fdc8d8SChris Lattner 
45430fdc8d8SChris Lattner const lldb::BreakpointSP &
45530fdc8d8SChris Lattner SBBreakpoint::operator *() const
45630fdc8d8SChris Lattner {
4576611103cSGreg Clayton     return m_opaque_sp;
45830fdc8d8SChris Lattner }
45930fdc8d8SChris Lattner 
460