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 95ac2eb9b1SGreg Clayton bool 96ac2eb9b1SGreg Clayton SBBreakpoint::operator == (const lldb::SBBreakpoint& rhs) 97ac2eb9b1SGreg Clayton { 98ac2eb9b1SGreg Clayton if (m_opaque_sp && rhs.m_opaque_sp) 99ac2eb9b1SGreg Clayton return m_opaque_sp.get() == rhs.m_opaque_sp.get(); 100ac2eb9b1SGreg Clayton return false; 101ac2eb9b1SGreg Clayton } 102ac2eb9b1SGreg Clayton 10330fdc8d8SChris Lattner break_id_t 10430fdc8d8SChris Lattner SBBreakpoint::GetID () const 10530fdc8d8SChris Lattner { 1062d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 107ceb6b139SCaroline Tice 108af67cecdSGreg Clayton break_id_t break_id = LLDB_INVALID_BREAK_ID; 1096611103cSGreg Clayton if (m_opaque_sp) 110af67cecdSGreg Clayton break_id = m_opaque_sp->GetID(); 111af67cecdSGreg Clayton 112ceb6b139SCaroline Tice if (log) 113af67cecdSGreg Clayton { 114af67cecdSGreg Clayton if (break_id == LLDB_INVALID_BREAK_ID) 115af67cecdSGreg Clayton log->Printf ("SBBreakpoint(%p)::GetID () => LLDB_INVALID_BREAK_ID", m_opaque_sp.get()); 116af67cecdSGreg Clayton else 1174838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::GetID () => %u", m_opaque_sp.get(), break_id); 118ceb6b139SCaroline Tice } 119ceb6b139SCaroline Tice 120af67cecdSGreg Clayton return break_id; 12130fdc8d8SChris Lattner } 12230fdc8d8SChris Lattner 12330fdc8d8SChris Lattner 12430fdc8d8SChris Lattner bool 12530fdc8d8SChris Lattner SBBreakpoint::IsValid() const 12630fdc8d8SChris Lattner { 127f94e1791SJim Ingham return (bool) m_opaque_sp; 12830fdc8d8SChris Lattner } 12930fdc8d8SChris Lattner 13030fdc8d8SChris Lattner void 13130fdc8d8SChris Lattner SBBreakpoint::ClearAllBreakpointSites () 13230fdc8d8SChris Lattner { 1336611103cSGreg Clayton if (m_opaque_sp) 134af67cecdSGreg Clayton { 135af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 1366611103cSGreg Clayton m_opaque_sp->ClearAllBreakpointSites (); 13730fdc8d8SChris Lattner } 138af67cecdSGreg Clayton } 13930fdc8d8SChris Lattner 14030fdc8d8SChris Lattner SBBreakpointLocation 14130fdc8d8SChris Lattner SBBreakpoint::FindLocationByAddress (addr_t vm_addr) 14230fdc8d8SChris Lattner { 14330fdc8d8SChris Lattner SBBreakpointLocation sb_bp_location; 14430fdc8d8SChris Lattner 1456611103cSGreg Clayton if (m_opaque_sp) 14630fdc8d8SChris Lattner { 14730fdc8d8SChris Lattner if (vm_addr != LLDB_INVALID_ADDRESS) 14830fdc8d8SChris Lattner { 149af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 15030fdc8d8SChris Lattner Address address; 151f5e56de0SGreg Clayton Target &target = m_opaque_sp->GetTarget(); 152f5e56de0SGreg Clayton if (target.GetSectionLoadList().ResolveLoadAddress (vm_addr, address) == false) 15330fdc8d8SChris Lattner { 154e72dfb32SGreg Clayton address.SetRawAddress (vm_addr); 15530fdc8d8SChris Lattner } 1566611103cSGreg Clayton sb_bp_location.SetLocation (m_opaque_sp->FindLocationByAddress (address)); 15730fdc8d8SChris Lattner } 15830fdc8d8SChris Lattner } 15930fdc8d8SChris Lattner return sb_bp_location; 16030fdc8d8SChris Lattner } 16130fdc8d8SChris Lattner 16230fdc8d8SChris Lattner break_id_t 16330fdc8d8SChris Lattner SBBreakpoint::FindLocationIDByAddress (addr_t vm_addr) 16430fdc8d8SChris Lattner { 165af67cecdSGreg Clayton break_id_t break_id = LLDB_INVALID_BREAK_ID; 16630fdc8d8SChris Lattner 167af67cecdSGreg Clayton if (m_opaque_sp && vm_addr != LLDB_INVALID_ADDRESS) 16830fdc8d8SChris Lattner { 169af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 17030fdc8d8SChris Lattner Address address; 171f5e56de0SGreg Clayton Target &target = m_opaque_sp->GetTarget(); 172f5e56de0SGreg Clayton if (target.GetSectionLoadList().ResolveLoadAddress (vm_addr, address) == false) 17330fdc8d8SChris Lattner { 174e72dfb32SGreg Clayton address.SetRawAddress (vm_addr); 17530fdc8d8SChris Lattner } 176af67cecdSGreg Clayton break_id = m_opaque_sp->FindLocationIDByAddress (address); 17730fdc8d8SChris Lattner } 17830fdc8d8SChris Lattner 179af67cecdSGreg Clayton return break_id; 18030fdc8d8SChris Lattner } 18130fdc8d8SChris Lattner 18230fdc8d8SChris Lattner SBBreakpointLocation 18330fdc8d8SChris Lattner SBBreakpoint::FindLocationByID (break_id_t bp_loc_id) 18430fdc8d8SChris Lattner { 18530fdc8d8SChris Lattner SBBreakpointLocation sb_bp_location; 18630fdc8d8SChris Lattner 1876611103cSGreg Clayton if (m_opaque_sp) 188af67cecdSGreg Clayton { 189af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 1906611103cSGreg Clayton sb_bp_location.SetLocation (m_opaque_sp->FindLocationByID (bp_loc_id)); 191af67cecdSGreg Clayton } 19230fdc8d8SChris Lattner 19330fdc8d8SChris Lattner return sb_bp_location; 19430fdc8d8SChris Lattner } 19530fdc8d8SChris Lattner 19630fdc8d8SChris Lattner SBBreakpointLocation 19730fdc8d8SChris Lattner SBBreakpoint::GetLocationAtIndex (uint32_t index) 19830fdc8d8SChris Lattner { 19930fdc8d8SChris Lattner SBBreakpointLocation sb_bp_location; 20030fdc8d8SChris Lattner 2016611103cSGreg Clayton if (m_opaque_sp) 202af67cecdSGreg Clayton { 203af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 2046611103cSGreg Clayton sb_bp_location.SetLocation (m_opaque_sp->GetLocationAtIndex (index)); 205af67cecdSGreg Clayton } 20630fdc8d8SChris Lattner 20730fdc8d8SChris Lattner return sb_bp_location; 20830fdc8d8SChris Lattner } 20930fdc8d8SChris Lattner 21030fdc8d8SChris Lattner void 21130fdc8d8SChris Lattner SBBreakpoint::SetEnabled (bool enable) 21230fdc8d8SChris Lattner { 2132d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 214ceb6b139SCaroline Tice 215ceb6b139SCaroline Tice if (log) 2164838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::SetEnabled (enabled=%i)", m_opaque_sp.get(), enable); 217ceb6b139SCaroline Tice 2186611103cSGreg Clayton if (m_opaque_sp) 219af67cecdSGreg Clayton { 220af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 2216611103cSGreg Clayton m_opaque_sp->SetEnabled (enable); 22230fdc8d8SChris Lattner } 223af67cecdSGreg Clayton } 22430fdc8d8SChris Lattner 22530fdc8d8SChris Lattner bool 22630fdc8d8SChris Lattner SBBreakpoint::IsEnabled () 22730fdc8d8SChris Lattner { 2286611103cSGreg Clayton if (m_opaque_sp) 229af67cecdSGreg Clayton { 230af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 2316611103cSGreg Clayton return m_opaque_sp->IsEnabled(); 232af67cecdSGreg Clayton } 23330fdc8d8SChris Lattner else 23430fdc8d8SChris Lattner return false; 23530fdc8d8SChris Lattner } 23630fdc8d8SChris Lattner 237*ca36cd16SJim Ingham void 238*ca36cd16SJim Ingham SBBreakpoint::SetOneShot (bool one_shot) 239*ca36cd16SJim Ingham { 240*ca36cd16SJim Ingham LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 241*ca36cd16SJim Ingham 242*ca36cd16SJim Ingham if (log) 243*ca36cd16SJim Ingham log->Printf ("SBBreakpoint(%p)::SetOneShot (one_shot=%i)", m_opaque_sp.get(), one_shot); 244*ca36cd16SJim Ingham 245*ca36cd16SJim Ingham if (m_opaque_sp) 246*ca36cd16SJim Ingham { 247*ca36cd16SJim Ingham Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 248*ca36cd16SJim Ingham m_opaque_sp->SetOneShot (one_shot); 249*ca36cd16SJim Ingham } 250*ca36cd16SJim Ingham } 251*ca36cd16SJim Ingham 252*ca36cd16SJim Ingham bool 253*ca36cd16SJim Ingham SBBreakpoint::IsOneShot () const 254*ca36cd16SJim Ingham { 255*ca36cd16SJim Ingham if (m_opaque_sp) 256*ca36cd16SJim Ingham { 257*ca36cd16SJim Ingham Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 258*ca36cd16SJim Ingham return m_opaque_sp->IsOneShot(); 259*ca36cd16SJim Ingham } 260*ca36cd16SJim Ingham else 261*ca36cd16SJim Ingham return false; 262*ca36cd16SJim Ingham } 263*ca36cd16SJim Ingham 26411c8108dSJim Ingham bool 26511c8108dSJim Ingham SBBreakpoint::IsInternal () 26611c8108dSJim Ingham { 26711c8108dSJim Ingham if (m_opaque_sp) 26811c8108dSJim Ingham { 26911c8108dSJim Ingham Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 27011c8108dSJim Ingham return m_opaque_sp->IsInternal(); 27111c8108dSJim Ingham } 27211c8108dSJim Ingham else 27311c8108dSJim Ingham return false; 27411c8108dSJim Ingham } 27511c8108dSJim Ingham 27630fdc8d8SChris Lattner void 277c982c768SGreg Clayton SBBreakpoint::SetIgnoreCount (uint32_t count) 27830fdc8d8SChris Lattner { 2792d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 280ceb6b139SCaroline Tice 281ceb6b139SCaroline Tice if (log) 2824838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::SetIgnoreCount (count=%u)", m_opaque_sp.get(), count); 283ceb6b139SCaroline Tice 2846611103cSGreg Clayton if (m_opaque_sp) 285af67cecdSGreg Clayton { 286af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 2876611103cSGreg Clayton m_opaque_sp->SetIgnoreCount (count); 28830fdc8d8SChris Lattner } 289af67cecdSGreg Clayton } 29030fdc8d8SChris Lattner 291041a12fcSJim Ingham void 292041a12fcSJim Ingham SBBreakpoint::SetCondition (const char *condition) 293041a12fcSJim Ingham { 294af67cecdSGreg Clayton if (m_opaque_sp) 295af67cecdSGreg Clayton { 296af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 297041a12fcSJim Ingham m_opaque_sp->SetCondition (condition); 298041a12fcSJim Ingham } 299af67cecdSGreg Clayton } 300041a12fcSJim Ingham 301041a12fcSJim Ingham const char * 302041a12fcSJim Ingham SBBreakpoint::GetCondition () 303041a12fcSJim Ingham { 304af67cecdSGreg Clayton if (m_opaque_sp) 305af67cecdSGreg Clayton { 306af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 307041a12fcSJim Ingham return m_opaque_sp->GetConditionText (); 308041a12fcSJim Ingham } 309af67cecdSGreg Clayton return NULL; 310af67cecdSGreg Clayton } 311041a12fcSJim Ingham 312c982c768SGreg Clayton uint32_t 3139fed0d85SGreg Clayton SBBreakpoint::GetHitCount () const 3149fed0d85SGreg Clayton { 3154838131bSGreg Clayton uint32_t count = 0; 3169fed0d85SGreg Clayton if (m_opaque_sp) 317af67cecdSGreg Clayton { 318af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 3194838131bSGreg Clayton count = m_opaque_sp->GetHitCount(); 320af67cecdSGreg Clayton } 3214838131bSGreg Clayton 3222d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 323ceb6b139SCaroline Tice if (log) 3244838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::GetHitCount () => %u", m_opaque_sp.get(), count); 3254838131bSGreg Clayton 3264838131bSGreg Clayton return count; 327ceb6b139SCaroline Tice } 3289fed0d85SGreg Clayton 3299fed0d85SGreg Clayton uint32_t 33030fdc8d8SChris Lattner SBBreakpoint::GetIgnoreCount () const 33130fdc8d8SChris Lattner { 3324838131bSGreg Clayton uint32_t count = 0; 3336611103cSGreg Clayton if (m_opaque_sp) 334af67cecdSGreg Clayton { 335af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 3364838131bSGreg Clayton count = m_opaque_sp->GetIgnoreCount(); 337af67cecdSGreg Clayton } 3384838131bSGreg Clayton 3392d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3404838131bSGreg Clayton if (log) 3414838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::GetIgnoreCount () => %u", m_opaque_sp.get(), count); 3424838131bSGreg Clayton 3434838131bSGreg Clayton return count; 34430fdc8d8SChris Lattner } 34530fdc8d8SChris Lattner 34630fdc8d8SChris Lattner void 3474838131bSGreg Clayton SBBreakpoint::SetThreadID (tid_t tid) 34830fdc8d8SChris Lattner { 3496611103cSGreg Clayton if (m_opaque_sp) 350af67cecdSGreg Clayton { 351af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 3524838131bSGreg Clayton m_opaque_sp->SetThreadID (tid); 353af67cecdSGreg Clayton } 3542d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3554838131bSGreg Clayton if (log) 35661e7a58cSGreg Clayton log->Printf ("SBBreakpoint(%p)::SetThreadID (tid=0x%4.4llx)", m_opaque_sp.get(), tid); 3574838131bSGreg Clayton 35830fdc8d8SChris Lattner } 35930fdc8d8SChris Lattner 36030fdc8d8SChris Lattner tid_t 36130fdc8d8SChris Lattner SBBreakpoint::GetThreadID () 36230fdc8d8SChris Lattner { 3634838131bSGreg Clayton tid_t tid = LLDB_INVALID_THREAD_ID; 3646611103cSGreg Clayton if (m_opaque_sp) 365af67cecdSGreg Clayton { 366af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 3674838131bSGreg Clayton tid = m_opaque_sp->GetThreadID(); 368af67cecdSGreg Clayton } 36930fdc8d8SChris Lattner 3702d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3714838131bSGreg Clayton if (log) 37261e7a58cSGreg Clayton log->Printf ("SBBreakpoint(%p)::GetThreadID () => 0x%4.4llx", m_opaque_sp.get(), tid); 3734838131bSGreg Clayton return tid; 37430fdc8d8SChris Lattner } 37530fdc8d8SChris Lattner 37662b02c61SJim Ingham void 37762b02c61SJim Ingham SBBreakpoint::SetThreadIndex (uint32_t index) 37862b02c61SJim Ingham { 3792d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3804838131bSGreg Clayton if (log) 3814838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::SetThreadIndex (%u)", m_opaque_sp.get(), index); 3826611103cSGreg Clayton if (m_opaque_sp) 383af67cecdSGreg Clayton { 384af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 3856611103cSGreg Clayton m_opaque_sp->GetOptions()->GetThreadSpec()->SetIndex (index); 38662b02c61SJim Ingham } 387af67cecdSGreg Clayton } 38862b02c61SJim Ingham 38962b02c61SJim Ingham uint32_t 39062b02c61SJim Ingham SBBreakpoint::GetThreadIndex() const 39162b02c61SJim Ingham { 392bdf4c6acSGreg Clayton uint32_t thread_idx = UINT32_MAX; 3936611103cSGreg Clayton if (m_opaque_sp) 39462b02c61SJim Ingham { 395af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 396af67cecdSGreg Clayton const ThreadSpec *thread_spec = m_opaque_sp->GetOptions()->GetThreadSpecNoCreate(); 397763d1a17SJohnny Chen if (thread_spec != NULL) 3984838131bSGreg Clayton thread_idx = thread_spec->GetIndex(); 39962b02c61SJim Ingham } 4002d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4014838131bSGreg Clayton if (log) 402bdf4c6acSGreg Clayton log->Printf ("SBBreakpoint(%p)::GetThreadIndex () => %u", m_opaque_sp.get(), thread_idx); 4034838131bSGreg Clayton 404763d1a17SJohnny Chen return thread_idx; 40562b02c61SJim Ingham } 40662b02c61SJim Ingham 40762b02c61SJim Ingham 40862b02c61SJim Ingham void 40962b02c61SJim Ingham SBBreakpoint::SetThreadName (const char *thread_name) 41062b02c61SJim Ingham { 4112d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4124838131bSGreg Clayton if (log) 4134838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::SetThreadName (%s)", m_opaque_sp.get(), thread_name); 4144838131bSGreg Clayton 4156611103cSGreg Clayton if (m_opaque_sp) 416af67cecdSGreg Clayton { 417af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 4186611103cSGreg Clayton m_opaque_sp->GetOptions()->GetThreadSpec()->SetName (thread_name); 41962b02c61SJim Ingham } 420af67cecdSGreg Clayton } 42162b02c61SJim Ingham 42262b02c61SJim Ingham const char * 42362b02c61SJim Ingham SBBreakpoint::GetThreadName () const 42462b02c61SJim Ingham { 4254838131bSGreg Clayton const char *name = NULL; 4266611103cSGreg Clayton if (m_opaque_sp) 42762b02c61SJim Ingham { 428af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 429af67cecdSGreg Clayton const ThreadSpec *thread_spec = m_opaque_sp->GetOptions()->GetThreadSpecNoCreate(); 430763d1a17SJohnny Chen if (thread_spec != NULL) 4314838131bSGreg Clayton name = thread_spec->GetName(); 43262b02c61SJim Ingham } 4332d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4344838131bSGreg Clayton if (log) 4354838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::GetThreadName () => %s", m_opaque_sp.get(), name); 4364838131bSGreg Clayton 4374838131bSGreg Clayton return name; 43862b02c61SJim Ingham } 43962b02c61SJim Ingham 44062b02c61SJim Ingham void 44162b02c61SJim Ingham SBBreakpoint::SetQueueName (const char *queue_name) 44262b02c61SJim Ingham { 4432d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4444838131bSGreg Clayton if (log) 4454838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::SetQueueName (%s)", m_opaque_sp.get(), queue_name); 4466611103cSGreg Clayton if (m_opaque_sp) 447af67cecdSGreg Clayton { 448af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 4496611103cSGreg Clayton m_opaque_sp->GetOptions()->GetThreadSpec()->SetQueueName (queue_name); 45062b02c61SJim Ingham } 451af67cecdSGreg Clayton } 45262b02c61SJim Ingham 45362b02c61SJim Ingham const char * 45462b02c61SJim Ingham SBBreakpoint::GetQueueName () const 45562b02c61SJim Ingham { 4564838131bSGreg Clayton const char *name = NULL; 4576611103cSGreg Clayton if (m_opaque_sp) 45862b02c61SJim Ingham { 459af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 460af67cecdSGreg Clayton const ThreadSpec *thread_spec = m_opaque_sp->GetOptions()->GetThreadSpecNoCreate(); 461af67cecdSGreg Clayton if (thread_spec) 4624838131bSGreg Clayton name = thread_spec->GetQueueName(); 46362b02c61SJim Ingham } 4642d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4654838131bSGreg Clayton if (log) 4664838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::GetQueueName () => %s", m_opaque_sp.get(), name); 4674838131bSGreg Clayton 4684838131bSGreg Clayton return name; 46962b02c61SJim Ingham } 47062b02c61SJim Ingham 47130fdc8d8SChris Lattner size_t 47230fdc8d8SChris Lattner SBBreakpoint::GetNumResolvedLocations() const 47330fdc8d8SChris Lattner { 4744838131bSGreg Clayton size_t num_resolved = 0; 4756611103cSGreg Clayton if (m_opaque_sp) 476af67cecdSGreg Clayton { 477af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 4784838131bSGreg Clayton num_resolved = m_opaque_sp->GetNumResolvedLocations(); 479af67cecdSGreg Clayton } 4802d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4814838131bSGreg Clayton if (log) 48243e0af06SGreg Clayton log->Printf ("SBBreakpoint(%p)::GetNumResolvedLocations () => %llu", m_opaque_sp.get(), (uint64_t)num_resolved); 4834838131bSGreg Clayton return num_resolved; 48430fdc8d8SChris Lattner } 48530fdc8d8SChris Lattner 48630fdc8d8SChris Lattner size_t 48730fdc8d8SChris Lattner SBBreakpoint::GetNumLocations() const 48830fdc8d8SChris Lattner { 4894838131bSGreg Clayton size_t num_locs = 0; 4906611103cSGreg Clayton if (m_opaque_sp) 491af67cecdSGreg Clayton { 492af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 4934838131bSGreg Clayton num_locs = m_opaque_sp->GetNumLocations(); 494af67cecdSGreg Clayton } 4952d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4964838131bSGreg Clayton if (log) 49743e0af06SGreg Clayton log->Printf ("SBBreakpoint(%p)::GetNumLocations () => %llu", m_opaque_sp.get(), (uint64_t)num_locs); 4984838131bSGreg Clayton return num_locs; 49930fdc8d8SChris Lattner } 50030fdc8d8SChris Lattner 501dde9cff3SCaroline Tice bool 50205faeb71SGreg Clayton SBBreakpoint::GetDescription (SBStream &s) 50330fdc8d8SChris Lattner { 5046611103cSGreg Clayton if (m_opaque_sp) 50530fdc8d8SChris Lattner { 506af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 50705faeb71SGreg Clayton s.Printf("SBBreakpoint: id = %i, ", m_opaque_sp->GetID()); 50805faeb71SGreg Clayton m_opaque_sp->GetResolverDescription (s.get()); 50905faeb71SGreg Clayton m_opaque_sp->GetFilterDescription (s.get()); 51005faeb71SGreg Clayton const size_t num_locations = m_opaque_sp->GetNumLocations (); 51143e0af06SGreg Clayton s.Printf(", locations = %llu", (uint64_t)num_locations); 512dde9cff3SCaroline Tice return true; 513dde9cff3SCaroline Tice } 51405faeb71SGreg Clayton s.Printf ("No value"); 51505faeb71SGreg Clayton return false; 51605faeb71SGreg Clayton } 517dde9cff3SCaroline Tice 51830fdc8d8SChris Lattner bool 51930fdc8d8SChris Lattner SBBreakpoint::PrivateBreakpointHitCallback 52030fdc8d8SChris Lattner ( 52130fdc8d8SChris Lattner void *baton, 52230fdc8d8SChris Lattner StoppointCallbackContext *ctx, 52330fdc8d8SChris Lattner lldb::user_id_t break_id, 52430fdc8d8SChris Lattner lldb::user_id_t break_loc_id 52530fdc8d8SChris Lattner ) 52630fdc8d8SChris Lattner { 5271ac04c30SGreg Clayton ExecutionContext exe_ctx (ctx->exe_ctx_ref); 5281ac04c30SGreg Clayton BreakpointSP bp_sp(exe_ctx.GetTargetRef().GetBreakpointList().FindBreakpointByID(break_id)); 52930fdc8d8SChris Lattner if (baton && bp_sp) 53030fdc8d8SChris Lattner { 53130fdc8d8SChris Lattner CallbackData *data = (CallbackData *)baton; 53230fdc8d8SChris Lattner lldb_private::Breakpoint *bp = bp_sp.get(); 53330fdc8d8SChris Lattner if (bp && data->callback) 53430fdc8d8SChris Lattner { 5351ac04c30SGreg Clayton Process *process = exe_ctx.GetProcessPtr(); 536c14ee32dSGreg Clayton if (process) 53730fdc8d8SChris Lattner { 538e1cd1be6SGreg Clayton SBProcess sb_process (process->shared_from_this()); 53930fdc8d8SChris Lattner SBThread sb_thread; 54030fdc8d8SChris Lattner SBBreakpointLocation sb_location; 54130fdc8d8SChris Lattner assert (bp_sp); 54230fdc8d8SChris Lattner sb_location.SetLocation (bp_sp->FindLocationByID (break_loc_id)); 5431ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 544c14ee32dSGreg Clayton if (thread) 545e1cd1be6SGreg Clayton sb_thread.SetThread(thread->shared_from_this()); 54630fdc8d8SChris Lattner 54730fdc8d8SChris Lattner return data->callback (data->callback_baton, 54830fdc8d8SChris Lattner sb_process, 54930fdc8d8SChris Lattner sb_thread, 55030fdc8d8SChris Lattner sb_location); 55130fdc8d8SChris Lattner } 55230fdc8d8SChris Lattner } 55330fdc8d8SChris Lattner } 55430fdc8d8SChris Lattner return true; // Return true if we should stop at this breakpoint 55530fdc8d8SChris Lattner } 55630fdc8d8SChris Lattner 55730fdc8d8SChris Lattner void 55830fdc8d8SChris Lattner SBBreakpoint::SetCallback (BreakpointHitCallback callback, void *baton) 55930fdc8d8SChris Lattner { 5602d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 561ceb6b139SCaroline Tice 562ceb6b139SCaroline Tice if (log) 5634838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::SetCallback (callback=%p, baton=%p)", m_opaque_sp.get(), callback, baton); 564ceb6b139SCaroline Tice 565c14ee32dSGreg Clayton if (m_opaque_sp) 56630fdc8d8SChris Lattner { 567af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 56830fdc8d8SChris Lattner BatonSP baton_sp(new SBBreakpointCallbackBaton (callback, baton)); 5696611103cSGreg Clayton m_opaque_sp->SetCallback (SBBreakpoint::PrivateBreakpointHitCallback, baton_sp, false); 57030fdc8d8SChris Lattner } 57130fdc8d8SChris Lattner } 57230fdc8d8SChris Lattner 57330fdc8d8SChris Lattner 57430fdc8d8SChris Lattner lldb_private::Breakpoint * 57530fdc8d8SChris Lattner SBBreakpoint::operator->() const 57630fdc8d8SChris Lattner { 5776611103cSGreg Clayton return m_opaque_sp.get(); 57830fdc8d8SChris Lattner } 57930fdc8d8SChris Lattner 58030fdc8d8SChris Lattner lldb_private::Breakpoint * 58130fdc8d8SChris Lattner SBBreakpoint::get() const 58230fdc8d8SChris Lattner { 5836611103cSGreg Clayton return m_opaque_sp.get(); 58430fdc8d8SChris Lattner } 58530fdc8d8SChris Lattner 58630fdc8d8SChris Lattner lldb::BreakpointSP & 58730fdc8d8SChris Lattner SBBreakpoint::operator *() 58830fdc8d8SChris Lattner { 5896611103cSGreg Clayton return m_opaque_sp; 59030fdc8d8SChris Lattner } 59130fdc8d8SChris Lattner 59230fdc8d8SChris Lattner const lldb::BreakpointSP & 59330fdc8d8SChris Lattner SBBreakpoint::operator *() const 59430fdc8d8SChris Lattner { 5956611103cSGreg Clayton return m_opaque_sp; 59630fdc8d8SChris Lattner } 59730fdc8d8SChris Lattner 598e6bc6cb9SJim Ingham bool 599e6bc6cb9SJim Ingham SBBreakpoint::EventIsBreakpointEvent (const lldb::SBEvent &event) 600e6bc6cb9SJim Ingham { 601e6bc6cb9SJim Ingham return Breakpoint::BreakpointEventData::GetEventDataFromEvent(event.get()) != NULL; 602e6bc6cb9SJim Ingham 603e6bc6cb9SJim Ingham } 604e6bc6cb9SJim Ingham 6059fed0d85SGreg Clayton BreakpointEventType 6069fed0d85SGreg Clayton SBBreakpoint::GetBreakpointEventTypeFromEvent (const SBEvent& event) 6079fed0d85SGreg Clayton { 6089fed0d85SGreg Clayton if (event.IsValid()) 6099fed0d85SGreg Clayton return Breakpoint::BreakpointEventData::GetBreakpointEventTypeFromEvent (event.GetSP()); 6109fed0d85SGreg Clayton return eBreakpointEventTypeInvalidType; 6119fed0d85SGreg Clayton } 6129fed0d85SGreg Clayton 6139fed0d85SGreg Clayton SBBreakpoint 6149fed0d85SGreg Clayton SBBreakpoint::GetBreakpointFromEvent (const lldb::SBEvent& event) 6159fed0d85SGreg Clayton { 6169fed0d85SGreg Clayton SBBreakpoint sb_breakpoint; 6179fed0d85SGreg Clayton if (event.IsValid()) 6189fed0d85SGreg Clayton sb_breakpoint.m_opaque_sp = Breakpoint::BreakpointEventData::GetBreakpointFromEvent (event.GetSP()); 6199fed0d85SGreg Clayton return sb_breakpoint; 6209fed0d85SGreg Clayton } 6219fed0d85SGreg Clayton 6229fed0d85SGreg Clayton SBBreakpointLocation 6239fed0d85SGreg Clayton SBBreakpoint::GetBreakpointLocationAtIndexFromEvent (const lldb::SBEvent& event, uint32_t loc_idx) 6249fed0d85SGreg Clayton { 6259fed0d85SGreg Clayton SBBreakpointLocation sb_breakpoint_loc; 6269fed0d85SGreg Clayton if (event.IsValid()) 6279fed0d85SGreg Clayton sb_breakpoint_loc.SetLocation (Breakpoint::BreakpointEventData::GetBreakpointLocationAtIndexFromEvent (event.GetSP(), loc_idx)); 6289fed0d85SGreg Clayton return sb_breakpoint_loc; 6299fed0d85SGreg Clayton } 6309fed0d85SGreg Clayton 631e6bc6cb9SJim Ingham uint32_t 632e6bc6cb9SJim Ingham SBBreakpoint::GetNumBreakpointLocationsFromEvent (const lldb::SBEvent &event) 633e6bc6cb9SJim Ingham { 634e6bc6cb9SJim Ingham uint32_t num_locations = 0; 635e6bc6cb9SJim Ingham if (event.IsValid()) 636e6bc6cb9SJim Ingham num_locations = (Breakpoint::BreakpointEventData::GetNumBreakpointLocationsFromEvent (event.GetSP())); 637e6bc6cb9SJim Ingham return num_locations; 638e6bc6cb9SJim Ingham } 639e6bc6cb9SJim Ingham 6409fed0d85SGreg Clayton 641