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 { 1276611103cSGreg Clayton return 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 { 15430fdc8d8SChris Lattner address.SetSection (NULL); 15530fdc8d8SChris Lattner address.SetOffset (vm_addr); 15630fdc8d8SChris Lattner } 1576611103cSGreg Clayton sb_bp_location.SetLocation (m_opaque_sp->FindLocationByAddress (address)); 15830fdc8d8SChris Lattner } 15930fdc8d8SChris Lattner } 16030fdc8d8SChris Lattner return sb_bp_location; 16130fdc8d8SChris Lattner } 16230fdc8d8SChris Lattner 16330fdc8d8SChris Lattner break_id_t 16430fdc8d8SChris Lattner SBBreakpoint::FindLocationIDByAddress (addr_t vm_addr) 16530fdc8d8SChris Lattner { 166af67cecdSGreg Clayton break_id_t break_id = LLDB_INVALID_BREAK_ID; 16730fdc8d8SChris Lattner 168af67cecdSGreg Clayton if (m_opaque_sp && vm_addr != LLDB_INVALID_ADDRESS) 16930fdc8d8SChris Lattner { 170af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 17130fdc8d8SChris Lattner Address address; 172f5e56de0SGreg Clayton Target &target = m_opaque_sp->GetTarget(); 173f5e56de0SGreg Clayton if (target.GetSectionLoadList().ResolveLoadAddress (vm_addr, address) == false) 17430fdc8d8SChris Lattner { 17530fdc8d8SChris Lattner address.SetSection (NULL); 17630fdc8d8SChris Lattner address.SetOffset (vm_addr); 17730fdc8d8SChris Lattner } 178af67cecdSGreg Clayton break_id = m_opaque_sp->FindLocationIDByAddress (address); 17930fdc8d8SChris Lattner } 18030fdc8d8SChris Lattner 181af67cecdSGreg Clayton return break_id; 18230fdc8d8SChris Lattner } 18330fdc8d8SChris Lattner 18430fdc8d8SChris Lattner SBBreakpointLocation 18530fdc8d8SChris Lattner SBBreakpoint::FindLocationByID (break_id_t bp_loc_id) 18630fdc8d8SChris Lattner { 18730fdc8d8SChris Lattner SBBreakpointLocation sb_bp_location; 18830fdc8d8SChris Lattner 1896611103cSGreg Clayton if (m_opaque_sp) 190af67cecdSGreg Clayton { 191af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 1926611103cSGreg Clayton sb_bp_location.SetLocation (m_opaque_sp->FindLocationByID (bp_loc_id)); 193af67cecdSGreg Clayton } 19430fdc8d8SChris Lattner 19530fdc8d8SChris Lattner return sb_bp_location; 19630fdc8d8SChris Lattner } 19730fdc8d8SChris Lattner 19830fdc8d8SChris Lattner SBBreakpointLocation 19930fdc8d8SChris Lattner SBBreakpoint::GetLocationAtIndex (uint32_t index) 20030fdc8d8SChris Lattner { 20130fdc8d8SChris Lattner SBBreakpointLocation sb_bp_location; 20230fdc8d8SChris Lattner 2036611103cSGreg Clayton if (m_opaque_sp) 204af67cecdSGreg Clayton { 205af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 2066611103cSGreg Clayton sb_bp_location.SetLocation (m_opaque_sp->GetLocationAtIndex (index)); 207af67cecdSGreg Clayton } 20830fdc8d8SChris Lattner 20930fdc8d8SChris Lattner return sb_bp_location; 21030fdc8d8SChris Lattner } 21130fdc8d8SChris Lattner 21230fdc8d8SChris Lattner void 21330fdc8d8SChris Lattner SBBreakpoint::SetEnabled (bool enable) 21430fdc8d8SChris Lattner { 2152d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 216ceb6b139SCaroline Tice 217ceb6b139SCaroline Tice if (log) 2184838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::SetEnabled (enabled=%i)", m_opaque_sp.get(), enable); 219ceb6b139SCaroline Tice 2206611103cSGreg Clayton if (m_opaque_sp) 221af67cecdSGreg Clayton { 222af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 2236611103cSGreg Clayton m_opaque_sp->SetEnabled (enable); 22430fdc8d8SChris Lattner } 225af67cecdSGreg Clayton } 22630fdc8d8SChris Lattner 22730fdc8d8SChris Lattner bool 22830fdc8d8SChris Lattner SBBreakpoint::IsEnabled () 22930fdc8d8SChris Lattner { 2306611103cSGreg Clayton if (m_opaque_sp) 231af67cecdSGreg Clayton { 232af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 2336611103cSGreg Clayton return m_opaque_sp->IsEnabled(); 234af67cecdSGreg Clayton } 23530fdc8d8SChris Lattner else 23630fdc8d8SChris Lattner return false; 23730fdc8d8SChris Lattner } 23830fdc8d8SChris Lattner 23930fdc8d8SChris Lattner void 240c982c768SGreg Clayton SBBreakpoint::SetIgnoreCount (uint32_t count) 24130fdc8d8SChris Lattner { 2422d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 243ceb6b139SCaroline Tice 244ceb6b139SCaroline Tice if (log) 2454838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::SetIgnoreCount (count=%u)", m_opaque_sp.get(), count); 246ceb6b139SCaroline Tice 2476611103cSGreg Clayton if (m_opaque_sp) 248af67cecdSGreg Clayton { 249af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 2506611103cSGreg Clayton m_opaque_sp->SetIgnoreCount (count); 25130fdc8d8SChris Lattner } 252af67cecdSGreg Clayton } 25330fdc8d8SChris Lattner 254041a12fcSJim Ingham void 255041a12fcSJim Ingham SBBreakpoint::SetCondition (const char *condition) 256041a12fcSJim Ingham { 257af67cecdSGreg Clayton if (m_opaque_sp) 258af67cecdSGreg Clayton { 259af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 260041a12fcSJim Ingham m_opaque_sp->SetCondition (condition); 261041a12fcSJim Ingham } 262af67cecdSGreg Clayton } 263041a12fcSJim Ingham 264041a12fcSJim Ingham const char * 265041a12fcSJim Ingham SBBreakpoint::GetCondition () 266041a12fcSJim Ingham { 267af67cecdSGreg Clayton if (m_opaque_sp) 268af67cecdSGreg Clayton { 269af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 270041a12fcSJim Ingham return m_opaque_sp->GetConditionText (); 271041a12fcSJim Ingham } 272af67cecdSGreg Clayton return NULL; 273af67cecdSGreg Clayton } 274041a12fcSJim Ingham 275c982c768SGreg Clayton uint32_t 2769fed0d85SGreg Clayton SBBreakpoint::GetHitCount () const 2779fed0d85SGreg Clayton { 2784838131bSGreg Clayton uint32_t count = 0; 2799fed0d85SGreg Clayton if (m_opaque_sp) 280af67cecdSGreg Clayton { 281af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 2824838131bSGreg Clayton count = m_opaque_sp->GetHitCount(); 283af67cecdSGreg Clayton } 2844838131bSGreg Clayton 2852d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 286ceb6b139SCaroline Tice if (log) 2874838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::GetHitCount () => %u", m_opaque_sp.get(), count); 2884838131bSGreg Clayton 2894838131bSGreg Clayton return count; 290ceb6b139SCaroline Tice } 2919fed0d85SGreg Clayton 2929fed0d85SGreg Clayton uint32_t 29330fdc8d8SChris Lattner SBBreakpoint::GetIgnoreCount () const 29430fdc8d8SChris Lattner { 2954838131bSGreg Clayton uint32_t count = 0; 2966611103cSGreg Clayton if (m_opaque_sp) 297af67cecdSGreg Clayton { 298af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 2994838131bSGreg Clayton count = m_opaque_sp->GetIgnoreCount(); 300af67cecdSGreg Clayton } 3014838131bSGreg Clayton 3022d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3034838131bSGreg Clayton if (log) 3044838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::GetIgnoreCount () => %u", m_opaque_sp.get(), count); 3054838131bSGreg Clayton 3064838131bSGreg Clayton return count; 30730fdc8d8SChris Lattner } 30830fdc8d8SChris Lattner 30930fdc8d8SChris Lattner void 3104838131bSGreg Clayton SBBreakpoint::SetThreadID (tid_t tid) 31130fdc8d8SChris Lattner { 3126611103cSGreg Clayton if (m_opaque_sp) 313af67cecdSGreg Clayton { 314af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 3154838131bSGreg Clayton m_opaque_sp->SetThreadID (tid); 316af67cecdSGreg Clayton } 3172d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3184838131bSGreg Clayton if (log) 31961e7a58cSGreg Clayton log->Printf ("SBBreakpoint(%p)::SetThreadID (tid=0x%4.4llx)", m_opaque_sp.get(), tid); 3204838131bSGreg Clayton 32130fdc8d8SChris Lattner } 32230fdc8d8SChris Lattner 32330fdc8d8SChris Lattner tid_t 32430fdc8d8SChris Lattner SBBreakpoint::GetThreadID () 32530fdc8d8SChris Lattner { 3264838131bSGreg Clayton tid_t tid = LLDB_INVALID_THREAD_ID; 3276611103cSGreg Clayton if (m_opaque_sp) 328af67cecdSGreg Clayton { 329af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 3304838131bSGreg Clayton tid = m_opaque_sp->GetThreadID(); 331af67cecdSGreg Clayton } 33230fdc8d8SChris Lattner 3332d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3344838131bSGreg Clayton if (log) 33561e7a58cSGreg Clayton log->Printf ("SBBreakpoint(%p)::GetThreadID () => 0x%4.4llx", m_opaque_sp.get(), tid); 3364838131bSGreg Clayton return tid; 33730fdc8d8SChris Lattner } 33830fdc8d8SChris Lattner 33962b02c61SJim Ingham void 34062b02c61SJim Ingham SBBreakpoint::SetThreadIndex (uint32_t index) 34162b02c61SJim Ingham { 3422d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3434838131bSGreg Clayton if (log) 3444838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::SetThreadIndex (%u)", m_opaque_sp.get(), index); 3456611103cSGreg Clayton if (m_opaque_sp) 346af67cecdSGreg Clayton { 347af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 3486611103cSGreg Clayton m_opaque_sp->GetOptions()->GetThreadSpec()->SetIndex (index); 34962b02c61SJim Ingham } 350af67cecdSGreg Clayton } 35162b02c61SJim Ingham 35262b02c61SJim Ingham uint32_t 35362b02c61SJim Ingham SBBreakpoint::GetThreadIndex() const 35462b02c61SJim Ingham { 355bdf4c6acSGreg Clayton uint32_t thread_idx = UINT32_MAX; 3566611103cSGreg Clayton if (m_opaque_sp) 35762b02c61SJim Ingham { 358af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 359af67cecdSGreg Clayton const ThreadSpec *thread_spec = m_opaque_sp->GetOptions()->GetThreadSpecNoCreate(); 360763d1a17SJohnny Chen if (thread_spec != NULL) 3614838131bSGreg Clayton thread_idx = thread_spec->GetIndex(); 36262b02c61SJim Ingham } 3632d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3644838131bSGreg Clayton if (log) 365bdf4c6acSGreg Clayton log->Printf ("SBBreakpoint(%p)::GetThreadIndex () => %u", m_opaque_sp.get(), thread_idx); 3664838131bSGreg Clayton 367763d1a17SJohnny Chen return thread_idx; 36862b02c61SJim Ingham } 36962b02c61SJim Ingham 37062b02c61SJim Ingham 37162b02c61SJim Ingham void 37262b02c61SJim Ingham SBBreakpoint::SetThreadName (const char *thread_name) 37362b02c61SJim Ingham { 3742d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3754838131bSGreg Clayton if (log) 3764838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::SetThreadName (%s)", m_opaque_sp.get(), thread_name); 3774838131bSGreg Clayton 3786611103cSGreg Clayton if (m_opaque_sp) 379af67cecdSGreg Clayton { 380af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 3816611103cSGreg Clayton m_opaque_sp->GetOptions()->GetThreadSpec()->SetName (thread_name); 38262b02c61SJim Ingham } 383af67cecdSGreg Clayton } 38462b02c61SJim Ingham 38562b02c61SJim Ingham const char * 38662b02c61SJim Ingham SBBreakpoint::GetThreadName () const 38762b02c61SJim Ingham { 3884838131bSGreg Clayton const char *name = NULL; 3896611103cSGreg Clayton if (m_opaque_sp) 39062b02c61SJim Ingham { 391af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 392af67cecdSGreg Clayton const ThreadSpec *thread_spec = m_opaque_sp->GetOptions()->GetThreadSpecNoCreate(); 393763d1a17SJohnny Chen if (thread_spec != NULL) 3944838131bSGreg Clayton name = thread_spec->GetName(); 39562b02c61SJim Ingham } 3962d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3974838131bSGreg Clayton if (log) 3984838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::GetThreadName () => %s", m_opaque_sp.get(), name); 3994838131bSGreg Clayton 4004838131bSGreg Clayton return name; 40162b02c61SJim Ingham } 40262b02c61SJim Ingham 40362b02c61SJim Ingham void 40462b02c61SJim Ingham SBBreakpoint::SetQueueName (const char *queue_name) 40562b02c61SJim Ingham { 4062d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4074838131bSGreg Clayton if (log) 4084838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::SetQueueName (%s)", m_opaque_sp.get(), queue_name); 4096611103cSGreg Clayton if (m_opaque_sp) 410af67cecdSGreg Clayton { 411af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 4126611103cSGreg Clayton m_opaque_sp->GetOptions()->GetThreadSpec()->SetQueueName (queue_name); 41362b02c61SJim Ingham } 414af67cecdSGreg Clayton } 41562b02c61SJim Ingham 41662b02c61SJim Ingham const char * 41762b02c61SJim Ingham SBBreakpoint::GetQueueName () const 41862b02c61SJim Ingham { 4194838131bSGreg Clayton const char *name = NULL; 4206611103cSGreg Clayton if (m_opaque_sp) 42162b02c61SJim Ingham { 422af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 423af67cecdSGreg Clayton const ThreadSpec *thread_spec = m_opaque_sp->GetOptions()->GetThreadSpecNoCreate(); 424af67cecdSGreg Clayton if (thread_spec) 4254838131bSGreg Clayton name = thread_spec->GetQueueName(); 42662b02c61SJim Ingham } 4272d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4284838131bSGreg Clayton if (log) 4294838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::GetQueueName () => %s", m_opaque_sp.get(), name); 4304838131bSGreg Clayton 4314838131bSGreg Clayton return name; 43262b02c61SJim Ingham } 43362b02c61SJim Ingham 43430fdc8d8SChris Lattner size_t 43530fdc8d8SChris Lattner SBBreakpoint::GetNumResolvedLocations() const 43630fdc8d8SChris Lattner { 4374838131bSGreg Clayton size_t num_resolved = 0; 4386611103cSGreg Clayton if (m_opaque_sp) 439af67cecdSGreg Clayton { 440af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 4414838131bSGreg Clayton num_resolved = m_opaque_sp->GetNumResolvedLocations(); 442af67cecdSGreg Clayton } 4432d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4444838131bSGreg Clayton if (log) 4454838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::GetNumResolvedLocations () => %zu", m_opaque_sp.get(), num_resolved); 4464838131bSGreg Clayton return num_resolved; 44730fdc8d8SChris Lattner } 44830fdc8d8SChris Lattner 44930fdc8d8SChris Lattner size_t 45030fdc8d8SChris Lattner SBBreakpoint::GetNumLocations() const 45130fdc8d8SChris Lattner { 4524838131bSGreg Clayton size_t num_locs = 0; 4536611103cSGreg Clayton if (m_opaque_sp) 454af67cecdSGreg Clayton { 455af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 4564838131bSGreg Clayton num_locs = m_opaque_sp->GetNumLocations(); 457af67cecdSGreg Clayton } 4582d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4594838131bSGreg Clayton if (log) 4604838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::GetNumLocations () => %zu", m_opaque_sp.get(), num_locs); 4614838131bSGreg Clayton return num_locs; 46230fdc8d8SChris Lattner } 46330fdc8d8SChris Lattner 464dde9cff3SCaroline Tice bool 46505faeb71SGreg Clayton SBBreakpoint::GetDescription (SBStream &s) 46630fdc8d8SChris Lattner { 4676611103cSGreg Clayton if (m_opaque_sp) 46830fdc8d8SChris Lattner { 469af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 47005faeb71SGreg Clayton s.Printf("SBBreakpoint: id = %i, ", m_opaque_sp->GetID()); 47105faeb71SGreg Clayton m_opaque_sp->GetResolverDescription (s.get()); 47205faeb71SGreg Clayton m_opaque_sp->GetFilterDescription (s.get()); 47305faeb71SGreg Clayton const size_t num_locations = m_opaque_sp->GetNumLocations (); 47405faeb71SGreg Clayton s.Printf(", locations = %zu", num_locations); 475dde9cff3SCaroline Tice return true; 476dde9cff3SCaroline Tice } 47705faeb71SGreg Clayton s.Printf ("No value"); 47805faeb71SGreg Clayton return false; 47905faeb71SGreg Clayton } 480dde9cff3SCaroline Tice 48130fdc8d8SChris Lattner bool 48230fdc8d8SChris Lattner SBBreakpoint::PrivateBreakpointHitCallback 48330fdc8d8SChris Lattner ( 48430fdc8d8SChris Lattner void *baton, 48530fdc8d8SChris Lattner StoppointCallbackContext *ctx, 48630fdc8d8SChris Lattner lldb::user_id_t break_id, 48730fdc8d8SChris Lattner lldb::user_id_t break_loc_id 48830fdc8d8SChris Lattner ) 48930fdc8d8SChris Lattner { 490c14ee32dSGreg Clayton BreakpointSP bp_sp(ctx->exe_ctx.GetTargetRef().GetBreakpointList().FindBreakpointByID(break_id)); 49130fdc8d8SChris Lattner if (baton && bp_sp) 49230fdc8d8SChris Lattner { 49330fdc8d8SChris Lattner CallbackData *data = (CallbackData *)baton; 49430fdc8d8SChris Lattner lldb_private::Breakpoint *bp = bp_sp.get(); 49530fdc8d8SChris Lattner if (bp && data->callback) 49630fdc8d8SChris Lattner { 497c14ee32dSGreg Clayton Process *process = ctx->exe_ctx.GetProcessPtr(); 498c14ee32dSGreg Clayton if (process) 49930fdc8d8SChris Lattner { 500*e1cd1be6SGreg Clayton SBProcess sb_process (process->shared_from_this()); 50130fdc8d8SChris Lattner SBThread sb_thread; 50230fdc8d8SChris Lattner SBBreakpointLocation sb_location; 50330fdc8d8SChris Lattner assert (bp_sp); 50430fdc8d8SChris Lattner sb_location.SetLocation (bp_sp->FindLocationByID (break_loc_id)); 505c14ee32dSGreg Clayton Thread *thread = ctx->exe_ctx.GetThreadPtr(); 506c14ee32dSGreg Clayton if (thread) 507*e1cd1be6SGreg Clayton sb_thread.SetThread(thread->shared_from_this()); 50830fdc8d8SChris Lattner 50930fdc8d8SChris Lattner return data->callback (data->callback_baton, 51030fdc8d8SChris Lattner sb_process, 51130fdc8d8SChris Lattner sb_thread, 51230fdc8d8SChris Lattner sb_location); 51330fdc8d8SChris Lattner } 51430fdc8d8SChris Lattner } 51530fdc8d8SChris Lattner } 51630fdc8d8SChris Lattner return true; // Return true if we should stop at this breakpoint 51730fdc8d8SChris Lattner } 51830fdc8d8SChris Lattner 51930fdc8d8SChris Lattner void 52030fdc8d8SChris Lattner SBBreakpoint::SetCallback (BreakpointHitCallback callback, void *baton) 52130fdc8d8SChris Lattner { 5222d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 523ceb6b139SCaroline Tice 524ceb6b139SCaroline Tice if (log) 5254838131bSGreg Clayton log->Printf ("SBBreakpoint(%p)::SetCallback (callback=%p, baton=%p)", m_opaque_sp.get(), callback, baton); 526ceb6b139SCaroline Tice 527c14ee32dSGreg Clayton if (m_opaque_sp) 52830fdc8d8SChris Lattner { 529af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex()); 53030fdc8d8SChris Lattner BatonSP baton_sp(new SBBreakpointCallbackBaton (callback, baton)); 5316611103cSGreg Clayton m_opaque_sp->SetCallback (SBBreakpoint::PrivateBreakpointHitCallback, baton_sp, false); 53230fdc8d8SChris Lattner } 53330fdc8d8SChris Lattner } 53430fdc8d8SChris Lattner 53530fdc8d8SChris Lattner 53630fdc8d8SChris Lattner lldb_private::Breakpoint * 53730fdc8d8SChris Lattner SBBreakpoint::operator->() const 53830fdc8d8SChris Lattner { 5396611103cSGreg Clayton return m_opaque_sp.get(); 54030fdc8d8SChris Lattner } 54130fdc8d8SChris Lattner 54230fdc8d8SChris Lattner lldb_private::Breakpoint * 54330fdc8d8SChris Lattner SBBreakpoint::get() const 54430fdc8d8SChris Lattner { 5456611103cSGreg Clayton return m_opaque_sp.get(); 54630fdc8d8SChris Lattner } 54730fdc8d8SChris Lattner 54830fdc8d8SChris Lattner lldb::BreakpointSP & 54930fdc8d8SChris Lattner SBBreakpoint::operator *() 55030fdc8d8SChris Lattner { 5516611103cSGreg Clayton return m_opaque_sp; 55230fdc8d8SChris Lattner } 55330fdc8d8SChris Lattner 55430fdc8d8SChris Lattner const lldb::BreakpointSP & 55530fdc8d8SChris Lattner SBBreakpoint::operator *() const 55630fdc8d8SChris Lattner { 5576611103cSGreg Clayton return m_opaque_sp; 55830fdc8d8SChris Lattner } 55930fdc8d8SChris Lattner 5609fed0d85SGreg Clayton BreakpointEventType 5619fed0d85SGreg Clayton SBBreakpoint::GetBreakpointEventTypeFromEvent (const SBEvent& event) 5629fed0d85SGreg Clayton { 5639fed0d85SGreg Clayton if (event.IsValid()) 5649fed0d85SGreg Clayton return Breakpoint::BreakpointEventData::GetBreakpointEventTypeFromEvent (event.GetSP()); 5659fed0d85SGreg Clayton return eBreakpointEventTypeInvalidType; 5669fed0d85SGreg Clayton } 5679fed0d85SGreg Clayton 5689fed0d85SGreg Clayton SBBreakpoint 5699fed0d85SGreg Clayton SBBreakpoint::GetBreakpointFromEvent (const lldb::SBEvent& event) 5709fed0d85SGreg Clayton { 5719fed0d85SGreg Clayton SBBreakpoint sb_breakpoint; 5729fed0d85SGreg Clayton if (event.IsValid()) 5739fed0d85SGreg Clayton sb_breakpoint.m_opaque_sp = Breakpoint::BreakpointEventData::GetBreakpointFromEvent (event.GetSP()); 5749fed0d85SGreg Clayton return sb_breakpoint; 5759fed0d85SGreg Clayton } 5769fed0d85SGreg Clayton 5779fed0d85SGreg Clayton SBBreakpointLocation 5789fed0d85SGreg Clayton SBBreakpoint::GetBreakpointLocationAtIndexFromEvent (const lldb::SBEvent& event, uint32_t loc_idx) 5799fed0d85SGreg Clayton { 5809fed0d85SGreg Clayton SBBreakpointLocation sb_breakpoint_loc; 5819fed0d85SGreg Clayton if (event.IsValid()) 5829fed0d85SGreg Clayton sb_breakpoint_loc.SetLocation (Breakpoint::BreakpointEventData::GetBreakpointLocationAtIndexFromEvent (event.GetSP(), loc_idx)); 5839fed0d85SGreg Clayton return sb_breakpoint_loc; 5849fed0d85SGreg Clayton } 5859fed0d85SGreg Clayton 5869fed0d85SGreg Clayton 587