15ffd83dbSDimitry Andric //===-- SBBreakpointName.cpp ----------------------------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric
90b57cec5SDimitry Andric #include "lldb/API/SBBreakpointName.h"
100b57cec5SDimitry Andric #include "lldb/API/SBDebugger.h"
110b57cec5SDimitry Andric #include "lldb/API/SBError.h"
120b57cec5SDimitry Andric #include "lldb/API/SBStream.h"
130b57cec5SDimitry Andric #include "lldb/API/SBStringList.h"
14480093f4SDimitry Andric #include "lldb/API/SBStructuredData.h"
150b57cec5SDimitry Andric #include "lldb/API/SBTarget.h"
1604eeddc0SDimitry Andric #include "lldb/Utility/Instrumentation.h"
170b57cec5SDimitry Andric
180b57cec5SDimitry Andric #include "lldb/Breakpoint/BreakpointName.h"
190b57cec5SDimitry Andric #include "lldb/Breakpoint/StoppointCallbackContext.h"
200b57cec5SDimitry Andric #include "lldb/Core/Debugger.h"
21480093f4SDimitry Andric #include "lldb/Core/StructuredDataImpl.h"
220b57cec5SDimitry Andric #include "lldb/Interpreter/CommandInterpreter.h"
230b57cec5SDimitry Andric #include "lldb/Interpreter/ScriptInterpreter.h"
240b57cec5SDimitry Andric #include "lldb/Target/Target.h"
250b57cec5SDimitry Andric #include "lldb/Target/ThreadSpec.h"
260b57cec5SDimitry Andric #include "lldb/Utility/Stream.h"
270b57cec5SDimitry Andric
280b57cec5SDimitry Andric #include "SBBreakpointOptionCommon.h"
290b57cec5SDimitry Andric
300b57cec5SDimitry Andric using namespace lldb;
310b57cec5SDimitry Andric using namespace lldb_private;
320b57cec5SDimitry Andric
330b57cec5SDimitry Andric namespace lldb
340b57cec5SDimitry Andric {
350b57cec5SDimitry Andric class SBBreakpointNameImpl {
360b57cec5SDimitry Andric public:
SBBreakpointNameImpl(TargetSP target_sp,const char * name)370b57cec5SDimitry Andric SBBreakpointNameImpl(TargetSP target_sp, const char *name) {
380b57cec5SDimitry Andric if (!name || name[0] == '\0')
390b57cec5SDimitry Andric return;
400b57cec5SDimitry Andric m_name.assign(name);
410b57cec5SDimitry Andric
420b57cec5SDimitry Andric if (!target_sp)
430b57cec5SDimitry Andric return;
440b57cec5SDimitry Andric
450b57cec5SDimitry Andric m_target_wp = target_sp;
460b57cec5SDimitry Andric }
470b57cec5SDimitry Andric
480b57cec5SDimitry Andric SBBreakpointNameImpl(SBTarget &sb_target, const char *name);
490b57cec5SDimitry Andric bool operator==(const SBBreakpointNameImpl &rhs);
500b57cec5SDimitry Andric bool operator!=(const SBBreakpointNameImpl &rhs);
510b57cec5SDimitry Andric
520b57cec5SDimitry Andric // For now we take a simple approach and only keep the name, and relook up
530b57cec5SDimitry Andric // the location when we need it.
540b57cec5SDimitry Andric
GetTarget() const550b57cec5SDimitry Andric TargetSP GetTarget() const {
560b57cec5SDimitry Andric return m_target_wp.lock();
570b57cec5SDimitry Andric }
580b57cec5SDimitry Andric
GetName() const590b57cec5SDimitry Andric const char *GetName() const {
600b57cec5SDimitry Andric return m_name.c_str();
610b57cec5SDimitry Andric }
620b57cec5SDimitry Andric
IsValid() const630b57cec5SDimitry Andric bool IsValid() const {
640b57cec5SDimitry Andric return !m_name.empty() && m_target_wp.lock();
650b57cec5SDimitry Andric }
660b57cec5SDimitry Andric
670b57cec5SDimitry Andric lldb_private::BreakpointName *GetBreakpointName() const;
680b57cec5SDimitry Andric
690b57cec5SDimitry Andric private:
700b57cec5SDimitry Andric TargetWP m_target_wp;
710b57cec5SDimitry Andric std::string m_name;
720b57cec5SDimitry Andric };
730b57cec5SDimitry Andric
SBBreakpointNameImpl(SBTarget & sb_target,const char * name)740b57cec5SDimitry Andric SBBreakpointNameImpl::SBBreakpointNameImpl(SBTarget &sb_target,
750b57cec5SDimitry Andric const char *name) {
760b57cec5SDimitry Andric if (!name || name[0] == '\0')
770b57cec5SDimitry Andric return;
780b57cec5SDimitry Andric m_name.assign(name);
790b57cec5SDimitry Andric
800b57cec5SDimitry Andric if (!sb_target.IsValid())
810b57cec5SDimitry Andric return;
820b57cec5SDimitry Andric
830b57cec5SDimitry Andric TargetSP target_sp = sb_target.GetSP();
840b57cec5SDimitry Andric if (!target_sp)
850b57cec5SDimitry Andric return;
860b57cec5SDimitry Andric
870b57cec5SDimitry Andric m_target_wp = target_sp;
880b57cec5SDimitry Andric }
890b57cec5SDimitry Andric
operator ==(const SBBreakpointNameImpl & rhs)900b57cec5SDimitry Andric bool SBBreakpointNameImpl::operator==(const SBBreakpointNameImpl &rhs) {
910b57cec5SDimitry Andric return m_name == rhs.m_name && m_target_wp.lock() == rhs.m_target_wp.lock();
920b57cec5SDimitry Andric }
930b57cec5SDimitry Andric
operator !=(const SBBreakpointNameImpl & rhs)940b57cec5SDimitry Andric bool SBBreakpointNameImpl::operator!=(const SBBreakpointNameImpl &rhs) {
950b57cec5SDimitry Andric return m_name != rhs.m_name || m_target_wp.lock() != rhs.m_target_wp.lock();
960b57cec5SDimitry Andric }
970b57cec5SDimitry Andric
GetBreakpointName() const980b57cec5SDimitry Andric lldb_private::BreakpointName *SBBreakpointNameImpl::GetBreakpointName() const {
990b57cec5SDimitry Andric if (!IsValid())
1000b57cec5SDimitry Andric return nullptr;
1010b57cec5SDimitry Andric TargetSP target_sp = GetTarget();
1020b57cec5SDimitry Andric if (!target_sp)
1030b57cec5SDimitry Andric return nullptr;
1040b57cec5SDimitry Andric Status error;
1050b57cec5SDimitry Andric return target_sp->FindBreakpointName(ConstString(m_name), true, error);
1060b57cec5SDimitry Andric }
1070b57cec5SDimitry Andric
1080b57cec5SDimitry Andric } // namespace lldb
1090b57cec5SDimitry Andric
SBBreakpointName()11004eeddc0SDimitry Andric SBBreakpointName::SBBreakpointName() { LLDB_INSTRUMENT_VA(this); }
1110b57cec5SDimitry Andric
SBBreakpointName(SBTarget & sb_target,const char * name)1120b57cec5SDimitry Andric SBBreakpointName::SBBreakpointName(SBTarget &sb_target, const char *name) {
11304eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, sb_target, name);
1140b57cec5SDimitry Andric
1155ffd83dbSDimitry Andric m_impl_up = std::make_unique<SBBreakpointNameImpl>(sb_target, name);
1160b57cec5SDimitry Andric // Call FindBreakpointName here to make sure the name is valid, reset if not:
1170b57cec5SDimitry Andric BreakpointName *bp_name = GetBreakpointName();
1180b57cec5SDimitry Andric if (!bp_name)
1190b57cec5SDimitry Andric m_impl_up.reset();
1200b57cec5SDimitry Andric }
1210b57cec5SDimitry Andric
SBBreakpointName(SBBreakpoint & sb_bkpt,const char * name)1220b57cec5SDimitry Andric SBBreakpointName::SBBreakpointName(SBBreakpoint &sb_bkpt, const char *name) {
12304eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, sb_bkpt, name);
1240b57cec5SDimitry Andric
1250b57cec5SDimitry Andric if (!sb_bkpt.IsValid()) {
1260b57cec5SDimitry Andric m_impl_up.reset();
1270b57cec5SDimitry Andric return;
1280b57cec5SDimitry Andric }
1290b57cec5SDimitry Andric BreakpointSP bkpt_sp = sb_bkpt.GetSP();
1300b57cec5SDimitry Andric Target &target = bkpt_sp->GetTarget();
1310b57cec5SDimitry Andric
1325ffd83dbSDimitry Andric m_impl_up =
1335ffd83dbSDimitry Andric std::make_unique<SBBreakpointNameImpl>(target.shared_from_this(), name);
1340b57cec5SDimitry Andric
1350b57cec5SDimitry Andric // Call FindBreakpointName here to make sure the name is valid, reset if not:
1360b57cec5SDimitry Andric BreakpointName *bp_name = GetBreakpointName();
1370b57cec5SDimitry Andric if (!bp_name) {
1380b57cec5SDimitry Andric m_impl_up.reset();
1390b57cec5SDimitry Andric return;
1400b57cec5SDimitry Andric }
1410b57cec5SDimitry Andric
1420b57cec5SDimitry Andric // Now copy over the breakpoint's options:
143fe6060f1SDimitry Andric target.ConfigureBreakpointName(*bp_name, bkpt_sp->GetOptions(),
1440b57cec5SDimitry Andric BreakpointName::Permissions());
1450b57cec5SDimitry Andric }
1460b57cec5SDimitry Andric
SBBreakpointName(const SBBreakpointName & rhs)1470b57cec5SDimitry Andric SBBreakpointName::SBBreakpointName(const SBBreakpointName &rhs) {
14804eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, rhs);
1490b57cec5SDimitry Andric
1500b57cec5SDimitry Andric if (!rhs.m_impl_up)
1510b57cec5SDimitry Andric return;
1520b57cec5SDimitry Andric else
1535ffd83dbSDimitry Andric m_impl_up = std::make_unique<SBBreakpointNameImpl>(
1545ffd83dbSDimitry Andric rhs.m_impl_up->GetTarget(), rhs.m_impl_up->GetName());
1550b57cec5SDimitry Andric }
1560b57cec5SDimitry Andric
1570b57cec5SDimitry Andric SBBreakpointName::~SBBreakpointName() = default;
1580b57cec5SDimitry Andric
1590b57cec5SDimitry Andric const SBBreakpointName &SBBreakpointName::
operator =(const SBBreakpointName & rhs)1600b57cec5SDimitry Andric operator=(const SBBreakpointName &rhs) {
16104eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, rhs);
1620b57cec5SDimitry Andric
1630b57cec5SDimitry Andric if (!rhs.m_impl_up) {
1640b57cec5SDimitry Andric m_impl_up.reset();
16504eeddc0SDimitry Andric return *this;
1660b57cec5SDimitry Andric }
1670b57cec5SDimitry Andric
1685ffd83dbSDimitry Andric m_impl_up = std::make_unique<SBBreakpointNameImpl>(rhs.m_impl_up->GetTarget(),
1695ffd83dbSDimitry Andric rhs.m_impl_up->GetName());
17004eeddc0SDimitry Andric return *this;
1710b57cec5SDimitry Andric }
1720b57cec5SDimitry Andric
operator ==(const lldb::SBBreakpointName & rhs)1730b57cec5SDimitry Andric bool SBBreakpointName::operator==(const lldb::SBBreakpointName &rhs) {
17404eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, rhs);
1750b57cec5SDimitry Andric
1760b57cec5SDimitry Andric return *m_impl_up == *rhs.m_impl_up;
1770b57cec5SDimitry Andric }
1780b57cec5SDimitry Andric
operator !=(const lldb::SBBreakpointName & rhs)1790b57cec5SDimitry Andric bool SBBreakpointName::operator!=(const lldb::SBBreakpointName &rhs) {
18004eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, rhs);
1810b57cec5SDimitry Andric
1820b57cec5SDimitry Andric return *m_impl_up != *rhs.m_impl_up;
1830b57cec5SDimitry Andric }
1840b57cec5SDimitry Andric
IsValid() const1850b57cec5SDimitry Andric bool SBBreakpointName::IsValid() const {
18604eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this);
1870b57cec5SDimitry Andric return this->operator bool();
1880b57cec5SDimitry Andric }
operator bool() const1890b57cec5SDimitry Andric SBBreakpointName::operator bool() const {
19004eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this);
1910b57cec5SDimitry Andric
1920b57cec5SDimitry Andric if (!m_impl_up)
1930b57cec5SDimitry Andric return false;
1940b57cec5SDimitry Andric return m_impl_up->IsValid();
1950b57cec5SDimitry Andric }
1960b57cec5SDimitry Andric
GetName() const1970b57cec5SDimitry Andric const char *SBBreakpointName::GetName() const {
19804eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this);
1990b57cec5SDimitry Andric
2000b57cec5SDimitry Andric if (!m_impl_up)
2010b57cec5SDimitry Andric return "<Invalid Breakpoint Name Object>";
202*fe013be4SDimitry Andric return ConstString(m_impl_up->GetName()).GetCString();
2030b57cec5SDimitry Andric }
2040b57cec5SDimitry Andric
SetEnabled(bool enable)2050b57cec5SDimitry Andric void SBBreakpointName::SetEnabled(bool enable) {
20604eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, enable);
2070b57cec5SDimitry Andric
2080b57cec5SDimitry Andric BreakpointName *bp_name = GetBreakpointName();
2090b57cec5SDimitry Andric if (!bp_name)
2100b57cec5SDimitry Andric return;
2110b57cec5SDimitry Andric
2120b57cec5SDimitry Andric std::lock_guard<std::recursive_mutex> guard(
2130b57cec5SDimitry Andric m_impl_up->GetTarget()->GetAPIMutex());
2140b57cec5SDimitry Andric
2150b57cec5SDimitry Andric bp_name->GetOptions().SetEnabled(enable);
2160b57cec5SDimitry Andric }
2170b57cec5SDimitry Andric
UpdateName(BreakpointName & bp_name)2180b57cec5SDimitry Andric void SBBreakpointName::UpdateName(BreakpointName &bp_name) {
2190b57cec5SDimitry Andric if (!IsValid())
2200b57cec5SDimitry Andric return;
2210b57cec5SDimitry Andric
2220b57cec5SDimitry Andric TargetSP target_sp = m_impl_up->GetTarget();
2230b57cec5SDimitry Andric if (!target_sp)
2240b57cec5SDimitry Andric return;
2250b57cec5SDimitry Andric target_sp->ApplyNameToBreakpoints(bp_name);
2260b57cec5SDimitry Andric
2270b57cec5SDimitry Andric }
2280b57cec5SDimitry Andric
IsEnabled()2290b57cec5SDimitry Andric bool SBBreakpointName::IsEnabled() {
23004eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this);
2310b57cec5SDimitry Andric
2320b57cec5SDimitry Andric BreakpointName *bp_name = GetBreakpointName();
2330b57cec5SDimitry Andric if (!bp_name)
2340b57cec5SDimitry Andric return false;
2350b57cec5SDimitry Andric
2360b57cec5SDimitry Andric std::lock_guard<std::recursive_mutex> guard(
2370b57cec5SDimitry Andric m_impl_up->GetTarget()->GetAPIMutex());
2380b57cec5SDimitry Andric
2390b57cec5SDimitry Andric return bp_name->GetOptions().IsEnabled();
2400b57cec5SDimitry Andric }
2410b57cec5SDimitry Andric
SetOneShot(bool one_shot)2420b57cec5SDimitry Andric void SBBreakpointName::SetOneShot(bool one_shot) {
24304eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, one_shot);
2440b57cec5SDimitry Andric
2450b57cec5SDimitry Andric BreakpointName *bp_name = GetBreakpointName();
2460b57cec5SDimitry Andric if (!bp_name)
2470b57cec5SDimitry Andric return;
2480b57cec5SDimitry Andric
2490b57cec5SDimitry Andric std::lock_guard<std::recursive_mutex> guard(
2500b57cec5SDimitry Andric m_impl_up->GetTarget()->GetAPIMutex());
2510b57cec5SDimitry Andric
2520b57cec5SDimitry Andric bp_name->GetOptions().SetOneShot(one_shot);
2530b57cec5SDimitry Andric UpdateName(*bp_name);
2540b57cec5SDimitry Andric }
2550b57cec5SDimitry Andric
IsOneShot() const2560b57cec5SDimitry Andric bool SBBreakpointName::IsOneShot() const {
25704eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this);
2580b57cec5SDimitry Andric
2590b57cec5SDimitry Andric const BreakpointName *bp_name = GetBreakpointName();
2600b57cec5SDimitry Andric if (!bp_name)
2610b57cec5SDimitry Andric return false;
2620b57cec5SDimitry Andric
2630b57cec5SDimitry Andric std::lock_guard<std::recursive_mutex> guard(
2640b57cec5SDimitry Andric m_impl_up->GetTarget()->GetAPIMutex());
2650b57cec5SDimitry Andric
2660b57cec5SDimitry Andric return bp_name->GetOptions().IsOneShot();
2670b57cec5SDimitry Andric }
2680b57cec5SDimitry Andric
SetIgnoreCount(uint32_t count)2690b57cec5SDimitry Andric void SBBreakpointName::SetIgnoreCount(uint32_t count) {
27004eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, count);
2710b57cec5SDimitry Andric
2720b57cec5SDimitry Andric BreakpointName *bp_name = GetBreakpointName();
2730b57cec5SDimitry Andric if (!bp_name)
2740b57cec5SDimitry Andric return;
2750b57cec5SDimitry Andric
2760b57cec5SDimitry Andric std::lock_guard<std::recursive_mutex> guard(
2770b57cec5SDimitry Andric m_impl_up->GetTarget()->GetAPIMutex());
2780b57cec5SDimitry Andric
2790b57cec5SDimitry Andric bp_name->GetOptions().SetIgnoreCount(count);
2800b57cec5SDimitry Andric UpdateName(*bp_name);
2810b57cec5SDimitry Andric }
2820b57cec5SDimitry Andric
GetIgnoreCount() const2830b57cec5SDimitry Andric uint32_t SBBreakpointName::GetIgnoreCount() const {
28404eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this);
2850b57cec5SDimitry Andric
2860b57cec5SDimitry Andric BreakpointName *bp_name = GetBreakpointName();
2870b57cec5SDimitry Andric if (!bp_name)
2880b57cec5SDimitry Andric return false;
2890b57cec5SDimitry Andric
2900b57cec5SDimitry Andric std::lock_guard<std::recursive_mutex> guard(
2910b57cec5SDimitry Andric m_impl_up->GetTarget()->GetAPIMutex());
2920b57cec5SDimitry Andric
2930b57cec5SDimitry Andric return bp_name->GetOptions().GetIgnoreCount();
2940b57cec5SDimitry Andric }
2950b57cec5SDimitry Andric
SetCondition(const char * condition)2960b57cec5SDimitry Andric void SBBreakpointName::SetCondition(const char *condition) {
29704eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, condition);
2980b57cec5SDimitry Andric
2990b57cec5SDimitry Andric BreakpointName *bp_name = GetBreakpointName();
3000b57cec5SDimitry Andric if (!bp_name)
3010b57cec5SDimitry Andric return;
3020b57cec5SDimitry Andric
3030b57cec5SDimitry Andric std::lock_guard<std::recursive_mutex> guard(
3040b57cec5SDimitry Andric m_impl_up->GetTarget()->GetAPIMutex());
3050b57cec5SDimitry Andric
3060b57cec5SDimitry Andric bp_name->GetOptions().SetCondition(condition);
3070b57cec5SDimitry Andric UpdateName(*bp_name);
3080b57cec5SDimitry Andric }
3090b57cec5SDimitry Andric
GetCondition()3100b57cec5SDimitry Andric const char *SBBreakpointName::GetCondition() {
31104eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this);
3120b57cec5SDimitry Andric
3130b57cec5SDimitry Andric BreakpointName *bp_name = GetBreakpointName();
3140b57cec5SDimitry Andric if (!bp_name)
3150b57cec5SDimitry Andric return nullptr;
3160b57cec5SDimitry Andric
3170b57cec5SDimitry Andric std::lock_guard<std::recursive_mutex> guard(
3180b57cec5SDimitry Andric m_impl_up->GetTarget()->GetAPIMutex());
3190b57cec5SDimitry Andric
320*fe013be4SDimitry Andric return ConstString(bp_name->GetOptions().GetConditionText()).GetCString();
3210b57cec5SDimitry Andric }
3220b57cec5SDimitry Andric
SetAutoContinue(bool auto_continue)3230b57cec5SDimitry Andric void SBBreakpointName::SetAutoContinue(bool auto_continue) {
32404eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, auto_continue);
3250b57cec5SDimitry Andric
3260b57cec5SDimitry Andric BreakpointName *bp_name = GetBreakpointName();
3270b57cec5SDimitry Andric if (!bp_name)
3280b57cec5SDimitry Andric return;
3290b57cec5SDimitry Andric
3300b57cec5SDimitry Andric std::lock_guard<std::recursive_mutex> guard(
3310b57cec5SDimitry Andric m_impl_up->GetTarget()->GetAPIMutex());
3320b57cec5SDimitry Andric
3330b57cec5SDimitry Andric bp_name->GetOptions().SetAutoContinue(auto_continue);
3340b57cec5SDimitry Andric UpdateName(*bp_name);
3350b57cec5SDimitry Andric }
3360b57cec5SDimitry Andric
GetAutoContinue()3370b57cec5SDimitry Andric bool SBBreakpointName::GetAutoContinue() {
33804eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this);
3390b57cec5SDimitry Andric
3400b57cec5SDimitry Andric BreakpointName *bp_name = GetBreakpointName();
3410b57cec5SDimitry Andric if (!bp_name)
3420b57cec5SDimitry Andric return false;
3430b57cec5SDimitry Andric
3440b57cec5SDimitry Andric std::lock_guard<std::recursive_mutex> guard(
3450b57cec5SDimitry Andric m_impl_up->GetTarget()->GetAPIMutex());
3460b57cec5SDimitry Andric
3470b57cec5SDimitry Andric return bp_name->GetOptions().IsAutoContinue();
3480b57cec5SDimitry Andric }
3490b57cec5SDimitry Andric
SetThreadID(tid_t tid)3500b57cec5SDimitry Andric void SBBreakpointName::SetThreadID(tid_t tid) {
35104eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, tid);
3520b57cec5SDimitry Andric
3530b57cec5SDimitry Andric BreakpointName *bp_name = GetBreakpointName();
3540b57cec5SDimitry Andric if (!bp_name)
3550b57cec5SDimitry Andric return;
3560b57cec5SDimitry Andric
3570b57cec5SDimitry Andric std::lock_guard<std::recursive_mutex> guard(
3580b57cec5SDimitry Andric m_impl_up->GetTarget()->GetAPIMutex());
3590b57cec5SDimitry Andric
3600b57cec5SDimitry Andric bp_name->GetOptions().SetThreadID(tid);
3610b57cec5SDimitry Andric UpdateName(*bp_name);
3620b57cec5SDimitry Andric }
3630b57cec5SDimitry Andric
GetThreadID()3640b57cec5SDimitry Andric tid_t SBBreakpointName::GetThreadID() {
36504eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this);
3660b57cec5SDimitry Andric
3670b57cec5SDimitry Andric BreakpointName *bp_name = GetBreakpointName();
3680b57cec5SDimitry Andric if (!bp_name)
3690b57cec5SDimitry Andric return LLDB_INVALID_THREAD_ID;
3700b57cec5SDimitry Andric
3710b57cec5SDimitry Andric std::lock_guard<std::recursive_mutex> guard(
3720b57cec5SDimitry Andric m_impl_up->GetTarget()->GetAPIMutex());
3730b57cec5SDimitry Andric
3740b57cec5SDimitry Andric return bp_name->GetOptions().GetThreadSpec()->GetTID();
3750b57cec5SDimitry Andric }
3760b57cec5SDimitry Andric
SetThreadIndex(uint32_t index)3770b57cec5SDimitry Andric void SBBreakpointName::SetThreadIndex(uint32_t index) {
37804eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, index);
3790b57cec5SDimitry Andric
3800b57cec5SDimitry Andric BreakpointName *bp_name = GetBreakpointName();
3810b57cec5SDimitry Andric if (!bp_name)
3820b57cec5SDimitry Andric return;
3830b57cec5SDimitry Andric
3840b57cec5SDimitry Andric std::lock_guard<std::recursive_mutex> guard(
3850b57cec5SDimitry Andric m_impl_up->GetTarget()->GetAPIMutex());
3860b57cec5SDimitry Andric
3870b57cec5SDimitry Andric bp_name->GetOptions().GetThreadSpec()->SetIndex(index);
3880b57cec5SDimitry Andric UpdateName(*bp_name);
3890b57cec5SDimitry Andric }
3900b57cec5SDimitry Andric
GetThreadIndex() const3910b57cec5SDimitry Andric uint32_t SBBreakpointName::GetThreadIndex() const {
39204eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this);
3930b57cec5SDimitry Andric
3940b57cec5SDimitry Andric BreakpointName *bp_name = GetBreakpointName();
3950b57cec5SDimitry Andric if (!bp_name)
3960b57cec5SDimitry Andric return LLDB_INVALID_THREAD_ID;
3970b57cec5SDimitry Andric
3980b57cec5SDimitry Andric std::lock_guard<std::recursive_mutex> guard(
3990b57cec5SDimitry Andric m_impl_up->GetTarget()->GetAPIMutex());
4000b57cec5SDimitry Andric
4010b57cec5SDimitry Andric return bp_name->GetOptions().GetThreadSpec()->GetIndex();
4020b57cec5SDimitry Andric }
4030b57cec5SDimitry Andric
SetThreadName(const char * thread_name)4040b57cec5SDimitry Andric void SBBreakpointName::SetThreadName(const char *thread_name) {
40504eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, thread_name);
4060b57cec5SDimitry Andric
4070b57cec5SDimitry Andric BreakpointName *bp_name = GetBreakpointName();
4080b57cec5SDimitry Andric if (!bp_name)
4090b57cec5SDimitry Andric return;
4100b57cec5SDimitry Andric
4110b57cec5SDimitry Andric std::lock_guard<std::recursive_mutex> guard(
4120b57cec5SDimitry Andric m_impl_up->GetTarget()->GetAPIMutex());
4130b57cec5SDimitry Andric
4140b57cec5SDimitry Andric bp_name->GetOptions().GetThreadSpec()->SetName(thread_name);
4150b57cec5SDimitry Andric UpdateName(*bp_name);
4160b57cec5SDimitry Andric }
4170b57cec5SDimitry Andric
GetThreadName() const4180b57cec5SDimitry Andric const char *SBBreakpointName::GetThreadName() const {
41904eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this);
4200b57cec5SDimitry Andric
4210b57cec5SDimitry Andric BreakpointName *bp_name = GetBreakpointName();
4220b57cec5SDimitry Andric if (!bp_name)
4230b57cec5SDimitry Andric return nullptr;
4240b57cec5SDimitry Andric
4250b57cec5SDimitry Andric std::lock_guard<std::recursive_mutex> guard(
4260b57cec5SDimitry Andric m_impl_up->GetTarget()->GetAPIMutex());
4270b57cec5SDimitry Andric
428*fe013be4SDimitry Andric return ConstString(bp_name->GetOptions().GetThreadSpec()->GetName())
429*fe013be4SDimitry Andric .GetCString();
4300b57cec5SDimitry Andric }
4310b57cec5SDimitry Andric
SetQueueName(const char * queue_name)4320b57cec5SDimitry Andric void SBBreakpointName::SetQueueName(const char *queue_name) {
43304eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, queue_name);
4340b57cec5SDimitry Andric
4350b57cec5SDimitry Andric BreakpointName *bp_name = GetBreakpointName();
4360b57cec5SDimitry Andric if (!bp_name)
4370b57cec5SDimitry Andric return;
4380b57cec5SDimitry Andric
4390b57cec5SDimitry Andric std::lock_guard<std::recursive_mutex> guard(
4400b57cec5SDimitry Andric m_impl_up->GetTarget()->GetAPIMutex());
4410b57cec5SDimitry Andric
4420b57cec5SDimitry Andric bp_name->GetOptions().GetThreadSpec()->SetQueueName(queue_name);
4430b57cec5SDimitry Andric UpdateName(*bp_name);
4440b57cec5SDimitry Andric }
4450b57cec5SDimitry Andric
GetQueueName() const4460b57cec5SDimitry Andric const char *SBBreakpointName::GetQueueName() const {
44704eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this);
4480b57cec5SDimitry Andric
4490b57cec5SDimitry Andric BreakpointName *bp_name = GetBreakpointName();
4500b57cec5SDimitry Andric if (!bp_name)
4510b57cec5SDimitry Andric return nullptr;
4520b57cec5SDimitry Andric
4530b57cec5SDimitry Andric std::lock_guard<std::recursive_mutex> guard(
4540b57cec5SDimitry Andric m_impl_up->GetTarget()->GetAPIMutex());
4550b57cec5SDimitry Andric
456*fe013be4SDimitry Andric return ConstString(bp_name->GetOptions().GetThreadSpec()->GetQueueName())
457*fe013be4SDimitry Andric .GetCString();
4580b57cec5SDimitry Andric }
4590b57cec5SDimitry Andric
SetCommandLineCommands(SBStringList & commands)4600b57cec5SDimitry Andric void SBBreakpointName::SetCommandLineCommands(SBStringList &commands) {
46104eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, commands);
4620b57cec5SDimitry Andric
4630b57cec5SDimitry Andric BreakpointName *bp_name = GetBreakpointName();
4640b57cec5SDimitry Andric if (!bp_name)
4650b57cec5SDimitry Andric return;
4660b57cec5SDimitry Andric if (commands.GetSize() == 0)
4670b57cec5SDimitry Andric return;
4680b57cec5SDimitry Andric
4690b57cec5SDimitry Andric
4700b57cec5SDimitry Andric std::lock_guard<std::recursive_mutex> guard(
4710b57cec5SDimitry Andric m_impl_up->GetTarget()->GetAPIMutex());
4720b57cec5SDimitry Andric std::unique_ptr<BreakpointOptions::CommandData> cmd_data_up(
4730b57cec5SDimitry Andric new BreakpointOptions::CommandData(*commands, eScriptLanguageNone));
4740b57cec5SDimitry Andric
4750b57cec5SDimitry Andric bp_name->GetOptions().SetCommandDataCallback(cmd_data_up);
4760b57cec5SDimitry Andric UpdateName(*bp_name);
4770b57cec5SDimitry Andric }
4780b57cec5SDimitry Andric
GetCommandLineCommands(SBStringList & commands)4790b57cec5SDimitry Andric bool SBBreakpointName::GetCommandLineCommands(SBStringList &commands) {
48004eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, commands);
4810b57cec5SDimitry Andric
4820b57cec5SDimitry Andric BreakpointName *bp_name = GetBreakpointName();
4830b57cec5SDimitry Andric if (!bp_name)
4840b57cec5SDimitry Andric return false;
4850b57cec5SDimitry Andric
4860b57cec5SDimitry Andric StringList command_list;
4870b57cec5SDimitry Andric bool has_commands =
4880b57cec5SDimitry Andric bp_name->GetOptions().GetCommandLineCallbacks(command_list);
4890b57cec5SDimitry Andric if (has_commands)
4900b57cec5SDimitry Andric commands.AppendList(command_list);
4910b57cec5SDimitry Andric return has_commands;
4920b57cec5SDimitry Andric }
4930b57cec5SDimitry Andric
GetHelpString() const4940b57cec5SDimitry Andric const char *SBBreakpointName::GetHelpString() const {
49504eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this);
4960b57cec5SDimitry Andric
4970b57cec5SDimitry Andric BreakpointName *bp_name = GetBreakpointName();
4980b57cec5SDimitry Andric if (!bp_name)
4990b57cec5SDimitry Andric return "";
5000b57cec5SDimitry Andric
501*fe013be4SDimitry Andric return ConstString(bp_name->GetHelp()).GetCString();
5020b57cec5SDimitry Andric }
5030b57cec5SDimitry Andric
SetHelpString(const char * help_string)5040b57cec5SDimitry Andric void SBBreakpointName::SetHelpString(const char *help_string) {
50504eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, help_string);
5060b57cec5SDimitry Andric
5070b57cec5SDimitry Andric BreakpointName *bp_name = GetBreakpointName();
5080b57cec5SDimitry Andric if (!bp_name)
5090b57cec5SDimitry Andric return;
5100b57cec5SDimitry Andric
5110b57cec5SDimitry Andric
5120b57cec5SDimitry Andric std::lock_guard<std::recursive_mutex> guard(
5130b57cec5SDimitry Andric m_impl_up->GetTarget()->GetAPIMutex());
5140b57cec5SDimitry Andric bp_name->SetHelp(help_string);
5150b57cec5SDimitry Andric }
5160b57cec5SDimitry Andric
GetDescription(SBStream & s)5170b57cec5SDimitry Andric bool SBBreakpointName::GetDescription(SBStream &s) {
51804eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, s);
5190b57cec5SDimitry Andric
5200b57cec5SDimitry Andric BreakpointName *bp_name = GetBreakpointName();
5210b57cec5SDimitry Andric if (!bp_name)
5220b57cec5SDimitry Andric {
5230b57cec5SDimitry Andric s.Printf("No value");
5240b57cec5SDimitry Andric return false;
5250b57cec5SDimitry Andric }
5260b57cec5SDimitry Andric
5270b57cec5SDimitry Andric std::lock_guard<std::recursive_mutex> guard(
5280b57cec5SDimitry Andric m_impl_up->GetTarget()->GetAPIMutex());
5290b57cec5SDimitry Andric bp_name->GetDescription(s.get(), eDescriptionLevelFull);
5300b57cec5SDimitry Andric return true;
5310b57cec5SDimitry Andric }
5320b57cec5SDimitry Andric
SetCallback(SBBreakpointHitCallback callback,void * baton)5330b57cec5SDimitry Andric void SBBreakpointName::SetCallback(SBBreakpointHitCallback callback,
5340b57cec5SDimitry Andric void *baton) {
53504eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, callback, baton);
5360b57cec5SDimitry Andric
5370b57cec5SDimitry Andric BreakpointName *bp_name = GetBreakpointName();
5380b57cec5SDimitry Andric if (!bp_name)
5390b57cec5SDimitry Andric return;
5400b57cec5SDimitry Andric std::lock_guard<std::recursive_mutex> guard(
5410b57cec5SDimitry Andric m_impl_up->GetTarget()->GetAPIMutex());
5420b57cec5SDimitry Andric
5430b57cec5SDimitry Andric BatonSP baton_sp(new SBBreakpointCallbackBaton(callback, baton));
5440b57cec5SDimitry Andric bp_name->GetOptions().SetCallback(SBBreakpointCallbackBaton
5450b57cec5SDimitry Andric ::PrivateBreakpointHitCallback,
5460b57cec5SDimitry Andric baton_sp,
5470b57cec5SDimitry Andric false);
5480b57cec5SDimitry Andric UpdateName(*bp_name);
5490b57cec5SDimitry Andric }
5500b57cec5SDimitry Andric
SetScriptCallbackFunction(const char * callback_function_name)5510b57cec5SDimitry Andric void SBBreakpointName::SetScriptCallbackFunction(
5520b57cec5SDimitry Andric const char *callback_function_name) {
55304eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, callback_function_name);
554480093f4SDimitry Andric SBStructuredData empty_args;
555480093f4SDimitry Andric SetScriptCallbackFunction(callback_function_name, empty_args);
556480093f4SDimitry Andric }
5570b57cec5SDimitry Andric
SetScriptCallbackFunction(const char * callback_function_name,SBStructuredData & extra_args)558480093f4SDimitry Andric SBError SBBreakpointName::SetScriptCallbackFunction(
559480093f4SDimitry Andric const char *callback_function_name,
560480093f4SDimitry Andric SBStructuredData &extra_args) {
56104eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, callback_function_name, extra_args);
562480093f4SDimitry Andric SBError sb_error;
5630b57cec5SDimitry Andric BreakpointName *bp_name = GetBreakpointName();
564480093f4SDimitry Andric if (!bp_name) {
565480093f4SDimitry Andric sb_error.SetErrorString("unrecognized breakpoint name");
56604eeddc0SDimitry Andric return sb_error;
567480093f4SDimitry Andric }
5680b57cec5SDimitry Andric
5690b57cec5SDimitry Andric std::lock_guard<std::recursive_mutex> guard(
5700b57cec5SDimitry Andric m_impl_up->GetTarget()->GetAPIMutex());
5710b57cec5SDimitry Andric
5720b57cec5SDimitry Andric BreakpointOptions &bp_options = bp_name->GetOptions();
573480093f4SDimitry Andric Status error;
574480093f4SDimitry Andric error = m_impl_up->GetTarget()
5750b57cec5SDimitry Andric ->GetDebugger()
5760b57cec5SDimitry Andric .GetScriptInterpreter()
577fe6060f1SDimitry Andric ->SetBreakpointCommandCallbackFunction(
578fe6060f1SDimitry Andric bp_options, callback_function_name,
579fe6060f1SDimitry Andric extra_args.m_impl_up->GetObjectSP());
580480093f4SDimitry Andric sb_error.SetError(error);
5810b57cec5SDimitry Andric UpdateName(*bp_name);
58204eeddc0SDimitry Andric return sb_error;
5830b57cec5SDimitry Andric }
5840b57cec5SDimitry Andric
5850b57cec5SDimitry Andric SBError
SetScriptCallbackBody(const char * callback_body_text)5860b57cec5SDimitry Andric SBBreakpointName::SetScriptCallbackBody(const char *callback_body_text) {
58704eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, callback_body_text);
5880b57cec5SDimitry Andric
5890b57cec5SDimitry Andric SBError sb_error;
5900b57cec5SDimitry Andric BreakpointName *bp_name = GetBreakpointName();
5910b57cec5SDimitry Andric if (!bp_name)
59204eeddc0SDimitry Andric return sb_error;
5930b57cec5SDimitry Andric
5940b57cec5SDimitry Andric std::lock_guard<std::recursive_mutex> guard(
5950b57cec5SDimitry Andric m_impl_up->GetTarget()->GetAPIMutex());
5960b57cec5SDimitry Andric
5970b57cec5SDimitry Andric BreakpointOptions &bp_options = bp_name->GetOptions();
598*fe013be4SDimitry Andric Status error = m_impl_up->GetTarget()
5990b57cec5SDimitry Andric ->GetDebugger()
6000b57cec5SDimitry Andric .GetScriptInterpreter()
601*fe013be4SDimitry Andric ->SetBreakpointCommandCallback(
602*fe013be4SDimitry Andric bp_options, callback_body_text, /*is_callback=*/false);
6030b57cec5SDimitry Andric sb_error.SetError(error);
6040b57cec5SDimitry Andric if (!sb_error.Fail())
6050b57cec5SDimitry Andric UpdateName(*bp_name);
6060b57cec5SDimitry Andric
60704eeddc0SDimitry Andric return sb_error;
6080b57cec5SDimitry Andric }
6090b57cec5SDimitry Andric
GetAllowList() const6100b57cec5SDimitry Andric bool SBBreakpointName::GetAllowList() const {
61104eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this);
6120b57cec5SDimitry Andric
6130b57cec5SDimitry Andric BreakpointName *bp_name = GetBreakpointName();
6140b57cec5SDimitry Andric if (!bp_name)
6150b57cec5SDimitry Andric return false;
6160b57cec5SDimitry Andric return bp_name->GetPermissions().GetAllowList();
6170b57cec5SDimitry Andric }
6180b57cec5SDimitry Andric
SetAllowList(bool value)6190b57cec5SDimitry Andric void SBBreakpointName::SetAllowList(bool value) {
62004eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, value);
6210b57cec5SDimitry Andric
6220b57cec5SDimitry Andric BreakpointName *bp_name = GetBreakpointName();
6230b57cec5SDimitry Andric if (!bp_name)
6240b57cec5SDimitry Andric return;
6250b57cec5SDimitry Andric bp_name->GetPermissions().SetAllowList(value);
6260b57cec5SDimitry Andric }
6270b57cec5SDimitry Andric
GetAllowDelete()6280b57cec5SDimitry Andric bool SBBreakpointName::GetAllowDelete() {
62904eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this);
6300b57cec5SDimitry Andric
6310b57cec5SDimitry Andric BreakpointName *bp_name = GetBreakpointName();
6320b57cec5SDimitry Andric if (!bp_name)
6330b57cec5SDimitry Andric return false;
6340b57cec5SDimitry Andric return bp_name->GetPermissions().GetAllowDelete();
6350b57cec5SDimitry Andric }
6360b57cec5SDimitry Andric
SetAllowDelete(bool value)6370b57cec5SDimitry Andric void SBBreakpointName::SetAllowDelete(bool value) {
63804eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, value);
6390b57cec5SDimitry Andric
6400b57cec5SDimitry Andric BreakpointName *bp_name = GetBreakpointName();
6410b57cec5SDimitry Andric if (!bp_name)
6420b57cec5SDimitry Andric return;
6430b57cec5SDimitry Andric bp_name->GetPermissions().SetAllowDelete(value);
6440b57cec5SDimitry Andric }
6450b57cec5SDimitry Andric
GetAllowDisable()6460b57cec5SDimitry Andric bool SBBreakpointName::GetAllowDisable() {
64704eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this);
6480b57cec5SDimitry Andric
6490b57cec5SDimitry Andric BreakpointName *bp_name = GetBreakpointName();
6500b57cec5SDimitry Andric if (!bp_name)
6510b57cec5SDimitry Andric return false;
6520b57cec5SDimitry Andric return bp_name->GetPermissions().GetAllowDisable();
6530b57cec5SDimitry Andric }
6540b57cec5SDimitry Andric
SetAllowDisable(bool value)6550b57cec5SDimitry Andric void SBBreakpointName::SetAllowDisable(bool value) {
65604eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, value);
6570b57cec5SDimitry Andric
6580b57cec5SDimitry Andric BreakpointName *bp_name = GetBreakpointName();
6590b57cec5SDimitry Andric if (!bp_name)
6600b57cec5SDimitry Andric return;
6610b57cec5SDimitry Andric bp_name->GetPermissions().SetAllowDisable(value);
6620b57cec5SDimitry Andric }
6630b57cec5SDimitry Andric
GetBreakpointName() const6640b57cec5SDimitry Andric lldb_private::BreakpointName *SBBreakpointName::GetBreakpointName() const
6650b57cec5SDimitry Andric {
6660b57cec5SDimitry Andric if (!IsValid())
6670b57cec5SDimitry Andric return nullptr;
6680b57cec5SDimitry Andric return m_impl_up->GetBreakpointName();
6690b57cec5SDimitry Andric }
670