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 { 127*f94e1791SJim 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 23730fdc8d8SChris Lattner void 238c982c768SGreg Clayton SBBreakpoint::SetIgnoreCount (uint32_t count) 23930fdc8d8SChris Lattner { 2402d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 241ceb6b139SCaroline Tice 242ceb6b139SCaroline Tice if (log) 2434838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::SetIgnoreCount (count=%u)", m_opaque_sp.get(), count); 244ceb6b139SCaroline Tice 2456611103cSGreg Clayton if (m_opaque_sp) 246af67cecdSGreg Clayton { 247af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 2486611103cSGreg Clayton m_opaque_sp->SetIgnoreCount (count); 24930fdc8d8SChris Lattner } 250af67cecdSGreg Clayton } 25130fdc8d8SChris Lattner 252041a12fcSJim Ingham void 253041a12fcSJim Ingham SBBreakpoint::SetCondition (const char *condition) 254041a12fcSJim Ingham { 255af67cecdSGreg Clayton if (m_opaque_sp) 256af67cecdSGreg Clayton { 257af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 258041a12fcSJim Ingham m_opaque_sp->SetCondition (condition); 259041a12fcSJim Ingham } 260af67cecdSGreg Clayton } 261041a12fcSJim Ingham 262041a12fcSJim Ingham const char * 263041a12fcSJim Ingham SBBreakpoint::GetCondition () 264041a12fcSJim Ingham { 265af67cecdSGreg Clayton if (m_opaque_sp) 266af67cecdSGreg Clayton { 267af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 268041a12fcSJim Ingham return m_opaque_sp->GetConditionText (); 269041a12fcSJim Ingham } 270af67cecdSGreg Clayton return NULL; 271af67cecdSGreg Clayton } 272041a12fcSJim Ingham 273c982c768SGreg Clayton uint32_t 2749fed0d85SGreg Clayton SBBreakpoint::GetHitCount () const 2759fed0d85SGreg Clayton { 2764838131bSGreg Clayton uint32_t count = 0; 2779fed0d85SGreg Clayton if (m_opaque_sp) 278af67cecdSGreg Clayton { 279af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 2804838131bSGreg Clayton count = m_opaque_sp->GetHitCount(); 281af67cecdSGreg Clayton } 2824838131bSGreg Clayton 2832d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 284ceb6b139SCaroline Tice if (log) 2854838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::GetHitCount () => %u", m_opaque_sp.get(), count); 2864838131bSGreg Clayton 2874838131bSGreg Clayton return count; 288ceb6b139SCaroline Tice } 2899fed0d85SGreg Clayton 2909fed0d85SGreg Clayton uint32_t 29130fdc8d8SChris Lattner SBBreakpoint::GetIgnoreCount () const 29230fdc8d8SChris Lattner { 2934838131bSGreg Clayton uint32_t count = 0; 2946611103cSGreg Clayton if (m_opaque_sp) 295af67cecdSGreg Clayton { 296af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 2974838131bSGreg Clayton count = m_opaque_sp->GetIgnoreCount(); 298af67cecdSGreg Clayton } 2994838131bSGreg Clayton 3002d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3014838131bSGreg Clayton if (log) 3024838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::GetIgnoreCount () => %u", m_opaque_sp.get(), count); 3034838131bSGreg Clayton 3044838131bSGreg Clayton return count; 30530fdc8d8SChris Lattner } 30630fdc8d8SChris Lattner 30730fdc8d8SChris Lattner void 3084838131bSGreg Clayton SBBreakpoint::SetThreadID (tid_t tid) 30930fdc8d8SChris Lattner { 3106611103cSGreg Clayton if (m_opaque_sp) 311af67cecdSGreg Clayton { 312af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 3134838131bSGreg Clayton m_opaque_sp->SetThreadID (tid); 314af67cecdSGreg Clayton } 3152d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3164838131bSGreg Clayton if (log) 31761e7a58cSGreg Clayton log->Printf ("SBBreakpoint(%p)::SetThreadID (tid=0x%4.4llx)", m_opaque_sp.get(), tid); 3184838131bSGreg Clayton 31930fdc8d8SChris Lattner } 32030fdc8d8SChris Lattner 32130fdc8d8SChris Lattner tid_t 32230fdc8d8SChris Lattner SBBreakpoint::GetThreadID () 32330fdc8d8SChris Lattner { 3244838131bSGreg Clayton tid_t tid = LLDB_INVALID_THREAD_ID; 3256611103cSGreg Clayton if (m_opaque_sp) 326af67cecdSGreg Clayton { 327af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 3284838131bSGreg Clayton tid = m_opaque_sp->GetThreadID(); 329af67cecdSGreg Clayton } 33030fdc8d8SChris Lattner 3312d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3324838131bSGreg Clayton if (log) 33361e7a58cSGreg Clayton log->Printf ("SBBreakpoint(%p)::GetThreadID () => 0x%4.4llx", m_opaque_sp.get(), tid); 3344838131bSGreg Clayton return tid; 33530fdc8d8SChris Lattner } 33630fdc8d8SChris Lattner 33762b02c61SJim Ingham void 33862b02c61SJim Ingham SBBreakpoint::SetThreadIndex (uint32_t index) 33962b02c61SJim Ingham { 3402d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3414838131bSGreg Clayton if (log) 3424838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::SetThreadIndex (%u)", m_opaque_sp.get(), index); 3436611103cSGreg Clayton if (m_opaque_sp) 344af67cecdSGreg Clayton { 345af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 3466611103cSGreg Clayton m_opaque_sp->GetOptions()->GetThreadSpec()->SetIndex (index); 34762b02c61SJim Ingham } 348af67cecdSGreg Clayton } 34962b02c61SJim Ingham 35062b02c61SJim Ingham uint32_t 35162b02c61SJim Ingham SBBreakpoint::GetThreadIndex() const 35262b02c61SJim Ingham { 353bdf4c6acSGreg Clayton uint32_t thread_idx = UINT32_MAX; 3546611103cSGreg Clayton if (m_opaque_sp) 35562b02c61SJim Ingham { 356af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 357af67cecdSGreg Clayton const ThreadSpec *thread_spec = m_opaque_sp->GetOptions()->GetThreadSpecNoCreate(); 358763d1a17SJohnny Chen if (thread_spec != NULL) 3594838131bSGreg Clayton thread_idx = thread_spec->GetIndex(); 36062b02c61SJim Ingham } 3612d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3624838131bSGreg Clayton if (log) 363bdf4c6acSGreg Clayton log->Printf ("SBBreakpoint(%p)::GetThreadIndex () => %u", m_opaque_sp.get(), thread_idx); 3644838131bSGreg Clayton 365763d1a17SJohnny Chen return thread_idx; 36662b02c61SJim Ingham } 36762b02c61SJim Ingham 36862b02c61SJim Ingham 36962b02c61SJim Ingham void 37062b02c61SJim Ingham SBBreakpoint::SetThreadName (const char *thread_name) 37162b02c61SJim Ingham { 3722d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3734838131bSGreg Clayton if (log) 3744838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::SetThreadName (%s)", m_opaque_sp.get(), thread_name); 3754838131bSGreg Clayton 3766611103cSGreg Clayton if (m_opaque_sp) 377af67cecdSGreg Clayton { 378af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 3796611103cSGreg Clayton m_opaque_sp->GetOptions()->GetThreadSpec()->SetName (thread_name); 38062b02c61SJim Ingham } 381af67cecdSGreg Clayton } 38262b02c61SJim Ingham 38362b02c61SJim Ingham const char * 38462b02c61SJim Ingham SBBreakpoint::GetThreadName () const 38562b02c61SJim Ingham { 3864838131bSGreg Clayton const char *name = NULL; 3876611103cSGreg Clayton if (m_opaque_sp) 38862b02c61SJim Ingham { 389af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 390af67cecdSGreg Clayton const ThreadSpec *thread_spec = m_opaque_sp->GetOptions()->GetThreadSpecNoCreate(); 391763d1a17SJohnny Chen if (thread_spec != NULL) 3924838131bSGreg Clayton name = thread_spec->GetName(); 39362b02c61SJim Ingham } 3942d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3954838131bSGreg Clayton if (log) 3964838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::GetThreadName () => %s", m_opaque_sp.get(), name); 3974838131bSGreg Clayton 3984838131bSGreg Clayton return name; 39962b02c61SJim Ingham } 40062b02c61SJim Ingham 40162b02c61SJim Ingham void 40262b02c61SJim Ingham SBBreakpoint::SetQueueName (const char *queue_name) 40362b02c61SJim Ingham { 4042d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4054838131bSGreg Clayton if (log) 4064838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::SetQueueName (%s)", m_opaque_sp.get(), queue_name); 4076611103cSGreg Clayton if (m_opaque_sp) 408af67cecdSGreg Clayton { 409af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 4106611103cSGreg Clayton m_opaque_sp->GetOptions()->GetThreadSpec()->SetQueueName (queue_name); 41162b02c61SJim Ingham } 412af67cecdSGreg Clayton } 41362b02c61SJim Ingham 41462b02c61SJim Ingham const char * 41562b02c61SJim Ingham SBBreakpoint::GetQueueName () const 41662b02c61SJim Ingham { 4174838131bSGreg Clayton const char *name = NULL; 4186611103cSGreg Clayton if (m_opaque_sp) 41962b02c61SJim Ingham { 420af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 421af67cecdSGreg Clayton const ThreadSpec *thread_spec = m_opaque_sp->GetOptions()->GetThreadSpecNoCreate(); 422af67cecdSGreg Clayton if (thread_spec) 4234838131bSGreg Clayton name = thread_spec->GetQueueName(); 42462b02c61SJim Ingham } 4252d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4264838131bSGreg Clayton if (log) 4274838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::GetQueueName () => %s", m_opaque_sp.get(), name); 4284838131bSGreg Clayton 4294838131bSGreg Clayton return name; 43062b02c61SJim Ingham } 43162b02c61SJim Ingham 43230fdc8d8SChris Lattner size_t 43330fdc8d8SChris Lattner SBBreakpoint::GetNumResolvedLocations() const 43430fdc8d8SChris Lattner { 4354838131bSGreg Clayton size_t num_resolved = 0; 4366611103cSGreg Clayton if (m_opaque_sp) 437af67cecdSGreg Clayton { 438af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 4394838131bSGreg Clayton num_resolved = m_opaque_sp->GetNumResolvedLocations(); 440af67cecdSGreg Clayton } 4412d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4424838131bSGreg Clayton if (log) 4434838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::GetNumResolvedLocations () => %zu", m_opaque_sp.get(), num_resolved); 4444838131bSGreg Clayton return num_resolved; 44530fdc8d8SChris Lattner } 44630fdc8d8SChris Lattner 44730fdc8d8SChris Lattner size_t 44830fdc8d8SChris Lattner SBBreakpoint::GetNumLocations() const 44930fdc8d8SChris Lattner { 4504838131bSGreg Clayton size_t num_locs = 0; 4516611103cSGreg Clayton if (m_opaque_sp) 452af67cecdSGreg Clayton { 453af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 4544838131bSGreg Clayton num_locs = m_opaque_sp->GetNumLocations(); 455af67cecdSGreg Clayton } 4562d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4574838131bSGreg Clayton if (log) 4584838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::GetNumLocations () => %zu", m_opaque_sp.get(), num_locs); 4594838131bSGreg Clayton return num_locs; 46030fdc8d8SChris Lattner } 46130fdc8d8SChris Lattner 462dde9cff3SCaroline Tice bool 46305faeb71SGreg Clayton SBBreakpoint::GetDescription (SBStream &s) 46430fdc8d8SChris Lattner { 4656611103cSGreg Clayton if (m_opaque_sp) 46630fdc8d8SChris Lattner { 467af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 46805faeb71SGreg Clayton s.Printf("SBBreakpoint: id = %i, ", m_opaque_sp->GetID()); 46905faeb71SGreg Clayton m_opaque_sp->GetResolverDescription (s.get()); 47005faeb71SGreg Clayton m_opaque_sp->GetFilterDescription (s.get()); 47105faeb71SGreg Clayton const size_t num_locations = m_opaque_sp->GetNumLocations (); 47205faeb71SGreg Clayton s.Printf(", locations = %zu", num_locations); 473dde9cff3SCaroline Tice return true; 474dde9cff3SCaroline Tice } 47505faeb71SGreg Clayton s.Printf ("No value"); 47605faeb71SGreg Clayton return false; 47705faeb71SGreg Clayton } 478dde9cff3SCaroline Tice 47930fdc8d8SChris Lattner bool 48030fdc8d8SChris Lattner SBBreakpoint::PrivateBreakpointHitCallback 48130fdc8d8SChris Lattner ( 48230fdc8d8SChris Lattner void *baton, 48330fdc8d8SChris Lattner StoppointCallbackContext *ctx, 48430fdc8d8SChris Lattner lldb::user_id_t break_id, 48530fdc8d8SChris Lattner lldb::user_id_t break_loc_id 48630fdc8d8SChris Lattner ) 48730fdc8d8SChris Lattner { 4881ac04c30SGreg Clayton ExecutionContext exe_ctx (ctx->exe_ctx_ref); 4891ac04c30SGreg Clayton BreakpointSP bp_sp(exe_ctx.GetTargetRef().GetBreakpointList().FindBreakpointByID(break_id)); 49030fdc8d8SChris Lattner if (baton && bp_sp) 49130fdc8d8SChris Lattner { 49230fdc8d8SChris Lattner CallbackData *data = (CallbackData *)baton; 49330fdc8d8SChris Lattner lldb_private::Breakpoint *bp = bp_sp.get(); 49430fdc8d8SChris Lattner if (bp && data->callback) 49530fdc8d8SChris Lattner { 4961ac04c30SGreg Clayton Process *process = exe_ctx.GetProcessPtr(); 497c14ee32dSGreg Clayton if (process) 49830fdc8d8SChris Lattner { 499e1cd1be6SGreg Clayton SBProcess sb_process (process->shared_from_this()); 50030fdc8d8SChris Lattner SBThread sb_thread; 50130fdc8d8SChris Lattner SBBreakpointLocation sb_location; 50230fdc8d8SChris Lattner assert (bp_sp); 50330fdc8d8SChris Lattner sb_location.SetLocation (bp_sp->FindLocationByID (break_loc_id)); 5041ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 505c14ee32dSGreg Clayton if (thread) 506e1cd1be6SGreg Clayton sb_thread.SetThread(thread->shared_from_this()); 50730fdc8d8SChris Lattner 50830fdc8d8SChris Lattner return data->callback (data->callback_baton, 50930fdc8d8SChris Lattner sb_process, 51030fdc8d8SChris Lattner sb_thread, 51130fdc8d8SChris Lattner sb_location); 51230fdc8d8SChris Lattner } 51330fdc8d8SChris Lattner } 51430fdc8d8SChris Lattner } 51530fdc8d8SChris Lattner return true; // Return true if we should stop at this breakpoint 51630fdc8d8SChris Lattner } 51730fdc8d8SChris Lattner 51830fdc8d8SChris Lattner void 51930fdc8d8SChris Lattner SBBreakpoint::SetCallback (BreakpointHitCallback callback, void *baton) 52030fdc8d8SChris Lattner { 5212d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 522ceb6b139SCaroline Tice 523ceb6b139SCaroline Tice if (log) 5244838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::SetCallback (callback=%p, baton=%p)", m_opaque_sp.get(), callback, baton); 525ceb6b139SCaroline Tice 526c14ee32dSGreg Clayton if (m_opaque_sp) 52730fdc8d8SChris Lattner { 528af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 52930fdc8d8SChris Lattner BatonSP baton_sp(new SBBreakpointCallbackBaton (callback, baton)); 5306611103cSGreg Clayton m_opaque_sp->SetCallback (SBBreakpoint::PrivateBreakpointHitCallback, baton_sp, false); 53130fdc8d8SChris Lattner } 53230fdc8d8SChris Lattner } 53330fdc8d8SChris Lattner 53430fdc8d8SChris Lattner 53530fdc8d8SChris Lattner lldb_private::Breakpoint * 53630fdc8d8SChris Lattner SBBreakpoint::operator->() const 53730fdc8d8SChris Lattner { 5386611103cSGreg Clayton return m_opaque_sp.get(); 53930fdc8d8SChris Lattner } 54030fdc8d8SChris Lattner 54130fdc8d8SChris Lattner lldb_private::Breakpoint * 54230fdc8d8SChris Lattner SBBreakpoint::get() const 54330fdc8d8SChris Lattner { 5446611103cSGreg Clayton return m_opaque_sp.get(); 54530fdc8d8SChris Lattner } 54630fdc8d8SChris Lattner 54730fdc8d8SChris Lattner lldb::BreakpointSP & 54830fdc8d8SChris Lattner SBBreakpoint::operator *() 54930fdc8d8SChris Lattner { 5506611103cSGreg Clayton return m_opaque_sp; 55130fdc8d8SChris Lattner } 55230fdc8d8SChris Lattner 55330fdc8d8SChris Lattner const lldb::BreakpointSP & 55430fdc8d8SChris Lattner SBBreakpoint::operator *() const 55530fdc8d8SChris Lattner { 5566611103cSGreg Clayton return m_opaque_sp; 55730fdc8d8SChris Lattner } 55830fdc8d8SChris Lattner 559e6bc6cb9SJim Ingham bool 560e6bc6cb9SJim Ingham SBBreakpoint::EventIsBreakpointEvent (const lldb::SBEvent &event) 561e6bc6cb9SJim Ingham { 562e6bc6cb9SJim Ingham return Breakpoint::BreakpointEventData::GetEventDataFromEvent(event.get()) != NULL; 563e6bc6cb9SJim Ingham 564e6bc6cb9SJim Ingham } 565e6bc6cb9SJim Ingham 5669fed0d85SGreg Clayton BreakpointEventType 5679fed0d85SGreg Clayton SBBreakpoint::GetBreakpointEventTypeFromEvent (const SBEvent& event) 5689fed0d85SGreg Clayton { 5699fed0d85SGreg Clayton if (event.IsValid()) 5709fed0d85SGreg Clayton return Breakpoint::BreakpointEventData::GetBreakpointEventTypeFromEvent (event.GetSP()); 5719fed0d85SGreg Clayton return eBreakpointEventTypeInvalidType; 5729fed0d85SGreg Clayton } 5739fed0d85SGreg Clayton 5749fed0d85SGreg Clayton SBBreakpoint 5759fed0d85SGreg Clayton SBBreakpoint::GetBreakpointFromEvent (const lldb::SBEvent& event) 5769fed0d85SGreg Clayton { 5779fed0d85SGreg Clayton SBBreakpoint sb_breakpoint; 5789fed0d85SGreg Clayton if (event.IsValid()) 5799fed0d85SGreg Clayton sb_breakpoint.m_opaque_sp = Breakpoint::BreakpointEventData::GetBreakpointFromEvent (event.GetSP()); 5809fed0d85SGreg Clayton return sb_breakpoint; 5819fed0d85SGreg Clayton } 5829fed0d85SGreg Clayton 5839fed0d85SGreg Clayton SBBreakpointLocation 5849fed0d85SGreg Clayton SBBreakpoint::GetBreakpointLocationAtIndexFromEvent (const lldb::SBEvent& event, uint32_t loc_idx) 5859fed0d85SGreg Clayton { 5869fed0d85SGreg Clayton SBBreakpointLocation sb_breakpoint_loc; 5879fed0d85SGreg Clayton if (event.IsValid()) 5889fed0d85SGreg Clayton sb_breakpoint_loc.SetLocation (Breakpoint::BreakpointEventData::GetBreakpointLocationAtIndexFromEvent (event.GetSP(), loc_idx)); 5899fed0d85SGreg Clayton return sb_breakpoint_loc; 5909fed0d85SGreg Clayton } 5919fed0d85SGreg Clayton 592e6bc6cb9SJim Ingham uint32_t 593e6bc6cb9SJim Ingham SBBreakpoint::GetNumBreakpointLocationsFromEvent (const lldb::SBEvent &event) 594e6bc6cb9SJim Ingham { 595e6bc6cb9SJim Ingham uint32_t num_locations = 0; 596e6bc6cb9SJim Ingham if (event.IsValid()) 597e6bc6cb9SJim Ingham num_locations = (Breakpoint::BreakpointEventData::GetNumBreakpointLocationsFromEvent (event.GetSP())); 598e6bc6cb9SJim Ingham return num_locations; 599e6bc6cb9SJim Ingham } 600e6bc6cb9SJim Ingham 6019fed0d85SGreg Clayton 602