180814287SRaphael Isemann //===-- SBBreakpoint.cpp --------------------------------------------------===// 230fdc8d8SChris Lattner // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 630fdc8d8SChris Lattner // 730fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 830fdc8d8SChris Lattner 930fdc8d8SChris Lattner #include "lldb/API/SBBreakpoint.h" 10d51402acSJonas Devlieghere #include "lldb/Utility/ReproducerInstrumentation.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" 165e09c8c3SJim Ingham #include "lldb/API/SBStringList.h" 17738af7a6SJim Ingham #include "lldb/API/SBStructuredData.h" 1830fdc8d8SChris Lattner #include "lldb/API/SBThread.h" 1930fdc8d8SChris Lattner 2030fdc8d8SChris Lattner #include "lldb/Breakpoint/Breakpoint.h" 2101f16664SJim Ingham #include "lldb/Breakpoint/BreakpointIDList.h" 2230fdc8d8SChris Lattner #include "lldb/Breakpoint/BreakpointLocation.h" 233815e702SJim Ingham #include "lldb/Breakpoint/BreakpointResolver.h" 243815e702SJim Ingham #include "lldb/Breakpoint/BreakpointResolverScripted.h" 2530fdc8d8SChris Lattner #include "lldb/Breakpoint/StoppointCallbackContext.h" 2630fdc8d8SChris Lattner #include "lldb/Core/Address.h" 27d80102e4SJim Ingham #include "lldb/Core/Debugger.h" 2830fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 29738af7a6SJim Ingham #include "lldb/Core/StructuredDataImpl.h" 30d80102e4SJim Ingham #include "lldb/Interpreter/CommandInterpreter.h" 31d80102e4SJim Ingham #include "lldb/Interpreter/ScriptInterpreter.h" 3230fdc8d8SChris Lattner #include "lldb/Target/Process.h" 33d5944cd1SGreg Clayton #include "lldb/Target/SectionLoadList.h" 3430fdc8d8SChris Lattner #include "lldb/Target/Target.h" 3562b02c61SJim Ingham #include "lldb/Target/Thread.h" 3662b02c61SJim Ingham #include "lldb/Target/ThreadSpec.h" 37bf9a7730SZachary Turner #include "lldb/Utility/Stream.h" 3830fdc8d8SChris Lattner 39b842f2ecSJim Ingham #include "SBBreakpointOptionCommon.h" 40b842f2ecSJim Ingham 4130fdc8d8SChris Lattner #include "lldb/lldb-enumerations.h" 4230fdc8d8SChris Lattner 434e4fbe82SZachary Turner #include "llvm/ADT/STLExtras.h" 444e4fbe82SZachary Turner 4530fdc8d8SChris Lattner using namespace lldb; 4630fdc8d8SChris Lattner using namespace lldb_private; 4730fdc8d8SChris Lattner 48baf5664fSJonas Devlieghere SBBreakpoint::SBBreakpoint() { LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBBreakpoint); } 4930fdc8d8SChris Lattner 50b9c1b51eSKate Stone SBBreakpoint::SBBreakpoint(const SBBreakpoint &rhs) 51baf5664fSJonas Devlieghere : m_opaque_wp(rhs.m_opaque_wp) { 52baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR(SBBreakpoint, (const lldb::SBBreakpoint &), rhs); 53baf5664fSJonas Devlieghere } 5430fdc8d8SChris Lattner 55b9c1b51eSKate Stone SBBreakpoint::SBBreakpoint(const lldb::BreakpointSP &bp_sp) 56baf5664fSJonas Devlieghere : m_opaque_wp(bp_sp) { 57baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR(SBBreakpoint, (const lldb::BreakpointSP &), bp_sp); 58baf5664fSJonas Devlieghere } 5930fdc8d8SChris Lattner 60dbb0abbfSEugene Zelenko SBBreakpoint::~SBBreakpoint() = default; 6130fdc8d8SChris Lattner 62b9c1b51eSKate Stone const SBBreakpoint &SBBreakpoint::operator=(const SBBreakpoint &rhs) { 63baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(const lldb::SBBreakpoint &, 64baf5664fSJonas Devlieghere SBBreakpoint, operator=,(const lldb::SBBreakpoint &), rhs); 65baf5664fSJonas Devlieghere 666ac84034SPavel Labath m_opaque_wp = rhs.m_opaque_wp; 67*d232abc3SJonas Devlieghere return *this; 6830fdc8d8SChris Lattner } 6930fdc8d8SChris Lattner 70b9c1b51eSKate Stone bool SBBreakpoint::operator==(const lldb::SBBreakpoint &rhs) { 71baf5664fSJonas Devlieghere LLDB_RECORD_METHOD( 72baf5664fSJonas Devlieghere bool, SBBreakpoint, operator==,(const lldb::SBBreakpoint &), rhs); 73baf5664fSJonas Devlieghere 746ac84034SPavel Labath return m_opaque_wp.lock() == rhs.m_opaque_wp.lock(); 75ac2eb9b1SGreg Clayton } 76ac2eb9b1SGreg Clayton 77b9c1b51eSKate Stone bool SBBreakpoint::operator!=(const lldb::SBBreakpoint &rhs) { 78baf5664fSJonas Devlieghere LLDB_RECORD_METHOD( 79baf5664fSJonas Devlieghere bool, SBBreakpoint, operator!=,(const lldb::SBBreakpoint &), rhs); 80baf5664fSJonas Devlieghere 816ac84034SPavel Labath return m_opaque_wp.lock() != rhs.m_opaque_wp.lock(); 82c3387333SEnrico Granata } 83c3387333SEnrico Granata 846754caa9SJim Ingham SBTarget SBBreakpoint::GetTarget() const { 856754caa9SJim Ingham LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBTarget, SBBreakpoint, GetTarget); 866754caa9SJim Ingham 876754caa9SJim Ingham BreakpointSP bkpt_sp = GetSP(); 886754caa9SJim Ingham if (bkpt_sp) 89*d232abc3SJonas Devlieghere return SBTarget(bkpt_sp->GetTargetSP()); 906754caa9SJim Ingham 91*d232abc3SJonas Devlieghere return SBTarget(); 926754caa9SJim Ingham } 936754caa9SJim Ingham 94b9c1b51eSKate Stone break_id_t SBBreakpoint::GetID() const { 95baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::break_id_t, SBBreakpoint, GetID); 96baf5664fSJonas Devlieghere 97af67cecdSGreg Clayton break_id_t break_id = LLDB_INVALID_BREAK_ID; 986ac84034SPavel Labath BreakpointSP bkpt_sp = GetSP(); 996ac84034SPavel Labath if (bkpt_sp) 1006ac84034SPavel Labath break_id = bkpt_sp->GetID(); 101af67cecdSGreg Clayton 102af67cecdSGreg Clayton return break_id; 10330fdc8d8SChris Lattner } 10430fdc8d8SChris Lattner 105b9c1b51eSKate Stone bool SBBreakpoint::IsValid() const { 106baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBBreakpoint, IsValid); 1077f5237bcSPavel Labath return this->operator bool(); 1087f5237bcSPavel Labath } 1097f5237bcSPavel Labath SBBreakpoint::operator bool() const { 1107f5237bcSPavel Labath LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBBreakpoint, operator bool); 111baf5664fSJonas Devlieghere 1126ac84034SPavel Labath BreakpointSP bkpt_sp = GetSP(); 1136ac84034SPavel Labath if (!bkpt_sp) 114e029fa57SJim Ingham return false; 1156ac84034SPavel Labath else if (bkpt_sp->GetTarget().GetBreakpointByID(bkpt_sp->GetID())) 116e029fa57SJim Ingham return true; 117e029fa57SJim Ingham else 118e029fa57SJim Ingham return false; 11930fdc8d8SChris Lattner } 12030fdc8d8SChris Lattner 121b9c1b51eSKate Stone void SBBreakpoint::ClearAllBreakpointSites() { 122baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(void, SBBreakpoint, ClearAllBreakpointSites); 123baf5664fSJonas Devlieghere 1246ac84034SPavel Labath BreakpointSP bkpt_sp = GetSP(); 1256ac84034SPavel Labath if (bkpt_sp) { 126b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1276ac84034SPavel Labath bkpt_sp->GetTarget().GetAPIMutex()); 1286ac84034SPavel Labath bkpt_sp->ClearAllBreakpointSites(); 12930fdc8d8SChris Lattner } 130af67cecdSGreg Clayton } 13130fdc8d8SChris Lattner 132b9c1b51eSKate Stone SBBreakpointLocation SBBreakpoint::FindLocationByAddress(addr_t vm_addr) { 133baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBBreakpointLocation, SBBreakpoint, 134baf5664fSJonas Devlieghere FindLocationByAddress, (lldb::addr_t), vm_addr); 135baf5664fSJonas Devlieghere 13630fdc8d8SChris Lattner SBBreakpointLocation sb_bp_location; 13730fdc8d8SChris Lattner 1386ac84034SPavel Labath BreakpointSP bkpt_sp = GetSP(); 1396ac84034SPavel Labath if (bkpt_sp) { 140b9c1b51eSKate Stone if (vm_addr != LLDB_INVALID_ADDRESS) { 141b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1426ac84034SPavel Labath bkpt_sp->GetTarget().GetAPIMutex()); 14330fdc8d8SChris Lattner Address address; 1446ac84034SPavel Labath Target &target = bkpt_sp->GetTarget(); 145b9c1b51eSKate Stone if (!target.GetSectionLoadList().ResolveLoadAddress(vm_addr, address)) { 146e72dfb32SGreg Clayton address.SetRawAddress(vm_addr); 14730fdc8d8SChris Lattner } 1486ac84034SPavel Labath sb_bp_location.SetLocation(bkpt_sp->FindLocationByAddress(address)); 14930fdc8d8SChris Lattner } 15030fdc8d8SChris Lattner } 151*d232abc3SJonas Devlieghere return sb_bp_location; 15230fdc8d8SChris Lattner } 15330fdc8d8SChris Lattner 154b9c1b51eSKate Stone break_id_t SBBreakpoint::FindLocationIDByAddress(addr_t vm_addr) { 155baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::break_id_t, SBBreakpoint, FindLocationIDByAddress, 156baf5664fSJonas Devlieghere (lldb::addr_t), vm_addr); 157baf5664fSJonas Devlieghere 158af67cecdSGreg Clayton break_id_t break_id = LLDB_INVALID_BREAK_ID; 1596ac84034SPavel Labath BreakpointSP bkpt_sp = GetSP(); 16030fdc8d8SChris Lattner 1616ac84034SPavel Labath if (bkpt_sp && vm_addr != LLDB_INVALID_ADDRESS) { 162b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1636ac84034SPavel Labath bkpt_sp->GetTarget().GetAPIMutex()); 16430fdc8d8SChris Lattner Address address; 1656ac84034SPavel Labath Target &target = bkpt_sp->GetTarget(); 166b9c1b51eSKate Stone if (!target.GetSectionLoadList().ResolveLoadAddress(vm_addr, address)) { 167e72dfb32SGreg Clayton address.SetRawAddress(vm_addr); 16830fdc8d8SChris Lattner } 1696ac84034SPavel Labath break_id = bkpt_sp->FindLocationIDByAddress(address); 17030fdc8d8SChris Lattner } 17130fdc8d8SChris Lattner 172af67cecdSGreg Clayton return break_id; 17330fdc8d8SChris Lattner } 17430fdc8d8SChris Lattner 175b9c1b51eSKate Stone SBBreakpointLocation SBBreakpoint::FindLocationByID(break_id_t bp_loc_id) { 176baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBBreakpointLocation, SBBreakpoint, FindLocationByID, 177baf5664fSJonas Devlieghere (lldb::break_id_t), bp_loc_id); 178baf5664fSJonas Devlieghere 17930fdc8d8SChris Lattner SBBreakpointLocation sb_bp_location; 1806ac84034SPavel Labath BreakpointSP bkpt_sp = GetSP(); 18130fdc8d8SChris Lattner 1826ac84034SPavel Labath if (bkpt_sp) { 183b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 1846ac84034SPavel Labath bkpt_sp->GetTarget().GetAPIMutex()); 1856ac84034SPavel Labath sb_bp_location.SetLocation(bkpt_sp->FindLocationByID(bp_loc_id)); 186af67cecdSGreg Clayton } 18730fdc8d8SChris Lattner 188*d232abc3SJonas Devlieghere return sb_bp_location; 18930fdc8d8SChris Lattner } 19030fdc8d8SChris Lattner 191b9c1b51eSKate Stone SBBreakpointLocation SBBreakpoint::GetLocationAtIndex(uint32_t index) { 192baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBBreakpointLocation, SBBreakpoint, 193baf5664fSJonas Devlieghere GetLocationAtIndex, (uint32_t), index); 194baf5664fSJonas Devlieghere 19530fdc8d8SChris Lattner SBBreakpointLocation sb_bp_location; 1966ac84034SPavel Labath BreakpointSP bkpt_sp = GetSP(); 19730fdc8d8SChris Lattner 1986ac84034SPavel Labath if (bkpt_sp) { 199b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 2006ac84034SPavel Labath bkpt_sp->GetTarget().GetAPIMutex()); 2016ac84034SPavel Labath sb_bp_location.SetLocation(bkpt_sp->GetLocationAtIndex(index)); 202af67cecdSGreg Clayton } 20330fdc8d8SChris Lattner 204*d232abc3SJonas Devlieghere return sb_bp_location; 20530fdc8d8SChris Lattner } 20630fdc8d8SChris Lattner 207b9c1b51eSKate Stone void SBBreakpoint::SetEnabled(bool enable) { 208baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBBreakpoint, SetEnabled, (bool), enable); 209baf5664fSJonas Devlieghere 2106ac84034SPavel Labath BreakpointSP bkpt_sp = GetSP(); 211ceb6b139SCaroline Tice 2126ac84034SPavel Labath if (bkpt_sp) { 213b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 2146ac84034SPavel Labath bkpt_sp->GetTarget().GetAPIMutex()); 2156ac84034SPavel Labath bkpt_sp->SetEnabled(enable); 21630fdc8d8SChris Lattner } 217af67cecdSGreg Clayton } 21830fdc8d8SChris Lattner 219b9c1b51eSKate Stone bool SBBreakpoint::IsEnabled() { 220baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(bool, SBBreakpoint, IsEnabled); 221baf5664fSJonas Devlieghere 2226ac84034SPavel Labath BreakpointSP bkpt_sp = GetSP(); 2236ac84034SPavel Labath if (bkpt_sp) { 224b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 2256ac84034SPavel Labath bkpt_sp->GetTarget().GetAPIMutex()); 2266ac84034SPavel Labath return bkpt_sp->IsEnabled(); 227b9c1b51eSKate Stone } else 22830fdc8d8SChris Lattner return false; 22930fdc8d8SChris Lattner } 23030fdc8d8SChris Lattner 231b9c1b51eSKate Stone void SBBreakpoint::SetOneShot(bool one_shot) { 232baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBBreakpoint, SetOneShot, (bool), one_shot); 233baf5664fSJonas Devlieghere 2346ac84034SPavel Labath BreakpointSP bkpt_sp = GetSP(); 235ca36cd16SJim Ingham 2366ac84034SPavel Labath if (bkpt_sp) { 237b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 2386ac84034SPavel Labath bkpt_sp->GetTarget().GetAPIMutex()); 2396ac84034SPavel Labath bkpt_sp->SetOneShot(one_shot); 240ca36cd16SJim Ingham } 241ca36cd16SJim Ingham } 242ca36cd16SJim Ingham 243b9c1b51eSKate Stone bool SBBreakpoint::IsOneShot() const { 244baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBBreakpoint, IsOneShot); 245baf5664fSJonas Devlieghere 2466ac84034SPavel Labath BreakpointSP bkpt_sp = GetSP(); 2476ac84034SPavel Labath if (bkpt_sp) { 248b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 2496ac84034SPavel Labath bkpt_sp->GetTarget().GetAPIMutex()); 2506ac84034SPavel Labath return bkpt_sp->IsOneShot(); 251b9c1b51eSKate Stone } else 252ca36cd16SJim Ingham return false; 253ca36cd16SJim Ingham } 254ca36cd16SJim Ingham 255b9c1b51eSKate Stone bool SBBreakpoint::IsInternal() { 256baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(bool, SBBreakpoint, IsInternal); 257baf5664fSJonas Devlieghere 2586ac84034SPavel Labath BreakpointSP bkpt_sp = GetSP(); 2596ac84034SPavel Labath if (bkpt_sp) { 260b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 2616ac84034SPavel Labath bkpt_sp->GetTarget().GetAPIMutex()); 2626ac84034SPavel Labath return bkpt_sp->IsInternal(); 263b9c1b51eSKate Stone } else 26411c8108dSJim Ingham return false; 26511c8108dSJim Ingham } 26611c8108dSJim Ingham 267b9c1b51eSKate Stone void SBBreakpoint::SetIgnoreCount(uint32_t count) { 268baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBBreakpoint, SetIgnoreCount, (uint32_t), count); 269baf5664fSJonas Devlieghere 2706ac84034SPavel Labath BreakpointSP bkpt_sp = GetSP(); 271ceb6b139SCaroline Tice 2726ac84034SPavel Labath if (bkpt_sp) { 273b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 2746ac84034SPavel Labath bkpt_sp->GetTarget().GetAPIMutex()); 2756ac84034SPavel Labath bkpt_sp->SetIgnoreCount(count); 27630fdc8d8SChris Lattner } 277af67cecdSGreg Clayton } 27830fdc8d8SChris Lattner 279b9c1b51eSKate Stone void SBBreakpoint::SetCondition(const char *condition) { 280baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBBreakpoint, SetCondition, (const char *), 281baf5664fSJonas Devlieghere condition); 282baf5664fSJonas Devlieghere 2836ac84034SPavel Labath BreakpointSP bkpt_sp = GetSP(); 2846ac84034SPavel Labath if (bkpt_sp) { 285b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 2866ac84034SPavel Labath bkpt_sp->GetTarget().GetAPIMutex()); 2876ac84034SPavel Labath bkpt_sp->SetCondition(condition); 288041a12fcSJim Ingham } 289af67cecdSGreg Clayton } 290041a12fcSJim Ingham 291b9c1b51eSKate Stone const char *SBBreakpoint::GetCondition() { 292baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(const char *, SBBreakpoint, GetCondition); 293baf5664fSJonas Devlieghere 2946ac84034SPavel Labath BreakpointSP bkpt_sp = GetSP(); 2956ac84034SPavel Labath if (bkpt_sp) { 296b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 2976ac84034SPavel Labath bkpt_sp->GetTarget().GetAPIMutex()); 2986ac84034SPavel Labath return bkpt_sp->GetConditionText(); 299041a12fcSJim Ingham } 300dbb0abbfSEugene Zelenko return nullptr; 301af67cecdSGreg Clayton } 302041a12fcSJim Ingham 303f08f5c99SJim Ingham void SBBreakpoint::SetAutoContinue(bool auto_continue) { 304baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBBreakpoint, SetAutoContinue, (bool), 305baf5664fSJonas Devlieghere auto_continue); 306baf5664fSJonas Devlieghere 307f08f5c99SJim Ingham BreakpointSP bkpt_sp = GetSP(); 308f08f5c99SJim Ingham if (bkpt_sp) { 309f08f5c99SJim Ingham std::lock_guard<std::recursive_mutex> guard( 310f08f5c99SJim Ingham bkpt_sp->GetTarget().GetAPIMutex()); 311f08f5c99SJim Ingham bkpt_sp->SetAutoContinue(auto_continue); 312f08f5c99SJim Ingham } 313f08f5c99SJim Ingham } 314f08f5c99SJim Ingham 315f08f5c99SJim Ingham bool SBBreakpoint::GetAutoContinue() { 316baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(bool, SBBreakpoint, GetAutoContinue); 317baf5664fSJonas Devlieghere 318f08f5c99SJim Ingham BreakpointSP bkpt_sp = GetSP(); 319f08f5c99SJim Ingham if (bkpt_sp) { 320f08f5c99SJim Ingham std::lock_guard<std::recursive_mutex> guard( 321f08f5c99SJim Ingham bkpt_sp->GetTarget().GetAPIMutex()); 322f08f5c99SJim Ingham return bkpt_sp->IsAutoContinue(); 323f08f5c99SJim Ingham } 3241c7dc829SJim Ingham return false; 325f08f5c99SJim Ingham } 326f08f5c99SJim Ingham 327b9c1b51eSKate Stone uint32_t SBBreakpoint::GetHitCount() const { 328baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBBreakpoint, GetHitCount); 329baf5664fSJonas Devlieghere 3304838131bSGreg Clayton uint32_t count = 0; 3316ac84034SPavel Labath BreakpointSP bkpt_sp = GetSP(); 3326ac84034SPavel Labath if (bkpt_sp) { 333b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 3346ac84034SPavel Labath bkpt_sp->GetTarget().GetAPIMutex()); 3356ac84034SPavel Labath count = bkpt_sp->GetHitCount(); 336af67cecdSGreg Clayton } 3374838131bSGreg Clayton 3384838131bSGreg Clayton return count; 339ceb6b139SCaroline Tice } 3409fed0d85SGreg Clayton 341b9c1b51eSKate Stone uint32_t SBBreakpoint::GetIgnoreCount() const { 342baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBBreakpoint, GetIgnoreCount); 343baf5664fSJonas Devlieghere 3444838131bSGreg Clayton uint32_t count = 0; 3456ac84034SPavel Labath BreakpointSP bkpt_sp = GetSP(); 3466ac84034SPavel Labath if (bkpt_sp) { 347b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 3486ac84034SPavel Labath bkpt_sp->GetTarget().GetAPIMutex()); 3496ac84034SPavel Labath count = bkpt_sp->GetIgnoreCount(); 350af67cecdSGreg Clayton } 3514838131bSGreg Clayton 3524838131bSGreg Clayton return count; 35330fdc8d8SChris Lattner } 35430fdc8d8SChris Lattner 355b9c1b51eSKate Stone void SBBreakpoint::SetThreadID(tid_t tid) { 356baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBBreakpoint, SetThreadID, (lldb::tid_t), tid); 357baf5664fSJonas Devlieghere 3586ac84034SPavel Labath BreakpointSP bkpt_sp = GetSP(); 3596ac84034SPavel Labath if (bkpt_sp) { 360b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 3616ac84034SPavel Labath bkpt_sp->GetTarget().GetAPIMutex()); 3626ac84034SPavel Labath bkpt_sp->SetThreadID(tid); 363af67cecdSGreg Clayton } 36430fdc8d8SChris Lattner } 36530fdc8d8SChris Lattner 366b9c1b51eSKate Stone tid_t SBBreakpoint::GetThreadID() { 367baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::tid_t, SBBreakpoint, GetThreadID); 368baf5664fSJonas Devlieghere 3694838131bSGreg Clayton tid_t tid = LLDB_INVALID_THREAD_ID; 3706ac84034SPavel Labath BreakpointSP bkpt_sp = GetSP(); 3716ac84034SPavel Labath if (bkpt_sp) { 372b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 3736ac84034SPavel Labath bkpt_sp->GetTarget().GetAPIMutex()); 3746ac84034SPavel Labath tid = bkpt_sp->GetThreadID(); 375af67cecdSGreg Clayton } 37630fdc8d8SChris Lattner 3774838131bSGreg Clayton return tid; 37830fdc8d8SChris Lattner } 37930fdc8d8SChris Lattner 380b9c1b51eSKate Stone void SBBreakpoint::SetThreadIndex(uint32_t index) { 381baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBBreakpoint, SetThreadIndex, (uint32_t), index); 382baf5664fSJonas Devlieghere 3836ac84034SPavel Labath BreakpointSP bkpt_sp = GetSP(); 3846ac84034SPavel Labath if (bkpt_sp) { 385b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 3866ac84034SPavel Labath bkpt_sp->GetTarget().GetAPIMutex()); 387cfb96d84SJim Ingham bkpt_sp->GetOptions().GetThreadSpec()->SetIndex(index); 38862b02c61SJim Ingham } 389af67cecdSGreg Clayton } 39062b02c61SJim Ingham 391b9c1b51eSKate Stone uint32_t SBBreakpoint::GetThreadIndex() const { 392baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBBreakpoint, GetThreadIndex); 393baf5664fSJonas Devlieghere 394bdf4c6acSGreg Clayton uint32_t thread_idx = UINT32_MAX; 3956ac84034SPavel Labath BreakpointSP bkpt_sp = GetSP(); 3966ac84034SPavel Labath if (bkpt_sp) { 397b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 3986ac84034SPavel Labath bkpt_sp->GetTarget().GetAPIMutex()); 399b9c1b51eSKate Stone const ThreadSpec *thread_spec = 400cfb96d84SJim Ingham bkpt_sp->GetOptions().GetThreadSpecNoCreate(); 401dbb0abbfSEugene Zelenko if (thread_spec != nullptr) 4024838131bSGreg Clayton thread_idx = thread_spec->GetIndex(); 40362b02c61SJim Ingham } 4044838131bSGreg Clayton 405763d1a17SJohnny Chen return thread_idx; 40662b02c61SJim Ingham } 40762b02c61SJim Ingham 408b9c1b51eSKate Stone void SBBreakpoint::SetThreadName(const char *thread_name) { 409baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBBreakpoint, SetThreadName, (const char *), 410baf5664fSJonas Devlieghere thread_name); 411baf5664fSJonas Devlieghere 4126ac84034SPavel Labath BreakpointSP bkpt_sp = GetSP(); 4134838131bSGreg Clayton 4146ac84034SPavel Labath if (bkpt_sp) { 415b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 4166ac84034SPavel Labath bkpt_sp->GetTarget().GetAPIMutex()); 417cfb96d84SJim Ingham bkpt_sp->GetOptions().GetThreadSpec()->SetName(thread_name); 41862b02c61SJim Ingham } 419af67cecdSGreg Clayton } 42062b02c61SJim Ingham 421b9c1b51eSKate Stone const char *SBBreakpoint::GetThreadName() const { 422baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBBreakpoint, GetThreadName); 423baf5664fSJonas Devlieghere 424dbb0abbfSEugene Zelenko const char *name = nullptr; 4256ac84034SPavel Labath BreakpointSP bkpt_sp = GetSP(); 4266ac84034SPavel Labath if (bkpt_sp) { 427b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 4286ac84034SPavel Labath bkpt_sp->GetTarget().GetAPIMutex()); 429b9c1b51eSKate Stone const ThreadSpec *thread_spec = 430cfb96d84SJim Ingham bkpt_sp->GetOptions().GetThreadSpecNoCreate(); 431dbb0abbfSEugene Zelenko if (thread_spec != nullptr) 4324838131bSGreg Clayton name = thread_spec->GetName(); 43362b02c61SJim Ingham } 4344838131bSGreg Clayton 4354838131bSGreg Clayton return name; 43662b02c61SJim Ingham } 43762b02c61SJim Ingham 438b9c1b51eSKate Stone void SBBreakpoint::SetQueueName(const char *queue_name) { 439baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBBreakpoint, SetQueueName, (const char *), 440baf5664fSJonas Devlieghere queue_name); 441baf5664fSJonas Devlieghere 4426ac84034SPavel Labath BreakpointSP bkpt_sp = GetSP(); 4436ac84034SPavel Labath if (bkpt_sp) { 444b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 4456ac84034SPavel Labath bkpt_sp->GetTarget().GetAPIMutex()); 446cfb96d84SJim Ingham bkpt_sp->GetOptions().GetThreadSpec()->SetQueueName(queue_name); 44762b02c61SJim Ingham } 448af67cecdSGreg Clayton } 44962b02c61SJim Ingham 450b9c1b51eSKate Stone const char *SBBreakpoint::GetQueueName() const { 451baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBBreakpoint, GetQueueName); 452baf5664fSJonas Devlieghere 453dbb0abbfSEugene Zelenko const char *name = nullptr; 4546ac84034SPavel Labath BreakpointSP bkpt_sp = GetSP(); 4556ac84034SPavel Labath if (bkpt_sp) { 456b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 4576ac84034SPavel Labath bkpt_sp->GetTarget().GetAPIMutex()); 458b9c1b51eSKate Stone const ThreadSpec *thread_spec = 459cfb96d84SJim Ingham bkpt_sp->GetOptions().GetThreadSpecNoCreate(); 460af67cecdSGreg Clayton if (thread_spec) 4614838131bSGreg Clayton name = thread_spec->GetQueueName(); 46262b02c61SJim Ingham } 4634838131bSGreg Clayton 4644838131bSGreg Clayton return name; 46562b02c61SJim Ingham } 46662b02c61SJim Ingham 467b9c1b51eSKate Stone size_t SBBreakpoint::GetNumResolvedLocations() const { 468baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(size_t, SBBreakpoint, 469baf5664fSJonas Devlieghere GetNumResolvedLocations); 470baf5664fSJonas Devlieghere 4714838131bSGreg Clayton size_t num_resolved = 0; 4726ac84034SPavel Labath BreakpointSP bkpt_sp = GetSP(); 4736ac84034SPavel Labath if (bkpt_sp) { 474b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 4756ac84034SPavel Labath bkpt_sp->GetTarget().GetAPIMutex()); 4766ac84034SPavel Labath num_resolved = bkpt_sp->GetNumResolvedLocations(); 477af67cecdSGreg Clayton } 4784838131bSGreg Clayton return num_resolved; 47930fdc8d8SChris Lattner } 48030fdc8d8SChris Lattner 481b9c1b51eSKate Stone size_t SBBreakpoint::GetNumLocations() const { 482baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(size_t, SBBreakpoint, GetNumLocations); 483baf5664fSJonas Devlieghere 4846ac84034SPavel Labath BreakpointSP bkpt_sp = GetSP(); 4854838131bSGreg Clayton size_t num_locs = 0; 4866ac84034SPavel Labath if (bkpt_sp) { 487b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 4886ac84034SPavel Labath bkpt_sp->GetTarget().GetAPIMutex()); 4896ac84034SPavel Labath num_locs = bkpt_sp->GetNumLocations(); 490af67cecdSGreg Clayton } 4914838131bSGreg Clayton return num_locs; 49230fdc8d8SChris Lattner } 49330fdc8d8SChris Lattner 49492d1960eSJim Ingham void SBBreakpoint::SetCommandLineCommands(SBStringList &commands) { 495baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBBreakpoint, SetCommandLineCommands, 496baf5664fSJonas Devlieghere (lldb::SBStringList &), commands); 497baf5664fSJonas Devlieghere 4986ac84034SPavel Labath BreakpointSP bkpt_sp = GetSP(); 4996ac84034SPavel Labath if (!bkpt_sp) 50092d1960eSJim Ingham return; 50192d1960eSJim Ingham if (commands.GetSize() == 0) 50292d1960eSJim Ingham return; 50392d1960eSJim Ingham 50492d1960eSJim Ingham std::lock_guard<std::recursive_mutex> guard( 5056ac84034SPavel Labath bkpt_sp->GetTarget().GetAPIMutex()); 50692d1960eSJim Ingham std::unique_ptr<BreakpointOptions::CommandData> cmd_data_up( 507f7e07256SJim Ingham new BreakpointOptions::CommandData(*commands, eScriptLanguageNone)); 50892d1960eSJim Ingham 509cfb96d84SJim Ingham bkpt_sp->GetOptions().SetCommandDataCallback(cmd_data_up); 51092d1960eSJim Ingham } 51192d1960eSJim Ingham 51292d1960eSJim Ingham bool SBBreakpoint::GetCommandLineCommands(SBStringList &commands) { 513baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBBreakpoint, GetCommandLineCommands, 514baf5664fSJonas Devlieghere (lldb::SBStringList &), commands); 515baf5664fSJonas Devlieghere 5166ac84034SPavel Labath BreakpointSP bkpt_sp = GetSP(); 5176ac84034SPavel Labath if (!bkpt_sp) 51892d1960eSJim Ingham return false; 51992d1960eSJim Ingham StringList command_list; 52092d1960eSJim Ingham bool has_commands = 521cfb96d84SJim Ingham bkpt_sp->GetOptions().GetCommandLineCallbacks(command_list); 52292d1960eSJim Ingham if (has_commands) 52392d1960eSJim Ingham commands.AppendList(command_list); 52492d1960eSJim Ingham return has_commands; 52592d1960eSJim Ingham } 52692d1960eSJim Ingham 527b9c1b51eSKate Stone bool SBBreakpoint::GetDescription(SBStream &s) { 528baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBBreakpoint, GetDescription, (lldb::SBStream &), s); 529baf5664fSJonas Devlieghere 5306d1e4696SJim Ingham return GetDescription(s, true); 5316d1e4696SJim Ingham } 5326d1e4696SJim Ingham 5336d1e4696SJim Ingham bool SBBreakpoint::GetDescription(SBStream &s, bool include_locations) { 534baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBBreakpoint, GetDescription, 535baf5664fSJonas Devlieghere (lldb::SBStream &, bool), s, include_locations); 536baf5664fSJonas Devlieghere 5376ac84034SPavel Labath BreakpointSP bkpt_sp = GetSP(); 5386ac84034SPavel Labath if (bkpt_sp) { 539b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 5406ac84034SPavel Labath bkpt_sp->GetTarget().GetAPIMutex()); 5416ac84034SPavel Labath s.Printf("SBBreakpoint: id = %i, ", bkpt_sp->GetID()); 5426ac84034SPavel Labath bkpt_sp->GetResolverDescription(s.get()); 5436ac84034SPavel Labath bkpt_sp->GetFilterDescription(s.get()); 5446d1e4696SJim Ingham if (include_locations) { 5456ac84034SPavel Labath const size_t num_locations = bkpt_sp->GetNumLocations(); 546d01b2953SDaniel Malea s.Printf(", locations = %" PRIu64, (uint64_t)num_locations); 5476d1e4696SJim Ingham } 548dde9cff3SCaroline Tice return true; 549dde9cff3SCaroline Tice } 55005faeb71SGreg Clayton s.Printf("No value"); 55105faeb71SGreg Clayton return false; 55205faeb71SGreg Clayton } 553dde9cff3SCaroline Tice 554baf5664fSJonas Devlieghere SBError SBBreakpoint::AddLocation(SBAddress &address) { 555baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBError, SBBreakpoint, AddLocation, 556baf5664fSJonas Devlieghere (lldb::SBAddress &), address); 557baf5664fSJonas Devlieghere 5583815e702SJim Ingham BreakpointSP bkpt_sp = GetSP(); 5593815e702SJim Ingham SBError error; 5603815e702SJim Ingham 5613815e702SJim Ingham if (!address.IsValid()) { 5623815e702SJim Ingham error.SetErrorString("Can't add an invalid address."); 563*d232abc3SJonas Devlieghere return error; 5643815e702SJim Ingham } 5653815e702SJim Ingham 5663815e702SJim Ingham if (!bkpt_sp) { 5673815e702SJim Ingham error.SetErrorString("No breakpoint to add a location to."); 568*d232abc3SJonas Devlieghere return error; 5693815e702SJim Ingham } 5703815e702SJim Ingham 5713815e702SJim Ingham if (!llvm::isa<BreakpointResolverScripted>(bkpt_sp->GetResolver().get())) { 5723815e702SJim Ingham error.SetErrorString("Only a scripted resolver can add locations."); 573*d232abc3SJonas Devlieghere return error; 5743815e702SJim Ingham } 5753815e702SJim Ingham 5763815e702SJim Ingham if (bkpt_sp->GetSearchFilter()->AddressPasses(address.ref())) 5773815e702SJim Ingham bkpt_sp->AddLocation(address.ref()); 578baf5664fSJonas Devlieghere else { 5793815e702SJim Ingham StreamString s; 5803815e702SJim Ingham address.get()->Dump(&s, &bkpt_sp->GetTarget(), 5813815e702SJim Ingham Address::DumpStyleModuleWithFileAddress); 5823815e702SJim Ingham error.SetErrorStringWithFormat("Address: %s didn't pass the filter.", 5833815e702SJim Ingham s.GetData()); 5843815e702SJim Ingham } 585*d232abc3SJonas Devlieghere return error; 5863815e702SJim Ingham } 5873815e702SJim Ingham 5884da8fa45SMed Ismail Bennani SBStructuredData SBBreakpoint::SerializeToStructuredData() { 5894da8fa45SMed Ismail Bennani LLDB_RECORD_METHOD_NO_ARGS(lldb::SBStructuredData, SBBreakpoint, 5904da8fa45SMed Ismail Bennani SerializeToStructuredData); 5914da8fa45SMed Ismail Bennani 5924da8fa45SMed Ismail Bennani SBStructuredData data; 5934da8fa45SMed Ismail Bennani BreakpointSP bkpt_sp = GetSP(); 5944da8fa45SMed Ismail Bennani 5954da8fa45SMed Ismail Bennani if (!bkpt_sp) 596*d232abc3SJonas Devlieghere return data; 5974da8fa45SMed Ismail Bennani 5984da8fa45SMed Ismail Bennani StructuredData::ObjectSP bkpt_dict = bkpt_sp->SerializeToStructuredData(); 5994da8fa45SMed Ismail Bennani data.m_impl_up->SetObjectSP(bkpt_dict); 600*d232abc3SJonas Devlieghere return data; 6014da8fa45SMed Ismail Bennani } 6024da8fa45SMed Ismail Bennani 6030d7b0c96SJonas Devlieghere void SBBreakpoint::SetCallback(SBBreakpointHitCallback callback, void *baton) { 6040d7b0c96SJonas Devlieghere LLDB_RECORD_DUMMY(void, SBBreakpoint, SetCallback, 6050d7b0c96SJonas Devlieghere (lldb::SBBreakpointHitCallback, void *), callback, baton); 6060d7b0c96SJonas Devlieghere 6076ac84034SPavel Labath BreakpointSP bkpt_sp = GetSP(); 608ceb6b139SCaroline Tice 6096ac84034SPavel Labath if (bkpt_sp) { 610b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 6116ac84034SPavel Labath bkpt_sp->GetTarget().GetAPIMutex()); 61230fdc8d8SChris Lattner BatonSP baton_sp(new SBBreakpointCallbackBaton(callback, baton)); 613b842f2ecSJim Ingham bkpt_sp->SetCallback(SBBreakpointCallbackBaton 614b842f2ecSJim Ingham ::PrivateBreakpointHitCallback, baton_sp, 6156ac84034SPavel Labath false); 61630fdc8d8SChris Lattner } 61730fdc8d8SChris Lattner } 61830fdc8d8SChris Lattner 619b9c1b51eSKate Stone void SBBreakpoint::SetScriptCallbackFunction( 620b9c1b51eSKate Stone const char *callback_function_name) { 621baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBBreakpoint, SetScriptCallbackFunction, 622baf5664fSJonas Devlieghere (const char *), callback_function_name); 623738af7a6SJim Ingham SBStructuredData empty_args; 624738af7a6SJim Ingham SetScriptCallbackFunction(callback_function_name, empty_args); 625738af7a6SJim Ingham } 626baf5664fSJonas Devlieghere 627738af7a6SJim Ingham SBError SBBreakpoint::SetScriptCallbackFunction( 628738af7a6SJim Ingham const char *callback_function_name, 629738af7a6SJim Ingham SBStructuredData &extra_args) { 630738af7a6SJim Ingham LLDB_RECORD_METHOD(SBError, SBBreakpoint, SetScriptCallbackFunction, 631738af7a6SJim Ingham (const char *, SBStructuredData &), callback_function_name, extra_args); 632738af7a6SJim Ingham SBError sb_error; 6336ac84034SPavel Labath BreakpointSP bkpt_sp = GetSP(); 634d80102e4SJim Ingham 6356ac84034SPavel Labath if (bkpt_sp) { 636738af7a6SJim Ingham Status error; 637b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 6386ac84034SPavel Labath bkpt_sp->GetTarget().GetAPIMutex()); 639cfb96d84SJim Ingham BreakpointOptions &bp_options = bkpt_sp->GetOptions(); 640738af7a6SJim Ingham error = bkpt_sp->GetTarget() 641b9c1b51eSKate Stone .GetDebugger() 642b9c1b51eSKate Stone .GetScriptInterpreter() 643b9c1b51eSKate Stone ->SetBreakpointCommandCallbackFunction(bp_options, 644738af7a6SJim Ingham callback_function_name, 645738af7a6SJim Ingham extra_args.m_impl_up 646738af7a6SJim Ingham ->GetObjectSP()); 647738af7a6SJim Ingham sb_error.SetError(error); 648738af7a6SJim Ingham } else 649738af7a6SJim Ingham sb_error.SetErrorString("invalid breakpoint"); 650738af7a6SJim Ingham 651*d232abc3SJonas Devlieghere return sb_error; 652d80102e4SJim Ingham } 653d80102e4SJim Ingham 654b9c1b51eSKate Stone SBError SBBreakpoint::SetScriptCallbackBody(const char *callback_body_text) { 655baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBError, SBBreakpoint, SetScriptCallbackBody, 656baf5664fSJonas Devlieghere (const char *), callback_body_text); 657baf5664fSJonas Devlieghere 6586ac84034SPavel Labath BreakpointSP bkpt_sp = GetSP(); 659d80102e4SJim Ingham 660d80102e4SJim Ingham SBError sb_error; 6616ac84034SPavel Labath if (bkpt_sp) { 662b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 6636ac84034SPavel Labath bkpt_sp->GetTarget().GetAPIMutex()); 664cfb96d84SJim Ingham BreakpointOptions &bp_options = bkpt_sp->GetOptions(); 66597206d57SZachary Turner Status error = 6666ac84034SPavel Labath bkpt_sp->GetTarget() 667b9c1b51eSKate Stone .GetDebugger() 668b9c1b51eSKate Stone .GetScriptInterpreter() 669b9c1b51eSKate Stone ->SetBreakpointCommandCallback(bp_options, callback_body_text); 670d80102e4SJim Ingham sb_error.SetError(error); 671b9c1b51eSKate Stone } else 672d80102e4SJim Ingham sb_error.SetErrorString("invalid breakpoint"); 673d80102e4SJim Ingham 674*d232abc3SJonas Devlieghere return sb_error; 675d80102e4SJim Ingham } 67630fdc8d8SChris Lattner 677b9c1b51eSKate Stone bool SBBreakpoint::AddName(const char *new_name) { 678baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBBreakpoint, AddName, (const char *), new_name); 679baf5664fSJonas Devlieghere 680f70cad26SMed Ismail Bennani SBError status = AddNameWithErrorHandling(new_name); 681f70cad26SMed Ismail Bennani return status.Success(); 682f70cad26SMed Ismail Bennani } 683f70cad26SMed Ismail Bennani 684f70cad26SMed Ismail Bennani SBError SBBreakpoint::AddNameWithErrorHandling(const char *new_name) { 685f70cad26SMed Ismail Bennani LLDB_RECORD_METHOD(SBError, SBBreakpoint, AddNameWithErrorHandling, 686f70cad26SMed Ismail Bennani (const char *), new_name); 687f70cad26SMed Ismail Bennani 6886ac84034SPavel Labath BreakpointSP bkpt_sp = GetSP(); 6895e09c8c3SJim Ingham 690f70cad26SMed Ismail Bennani SBError status; 6916ac84034SPavel Labath if (bkpt_sp) { 692b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 6936ac84034SPavel Labath bkpt_sp->GetTarget().GetAPIMutex()); 694f70cad26SMed Ismail Bennani Status error; 695b842f2ecSJim Ingham bkpt_sp->GetTarget().AddNameToBreakpoint(bkpt_sp, new_name, error); 696f70cad26SMed Ismail Bennani status.SetError(error); 697f70cad26SMed Ismail Bennani } else { 698f70cad26SMed Ismail Bennani status.SetErrorString("invalid breakpoint"); 699b842f2ecSJim Ingham } 7005e09c8c3SJim Ingham 701*d232abc3SJonas Devlieghere return status; 7025e09c8c3SJim Ingham } 7035e09c8c3SJim Ingham 704b9c1b51eSKate Stone void SBBreakpoint::RemoveName(const char *name_to_remove) { 705baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBBreakpoint, RemoveName, (const char *), 706baf5664fSJonas Devlieghere name_to_remove); 707baf5664fSJonas Devlieghere 7086ac84034SPavel Labath BreakpointSP bkpt_sp = GetSP(); 7095e09c8c3SJim Ingham 7106ac84034SPavel Labath if (bkpt_sp) { 711b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 7126ac84034SPavel Labath bkpt_sp->GetTarget().GetAPIMutex()); 713b842f2ecSJim Ingham bkpt_sp->GetTarget().RemoveNameFromBreakpoint(bkpt_sp, 714b842f2ecSJim Ingham ConstString(name_to_remove)); 7155e09c8c3SJim Ingham } 7165e09c8c3SJim Ingham } 7175e09c8c3SJim Ingham 718b9c1b51eSKate Stone bool SBBreakpoint::MatchesName(const char *name) { 719baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBBreakpoint, MatchesName, (const char *), name); 720baf5664fSJonas Devlieghere 7216ac84034SPavel Labath BreakpointSP bkpt_sp = GetSP(); 7225e09c8c3SJim Ingham 7236ac84034SPavel Labath if (bkpt_sp) { 724b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 7256ac84034SPavel Labath bkpt_sp->GetTarget().GetAPIMutex()); 7266ac84034SPavel Labath return bkpt_sp->MatchesName(name); 7275e09c8c3SJim Ingham } 7285e09c8c3SJim Ingham 7295e09c8c3SJim Ingham return false; 7305e09c8c3SJim Ingham } 7315e09c8c3SJim Ingham 732b9c1b51eSKate Stone void SBBreakpoint::GetNames(SBStringList &names) { 733baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBBreakpoint, GetNames, (lldb::SBStringList &), 734baf5664fSJonas Devlieghere names); 735baf5664fSJonas Devlieghere 7366ac84034SPavel Labath BreakpointSP bkpt_sp = GetSP(); 7375e09c8c3SJim Ingham 7386ac84034SPavel Labath if (bkpt_sp) { 739b9c1b51eSKate Stone std::lock_guard<std::recursive_mutex> guard( 7406ac84034SPavel Labath bkpt_sp->GetTarget().GetAPIMutex()); 7415e09c8c3SJim Ingham std::vector<std::string> names_vec; 7426ac84034SPavel Labath bkpt_sp->GetNames(names_vec); 743b9c1b51eSKate Stone for (std::string name : names_vec) { 7445e09c8c3SJim Ingham names.AppendString(name.c_str()); 7455e09c8c3SJim Ingham } 7465e09c8c3SJim Ingham } 7475e09c8c3SJim Ingham } 7485e09c8c3SJim Ingham 749b9c1b51eSKate Stone bool SBBreakpoint::EventIsBreakpointEvent(const lldb::SBEvent &event) { 750baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD(bool, SBBreakpoint, EventIsBreakpointEvent, 751baf5664fSJonas Devlieghere (const lldb::SBEvent &), event); 752baf5664fSJonas Devlieghere 753b9c1b51eSKate Stone return Breakpoint::BreakpointEventData::GetEventDataFromEvent(event.get()) != 754b9c1b51eSKate Stone nullptr; 755e6bc6cb9SJim Ingham } 756e6bc6cb9SJim Ingham 7579fed0d85SGreg Clayton BreakpointEventType 758b9c1b51eSKate Stone SBBreakpoint::GetBreakpointEventTypeFromEvent(const SBEvent &event) { 759baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD(lldb::BreakpointEventType, SBBreakpoint, 760baf5664fSJonas Devlieghere GetBreakpointEventTypeFromEvent, 761baf5664fSJonas Devlieghere (const lldb::SBEvent &), event); 762baf5664fSJonas Devlieghere 7639fed0d85SGreg Clayton if (event.IsValid()) 764b9c1b51eSKate Stone return Breakpoint::BreakpointEventData::GetBreakpointEventTypeFromEvent( 765b9c1b51eSKate Stone event.GetSP()); 7669fed0d85SGreg Clayton return eBreakpointEventTypeInvalidType; 7679fed0d85SGreg Clayton } 7689fed0d85SGreg Clayton 769b9c1b51eSKate Stone SBBreakpoint SBBreakpoint::GetBreakpointFromEvent(const lldb::SBEvent &event) { 770baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD(lldb::SBBreakpoint, SBBreakpoint, 771baf5664fSJonas Devlieghere GetBreakpointFromEvent, (const lldb::SBEvent &), 772baf5664fSJonas Devlieghere event); 773baf5664fSJonas Devlieghere 7749fed0d85SGreg Clayton if (event.IsValid()) 775*d232abc3SJonas Devlieghere return SBBreakpoint( 776*d232abc3SJonas Devlieghere Breakpoint::BreakpointEventData::GetBreakpointFromEvent(event.GetSP())); 777*d232abc3SJonas Devlieghere return SBBreakpoint(); 7789fed0d85SGreg Clayton } 7799fed0d85SGreg Clayton 7809fed0d85SGreg Clayton SBBreakpointLocation 781b9c1b51eSKate Stone SBBreakpoint::GetBreakpointLocationAtIndexFromEvent(const lldb::SBEvent &event, 782b9c1b51eSKate Stone uint32_t loc_idx) { 783baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD(lldb::SBBreakpointLocation, SBBreakpoint, 784baf5664fSJonas Devlieghere GetBreakpointLocationAtIndexFromEvent, 785baf5664fSJonas Devlieghere (const lldb::SBEvent &, uint32_t), event, loc_idx); 786baf5664fSJonas Devlieghere 7879fed0d85SGreg Clayton SBBreakpointLocation sb_breakpoint_loc; 7889fed0d85SGreg Clayton if (event.IsValid()) 789b9c1b51eSKate Stone sb_breakpoint_loc.SetLocation( 790b9c1b51eSKate Stone Breakpoint::BreakpointEventData::GetBreakpointLocationAtIndexFromEvent( 791b9c1b51eSKate Stone event.GetSP(), loc_idx)); 792*d232abc3SJonas Devlieghere return sb_breakpoint_loc; 7939fed0d85SGreg Clayton } 7949fed0d85SGreg Clayton 795e6bc6cb9SJim Ingham uint32_t 796b9c1b51eSKate Stone SBBreakpoint::GetNumBreakpointLocationsFromEvent(const lldb::SBEvent &event) { 797baf5664fSJonas Devlieghere LLDB_RECORD_STATIC_METHOD(uint32_t, SBBreakpoint, 798baf5664fSJonas Devlieghere GetNumBreakpointLocationsFromEvent, 799baf5664fSJonas Devlieghere (const lldb::SBEvent &), event); 800baf5664fSJonas Devlieghere 801e6bc6cb9SJim Ingham uint32_t num_locations = 0; 802e6bc6cb9SJim Ingham if (event.IsValid()) 803b9c1b51eSKate Stone num_locations = 804b9c1b51eSKate Stone (Breakpoint::BreakpointEventData::GetNumBreakpointLocationsFromEvent( 805b9c1b51eSKate Stone event.GetSP())); 806e6bc6cb9SJim Ingham return num_locations; 807e6bc6cb9SJim Ingham } 80801f16664SJim Ingham 809e103ae92SJonas Devlieghere bool SBBreakpoint::IsHardware() const { 810baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBBreakpoint, IsHardware); 811baf5664fSJonas Devlieghere 812e103ae92SJonas Devlieghere BreakpointSP bkpt_sp = GetSP(); 813e103ae92SJonas Devlieghere if (bkpt_sp) 814e103ae92SJonas Devlieghere return bkpt_sp->IsHardware(); 815e103ae92SJonas Devlieghere return false; 816e103ae92SJonas Devlieghere } 817e103ae92SJonas Devlieghere 8186ac84034SPavel Labath BreakpointSP SBBreakpoint::GetSP() const { return m_opaque_wp.lock(); } 8196ac84034SPavel Labath 82001f16664SJim Ingham // This is simple collection of breakpoint id's and their target. 821653e3f4eSTodd Fiala class SBBreakpointListImpl { 82201f16664SJim Ingham public: 823a3436f73SKazu Hirata SBBreakpointListImpl(lldb::TargetSP target_sp) { 824653e3f4eSTodd Fiala if (target_sp && target_sp->IsValid()) 825653e3f4eSTodd Fiala m_target_wp = target_sp; 82601f16664SJim Ingham } 82701f16664SJim Ingham 82801f16664SJim Ingham ~SBBreakpointListImpl() = default; 82901f16664SJim Ingham 83001f16664SJim Ingham size_t GetSize() { return m_break_ids.size(); } 83101f16664SJim Ingham 83201f16664SJim Ingham BreakpointSP GetBreakpointAtIndex(size_t idx) { 83301f16664SJim Ingham if (idx >= m_break_ids.size()) 83401f16664SJim Ingham return BreakpointSP(); 83501f16664SJim Ingham TargetSP target_sp = m_target_wp.lock(); 83601f16664SJim Ingham if (!target_sp) 83701f16664SJim Ingham return BreakpointSP(); 83801f16664SJim Ingham lldb::break_id_t bp_id = m_break_ids[idx]; 83901f16664SJim Ingham return target_sp->GetBreakpointList().FindBreakpointByID(bp_id); 84001f16664SJim Ingham } 84101f16664SJim Ingham 8426d1e4696SJim Ingham BreakpointSP FindBreakpointByID(lldb::break_id_t desired_id) { 8436d1e4696SJim Ingham TargetSP target_sp = m_target_wp.lock(); 8446d1e4696SJim Ingham if (!target_sp) 8456d1e4696SJim Ingham return BreakpointSP(); 8466d1e4696SJim Ingham 8476d1e4696SJim Ingham for (lldb::break_id_t &break_id : m_break_ids) { 8486d1e4696SJim Ingham if (break_id == desired_id) 8496d1e4696SJim Ingham return target_sp->GetBreakpointList().FindBreakpointByID(break_id); 8506d1e4696SJim Ingham } 8516d1e4696SJim Ingham return BreakpointSP(); 8526d1e4696SJim Ingham } 8536d1e4696SJim Ingham 8546ac84034SPavel Labath bool Append(BreakpointSP bkpt) { 85501f16664SJim Ingham TargetSP target_sp = m_target_wp.lock(); 8566ac84034SPavel Labath if (!target_sp || !bkpt) 85701f16664SJim Ingham return false; 8586ac84034SPavel Labath if (bkpt->GetTargetSP() != target_sp) 85901f16664SJim Ingham return false; 8606ac84034SPavel Labath m_break_ids.push_back(bkpt->GetID()); 86101f16664SJim Ingham return true; 86201f16664SJim Ingham } 86301f16664SJim Ingham 8646ac84034SPavel Labath bool AppendIfUnique(BreakpointSP bkpt) { 86501f16664SJim Ingham TargetSP target_sp = m_target_wp.lock(); 8666ac84034SPavel Labath if (!target_sp || !bkpt) 86701f16664SJim Ingham return false; 8686ac84034SPavel Labath if (bkpt->GetTargetSP() != target_sp) 86901f16664SJim Ingham return false; 8706ac84034SPavel Labath lldb::break_id_t bp_id = bkpt->GetID(); 87101f16664SJim Ingham if (find(m_break_ids.begin(), m_break_ids.end(), bp_id) == 87201f16664SJim Ingham m_break_ids.end()) 87301f16664SJim Ingham return false; 87401f16664SJim Ingham 8756ac84034SPavel Labath m_break_ids.push_back(bkpt->GetID()); 87601f16664SJim Ingham return true; 87701f16664SJim Ingham } 87801f16664SJim Ingham 87901f16664SJim Ingham bool AppendByID(lldb::break_id_t id) { 88001f16664SJim Ingham TargetSP target_sp = m_target_wp.lock(); 88101f16664SJim Ingham if (!target_sp) 88201f16664SJim Ingham return false; 88301f16664SJim Ingham if (id == LLDB_INVALID_BREAK_ID) 88401f16664SJim Ingham return false; 88501f16664SJim Ingham m_break_ids.push_back(id); 88601f16664SJim Ingham return true; 88701f16664SJim Ingham } 88801f16664SJim Ingham 88901f16664SJim Ingham void Clear() { m_break_ids.clear(); } 89001f16664SJim Ingham 89101f16664SJim Ingham void CopyToBreakpointIDList(lldb_private::BreakpointIDList &bp_list) { 89201f16664SJim Ingham for (lldb::break_id_t id : m_break_ids) { 89301f16664SJim Ingham bp_list.AddBreakpointID(BreakpointID(id)); 89401f16664SJim Ingham } 89501f16664SJim Ingham } 89601f16664SJim Ingham 89701f16664SJim Ingham TargetSP GetTarget() { return m_target_wp.lock(); } 89801f16664SJim Ingham 89901f16664SJim Ingham private: 90001f16664SJim Ingham std::vector<lldb::break_id_t> m_break_ids; 90101f16664SJim Ingham TargetWP m_target_wp; 90201f16664SJim Ingham }; 90301f16664SJim Ingham 90401f16664SJim Ingham SBBreakpointList::SBBreakpointList(SBTarget &target) 905baf5664fSJonas Devlieghere : m_opaque_sp(new SBBreakpointListImpl(target.GetSP())) { 906baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR(SBBreakpointList, (lldb::SBTarget &), target); 907baf5664fSJonas Devlieghere } 90801f16664SJim Ingham 909866b7a65SJonas Devlieghere SBBreakpointList::~SBBreakpointList() = default; 91001f16664SJim Ingham 91101f16664SJim Ingham size_t SBBreakpointList::GetSize() const { 912baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(size_t, SBBreakpointList, GetSize); 913baf5664fSJonas Devlieghere 91401f16664SJim Ingham if (!m_opaque_sp) 91501f16664SJim Ingham return 0; 91601f16664SJim Ingham else 91701f16664SJim Ingham return m_opaque_sp->GetSize(); 91801f16664SJim Ingham } 91901f16664SJim Ingham 92001f16664SJim Ingham SBBreakpoint SBBreakpointList::GetBreakpointAtIndex(size_t idx) { 921baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBBreakpoint, SBBreakpointList, GetBreakpointAtIndex, 922baf5664fSJonas Devlieghere (size_t), idx); 923baf5664fSJonas Devlieghere 92401f16664SJim Ingham if (!m_opaque_sp) 925*d232abc3SJonas Devlieghere return SBBreakpoint(); 92601f16664SJim Ingham 92701f16664SJim Ingham BreakpointSP bkpt_sp = m_opaque_sp->GetBreakpointAtIndex(idx); 928*d232abc3SJonas Devlieghere return SBBreakpoint(bkpt_sp); 92901f16664SJim Ingham } 93001f16664SJim Ingham 9316d1e4696SJim Ingham SBBreakpoint SBBreakpointList::FindBreakpointByID(lldb::break_id_t id) { 932baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBBreakpoint, SBBreakpointList, FindBreakpointByID, 933baf5664fSJonas Devlieghere (lldb::break_id_t), id); 934baf5664fSJonas Devlieghere 9356d1e4696SJim Ingham if (!m_opaque_sp) 936*d232abc3SJonas Devlieghere return SBBreakpoint(); 9376d1e4696SJim Ingham BreakpointSP bkpt_sp = m_opaque_sp->FindBreakpointByID(id); 938*d232abc3SJonas Devlieghere return SBBreakpoint(bkpt_sp); 9396d1e4696SJim Ingham } 9406d1e4696SJim Ingham 94101f16664SJim Ingham void SBBreakpointList::Append(const SBBreakpoint &sb_bkpt) { 942baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBBreakpointList, Append, 943baf5664fSJonas Devlieghere (const lldb::SBBreakpoint &), sb_bkpt); 944baf5664fSJonas Devlieghere 94501f16664SJim Ingham if (!sb_bkpt.IsValid()) 94601f16664SJim Ingham return; 94701f16664SJim Ingham if (!m_opaque_sp) 94801f16664SJim Ingham return; 9496ac84034SPavel Labath m_opaque_sp->Append(sb_bkpt.m_opaque_wp.lock()); 95001f16664SJim Ingham } 95101f16664SJim Ingham 95201f16664SJim Ingham void SBBreakpointList::AppendByID(lldb::break_id_t id) { 953baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(void, SBBreakpointList, AppendByID, (lldb::break_id_t), 954baf5664fSJonas Devlieghere id); 955baf5664fSJonas Devlieghere 95601f16664SJim Ingham if (!m_opaque_sp) 95701f16664SJim Ingham return; 95801f16664SJim Ingham m_opaque_sp->AppendByID(id); 95901f16664SJim Ingham } 96001f16664SJim Ingham 96101f16664SJim Ingham bool SBBreakpointList::AppendIfUnique(const SBBreakpoint &sb_bkpt) { 962baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBBreakpointList, AppendIfUnique, 963baf5664fSJonas Devlieghere (const lldb::SBBreakpoint &), sb_bkpt); 964baf5664fSJonas Devlieghere 96501f16664SJim Ingham if (!sb_bkpt.IsValid()) 96601f16664SJim Ingham return false; 96701f16664SJim Ingham if (!m_opaque_sp) 96801f16664SJim Ingham return false; 9696ac84034SPavel Labath return m_opaque_sp->AppendIfUnique(sb_bkpt.GetSP()); 97001f16664SJim Ingham } 97101f16664SJim Ingham 97201f16664SJim Ingham void SBBreakpointList::Clear() { 973baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(void, SBBreakpointList, Clear); 974baf5664fSJonas Devlieghere 97501f16664SJim Ingham if (m_opaque_sp) 97601f16664SJim Ingham m_opaque_sp->Clear(); 97701f16664SJim Ingham } 97801f16664SJim Ingham 97901f16664SJim Ingham void SBBreakpointList::CopyToBreakpointIDList( 98001f16664SJim Ingham lldb_private::BreakpointIDList &bp_id_list) { 98101f16664SJim Ingham if (m_opaque_sp) 98201f16664SJim Ingham m_opaque_sp->CopyToBreakpointIDList(bp_id_list); 98301f16664SJim Ingham } 984