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 10dbb0abbfSEugene Zelenko // C Includes 11dbb0abbfSEugene Zelenko // C++ Includes 12dbb0abbfSEugene Zelenko // Other libraries and framework includes 13dbb0abbfSEugene Zelenko // Project includes 1430fdc8d8SChris Lattner #include "lldb/API/SBBreakpoint.h" 1530fdc8d8SChris Lattner #include "lldb/API/SBBreakpointLocation.h" 1630fdc8d8SChris Lattner #include "lldb/API/SBDebugger.h" 179fed0d85SGreg Clayton #include "lldb/API/SBEvent.h" 1830fdc8d8SChris Lattner #include "lldb/API/SBProcess.h" 19dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 205e09c8c3SJim Ingham #include "lldb/API/SBStringList.h" 2130fdc8d8SChris Lattner #include "lldb/API/SBThread.h" 2230fdc8d8SChris Lattner 2330fdc8d8SChris Lattner #include "lldb/Breakpoint/Breakpoint.h" 2401f16664SJim Ingham #include "lldb/Breakpoint/BreakpointIDList.h" 2530fdc8d8SChris Lattner #include "lldb/Breakpoint/BreakpointLocation.h" 2630fdc8d8SChris Lattner #include "lldb/Breakpoint/StoppointCallbackContext.h" 2730fdc8d8SChris Lattner #include "lldb/Core/Address.h" 28d80102e4SJim Ingham #include "lldb/Core/Debugger.h" 29ceb6b139SCaroline Tice #include "lldb/Core/Log.h" 3030fdc8d8SChris Lattner #include "lldb/Core/Stream.h" 3130fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 32d80102e4SJim Ingham #include "lldb/Interpreter/CommandInterpreter.h" 33d80102e4SJim Ingham #include "lldb/Interpreter/ScriptInterpreter.h" 3430fdc8d8SChris Lattner #include "lldb/Target/Process.h" 35d5944cd1SGreg Clayton #include "lldb/Target/SectionLoadList.h" 3630fdc8d8SChris Lattner #include "lldb/Target/Target.h" 3762b02c61SJim Ingham #include "lldb/Target/Thread.h" 3862b02c61SJim Ingham #include "lldb/Target/ThreadSpec.h" 3930fdc8d8SChris Lattner 4030fdc8d8SChris Lattner #include "lldb/lldb-enumerations.h" 4130fdc8d8SChris Lattner 424e4fbe82SZachary Turner #include "llvm/ADT/STLExtras.h" 434e4fbe82SZachary Turner 4430fdc8d8SChris Lattner using namespace lldb; 4530fdc8d8SChris Lattner using namespace lldb_private; 4630fdc8d8SChris Lattner 47b9c1b51eSKate Stone struct CallbackData { 4830fdc8d8SChris Lattner SBBreakpoint::BreakpointHitCallback callback; 4930fdc8d8SChris Lattner void *callback_baton; 5030fdc8d8SChris Lattner }; 5130fdc8d8SChris Lattner 524e4fbe82SZachary Turner class SBBreakpointCallbackBaton : public TypedBaton<CallbackData> { 5330fdc8d8SChris Lattner public: 54b9c1b51eSKate Stone SBBreakpointCallbackBaton(SBBreakpoint::BreakpointHitCallback callback, 55b9c1b51eSKate Stone void *baton) 564e4fbe82SZachary Turner : TypedBaton(llvm::make_unique<CallbackData>()) { 574e4fbe82SZachary Turner getItem()->callback = callback; 584e4fbe82SZachary Turner getItem()->callback_baton = baton; 5930fdc8d8SChris Lattner } 6030fdc8d8SChris Lattner }; 6130fdc8d8SChris Lattner 62b9c1b51eSKate Stone SBBreakpoint::SBBreakpoint() : m_opaque_sp() {} 6330fdc8d8SChris Lattner 64b9c1b51eSKate Stone SBBreakpoint::SBBreakpoint(const SBBreakpoint &rhs) 65b9c1b51eSKate Stone : m_opaque_sp(rhs.m_opaque_sp) {} 6630fdc8d8SChris Lattner 67b9c1b51eSKate Stone SBBreakpoint::SBBreakpoint(const lldb::BreakpointSP &bp_sp) 68b9c1b51eSKate Stone : m_opaque_sp(bp_sp) {} 6930fdc8d8SChris Lattner 70dbb0abbfSEugene Zelenko SBBreakpoint::~SBBreakpoint() = default; 7130fdc8d8SChris Lattner 72b9c1b51eSKate Stone const SBBreakpoint &SBBreakpoint::operator=(const SBBreakpoint &rhs) { 7330fdc8d8SChris Lattner if (this != &rhs) 746611103cSGreg Clayton m_opaque_sp = rhs.m_opaque_sp; 7530fdc8d8SChris Lattner return *this; 7630fdc8d8SChris Lattner } 7730fdc8d8SChris Lattner 78b9c1b51eSKate Stone bool SBBreakpoint::operator==(const lldb::SBBreakpoint &rhs) { 79ac2eb9b1SGreg Clayton if (m_opaque_sp && rhs.m_opaque_sp) 80ac2eb9b1SGreg Clayton return m_opaque_sp.get() == rhs.m_opaque_sp.get(); 81ac2eb9b1SGreg Clayton return false; 82ac2eb9b1SGreg Clayton } 83ac2eb9b1SGreg Clayton 84b9c1b51eSKate Stone bool SBBreakpoint::operator!=(const lldb::SBBreakpoint &rhs) { 85c3387333SEnrico Granata if (m_opaque_sp && rhs.m_opaque_sp) 86c3387333SEnrico Granata return m_opaque_sp.get() != rhs.m_opaque_sp.get(); 87c3387333SEnrico Granata return (m_opaque_sp && !rhs.m_opaque_sp) || (rhs.m_opaque_sp && !m_opaque_sp); 88c3387333SEnrico Granata } 89c3387333SEnrico Granata 90b9c1b51eSKate Stone break_id_t SBBreakpoint::GetID() const { 915160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 92ceb6b139SCaroline Tice 93af67cecdSGreg Clayton break_id_t break_id = LLDB_INVALID_BREAK_ID; 946611103cSGreg Clayton if (m_opaque_sp) 95af67cecdSGreg Clayton break_id = m_opaque_sp->GetID(); 96af67cecdSGreg Clayton 97b9c1b51eSKate Stone if (log) { 98af67cecdSGreg Clayton if (break_id == LLDB_INVALID_BREAK_ID) 99324a1036SSaleem Abdulrasool log->Printf("SBBreakpoint(%p)::GetID () => LLDB_INVALID_BREAK_ID", 100324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_sp.get())); 101af67cecdSGreg Clayton else 102324a1036SSaleem Abdulrasool log->Printf("SBBreakpoint(%p)::GetID () => %u", 103324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_sp.get()), break_id); 104ceb6b139SCaroline Tice } 105ceb6b139SCaroline Tice 106af67cecdSGreg Clayton return break_id; 10730fdc8d8SChris Lattner } 10830fdc8d8SChris Lattner 109b9c1b51eSKate Stone bool SBBreakpoint::IsValid() const { 110e029fa57SJim Ingham if (!m_opaque_sp) 111e029fa57SJim Ingham return false; 112e029fa57SJim Ingham else if (m_opaque_sp->GetTarget().GetBreakpointByID(m_opaque_sp->GetID())) 113e029fa57SJim Ingham return true; 114e029fa57SJim Ingham else 115e029fa57SJim Ingham return false; 11630fdc8d8SChris Lattner } 11730fdc8d8SChris Lattner 118b9c1b51eSKate Stone void SBBreakpoint::ClearAllBreakpointSites() { 119b9c1b51eSKate Stone if (m_opaque_sp) { 120b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 121b9c1b51eSKate Stone m_opaque_sp->GetTarget().GetAPIMutex()); 1226611103cSGreg Clayton m_opaque_sp->ClearAllBreakpointSites(); 12330fdc8d8SChris Lattner } 124af67cecdSGreg Clayton } 12530fdc8d8SChris Lattner 126b9c1b51eSKate Stone SBBreakpointLocation SBBreakpoint::FindLocationByAddress(addr_t vm_addr) { 12730fdc8d8SChris Lattner SBBreakpointLocation sb_bp_location; 12830fdc8d8SChris Lattner 129b9c1b51eSKate Stone if (m_opaque_sp) { 130b9c1b51eSKate Stone if (vm_addr != LLDB_INVALID_ADDRESS) { 131b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 132b9c1b51eSKate Stone m_opaque_sp->GetTarget().GetAPIMutex()); 13330fdc8d8SChris Lattner Address address; 134f5e56de0SGreg Clayton Target &target = m_opaque_sp->GetTarget(); 135b9c1b51eSKate Stone if (!target.GetSectionLoadList().ResolveLoadAddress(vm_addr, address)) { 136e72dfb32SGreg Clayton address.SetRawAddress(vm_addr); 13730fdc8d8SChris Lattner } 1386611103cSGreg Clayton sb_bp_location.SetLocation(m_opaque_sp->FindLocationByAddress(address)); 13930fdc8d8SChris Lattner } 14030fdc8d8SChris Lattner } 14130fdc8d8SChris Lattner return sb_bp_location; 14230fdc8d8SChris Lattner } 14330fdc8d8SChris Lattner 144b9c1b51eSKate Stone break_id_t SBBreakpoint::FindLocationIDByAddress(addr_t vm_addr) { 145af67cecdSGreg Clayton break_id_t break_id = LLDB_INVALID_BREAK_ID; 14630fdc8d8SChris Lattner 147b9c1b51eSKate Stone if (m_opaque_sp && vm_addr != LLDB_INVALID_ADDRESS) { 148b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 149b9c1b51eSKate Stone m_opaque_sp->GetTarget().GetAPIMutex()); 15030fdc8d8SChris Lattner Address address; 151f5e56de0SGreg Clayton Target &target = m_opaque_sp->GetTarget(); 152b9c1b51eSKate Stone if (!target.GetSectionLoadList().ResolveLoadAddress(vm_addr, address)) { 153e72dfb32SGreg Clayton address.SetRawAddress(vm_addr); 15430fdc8d8SChris Lattner } 155af67cecdSGreg Clayton break_id = m_opaque_sp->FindLocationIDByAddress(address); 15630fdc8d8SChris Lattner } 15730fdc8d8SChris Lattner 158af67cecdSGreg Clayton return break_id; 15930fdc8d8SChris Lattner } 16030fdc8d8SChris Lattner 161b9c1b51eSKate Stone SBBreakpointLocation SBBreakpoint::FindLocationByID(break_id_t bp_loc_id) { 16230fdc8d8SChris Lattner SBBreakpointLocation sb_bp_location; 16330fdc8d8SChris Lattner 164b9c1b51eSKate Stone if (m_opaque_sp) { 165b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 166b9c1b51eSKate Stone m_opaque_sp->GetTarget().GetAPIMutex()); 1676611103cSGreg Clayton sb_bp_location.SetLocation(m_opaque_sp->FindLocationByID(bp_loc_id)); 168af67cecdSGreg Clayton } 16930fdc8d8SChris Lattner 17030fdc8d8SChris Lattner return sb_bp_location; 17130fdc8d8SChris Lattner } 17230fdc8d8SChris Lattner 173b9c1b51eSKate Stone SBBreakpointLocation SBBreakpoint::GetLocationAtIndex(uint32_t index) { 17430fdc8d8SChris Lattner SBBreakpointLocation sb_bp_location; 17530fdc8d8SChris Lattner 176b9c1b51eSKate Stone if (m_opaque_sp) { 177b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 178b9c1b51eSKate Stone m_opaque_sp->GetTarget().GetAPIMutex()); 1796611103cSGreg Clayton sb_bp_location.SetLocation(m_opaque_sp->GetLocationAtIndex(index)); 180af67cecdSGreg Clayton } 18130fdc8d8SChris Lattner 18230fdc8d8SChris Lattner return sb_bp_location; 18330fdc8d8SChris Lattner } 18430fdc8d8SChris Lattner 185b9c1b51eSKate Stone void SBBreakpoint::SetEnabled(bool enable) { 1865160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 187ceb6b139SCaroline Tice 188ceb6b139SCaroline Tice if (log) 189324a1036SSaleem Abdulrasool log->Printf("SBBreakpoint(%p)::SetEnabled (enabled=%i)", 190324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_sp.get()), enable); 191ceb6b139SCaroline Tice 192b9c1b51eSKate Stone if (m_opaque_sp) { 193b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 194b9c1b51eSKate Stone m_opaque_sp->GetTarget().GetAPIMutex()); 1956611103cSGreg Clayton m_opaque_sp->SetEnabled(enable); 19630fdc8d8SChris Lattner } 197af67cecdSGreg Clayton } 19830fdc8d8SChris Lattner 199b9c1b51eSKate Stone bool SBBreakpoint::IsEnabled() { 200b9c1b51eSKate Stone if (m_opaque_sp) { 201b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 202b9c1b51eSKate Stone m_opaque_sp->GetTarget().GetAPIMutex()); 2036611103cSGreg Clayton return m_opaque_sp->IsEnabled(); 204b9c1b51eSKate Stone } else 20530fdc8d8SChris Lattner return false; 20630fdc8d8SChris Lattner } 20730fdc8d8SChris Lattner 208b9c1b51eSKate Stone void SBBreakpoint::SetOneShot(bool one_shot) { 2095160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 210ca36cd16SJim Ingham 211ca36cd16SJim Ingham if (log) 212324a1036SSaleem Abdulrasool log->Printf("SBBreakpoint(%p)::SetOneShot (one_shot=%i)", 213324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_sp.get()), one_shot); 214ca36cd16SJim Ingham 215b9c1b51eSKate Stone if (m_opaque_sp) { 216b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 217b9c1b51eSKate Stone m_opaque_sp->GetTarget().GetAPIMutex()); 218ca36cd16SJim Ingham m_opaque_sp->SetOneShot(one_shot); 219ca36cd16SJim Ingham } 220ca36cd16SJim Ingham } 221ca36cd16SJim Ingham 222b9c1b51eSKate Stone bool SBBreakpoint::IsOneShot() const { 223b9c1b51eSKate Stone if (m_opaque_sp) { 224b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 225b9c1b51eSKate Stone m_opaque_sp->GetTarget().GetAPIMutex()); 226ca36cd16SJim Ingham return m_opaque_sp->IsOneShot(); 227b9c1b51eSKate Stone } else 228ca36cd16SJim Ingham return false; 229ca36cd16SJim Ingham } 230ca36cd16SJim Ingham 231b9c1b51eSKate Stone bool SBBreakpoint::IsInternal() { 232b9c1b51eSKate Stone if (m_opaque_sp) { 233b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 234b9c1b51eSKate Stone m_opaque_sp->GetTarget().GetAPIMutex()); 23511c8108dSJim Ingham return m_opaque_sp->IsInternal(); 236b9c1b51eSKate Stone } else 23711c8108dSJim Ingham return false; 23811c8108dSJim Ingham } 23911c8108dSJim Ingham 240b9c1b51eSKate Stone void SBBreakpoint::SetIgnoreCount(uint32_t count) { 2415160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 242ceb6b139SCaroline Tice 243ceb6b139SCaroline Tice if (log) 244324a1036SSaleem Abdulrasool log->Printf("SBBreakpoint(%p)::SetIgnoreCount (count=%u)", 245324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_sp.get()), count); 246ceb6b139SCaroline Tice 247b9c1b51eSKate Stone if (m_opaque_sp) { 248b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 249b9c1b51eSKate Stone m_opaque_sp->GetTarget().GetAPIMutex()); 2506611103cSGreg Clayton m_opaque_sp->SetIgnoreCount(count); 25130fdc8d8SChris Lattner } 252af67cecdSGreg Clayton } 25330fdc8d8SChris Lattner 254b9c1b51eSKate Stone void SBBreakpoint::SetCondition(const char *condition) { 255b9c1b51eSKate Stone if (m_opaque_sp) { 256b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 257b9c1b51eSKate Stone m_opaque_sp->GetTarget().GetAPIMutex()); 258041a12fcSJim Ingham m_opaque_sp->SetCondition(condition); 259041a12fcSJim Ingham } 260af67cecdSGreg Clayton } 261041a12fcSJim Ingham 262b9c1b51eSKate Stone const char *SBBreakpoint::GetCondition() { 263b9c1b51eSKate Stone if (m_opaque_sp) { 264b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 265b9c1b51eSKate Stone m_opaque_sp->GetTarget().GetAPIMutex()); 266041a12fcSJim Ingham return m_opaque_sp->GetConditionText(); 267041a12fcSJim Ingham } 268dbb0abbfSEugene Zelenko return nullptr; 269af67cecdSGreg Clayton } 270041a12fcSJim Ingham 271b9c1b51eSKate Stone uint32_t SBBreakpoint::GetHitCount() const { 2724838131bSGreg Clayton uint32_t count = 0; 273b9c1b51eSKate Stone if (m_opaque_sp) { 274b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 275b9c1b51eSKate Stone m_opaque_sp->GetTarget().GetAPIMutex()); 2764838131bSGreg Clayton count = m_opaque_sp->GetHitCount(); 277af67cecdSGreg Clayton } 2784838131bSGreg Clayton 2795160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 280ceb6b139SCaroline Tice if (log) 281324a1036SSaleem Abdulrasool log->Printf("SBBreakpoint(%p)::GetHitCount () => %u", 282324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_sp.get()), count); 2834838131bSGreg Clayton 2844838131bSGreg Clayton return count; 285ceb6b139SCaroline Tice } 2869fed0d85SGreg Clayton 287b9c1b51eSKate Stone uint32_t SBBreakpoint::GetIgnoreCount() const { 2884838131bSGreg Clayton uint32_t count = 0; 289b9c1b51eSKate Stone if (m_opaque_sp) { 290b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 291b9c1b51eSKate Stone m_opaque_sp->GetTarget().GetAPIMutex()); 2924838131bSGreg Clayton count = m_opaque_sp->GetIgnoreCount(); 293af67cecdSGreg Clayton } 2944838131bSGreg Clayton 2955160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 2964838131bSGreg Clayton if (log) 297324a1036SSaleem Abdulrasool log->Printf("SBBreakpoint(%p)::GetIgnoreCount () => %u", 298324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_sp.get()), count); 2994838131bSGreg Clayton 3004838131bSGreg Clayton return count; 30130fdc8d8SChris Lattner } 30230fdc8d8SChris Lattner 303b9c1b51eSKate Stone void SBBreakpoint::SetThreadID(tid_t tid) { 304b9c1b51eSKate Stone if (m_opaque_sp) { 305b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 306b9c1b51eSKate Stone m_opaque_sp->GetTarget().GetAPIMutex()); 3074838131bSGreg Clayton m_opaque_sp->SetThreadID(tid); 308af67cecdSGreg Clayton } 3095160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 3104838131bSGreg Clayton if (log) 311324a1036SSaleem Abdulrasool log->Printf("SBBreakpoint(%p)::SetThreadID (tid=0x%4.4" PRIx64 ")", 312324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_sp.get()), tid); 31330fdc8d8SChris Lattner } 31430fdc8d8SChris Lattner 315b9c1b51eSKate Stone tid_t SBBreakpoint::GetThreadID() { 3164838131bSGreg Clayton tid_t tid = LLDB_INVALID_THREAD_ID; 317b9c1b51eSKate Stone if (m_opaque_sp) { 318b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 319b9c1b51eSKate Stone m_opaque_sp->GetTarget().GetAPIMutex()); 3204838131bSGreg Clayton tid = m_opaque_sp->GetThreadID(); 321af67cecdSGreg Clayton } 32230fdc8d8SChris Lattner 3235160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 3244838131bSGreg Clayton if (log) 325324a1036SSaleem Abdulrasool log->Printf("SBBreakpoint(%p)::GetThreadID () => 0x%4.4" PRIx64, 326324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_sp.get()), tid); 3274838131bSGreg Clayton return tid; 32830fdc8d8SChris Lattner } 32930fdc8d8SChris Lattner 330b9c1b51eSKate Stone void SBBreakpoint::SetThreadIndex(uint32_t index) { 3315160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 3324838131bSGreg Clayton if (log) 333324a1036SSaleem Abdulrasool log->Printf("SBBreakpoint(%p)::SetThreadIndex (%u)", 334324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_sp.get()), index); 335b9c1b51eSKate Stone if (m_opaque_sp) { 336b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 337b9c1b51eSKate Stone m_opaque_sp->GetTarget().GetAPIMutex()); 3386611103cSGreg Clayton m_opaque_sp->GetOptions()->GetThreadSpec()->SetIndex(index); 33962b02c61SJim Ingham } 340af67cecdSGreg Clayton } 34162b02c61SJim Ingham 342b9c1b51eSKate Stone uint32_t SBBreakpoint::GetThreadIndex() const { 343bdf4c6acSGreg Clayton uint32_t thread_idx = UINT32_MAX; 344b9c1b51eSKate Stone if (m_opaque_sp) { 345b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 346b9c1b51eSKate Stone m_opaque_sp->GetTarget().GetAPIMutex()); 347b9c1b51eSKate Stone const ThreadSpec *thread_spec = 348b9c1b51eSKate Stone m_opaque_sp->GetOptions()->GetThreadSpecNoCreate(); 349dbb0abbfSEugene Zelenko if (thread_spec != nullptr) 3504838131bSGreg Clayton thread_idx = thread_spec->GetIndex(); 35162b02c61SJim Ingham } 3525160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 3534838131bSGreg Clayton if (log) 354324a1036SSaleem Abdulrasool log->Printf("SBBreakpoint(%p)::GetThreadIndex () => %u", 355324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_sp.get()), thread_idx); 3564838131bSGreg Clayton 357763d1a17SJohnny Chen return thread_idx; 35862b02c61SJim Ingham } 35962b02c61SJim Ingham 360b9c1b51eSKate Stone void SBBreakpoint::SetThreadName(const char *thread_name) { 3615160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 3624838131bSGreg Clayton if (log) 363324a1036SSaleem Abdulrasool log->Printf("SBBreakpoint(%p)::SetThreadName (%s)", 364324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_sp.get()), thread_name); 3654838131bSGreg Clayton 366b9c1b51eSKate Stone if (m_opaque_sp) { 367b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 368b9c1b51eSKate Stone m_opaque_sp->GetTarget().GetAPIMutex()); 3696611103cSGreg Clayton m_opaque_sp->GetOptions()->GetThreadSpec()->SetName(thread_name); 37062b02c61SJim Ingham } 371af67cecdSGreg Clayton } 37262b02c61SJim Ingham 373b9c1b51eSKate Stone const char *SBBreakpoint::GetThreadName() const { 374dbb0abbfSEugene Zelenko const char *name = nullptr; 375b9c1b51eSKate Stone if (m_opaque_sp) { 376b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 377b9c1b51eSKate Stone m_opaque_sp->GetTarget().GetAPIMutex()); 378b9c1b51eSKate Stone const ThreadSpec *thread_spec = 379b9c1b51eSKate Stone m_opaque_sp->GetOptions()->GetThreadSpecNoCreate(); 380dbb0abbfSEugene Zelenko if (thread_spec != nullptr) 3814838131bSGreg Clayton name = thread_spec->GetName(); 38262b02c61SJim Ingham } 3835160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 3844838131bSGreg Clayton if (log) 385324a1036SSaleem Abdulrasool log->Printf("SBBreakpoint(%p)::GetThreadName () => %s", 386324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_sp.get()), name); 3874838131bSGreg Clayton 3884838131bSGreg Clayton return name; 38962b02c61SJim Ingham } 39062b02c61SJim Ingham 391b9c1b51eSKate Stone void SBBreakpoint::SetQueueName(const char *queue_name) { 3925160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 3934838131bSGreg Clayton if (log) 394324a1036SSaleem Abdulrasool log->Printf("SBBreakpoint(%p)::SetQueueName (%s)", 395324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_sp.get()), queue_name); 396b9c1b51eSKate Stone if (m_opaque_sp) { 397b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 398b9c1b51eSKate Stone m_opaque_sp->GetTarget().GetAPIMutex()); 3996611103cSGreg Clayton m_opaque_sp->GetOptions()->GetThreadSpec()->SetQueueName(queue_name); 40062b02c61SJim Ingham } 401af67cecdSGreg Clayton } 40262b02c61SJim Ingham 403b9c1b51eSKate Stone const char *SBBreakpoint::GetQueueName() const { 404dbb0abbfSEugene Zelenko const char *name = nullptr; 405b9c1b51eSKate Stone if (m_opaque_sp) { 406b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 407b9c1b51eSKate Stone m_opaque_sp->GetTarget().GetAPIMutex()); 408b9c1b51eSKate Stone const ThreadSpec *thread_spec = 409b9c1b51eSKate Stone m_opaque_sp->GetOptions()->GetThreadSpecNoCreate(); 410af67cecdSGreg Clayton if (thread_spec) 4114838131bSGreg Clayton name = thread_spec->GetQueueName(); 41262b02c61SJim Ingham } 4135160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 4144838131bSGreg Clayton if (log) 415324a1036SSaleem Abdulrasool log->Printf("SBBreakpoint(%p)::GetQueueName () => %s", 416324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_sp.get()), name); 4174838131bSGreg Clayton 4184838131bSGreg Clayton return name; 41962b02c61SJim Ingham } 42062b02c61SJim Ingham 421b9c1b51eSKate Stone size_t SBBreakpoint::GetNumResolvedLocations() const { 4224838131bSGreg Clayton size_t num_resolved = 0; 423b9c1b51eSKate Stone if (m_opaque_sp) { 424b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 425b9c1b51eSKate Stone m_opaque_sp->GetTarget().GetAPIMutex()); 4264838131bSGreg Clayton num_resolved = m_opaque_sp->GetNumResolvedLocations(); 427af67cecdSGreg Clayton } 4285160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 4294838131bSGreg Clayton if (log) 430324a1036SSaleem Abdulrasool log->Printf("SBBreakpoint(%p)::GetNumResolvedLocations () => %" PRIu64, 431324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_sp.get()), 432324a1036SSaleem Abdulrasool static_cast<uint64_t>(num_resolved)); 4334838131bSGreg Clayton return num_resolved; 43430fdc8d8SChris Lattner } 43530fdc8d8SChris Lattner 436b9c1b51eSKate Stone size_t SBBreakpoint::GetNumLocations() const { 4374838131bSGreg Clayton size_t num_locs = 0; 438b9c1b51eSKate Stone if (m_opaque_sp) { 439b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 440b9c1b51eSKate Stone m_opaque_sp->GetTarget().GetAPIMutex()); 4414838131bSGreg Clayton num_locs = m_opaque_sp->GetNumLocations(); 442af67cecdSGreg Clayton } 4435160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 4444838131bSGreg Clayton if (log) 445324a1036SSaleem Abdulrasool log->Printf("SBBreakpoint(%p)::GetNumLocations () => %" PRIu64, 446324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_sp.get()), 447324a1036SSaleem Abdulrasool static_cast<uint64_t>(num_locs)); 4484838131bSGreg Clayton return num_locs; 44930fdc8d8SChris Lattner } 45030fdc8d8SChris Lattner 45192d1960eSJim Ingham void SBBreakpoint::SetCommandLineCommands(SBStringList &commands) { 45292d1960eSJim Ingham if (!m_opaque_sp) 45392d1960eSJim Ingham return; 45492d1960eSJim Ingham if (commands.GetSize() == 0) 45592d1960eSJim Ingham return; 45692d1960eSJim Ingham 45792d1960eSJim Ingham std::lock_guard<std::recursive_mutex> guard( 45892d1960eSJim Ingham m_opaque_sp->GetTarget().GetAPIMutex()); 45992d1960eSJim Ingham std::unique_ptr<BreakpointOptions::CommandData> cmd_data_up( 460f7e07256SJim Ingham new BreakpointOptions::CommandData(*commands, eScriptLanguageNone)); 46192d1960eSJim Ingham 46292d1960eSJim Ingham m_opaque_sp->GetOptions()->SetCommandDataCallback(cmd_data_up); 46392d1960eSJim Ingham } 46492d1960eSJim Ingham 46592d1960eSJim Ingham bool SBBreakpoint::GetCommandLineCommands(SBStringList &commands) { 46692d1960eSJim Ingham if (!m_opaque_sp) 46792d1960eSJim Ingham return false; 46892d1960eSJim Ingham StringList command_list; 46992d1960eSJim Ingham bool has_commands = 47092d1960eSJim Ingham m_opaque_sp->GetOptions()->GetCommandLineCallbacks(command_list); 47192d1960eSJim Ingham if (has_commands) 47292d1960eSJim Ingham commands.AppendList(command_list); 47392d1960eSJim Ingham return has_commands; 47492d1960eSJim Ingham } 47592d1960eSJim Ingham 476b9c1b51eSKate Stone bool SBBreakpoint::GetDescription(SBStream &s) { 4776d1e4696SJim Ingham return GetDescription(s, true); 4786d1e4696SJim Ingham } 4796d1e4696SJim Ingham 4806d1e4696SJim Ingham bool SBBreakpoint::GetDescription(SBStream &s, bool include_locations) { 481b9c1b51eSKate Stone if (m_opaque_sp) { 482b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 483b9c1b51eSKate Stone m_opaque_sp->GetTarget().GetAPIMutex()); 48405faeb71SGreg Clayton s.Printf("SBBreakpoint: id = %i, ", m_opaque_sp->GetID()); 48505faeb71SGreg Clayton m_opaque_sp->GetResolverDescription(s.get()); 48605faeb71SGreg Clayton m_opaque_sp->GetFilterDescription(s.get()); 4876d1e4696SJim Ingham if (include_locations) { 48805faeb71SGreg Clayton const size_t num_locations = m_opaque_sp->GetNumLocations(); 489d01b2953SDaniel Malea s.Printf(", locations = %" PRIu64, (uint64_t)num_locations); 4906d1e4696SJim Ingham } 491dde9cff3SCaroline Tice return true; 492dde9cff3SCaroline Tice } 49305faeb71SGreg Clayton s.Printf("No value"); 49405faeb71SGreg Clayton return false; 49505faeb71SGreg Clayton } 496dde9cff3SCaroline Tice 497b9c1b51eSKate Stone bool SBBreakpoint::PrivateBreakpointHitCallback(void *baton, 49830fdc8d8SChris Lattner StoppointCallbackContext *ctx, 49930fdc8d8SChris Lattner lldb::user_id_t break_id, 500b9c1b51eSKate Stone lldb::user_id_t break_loc_id) { 5011ac04c30SGreg Clayton ExecutionContext exe_ctx(ctx->exe_ctx_ref); 502b9c1b51eSKate Stone BreakpointSP bp_sp( 503b9c1b51eSKate Stone exe_ctx.GetTargetRef().GetBreakpointList().FindBreakpointByID(break_id)); 504b9c1b51eSKate Stone if (baton && bp_sp) { 50530fdc8d8SChris Lattner CallbackData *data = (CallbackData *)baton; 50630fdc8d8SChris Lattner lldb_private::Breakpoint *bp = bp_sp.get(); 507b9c1b51eSKate Stone if (bp && data->callback) { 5081ac04c30SGreg Clayton Process *process = exe_ctx.GetProcessPtr(); 509b9c1b51eSKate Stone if (process) { 510e1cd1be6SGreg Clayton SBProcess sb_process(process->shared_from_this()); 51130fdc8d8SChris Lattner SBThread sb_thread; 51230fdc8d8SChris Lattner SBBreakpointLocation sb_location; 51330fdc8d8SChris Lattner assert(bp_sp); 51430fdc8d8SChris Lattner sb_location.SetLocation(bp_sp->FindLocationByID(break_loc_id)); 5151ac04c30SGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 516c14ee32dSGreg Clayton if (thread) 517e1cd1be6SGreg Clayton sb_thread.SetThread(thread->shared_from_this()); 51830fdc8d8SChris Lattner 519b9c1b51eSKate Stone return data->callback(data->callback_baton, sb_process, sb_thread, 52030fdc8d8SChris Lattner sb_location); 52130fdc8d8SChris Lattner } 52230fdc8d8SChris Lattner } 52330fdc8d8SChris Lattner } 52430fdc8d8SChris Lattner return true; // Return true if we should stop at this breakpoint 52530fdc8d8SChris Lattner } 52630fdc8d8SChris Lattner 527b9c1b51eSKate Stone void SBBreakpoint::SetCallback(BreakpointHitCallback callback, void *baton) { 5285160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 529ceb6b139SCaroline Tice 530b9c1b51eSKate Stone if (log) { 531324a1036SSaleem Abdulrasool void *pointer = &callback; 532324a1036SSaleem Abdulrasool log->Printf("SBBreakpoint(%p)::SetCallback (callback=%p, baton=%p)", 533324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_sp.get()), 534324a1036SSaleem Abdulrasool *static_cast<void **>(&pointer), static_cast<void *>(baton)); 535324a1036SSaleem Abdulrasool } 536ceb6b139SCaroline Tice 537b9c1b51eSKate Stone if (m_opaque_sp) { 538b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 539b9c1b51eSKate Stone m_opaque_sp->GetTarget().GetAPIMutex()); 54030fdc8d8SChris Lattner BatonSP baton_sp(new SBBreakpointCallbackBaton(callback, baton)); 541b9c1b51eSKate Stone m_opaque_sp->SetCallback(SBBreakpoint::PrivateBreakpointHitCallback, 542b9c1b51eSKate Stone baton_sp, false); 54330fdc8d8SChris Lattner } 54430fdc8d8SChris Lattner } 54530fdc8d8SChris Lattner 546b9c1b51eSKate Stone void SBBreakpoint::SetScriptCallbackFunction( 547b9c1b51eSKate Stone const char *callback_function_name) { 548d80102e4SJim Ingham Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 549d80102e4SJim Ingham 550d80102e4SJim Ingham if (log) 551324a1036SSaleem Abdulrasool log->Printf("SBBreakpoint(%p)::SetScriptCallbackFunction (callback=%s)", 552b9c1b51eSKate Stone static_cast<void *>(m_opaque_sp.get()), callback_function_name); 553d80102e4SJim Ingham 554b9c1b51eSKate Stone if (m_opaque_sp) { 555b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 556b9c1b51eSKate Stone m_opaque_sp->GetTarget().GetAPIMutex()); 557d80102e4SJim Ingham BreakpointOptions *bp_options = m_opaque_sp->GetOptions(); 558b9c1b51eSKate Stone m_opaque_sp->GetTarget() 559b9c1b51eSKate Stone .GetDebugger() 560b9c1b51eSKate Stone .GetCommandInterpreter() 561b9c1b51eSKate Stone .GetScriptInterpreter() 562b9c1b51eSKate Stone ->SetBreakpointCommandCallbackFunction(bp_options, 563d80102e4SJim Ingham callback_function_name); 564d80102e4SJim Ingham } 565d80102e4SJim Ingham } 566d80102e4SJim Ingham 567b9c1b51eSKate Stone SBError SBBreakpoint::SetScriptCallbackBody(const char *callback_body_text) { 568d80102e4SJim Ingham Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 569d80102e4SJim Ingham 570d80102e4SJim Ingham if (log) 571324a1036SSaleem Abdulrasool log->Printf("SBBreakpoint(%p)::SetScriptCallbackBody: callback body:\n%s)", 572324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_sp.get()), callback_body_text); 573d80102e4SJim Ingham 574d80102e4SJim Ingham SBError sb_error; 575b9c1b51eSKate Stone if (m_opaque_sp) { 576b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 577b9c1b51eSKate Stone m_opaque_sp->GetTarget().GetAPIMutex()); 578d80102e4SJim Ingham BreakpointOptions *bp_options = m_opaque_sp->GetOptions(); 579b9c1b51eSKate Stone Error error = 580b9c1b51eSKate Stone m_opaque_sp->GetTarget() 581b9c1b51eSKate Stone .GetDebugger() 582b9c1b51eSKate Stone .GetCommandInterpreter() 583b9c1b51eSKate Stone .GetScriptInterpreter() 584b9c1b51eSKate Stone ->SetBreakpointCommandCallback(bp_options, callback_body_text); 585d80102e4SJim Ingham sb_error.SetError(error); 586b9c1b51eSKate Stone } else 587d80102e4SJim Ingham sb_error.SetErrorString("invalid breakpoint"); 588d80102e4SJim Ingham 589d80102e4SJim Ingham return sb_error; 590d80102e4SJim Ingham } 59130fdc8d8SChris Lattner 592b9c1b51eSKate Stone bool SBBreakpoint::AddName(const char *new_name) { 5935e09c8c3SJim Ingham Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 5945e09c8c3SJim Ingham 5955e09c8c3SJim Ingham if (log) 5965e09c8c3SJim Ingham log->Printf("SBBreakpoint(%p)::AddName (name=%s)", 597b9c1b51eSKate Stone static_cast<void *>(m_opaque_sp.get()), new_name); 5985e09c8c3SJim Ingham 599b9c1b51eSKate Stone if (m_opaque_sp) { 600b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 601b9c1b51eSKate Stone m_opaque_sp->GetTarget().GetAPIMutex()); 602b9c1b51eSKate Stone Error error; // Think I'm just going to swallow the error here, it's 603b9c1b51eSKate Stone // probably more annoying to have to provide it. 6045e09c8c3SJim Ingham return m_opaque_sp->AddName(new_name, error); 6055e09c8c3SJim Ingham } 6065e09c8c3SJim Ingham 6075e09c8c3SJim Ingham return false; 6085e09c8c3SJim Ingham } 6095e09c8c3SJim Ingham 610b9c1b51eSKate Stone void SBBreakpoint::RemoveName(const char *name_to_remove) { 6115e09c8c3SJim Ingham Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 6125e09c8c3SJim Ingham 6135e09c8c3SJim Ingham if (log) 6145e09c8c3SJim Ingham log->Printf("SBBreakpoint(%p)::RemoveName (name=%s)", 615b9c1b51eSKate Stone static_cast<void *>(m_opaque_sp.get()), name_to_remove); 6165e09c8c3SJim Ingham 617b9c1b51eSKate Stone if (m_opaque_sp) { 618b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 619b9c1b51eSKate Stone m_opaque_sp->GetTarget().GetAPIMutex()); 6205e09c8c3SJim Ingham m_opaque_sp->RemoveName(name_to_remove); 6215e09c8c3SJim Ingham } 6225e09c8c3SJim Ingham } 6235e09c8c3SJim Ingham 624b9c1b51eSKate Stone bool SBBreakpoint::MatchesName(const char *name) { 6255e09c8c3SJim Ingham Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 6265e09c8c3SJim Ingham 6275e09c8c3SJim Ingham if (log) 6285e09c8c3SJim Ingham log->Printf("SBBreakpoint(%p)::MatchesName (name=%s)", 629b9c1b51eSKate Stone static_cast<void *>(m_opaque_sp.get()), name); 6305e09c8c3SJim Ingham 631b9c1b51eSKate Stone if (m_opaque_sp) { 632b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 633b9c1b51eSKate Stone m_opaque_sp->GetTarget().GetAPIMutex()); 6345e09c8c3SJim Ingham return m_opaque_sp->MatchesName(name); 6355e09c8c3SJim Ingham } 6365e09c8c3SJim Ingham 6375e09c8c3SJim Ingham return false; 6385e09c8c3SJim Ingham } 6395e09c8c3SJim Ingham 640b9c1b51eSKate Stone void SBBreakpoint::GetNames(SBStringList &names) { 6415e09c8c3SJim Ingham Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 6425e09c8c3SJim Ingham 6435e09c8c3SJim Ingham if (log) 6445e09c8c3SJim Ingham log->Printf("SBBreakpoint(%p)::GetNames ()", 6455e09c8c3SJim Ingham static_cast<void *>(m_opaque_sp.get())); 6465e09c8c3SJim Ingham 647b9c1b51eSKate Stone if (m_opaque_sp) { 648b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 649b9c1b51eSKate Stone m_opaque_sp->GetTarget().GetAPIMutex()); 6505e09c8c3SJim Ingham std::vector<std::string> names_vec; 6515e09c8c3SJim Ingham m_opaque_sp->GetNames(names_vec); 652b9c1b51eSKate Stone for (std::string name : names_vec) { 6535e09c8c3SJim Ingham names.AppendString(name.c_str()); 6545e09c8c3SJim Ingham } 6555e09c8c3SJim Ingham } 6565e09c8c3SJim Ingham } 6575e09c8c3SJim Ingham 658b9c1b51eSKate Stone lldb_private::Breakpoint *SBBreakpoint::operator->() const { 6596611103cSGreg Clayton return m_opaque_sp.get(); 66030fdc8d8SChris Lattner } 66130fdc8d8SChris Lattner 662b9c1b51eSKate Stone lldb_private::Breakpoint *SBBreakpoint::get() const { 6636611103cSGreg Clayton return m_opaque_sp.get(); 66430fdc8d8SChris Lattner } 66530fdc8d8SChris Lattner 666b9c1b51eSKate Stone lldb::BreakpointSP &SBBreakpoint::operator*() { return m_opaque_sp; } 667b9c1b51eSKate Stone 668b9c1b51eSKate Stone const lldb::BreakpointSP &SBBreakpoint::operator*() const { 6696611103cSGreg Clayton return m_opaque_sp; 67030fdc8d8SChris Lattner } 67130fdc8d8SChris Lattner 672b9c1b51eSKate Stone bool SBBreakpoint::EventIsBreakpointEvent(const lldb::SBEvent &event) { 673b9c1b51eSKate Stone return Breakpoint::BreakpointEventData::GetEventDataFromEvent(event.get()) != 674b9c1b51eSKate Stone nullptr; 675e6bc6cb9SJim Ingham } 676e6bc6cb9SJim Ingham 6779fed0d85SGreg Clayton BreakpointEventType 678b9c1b51eSKate Stone SBBreakpoint::GetBreakpointEventTypeFromEvent(const SBEvent &event) { 6799fed0d85SGreg Clayton if (event.IsValid()) 680b9c1b51eSKate Stone return Breakpoint::BreakpointEventData::GetBreakpointEventTypeFromEvent( 681b9c1b51eSKate Stone event.GetSP()); 6829fed0d85SGreg Clayton return eBreakpointEventTypeInvalidType; 6839fed0d85SGreg Clayton } 6849fed0d85SGreg Clayton 685b9c1b51eSKate Stone SBBreakpoint SBBreakpoint::GetBreakpointFromEvent(const lldb::SBEvent &event) { 6869fed0d85SGreg Clayton SBBreakpoint sb_breakpoint; 6879fed0d85SGreg Clayton if (event.IsValid()) 688b9c1b51eSKate Stone sb_breakpoint.m_opaque_sp = 689b9c1b51eSKate Stone Breakpoint::BreakpointEventData::GetBreakpointFromEvent(event.GetSP()); 6909fed0d85SGreg Clayton return sb_breakpoint; 6919fed0d85SGreg Clayton } 6929fed0d85SGreg Clayton 6939fed0d85SGreg Clayton SBBreakpointLocation 694b9c1b51eSKate Stone SBBreakpoint::GetBreakpointLocationAtIndexFromEvent(const lldb::SBEvent &event, 695b9c1b51eSKate Stone uint32_t loc_idx) { 6969fed0d85SGreg Clayton SBBreakpointLocation sb_breakpoint_loc; 6979fed0d85SGreg Clayton if (event.IsValid()) 698b9c1b51eSKate Stone sb_breakpoint_loc.SetLocation( 699b9c1b51eSKate Stone Breakpoint::BreakpointEventData::GetBreakpointLocationAtIndexFromEvent( 700b9c1b51eSKate Stone event.GetSP(), loc_idx)); 7019fed0d85SGreg Clayton return sb_breakpoint_loc; 7029fed0d85SGreg Clayton } 7039fed0d85SGreg Clayton 704e6bc6cb9SJim Ingham uint32_t 705b9c1b51eSKate Stone SBBreakpoint::GetNumBreakpointLocationsFromEvent(const lldb::SBEvent &event) { 706e6bc6cb9SJim Ingham uint32_t num_locations = 0; 707e6bc6cb9SJim Ingham if (event.IsValid()) 708b9c1b51eSKate Stone num_locations = 709b9c1b51eSKate Stone (Breakpoint::BreakpointEventData::GetNumBreakpointLocationsFromEvent( 710b9c1b51eSKate Stone event.GetSP())); 711e6bc6cb9SJim Ingham return num_locations; 712e6bc6cb9SJim Ingham } 71301f16664SJim Ingham 71401f16664SJim Ingham // This is simple collection of breakpoint id's and their target. 715*653e3f4eSTodd Fiala class SBBreakpointListImpl { 71601f16664SJim Ingham public: 717*653e3f4eSTodd Fiala SBBreakpointListImpl(lldb::TargetSP target_sp) : m_target_wp() { 718*653e3f4eSTodd Fiala if (target_sp && target_sp->IsValid()) 719*653e3f4eSTodd Fiala m_target_wp = target_sp; 72001f16664SJim Ingham } 72101f16664SJim Ingham 72201f16664SJim Ingham ~SBBreakpointListImpl() = default; 72301f16664SJim Ingham 72401f16664SJim Ingham size_t GetSize() { return m_break_ids.size(); } 72501f16664SJim Ingham 72601f16664SJim Ingham BreakpointSP GetBreakpointAtIndex(size_t idx) { 72701f16664SJim Ingham if (idx >= m_break_ids.size()) 72801f16664SJim Ingham return BreakpointSP(); 72901f16664SJim Ingham TargetSP target_sp = m_target_wp.lock(); 73001f16664SJim Ingham if (!target_sp) 73101f16664SJim Ingham return BreakpointSP(); 73201f16664SJim Ingham lldb::break_id_t bp_id = m_break_ids[idx]; 73301f16664SJim Ingham return target_sp->GetBreakpointList().FindBreakpointByID(bp_id); 73401f16664SJim Ingham } 73501f16664SJim Ingham 7366d1e4696SJim Ingham BreakpointSP FindBreakpointByID(lldb::break_id_t desired_id) { 7376d1e4696SJim Ingham TargetSP target_sp = m_target_wp.lock(); 7386d1e4696SJim Ingham if (!target_sp) 7396d1e4696SJim Ingham return BreakpointSP(); 7406d1e4696SJim Ingham 7416d1e4696SJim Ingham for (lldb::break_id_t &break_id : m_break_ids) { 7426d1e4696SJim Ingham if (break_id == desired_id) 7436d1e4696SJim Ingham return target_sp->GetBreakpointList().FindBreakpointByID(break_id); 7446d1e4696SJim Ingham } 7456d1e4696SJim Ingham return BreakpointSP(); 7466d1e4696SJim Ingham } 7476d1e4696SJim Ingham 74801f16664SJim Ingham bool Append(Breakpoint &bkpt) { 74901f16664SJim Ingham TargetSP target_sp = m_target_wp.lock(); 75001f16664SJim Ingham if (!target_sp) 75101f16664SJim Ingham return false; 75201f16664SJim Ingham if (bkpt.GetTargetSP() != target_sp) 75301f16664SJim Ingham return false; 75401f16664SJim Ingham m_break_ids.push_back(bkpt.GetID()); 75501f16664SJim Ingham return true; 75601f16664SJim Ingham } 75701f16664SJim Ingham 75801f16664SJim Ingham bool AppendIfUnique(Breakpoint &bkpt) { 75901f16664SJim Ingham TargetSP target_sp = m_target_wp.lock(); 76001f16664SJim Ingham if (!target_sp) 76101f16664SJim Ingham return false; 76201f16664SJim Ingham if (bkpt.GetTargetSP() != target_sp) 76301f16664SJim Ingham return false; 76401f16664SJim Ingham lldb::break_id_t bp_id = bkpt.GetID(); 76501f16664SJim Ingham if (find(m_break_ids.begin(), m_break_ids.end(), bp_id) == 76601f16664SJim Ingham m_break_ids.end()) 76701f16664SJim Ingham return false; 76801f16664SJim Ingham 76901f16664SJim Ingham m_break_ids.push_back(bkpt.GetID()); 77001f16664SJim Ingham return true; 77101f16664SJim Ingham } 77201f16664SJim Ingham 77301f16664SJim Ingham bool AppendByID(lldb::break_id_t id) { 77401f16664SJim Ingham TargetSP target_sp = m_target_wp.lock(); 77501f16664SJim Ingham if (!target_sp) 77601f16664SJim Ingham return false; 77701f16664SJim Ingham if (id == LLDB_INVALID_BREAK_ID) 77801f16664SJim Ingham return false; 77901f16664SJim Ingham m_break_ids.push_back(id); 78001f16664SJim Ingham return true; 78101f16664SJim Ingham } 78201f16664SJim Ingham 78301f16664SJim Ingham void Clear() { m_break_ids.clear(); } 78401f16664SJim Ingham 78501f16664SJim Ingham void CopyToBreakpointIDList(lldb_private::BreakpointIDList &bp_list) { 78601f16664SJim Ingham for (lldb::break_id_t id : m_break_ids) { 78701f16664SJim Ingham bp_list.AddBreakpointID(BreakpointID(id)); 78801f16664SJim Ingham } 78901f16664SJim Ingham } 79001f16664SJim Ingham 79101f16664SJim Ingham TargetSP GetTarget() { return m_target_wp.lock(); } 79201f16664SJim Ingham 79301f16664SJim Ingham private: 79401f16664SJim Ingham std::vector<lldb::break_id_t> m_break_ids; 79501f16664SJim Ingham TargetWP m_target_wp; 79601f16664SJim Ingham }; 79701f16664SJim Ingham 79801f16664SJim Ingham SBBreakpointList::SBBreakpointList(SBTarget &target) 799*653e3f4eSTodd Fiala : m_opaque_sp(new SBBreakpointListImpl(target.GetSP())) {} 80001f16664SJim Ingham 80101f16664SJim Ingham SBBreakpointList::~SBBreakpointList() {} 80201f16664SJim Ingham 80301f16664SJim Ingham size_t SBBreakpointList::GetSize() const { 80401f16664SJim Ingham if (!m_opaque_sp) 80501f16664SJim Ingham return 0; 80601f16664SJim Ingham else 80701f16664SJim Ingham return m_opaque_sp->GetSize(); 80801f16664SJim Ingham } 80901f16664SJim Ingham 81001f16664SJim Ingham SBBreakpoint SBBreakpointList::GetBreakpointAtIndex(size_t idx) { 81101f16664SJim Ingham if (!m_opaque_sp) 81201f16664SJim Ingham return SBBreakpoint(); 81301f16664SJim Ingham 81401f16664SJim Ingham BreakpointSP bkpt_sp = m_opaque_sp->GetBreakpointAtIndex(idx); 81501f16664SJim Ingham return SBBreakpoint(bkpt_sp); 81601f16664SJim Ingham } 81701f16664SJim Ingham 8186d1e4696SJim Ingham SBBreakpoint SBBreakpointList::FindBreakpointByID(lldb::break_id_t id) { 8196d1e4696SJim Ingham if (!m_opaque_sp) 8206d1e4696SJim Ingham return SBBreakpoint(); 8216d1e4696SJim Ingham BreakpointSP bkpt_sp = m_opaque_sp->FindBreakpointByID(id); 8226d1e4696SJim Ingham return SBBreakpoint(bkpt_sp); 8236d1e4696SJim Ingham } 8246d1e4696SJim Ingham 82501f16664SJim Ingham void SBBreakpointList::Append(const SBBreakpoint &sb_bkpt) { 82601f16664SJim Ingham if (!sb_bkpt.IsValid()) 82701f16664SJim Ingham return; 82801f16664SJim Ingham if (!m_opaque_sp) 82901f16664SJim Ingham return; 83001f16664SJim Ingham m_opaque_sp->Append(*sb_bkpt.get()); 83101f16664SJim Ingham } 83201f16664SJim Ingham 83301f16664SJim Ingham void SBBreakpointList::AppendByID(lldb::break_id_t id) { 83401f16664SJim Ingham if (!m_opaque_sp) 83501f16664SJim Ingham return; 83601f16664SJim Ingham m_opaque_sp->AppendByID(id); 83701f16664SJim Ingham } 83801f16664SJim Ingham 83901f16664SJim Ingham bool SBBreakpointList::AppendIfUnique(const SBBreakpoint &sb_bkpt) { 84001f16664SJim Ingham if (!sb_bkpt.IsValid()) 84101f16664SJim Ingham return false; 84201f16664SJim Ingham if (!m_opaque_sp) 84301f16664SJim Ingham return false; 84401f16664SJim Ingham return m_opaque_sp->AppendIfUnique(*sb_bkpt.get()); 84501f16664SJim Ingham } 84601f16664SJim Ingham 84701f16664SJim Ingham void SBBreakpointList::Clear() { 84801f16664SJim Ingham if (m_opaque_sp) 84901f16664SJim Ingham m_opaque_sp->Clear(); 85001f16664SJim Ingham } 85101f16664SJim Ingham 85201f16664SJim Ingham void SBBreakpointList::CopyToBreakpointIDList( 85301f16664SJim Ingham lldb_private::BreakpointIDList &bp_id_list) { 85401f16664SJim Ingham if (m_opaque_sp) 85501f16664SJim Ingham m_opaque_sp->CopyToBreakpointIDList(bp_id_list); 85601f16664SJim Ingham } 857