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" 26*d5944cd1SGreg Clayton #include "lldb/Target/SectionLoadList.h" 2730fdc8d8SChris Lattner #include "lldb/Target/Target.h" 2862b02c61SJim Ingham #include "lldb/Target/Thread.h" 2962b02c61SJim Ingham #include "lldb/Target/ThreadSpec.h" 3030fdc8d8SChris Lattner 3130fdc8d8SChris Lattner 3230fdc8d8SChris Lattner #include "lldb/lldb-enumerations.h" 3330fdc8d8SChris Lattner 3430fdc8d8SChris Lattner using namespace lldb; 3530fdc8d8SChris Lattner using namespace lldb_private; 3630fdc8d8SChris Lattner 3730fdc8d8SChris Lattner struct CallbackData 3830fdc8d8SChris Lattner { 3930fdc8d8SChris Lattner SBBreakpoint::BreakpointHitCallback callback; 4030fdc8d8SChris Lattner void *callback_baton; 4130fdc8d8SChris Lattner }; 4230fdc8d8SChris Lattner 4330fdc8d8SChris Lattner class SBBreakpointCallbackBaton : public Baton 4430fdc8d8SChris Lattner { 4530fdc8d8SChris Lattner public: 4630fdc8d8SChris Lattner 4730fdc8d8SChris Lattner SBBreakpointCallbackBaton (SBBreakpoint::BreakpointHitCallback callback, void *baton) : 4830fdc8d8SChris Lattner Baton (new CallbackData) 4930fdc8d8SChris Lattner { 5030fdc8d8SChris Lattner CallbackData *data = (CallbackData *)m_data; 5130fdc8d8SChris Lattner data->callback = callback; 5230fdc8d8SChris Lattner data->callback_baton = baton; 5330fdc8d8SChris Lattner } 5430fdc8d8SChris Lattner 5530fdc8d8SChris Lattner virtual ~SBBreakpointCallbackBaton() 5630fdc8d8SChris Lattner { 5730fdc8d8SChris Lattner CallbackData *data = (CallbackData *)m_data; 5830fdc8d8SChris Lattner 5930fdc8d8SChris Lattner if (data) 6030fdc8d8SChris Lattner { 6130fdc8d8SChris Lattner delete data; 6230fdc8d8SChris Lattner m_data = NULL; 6330fdc8d8SChris Lattner } 6430fdc8d8SChris Lattner } 6530fdc8d8SChris Lattner }; 6630fdc8d8SChris Lattner 6730fdc8d8SChris Lattner 6830fdc8d8SChris Lattner SBBreakpoint::SBBreakpoint () : 696611103cSGreg Clayton m_opaque_sp () 7030fdc8d8SChris Lattner { 7130fdc8d8SChris Lattner } 7230fdc8d8SChris Lattner 7330fdc8d8SChris Lattner SBBreakpoint::SBBreakpoint (const SBBreakpoint& rhs) : 746611103cSGreg Clayton m_opaque_sp (rhs.m_opaque_sp) 7530fdc8d8SChris Lattner { 7630fdc8d8SChris Lattner } 7730fdc8d8SChris Lattner 7830fdc8d8SChris Lattner 7930fdc8d8SChris Lattner SBBreakpoint::SBBreakpoint (const lldb::BreakpointSP &bp_sp) : 806611103cSGreg Clayton m_opaque_sp (bp_sp) 8130fdc8d8SChris Lattner { 8230fdc8d8SChris Lattner } 8330fdc8d8SChris Lattner 8430fdc8d8SChris Lattner SBBreakpoint::~SBBreakpoint() 8530fdc8d8SChris Lattner { 8630fdc8d8SChris Lattner } 8730fdc8d8SChris Lattner 8830fdc8d8SChris Lattner const SBBreakpoint & 8930fdc8d8SChris Lattner SBBreakpoint::operator = (const SBBreakpoint& rhs) 9030fdc8d8SChris Lattner { 9130fdc8d8SChris Lattner if (this != &rhs) 926611103cSGreg Clayton m_opaque_sp = rhs.m_opaque_sp; 9330fdc8d8SChris Lattner return *this; 9430fdc8d8SChris Lattner } 9530fdc8d8SChris Lattner 96ac2eb9b1SGreg Clayton bool 97ac2eb9b1SGreg Clayton SBBreakpoint::operator == (const lldb::SBBreakpoint& rhs) 98ac2eb9b1SGreg Clayton { 99ac2eb9b1SGreg Clayton if (m_opaque_sp && rhs.m_opaque_sp) 100ac2eb9b1SGreg Clayton return m_opaque_sp.get() == rhs.m_opaque_sp.get(); 101ac2eb9b1SGreg Clayton return false; 102ac2eb9b1SGreg Clayton } 103ac2eb9b1SGreg Clayton 104c3387333SEnrico Granata bool 105c3387333SEnrico Granata SBBreakpoint::operator != (const lldb::SBBreakpoint& rhs) 106c3387333SEnrico Granata { 107c3387333SEnrico Granata if (m_opaque_sp && rhs.m_opaque_sp) 108c3387333SEnrico Granata return m_opaque_sp.get() != rhs.m_opaque_sp.get(); 109c3387333SEnrico Granata return (m_opaque_sp && !rhs.m_opaque_sp) || (rhs.m_opaque_sp && !m_opaque_sp); 110c3387333SEnrico Granata } 111c3387333SEnrico Granata 11230fdc8d8SChris Lattner break_id_t 11330fdc8d8SChris Lattner SBBreakpoint::GetID () const 11430fdc8d8SChris Lattner { 1155160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 116ceb6b139SCaroline Tice 117af67cecdSGreg Clayton break_id_t break_id = LLDB_INVALID_BREAK_ID; 1186611103cSGreg Clayton if (m_opaque_sp) 119af67cecdSGreg Clayton break_id = m_opaque_sp->GetID(); 120af67cecdSGreg Clayton 121ceb6b139SCaroline Tice if (log) 122af67cecdSGreg Clayton { 123af67cecdSGreg Clayton if (break_id == LLDB_INVALID_BREAK_ID) 124af67cecdSGreg Clayton log->Printf ("SBBreakpoint(%p)::GetID () => LLDB_INVALID_BREAK_ID", m_opaque_sp.get()); 125af67cecdSGreg Clayton else 1264838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::GetID () => %u", m_opaque_sp.get(), break_id); 127ceb6b139SCaroline Tice } 128ceb6b139SCaroline Tice 129af67cecdSGreg Clayton return break_id; 13030fdc8d8SChris Lattner } 13130fdc8d8SChris Lattner 13230fdc8d8SChris Lattner 13330fdc8d8SChris Lattner bool 13430fdc8d8SChris Lattner SBBreakpoint::IsValid() const 13530fdc8d8SChris Lattner { 136f94e1791SJim Ingham return (bool) m_opaque_sp; 13730fdc8d8SChris Lattner } 13830fdc8d8SChris Lattner 13930fdc8d8SChris Lattner void 14030fdc8d8SChris Lattner SBBreakpoint::ClearAllBreakpointSites () 14130fdc8d8SChris Lattner { 1426611103cSGreg Clayton if (m_opaque_sp) 143af67cecdSGreg Clayton { 144af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 1456611103cSGreg Clayton m_opaque_sp->ClearAllBreakpointSites (); 14630fdc8d8SChris Lattner } 147af67cecdSGreg Clayton } 14830fdc8d8SChris Lattner 14930fdc8d8SChris Lattner SBBreakpointLocation 15030fdc8d8SChris Lattner SBBreakpoint::FindLocationByAddress (addr_t vm_addr) 15130fdc8d8SChris Lattner { 15230fdc8d8SChris Lattner SBBreakpointLocation sb_bp_location; 15330fdc8d8SChris Lattner 1546611103cSGreg Clayton if (m_opaque_sp) 15530fdc8d8SChris Lattner { 15630fdc8d8SChris Lattner if (vm_addr != LLDB_INVALID_ADDRESS) 15730fdc8d8SChris Lattner { 158af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 15930fdc8d8SChris Lattner Address address; 160f5e56de0SGreg Clayton Target &target = m_opaque_sp->GetTarget(); 161f5e56de0SGreg Clayton if (target.GetSectionLoadList().ResolveLoadAddress (vm_addr, address) == false) 16230fdc8d8SChris Lattner { 163e72dfb32SGreg Clayton address.SetRawAddress (vm_addr); 16430fdc8d8SChris Lattner } 1656611103cSGreg Clayton sb_bp_location.SetLocation (m_opaque_sp->FindLocationByAddress (address)); 16630fdc8d8SChris Lattner } 16730fdc8d8SChris Lattner } 16830fdc8d8SChris Lattner return sb_bp_location; 16930fdc8d8SChris Lattner } 17030fdc8d8SChris Lattner 17130fdc8d8SChris Lattner break_id_t 17230fdc8d8SChris Lattner SBBreakpoint::FindLocationIDByAddress (addr_t vm_addr) 17330fdc8d8SChris Lattner { 174af67cecdSGreg Clayton break_id_t break_id = LLDB_INVALID_BREAK_ID; 17530fdc8d8SChris Lattner 176af67cecdSGreg Clayton if (m_opaque_sp && vm_addr != LLDB_INVALID_ADDRESS) 17730fdc8d8SChris Lattner { 178af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 17930fdc8d8SChris Lattner Address address; 180f5e56de0SGreg Clayton Target &target = m_opaque_sp->GetTarget(); 181f5e56de0SGreg Clayton if (target.GetSectionLoadList().ResolveLoadAddress (vm_addr, address) == false) 18230fdc8d8SChris Lattner { 183e72dfb32SGreg Clayton address.SetRawAddress (vm_addr); 18430fdc8d8SChris Lattner } 185af67cecdSGreg Clayton break_id = m_opaque_sp->FindLocationIDByAddress (address); 18630fdc8d8SChris Lattner } 18730fdc8d8SChris Lattner 188af67cecdSGreg Clayton return break_id; 18930fdc8d8SChris Lattner } 19030fdc8d8SChris Lattner 19130fdc8d8SChris Lattner SBBreakpointLocation 19230fdc8d8SChris Lattner SBBreakpoint::FindLocationByID (break_id_t bp_loc_id) 19330fdc8d8SChris Lattner { 19430fdc8d8SChris Lattner SBBreakpointLocation sb_bp_location; 19530fdc8d8SChris Lattner 1966611103cSGreg Clayton if (m_opaque_sp) 197af67cecdSGreg Clayton { 198af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 1996611103cSGreg Clayton sb_bp_location.SetLocation (m_opaque_sp->FindLocationByID (bp_loc_id)); 200af67cecdSGreg Clayton } 20130fdc8d8SChris Lattner 20230fdc8d8SChris Lattner return sb_bp_location; 20330fdc8d8SChris Lattner } 20430fdc8d8SChris Lattner 20530fdc8d8SChris Lattner SBBreakpointLocation 20630fdc8d8SChris Lattner SBBreakpoint::GetLocationAtIndex (uint32_t index) 20730fdc8d8SChris Lattner { 20830fdc8d8SChris Lattner SBBreakpointLocation sb_bp_location; 20930fdc8d8SChris Lattner 2106611103cSGreg Clayton if (m_opaque_sp) 211af67cecdSGreg Clayton { 212af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 2136611103cSGreg Clayton sb_bp_location.SetLocation (m_opaque_sp->GetLocationAtIndex (index)); 214af67cecdSGreg Clayton } 21530fdc8d8SChris Lattner 21630fdc8d8SChris Lattner return sb_bp_location; 21730fdc8d8SChris Lattner } 21830fdc8d8SChris Lattner 21930fdc8d8SChris Lattner void 22030fdc8d8SChris Lattner SBBreakpoint::SetEnabled (bool enable) 22130fdc8d8SChris Lattner { 2225160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 223ceb6b139SCaroline Tice 224ceb6b139SCaroline Tice if (log) 2254838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::SetEnabled (enabled=%i)", m_opaque_sp.get(), enable); 226ceb6b139SCaroline Tice 2276611103cSGreg Clayton if (m_opaque_sp) 228af67cecdSGreg Clayton { 229af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 2306611103cSGreg Clayton m_opaque_sp->SetEnabled (enable); 23130fdc8d8SChris Lattner } 232af67cecdSGreg Clayton } 23330fdc8d8SChris Lattner 23430fdc8d8SChris Lattner bool 23530fdc8d8SChris Lattner SBBreakpoint::IsEnabled () 23630fdc8d8SChris Lattner { 2376611103cSGreg Clayton if (m_opaque_sp) 238af67cecdSGreg Clayton { 239af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 2406611103cSGreg Clayton return m_opaque_sp->IsEnabled(); 241af67cecdSGreg Clayton } 24230fdc8d8SChris Lattner else 24330fdc8d8SChris Lattner return false; 24430fdc8d8SChris Lattner } 24530fdc8d8SChris Lattner 246ca36cd16SJim Ingham void 247ca36cd16SJim Ingham SBBreakpoint::SetOneShot (bool one_shot) 248ca36cd16SJim Ingham { 2495160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 250ca36cd16SJim Ingham 251ca36cd16SJim Ingham if (log) 252ca36cd16SJim Ingham log->Printf ("SBBreakpoint(%p)::SetOneShot (one_shot=%i)", m_opaque_sp.get(), one_shot); 253ca36cd16SJim Ingham 254ca36cd16SJim Ingham if (m_opaque_sp) 255ca36cd16SJim Ingham { 256ca36cd16SJim Ingham Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 257ca36cd16SJim Ingham m_opaque_sp->SetOneShot (one_shot); 258ca36cd16SJim Ingham } 259ca36cd16SJim Ingham } 260ca36cd16SJim Ingham 261ca36cd16SJim Ingham bool 262ca36cd16SJim Ingham SBBreakpoint::IsOneShot () const 263ca36cd16SJim Ingham { 264ca36cd16SJim Ingham if (m_opaque_sp) 265ca36cd16SJim Ingham { 266ca36cd16SJim Ingham Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 267ca36cd16SJim Ingham return m_opaque_sp->IsOneShot(); 268ca36cd16SJim Ingham } 269ca36cd16SJim Ingham else 270ca36cd16SJim Ingham return false; 271ca36cd16SJim Ingham } 272ca36cd16SJim Ingham 27311c8108dSJim Ingham bool 27411c8108dSJim Ingham SBBreakpoint::IsInternal () 27511c8108dSJim Ingham { 27611c8108dSJim Ingham if (m_opaque_sp) 27711c8108dSJim Ingham { 27811c8108dSJim Ingham Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 27911c8108dSJim Ingham return m_opaque_sp->IsInternal(); 28011c8108dSJim Ingham } 28111c8108dSJim Ingham else 28211c8108dSJim Ingham return false; 28311c8108dSJim Ingham } 28411c8108dSJim Ingham 28530fdc8d8SChris Lattner void 286c982c768SGreg Clayton SBBreakpoint::SetIgnoreCount (uint32_t count) 28730fdc8d8SChris Lattner { 2885160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 289ceb6b139SCaroline Tice 290ceb6b139SCaroline Tice if (log) 2914838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::SetIgnoreCount (count=%u)", m_opaque_sp.get(), count); 292ceb6b139SCaroline Tice 2936611103cSGreg Clayton if (m_opaque_sp) 294af67cecdSGreg Clayton { 295af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 2966611103cSGreg Clayton m_opaque_sp->SetIgnoreCount (count); 29730fdc8d8SChris Lattner } 298af67cecdSGreg Clayton } 29930fdc8d8SChris Lattner 300041a12fcSJim Ingham void 301041a12fcSJim Ingham SBBreakpoint::SetCondition (const char *condition) 302041a12fcSJim Ingham { 303af67cecdSGreg Clayton if (m_opaque_sp) 304af67cecdSGreg Clayton { 305af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 306041a12fcSJim Ingham m_opaque_sp->SetCondition (condition); 307041a12fcSJim Ingham } 308af67cecdSGreg Clayton } 309041a12fcSJim Ingham 310041a12fcSJim Ingham const char * 311041a12fcSJim Ingham SBBreakpoint::GetCondition () 312041a12fcSJim Ingham { 313af67cecdSGreg Clayton if (m_opaque_sp) 314af67cecdSGreg Clayton { 315af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 316041a12fcSJim Ingham return m_opaque_sp->GetConditionText (); 317041a12fcSJim Ingham } 318af67cecdSGreg Clayton return NULL; 319af67cecdSGreg Clayton } 320041a12fcSJim Ingham 321c982c768SGreg Clayton uint32_t 3229fed0d85SGreg Clayton SBBreakpoint::GetHitCount () const 3239fed0d85SGreg Clayton { 3244838131bSGreg Clayton uint32_t count = 0; 3259fed0d85SGreg Clayton if (m_opaque_sp) 326af67cecdSGreg Clayton { 327af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 3284838131bSGreg Clayton count = m_opaque_sp->GetHitCount(); 329af67cecdSGreg Clayton } 3304838131bSGreg Clayton 3315160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 332ceb6b139SCaroline Tice if (log) 3334838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::GetHitCount () => %u", m_opaque_sp.get(), count); 3344838131bSGreg Clayton 3354838131bSGreg Clayton return count; 336ceb6b139SCaroline Tice } 3379fed0d85SGreg Clayton 3389fed0d85SGreg Clayton uint32_t 33930fdc8d8SChris Lattner SBBreakpoint::GetIgnoreCount () const 34030fdc8d8SChris Lattner { 3414838131bSGreg Clayton uint32_t count = 0; 3426611103cSGreg Clayton if (m_opaque_sp) 343af67cecdSGreg Clayton { 344af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 3454838131bSGreg Clayton count = m_opaque_sp->GetIgnoreCount(); 346af67cecdSGreg Clayton } 3474838131bSGreg Clayton 3485160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3494838131bSGreg Clayton if (log) 3504838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::GetIgnoreCount () => %u", m_opaque_sp.get(), count); 3514838131bSGreg Clayton 3524838131bSGreg Clayton return count; 35330fdc8d8SChris Lattner } 35430fdc8d8SChris Lattner 35530fdc8d8SChris Lattner void 3564838131bSGreg Clayton SBBreakpoint::SetThreadID (tid_t tid) 35730fdc8d8SChris Lattner { 3586611103cSGreg Clayton if (m_opaque_sp) 359af67cecdSGreg Clayton { 360af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 3614838131bSGreg Clayton m_opaque_sp->SetThreadID (tid); 362af67cecdSGreg Clayton } 3635160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3644838131bSGreg Clayton if (log) 365d01b2953SDaniel Malea log->Printf ("SBBreakpoint(%p)::SetThreadID (tid=0x%4.4" PRIx64 ")", m_opaque_sp.get(), tid); 3664838131bSGreg Clayton 36730fdc8d8SChris Lattner } 36830fdc8d8SChris Lattner 36930fdc8d8SChris Lattner tid_t 37030fdc8d8SChris Lattner SBBreakpoint::GetThreadID () 37130fdc8d8SChris Lattner { 3724838131bSGreg Clayton tid_t tid = LLDB_INVALID_THREAD_ID; 3736611103cSGreg Clayton if (m_opaque_sp) 374af67cecdSGreg Clayton { 375af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 3764838131bSGreg Clayton tid = m_opaque_sp->GetThreadID(); 377af67cecdSGreg Clayton } 37830fdc8d8SChris Lattner 3795160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3804838131bSGreg Clayton if (log) 381d01b2953SDaniel Malea log->Printf ("SBBreakpoint(%p)::GetThreadID () => 0x%4.4" PRIx64, m_opaque_sp.get(), tid); 3824838131bSGreg Clayton return tid; 38330fdc8d8SChris Lattner } 38430fdc8d8SChris Lattner 38562b02c61SJim Ingham void 38662b02c61SJim Ingham SBBreakpoint::SetThreadIndex (uint32_t index) 38762b02c61SJim Ingham { 3885160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3894838131bSGreg Clayton if (log) 3904838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::SetThreadIndex (%u)", m_opaque_sp.get(), index); 3916611103cSGreg Clayton if (m_opaque_sp) 392af67cecdSGreg Clayton { 393af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 3946611103cSGreg Clayton m_opaque_sp->GetOptions()->GetThreadSpec()->SetIndex (index); 39562b02c61SJim Ingham } 396af67cecdSGreg Clayton } 39762b02c61SJim Ingham 39862b02c61SJim Ingham uint32_t 39962b02c61SJim Ingham SBBreakpoint::GetThreadIndex() const 40062b02c61SJim Ingham { 401bdf4c6acSGreg Clayton uint32_t thread_idx = UINT32_MAX; 4026611103cSGreg Clayton if (m_opaque_sp) 40362b02c61SJim Ingham { 404af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 405af67cecdSGreg Clayton const ThreadSpec *thread_spec = m_opaque_sp->GetOptions()->GetThreadSpecNoCreate(); 406763d1a17SJohnny Chen if (thread_spec != NULL) 4074838131bSGreg Clayton thread_idx = thread_spec->GetIndex(); 40862b02c61SJim Ingham } 4095160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4104838131bSGreg Clayton if (log) 411bdf4c6acSGreg Clayton log->Printf ("SBBreakpoint(%p)::GetThreadIndex () => %u", m_opaque_sp.get(), thread_idx); 4124838131bSGreg Clayton 413763d1a17SJohnny Chen return thread_idx; 41462b02c61SJim Ingham } 41562b02c61SJim Ingham 41662b02c61SJim Ingham 41762b02c61SJim Ingham void 41862b02c61SJim Ingham SBBreakpoint::SetThreadName (const char *thread_name) 41962b02c61SJim Ingham { 4205160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4214838131bSGreg Clayton if (log) 4224838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::SetThreadName (%s)", m_opaque_sp.get(), thread_name); 4234838131bSGreg Clayton 4246611103cSGreg Clayton if (m_opaque_sp) 425af67cecdSGreg Clayton { 426af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 4276611103cSGreg Clayton m_opaque_sp->GetOptions()->GetThreadSpec()->SetName (thread_name); 42862b02c61SJim Ingham } 429af67cecdSGreg Clayton } 43062b02c61SJim Ingham 43162b02c61SJim Ingham const char * 43262b02c61SJim Ingham SBBreakpoint::GetThreadName () const 43362b02c61SJim Ingham { 4344838131bSGreg Clayton const char *name = NULL; 4356611103cSGreg Clayton if (m_opaque_sp) 43662b02c61SJim Ingham { 437af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 438af67cecdSGreg Clayton const ThreadSpec *thread_spec = m_opaque_sp->GetOptions()->GetThreadSpecNoCreate(); 439763d1a17SJohnny Chen if (thread_spec != NULL) 4404838131bSGreg Clayton name = thread_spec->GetName(); 44162b02c61SJim Ingham } 4425160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4434838131bSGreg Clayton if (log) 4444838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::GetThreadName () => %s", m_opaque_sp.get(), name); 4454838131bSGreg Clayton 4464838131bSGreg Clayton return name; 44762b02c61SJim Ingham } 44862b02c61SJim Ingham 44962b02c61SJim Ingham void 45062b02c61SJim Ingham SBBreakpoint::SetQueueName (const char *queue_name) 45162b02c61SJim Ingham { 4525160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4534838131bSGreg Clayton if (log) 4544838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::SetQueueName (%s)", m_opaque_sp.get(), queue_name); 4556611103cSGreg Clayton if (m_opaque_sp) 456af67cecdSGreg Clayton { 457af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 4586611103cSGreg Clayton m_opaque_sp->GetOptions()->GetThreadSpec()->SetQueueName (queue_name); 45962b02c61SJim Ingham } 460af67cecdSGreg Clayton } 46162b02c61SJim Ingham 46262b02c61SJim Ingham const char * 46362b02c61SJim Ingham SBBreakpoint::GetQueueName () const 46462b02c61SJim Ingham { 4654838131bSGreg Clayton const char *name = NULL; 4666611103cSGreg Clayton if (m_opaque_sp) 46762b02c61SJim Ingham { 468af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 469af67cecdSGreg Clayton const ThreadSpec *thread_spec = m_opaque_sp->GetOptions()->GetThreadSpecNoCreate(); 470af67cecdSGreg Clayton if (thread_spec) 4714838131bSGreg Clayton name = thread_spec->GetQueueName(); 47262b02c61SJim Ingham } 4735160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4744838131bSGreg Clayton if (log) 4754838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::GetQueueName () => %s", m_opaque_sp.get(), name); 4764838131bSGreg Clayton 4774838131bSGreg Clayton return name; 47862b02c61SJim Ingham } 47962b02c61SJim Ingham 48030fdc8d8SChris Lattner size_t 48130fdc8d8SChris Lattner SBBreakpoint::GetNumResolvedLocations() const 48230fdc8d8SChris Lattner { 4834838131bSGreg Clayton size_t num_resolved = 0; 4846611103cSGreg Clayton if (m_opaque_sp) 485af67cecdSGreg Clayton { 486af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 4874838131bSGreg Clayton num_resolved = m_opaque_sp->GetNumResolvedLocations(); 488af67cecdSGreg Clayton } 4895160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4904838131bSGreg Clayton if (log) 491d01b2953SDaniel Malea log->Printf ("SBBreakpoint(%p)::GetNumResolvedLocations () => %" PRIu64, m_opaque_sp.get(), (uint64_t)num_resolved); 4924838131bSGreg Clayton return num_resolved; 49330fdc8d8SChris Lattner } 49430fdc8d8SChris Lattner 49530fdc8d8SChris Lattner size_t 49630fdc8d8SChris Lattner SBBreakpoint::GetNumLocations() const 49730fdc8d8SChris Lattner { 4984838131bSGreg Clayton size_t num_locs = 0; 4996611103cSGreg Clayton if (m_opaque_sp) 500af67cecdSGreg Clayton { 501af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 5024838131bSGreg Clayton num_locs = m_opaque_sp->GetNumLocations(); 503af67cecdSGreg Clayton } 5045160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5054838131bSGreg Clayton if (log) 506d01b2953SDaniel Malea log->Printf ("SBBreakpoint(%p)::GetNumLocations () => %" PRIu64, m_opaque_sp.get(), (uint64_t)num_locs); 5074838131bSGreg Clayton return num_locs; 50830fdc8d8SChris Lattner } 50930fdc8d8SChris Lattner 510dde9cff3SCaroline Tice bool 51105faeb71SGreg Clayton SBBreakpoint::GetDescription (SBStream &s) 51230fdc8d8SChris Lattner { 5136611103cSGreg Clayton if (m_opaque_sp) 51430fdc8d8SChris Lattner { 515af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 51605faeb71SGreg Clayton s.Printf("SBBreakpoint: id = %i, ", m_opaque_sp->GetID()); 51705faeb71SGreg Clayton m_opaque_sp->GetResolverDescription (s.get()); 51805faeb71SGreg Clayton m_opaque_sp->GetFilterDescription (s.get()); 51905faeb71SGreg Clayton const size_t num_locations = m_opaque_sp->GetNumLocations (); 520d01b2953SDaniel Malea s.Printf(", locations = %" PRIu64, (uint64_t)num_locations); 521dde9cff3SCaroline Tice return true; 522dde9cff3SCaroline Tice } 52305faeb71SGreg Clayton s.Printf ("No value"); 52405faeb71SGreg Clayton return false; 52505faeb71SGreg Clayton } 526dde9cff3SCaroline Tice 52730fdc8d8SChris Lattner bool 52830fdc8d8SChris Lattner SBBreakpoint::PrivateBreakpointHitCallback 52930fdc8d8SChris Lattner ( 53030fdc8d8SChris Lattner void *baton, 53130fdc8d8SChris Lattner StoppointCallbackContext *ctx, 53230fdc8d8SChris Lattner lldb::user_id_t break_id, 53330fdc8d8SChris Lattner lldb::user_id_t break_loc_id 53430fdc8d8SChris Lattner ) 53530fdc8d8SChris Lattner { 5361ac04c30SGreg Clayton ExecutionContext exe_ctx (ctx->exe_ctx_ref); 5371ac04c30SGreg Clayton BreakpointSP bp_sp(exe_ctx.GetTargetRef().GetBreakpointList().FindBreakpointByID(break_id)); 53830fdc8d8SChris Lattner if (baton && bp_sp) 53930fdc8d8SChris Lattner { 54030fdc8d8SChris Lattner CallbackData *data = (CallbackData *)baton; 54130fdc8d8SChris Lattner lldb_private::Breakpoint *bp = bp_sp.get(); 54230fdc8d8SChris Lattner if (bp && data->callback) 54330fdc8d8SChris Lattner { 5441ac04c30SGreg Clayton Process *process = exe_ctx.GetProcessPtr(); 545c14ee32dSGreg Clayton if (process) 54630fdc8d8SChris Lattner { 547e1cd1be6SGreg Clayton SBProcess sb_process (process->shared_from_this()); 54830fdc8d8SChris Lattner SBThread sb_thread; 54930fdc8d8SChris Lattner SBBreakpointLocation sb_location; 55030fdc8d8SChris Lattner assert (bp_sp); 55130fdc8d8SChris Lattner sb_location.SetLocation (bp_sp->FindLocationByID (break_loc_id)); 5521ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 553c14ee32dSGreg Clayton if (thread) 554e1cd1be6SGreg Clayton sb_thread.SetThread(thread->shared_from_this()); 55530fdc8d8SChris Lattner 55630fdc8d8SChris Lattner return data->callback (data->callback_baton, 55730fdc8d8SChris Lattner sb_process, 55830fdc8d8SChris Lattner sb_thread, 55930fdc8d8SChris Lattner sb_location); 56030fdc8d8SChris Lattner } 56130fdc8d8SChris Lattner } 56230fdc8d8SChris Lattner } 56330fdc8d8SChris Lattner return true; // Return true if we should stop at this breakpoint 56430fdc8d8SChris Lattner } 56530fdc8d8SChris Lattner 56630fdc8d8SChris Lattner void 56730fdc8d8SChris Lattner SBBreakpoint::SetCallback (BreakpointHitCallback callback, void *baton) 56830fdc8d8SChris Lattner { 5695160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 570ceb6b139SCaroline Tice 571ceb6b139SCaroline Tice if (log) 5724838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::SetCallback (callback=%p, baton=%p)", m_opaque_sp.get(), callback, baton); 573ceb6b139SCaroline Tice 574c14ee32dSGreg Clayton if (m_opaque_sp) 57530fdc8d8SChris Lattner { 576af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 57730fdc8d8SChris Lattner BatonSP baton_sp(new SBBreakpointCallbackBaton (callback, baton)); 5786611103cSGreg Clayton m_opaque_sp->SetCallback (SBBreakpoint::PrivateBreakpointHitCallback, baton_sp, false); 57930fdc8d8SChris Lattner } 58030fdc8d8SChris Lattner } 58130fdc8d8SChris Lattner 58230fdc8d8SChris Lattner 58330fdc8d8SChris Lattner lldb_private::Breakpoint * 58430fdc8d8SChris Lattner SBBreakpoint::operator->() const 58530fdc8d8SChris Lattner { 5866611103cSGreg Clayton return m_opaque_sp.get(); 58730fdc8d8SChris Lattner } 58830fdc8d8SChris Lattner 58930fdc8d8SChris Lattner lldb_private::Breakpoint * 59030fdc8d8SChris Lattner SBBreakpoint::get() const 59130fdc8d8SChris Lattner { 5926611103cSGreg Clayton return m_opaque_sp.get(); 59330fdc8d8SChris Lattner } 59430fdc8d8SChris Lattner 59530fdc8d8SChris Lattner lldb::BreakpointSP & 59630fdc8d8SChris Lattner SBBreakpoint::operator *() 59730fdc8d8SChris Lattner { 5986611103cSGreg Clayton return m_opaque_sp; 59930fdc8d8SChris Lattner } 60030fdc8d8SChris Lattner 60130fdc8d8SChris Lattner const lldb::BreakpointSP & 60230fdc8d8SChris Lattner SBBreakpoint::operator *() const 60330fdc8d8SChris Lattner { 6046611103cSGreg Clayton return m_opaque_sp; 60530fdc8d8SChris Lattner } 60630fdc8d8SChris Lattner 607e6bc6cb9SJim Ingham bool 608e6bc6cb9SJim Ingham SBBreakpoint::EventIsBreakpointEvent (const lldb::SBEvent &event) 609e6bc6cb9SJim Ingham { 610e6bc6cb9SJim Ingham return Breakpoint::BreakpointEventData::GetEventDataFromEvent(event.get()) != NULL; 611e6bc6cb9SJim Ingham 612e6bc6cb9SJim Ingham } 613e6bc6cb9SJim Ingham 6149fed0d85SGreg Clayton BreakpointEventType 6159fed0d85SGreg Clayton SBBreakpoint::GetBreakpointEventTypeFromEvent (const SBEvent& event) 6169fed0d85SGreg Clayton { 6179fed0d85SGreg Clayton if (event.IsValid()) 6189fed0d85SGreg Clayton return Breakpoint::BreakpointEventData::GetBreakpointEventTypeFromEvent (event.GetSP()); 6199fed0d85SGreg Clayton return eBreakpointEventTypeInvalidType; 6209fed0d85SGreg Clayton } 6219fed0d85SGreg Clayton 6229fed0d85SGreg Clayton SBBreakpoint 6239fed0d85SGreg Clayton SBBreakpoint::GetBreakpointFromEvent (const lldb::SBEvent& event) 6249fed0d85SGreg Clayton { 6259fed0d85SGreg Clayton SBBreakpoint sb_breakpoint; 6269fed0d85SGreg Clayton if (event.IsValid()) 6279fed0d85SGreg Clayton sb_breakpoint.m_opaque_sp = Breakpoint::BreakpointEventData::GetBreakpointFromEvent (event.GetSP()); 6289fed0d85SGreg Clayton return sb_breakpoint; 6299fed0d85SGreg Clayton } 6309fed0d85SGreg Clayton 6319fed0d85SGreg Clayton SBBreakpointLocation 6329fed0d85SGreg Clayton SBBreakpoint::GetBreakpointLocationAtIndexFromEvent (const lldb::SBEvent& event, uint32_t loc_idx) 6339fed0d85SGreg Clayton { 6349fed0d85SGreg Clayton SBBreakpointLocation sb_breakpoint_loc; 6359fed0d85SGreg Clayton if (event.IsValid()) 6369fed0d85SGreg Clayton sb_breakpoint_loc.SetLocation (Breakpoint::BreakpointEventData::GetBreakpointLocationAtIndexFromEvent (event.GetSP(), loc_idx)); 6379fed0d85SGreg Clayton return sb_breakpoint_loc; 6389fed0d85SGreg Clayton } 6399fed0d85SGreg Clayton 640e6bc6cb9SJim Ingham uint32_t 641e6bc6cb9SJim Ingham SBBreakpoint::GetNumBreakpointLocationsFromEvent (const lldb::SBEvent &event) 642e6bc6cb9SJim Ingham { 643e6bc6cb9SJim Ingham uint32_t num_locations = 0; 644e6bc6cb9SJim Ingham if (event.IsValid()) 645e6bc6cb9SJim Ingham num_locations = (Breakpoint::BreakpointEventData::GetNumBreakpointLocationsFromEvent (event.GetSP())); 646e6bc6cb9SJim Ingham return num_locations; 647e6bc6cb9SJim Ingham } 648e6bc6cb9SJim Ingham 6499fed0d85SGreg Clayton 650