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