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