1acac075bSDimitry Andric //===-- SBBreakpointName.cpp ----------------------------------------*- C++ -*-===// 2acac075bSDimitry Andric // 3acac075bSDimitry Andric // The LLVM Compiler Infrastructure 4acac075bSDimitry Andric // 5acac075bSDimitry Andric // This file is distributed under the University of Illinois Open Source 6acac075bSDimitry Andric // License. See LICENSE.TXT for details. 7acac075bSDimitry Andric // 8acac075bSDimitry Andric //===----------------------------------------------------------------------===// 9acac075bSDimitry Andric 10acac075bSDimitry Andric // C Includes 11acac075bSDimitry Andric // C++ Includes 12acac075bSDimitry Andric // Other libraries and framework includes 13acac075bSDimitry Andric // Project includes 14acac075bSDimitry Andric #include "lldb/API/SBBreakpointName.h" 15acac075bSDimitry Andric #include "lldb/API/SBDebugger.h" 16acac075bSDimitry Andric #include "lldb/API/SBError.h" 17acac075bSDimitry Andric #include "lldb/API/SBStream.h" 18acac075bSDimitry Andric #include "lldb/API/SBStringList.h" 19acac075bSDimitry Andric #include "lldb/API/SBTarget.h" 20acac075bSDimitry Andric 21acac075bSDimitry Andric #include "lldb/Breakpoint/BreakpointName.h" 22acac075bSDimitry Andric #include "lldb/Breakpoint/StoppointCallbackContext.h" 23acac075bSDimitry Andric #include "lldb/Core/Debugger.h" 24acac075bSDimitry Andric #include "lldb/Interpreter/CommandInterpreter.h" 25acac075bSDimitry Andric #include "lldb/Interpreter/ScriptInterpreter.h" 26acac075bSDimitry Andric #include "lldb/Target/Target.h" 27acac075bSDimitry Andric #include "lldb/Target/ThreadSpec.h" 28acac075bSDimitry Andric #include "lldb/Utility/Log.h" 29acac075bSDimitry Andric #include "lldb/Utility/Stream.h" 30acac075bSDimitry Andric 31acac075bSDimitry Andric #include "SBBreakpointOptionCommon.h" 32acac075bSDimitry Andric 33acac075bSDimitry Andric using namespace lldb; 34acac075bSDimitry Andric using namespace lldb_private; 35acac075bSDimitry Andric 36acac075bSDimitry Andric namespace lldb 37acac075bSDimitry Andric { 38acac075bSDimitry Andric class SBBreakpointNameImpl { 39acac075bSDimitry Andric public: 40acac075bSDimitry Andric SBBreakpointNameImpl(TargetSP target_sp, const char *name) { 41acac075bSDimitry Andric if (!name || name[0] == '\0') 42acac075bSDimitry Andric return; 43acac075bSDimitry Andric m_name.assign(name); 44acac075bSDimitry Andric 45acac075bSDimitry Andric if (!target_sp) 46acac075bSDimitry Andric return; 47acac075bSDimitry Andric 48acac075bSDimitry Andric m_target_wp = target_sp; 49acac075bSDimitry Andric } 50acac075bSDimitry Andric 51acac075bSDimitry Andric SBBreakpointNameImpl(SBTarget &sb_target, const char *name); 52acac075bSDimitry Andric bool operator==(const SBBreakpointNameImpl &rhs); 53acac075bSDimitry Andric bool operator!=(const SBBreakpointNameImpl &rhs); 54acac075bSDimitry Andric 55acac075bSDimitry Andric // For now we take a simple approach and only keep the name, and relook 56acac075bSDimitry Andric // up the location when we need it. 57acac075bSDimitry Andric 58acac075bSDimitry Andric TargetSP GetTarget() const { 59acac075bSDimitry Andric return m_target_wp.lock(); 60acac075bSDimitry Andric } 61acac075bSDimitry Andric 62acac075bSDimitry Andric const char *GetName() const { 63acac075bSDimitry Andric return m_name.c_str(); 64acac075bSDimitry Andric } 65acac075bSDimitry Andric 66acac075bSDimitry Andric bool IsValid() const { 67acac075bSDimitry Andric return !m_name.empty() && m_target_wp.lock(); 68acac075bSDimitry Andric } 69acac075bSDimitry Andric 70acac075bSDimitry Andric lldb_private::BreakpointName *GetBreakpointName() const; 71acac075bSDimitry Andric 72acac075bSDimitry Andric private: 73acac075bSDimitry Andric TargetWP m_target_wp; 74acac075bSDimitry Andric std::string m_name; 75acac075bSDimitry Andric }; 76acac075bSDimitry Andric 77acac075bSDimitry Andric SBBreakpointNameImpl::SBBreakpointNameImpl(SBTarget &sb_target, 78acac075bSDimitry Andric const char *name) { 79acac075bSDimitry Andric if (!name || name[0] == '\0') 80acac075bSDimitry Andric return; 81acac075bSDimitry Andric m_name.assign(name); 82acac075bSDimitry Andric 83acac075bSDimitry Andric if (!sb_target.IsValid()) 84acac075bSDimitry Andric return; 85acac075bSDimitry Andric 86acac075bSDimitry Andric TargetSP target_sp = sb_target.GetSP(); 87acac075bSDimitry Andric if (!target_sp) 88acac075bSDimitry Andric return; 89acac075bSDimitry Andric 90acac075bSDimitry Andric m_target_wp = target_sp; 91acac075bSDimitry Andric } 92acac075bSDimitry Andric 93acac075bSDimitry Andric bool SBBreakpointNameImpl::operator==(const SBBreakpointNameImpl &rhs) { 94acac075bSDimitry Andric return m_name == rhs.m_name && m_target_wp.lock() == rhs.m_target_wp.lock(); 95acac075bSDimitry Andric } 96acac075bSDimitry Andric 97acac075bSDimitry Andric bool SBBreakpointNameImpl::operator!=(const SBBreakpointNameImpl &rhs) { 98acac075bSDimitry Andric return m_name != rhs.m_name || m_target_wp.lock() != rhs.m_target_wp.lock(); 99acac075bSDimitry Andric } 100acac075bSDimitry Andric 101acac075bSDimitry Andric lldb_private::BreakpointName *SBBreakpointNameImpl::GetBreakpointName() const { 102acac075bSDimitry Andric if (!IsValid()) 103acac075bSDimitry Andric return nullptr; 104acac075bSDimitry Andric TargetSP target_sp = GetTarget(); 105acac075bSDimitry Andric if (!target_sp) 106acac075bSDimitry Andric return nullptr; 107acac075bSDimitry Andric Status error; 108acac075bSDimitry Andric return target_sp->FindBreakpointName(ConstString(m_name), true, error); 109acac075bSDimitry Andric } 110acac075bSDimitry Andric 111acac075bSDimitry Andric } // namespace lldb 112acac075bSDimitry Andric 113acac075bSDimitry Andric SBBreakpointName::SBBreakpointName() {} 114acac075bSDimitry Andric 115acac075bSDimitry Andric SBBreakpointName::SBBreakpointName(SBTarget &sb_target, const char *name) 116acac075bSDimitry Andric { 117acac075bSDimitry Andric m_impl_up.reset(new SBBreakpointNameImpl(sb_target, name)); 118acac075bSDimitry Andric // Call FindBreakpointName here to make sure the name is valid, reset if 119acac075bSDimitry Andric // not: 120acac075bSDimitry Andric BreakpointName *bp_name = GetBreakpointName(); 121acac075bSDimitry Andric if (!bp_name) 122acac075bSDimitry Andric m_impl_up.reset(); 123acac075bSDimitry Andric } 124acac075bSDimitry Andric 125acac075bSDimitry Andric SBBreakpointName::SBBreakpointName(SBBreakpoint &sb_bkpt, const char *name) 126acac075bSDimitry Andric { 127acac075bSDimitry Andric if (!sb_bkpt.IsValid()) { 128acac075bSDimitry Andric m_impl_up.reset(); 129acac075bSDimitry Andric return; 130acac075bSDimitry Andric } 131acac075bSDimitry Andric BreakpointSP bkpt_sp = sb_bkpt.GetSP(); 132acac075bSDimitry Andric Target &target = bkpt_sp->GetTarget(); 133acac075bSDimitry Andric 134acac075bSDimitry Andric m_impl_up.reset(new SBBreakpointNameImpl(target.shared_from_this(), name)); 135acac075bSDimitry Andric 136acac075bSDimitry Andric // Call FindBreakpointName here to make sure the name is valid, reset if 137acac075bSDimitry Andric // not: 138acac075bSDimitry Andric BreakpointName *bp_name = GetBreakpointName(); 139acac075bSDimitry Andric if (!bp_name) { 140acac075bSDimitry Andric m_impl_up.reset(); 141acac075bSDimitry Andric return; 142acac075bSDimitry Andric } 143acac075bSDimitry Andric 144acac075bSDimitry Andric // Now copy over the breakpoint's options: 145acac075bSDimitry Andric target.ConfigureBreakpointName(*bp_name, *bkpt_sp->GetOptions(), 146acac075bSDimitry Andric BreakpointName::Permissions()); 147acac075bSDimitry Andric } 148acac075bSDimitry Andric 149acac075bSDimitry Andric SBBreakpointName::SBBreakpointName(const SBBreakpointName &rhs) 150acac075bSDimitry Andric { 151acac075bSDimitry Andric if (!rhs.m_impl_up) 152acac075bSDimitry Andric return; 153acac075bSDimitry Andric else 154acac075bSDimitry Andric m_impl_up.reset(new SBBreakpointNameImpl(rhs.m_impl_up->GetTarget(), 155acac075bSDimitry Andric rhs.m_impl_up->GetName())); 156acac075bSDimitry Andric } 157acac075bSDimitry Andric 158acac075bSDimitry Andric SBBreakpointName::~SBBreakpointName() = default; 159acac075bSDimitry Andric 160acac075bSDimitry Andric const SBBreakpointName &SBBreakpointName::operator=(const SBBreakpointName &rhs) 161acac075bSDimitry Andric { 162acac075bSDimitry Andric if (!rhs.m_impl_up) { 163acac075bSDimitry Andric m_impl_up.reset(); 164acac075bSDimitry Andric return *this; 165acac075bSDimitry Andric } 166acac075bSDimitry Andric 167acac075bSDimitry Andric m_impl_up.reset(new SBBreakpointNameImpl(rhs.m_impl_up->GetTarget(), 168acac075bSDimitry Andric rhs.m_impl_up->GetName())); 169acac075bSDimitry Andric return *this; 170acac075bSDimitry Andric } 171acac075bSDimitry Andric 172acac075bSDimitry Andric bool SBBreakpointName::operator==(const lldb::SBBreakpointName &rhs) { 173acac075bSDimitry Andric return *m_impl_up.get() == *rhs.m_impl_up.get(); 174acac075bSDimitry Andric } 175acac075bSDimitry Andric 176acac075bSDimitry Andric bool SBBreakpointName::operator!=(const lldb::SBBreakpointName &rhs) { 177acac075bSDimitry Andric return *m_impl_up.get() != *rhs.m_impl_up.get(); 178acac075bSDimitry Andric } 179acac075bSDimitry Andric 180acac075bSDimitry Andric bool SBBreakpointName::IsValid() const { 181acac075bSDimitry Andric if (!m_impl_up) 182acac075bSDimitry Andric return false; 183acac075bSDimitry Andric return m_impl_up->IsValid(); 184acac075bSDimitry Andric } 185acac075bSDimitry Andric 186acac075bSDimitry Andric const char *SBBreakpointName::GetName() const { 187acac075bSDimitry Andric if (!m_impl_up) 188acac075bSDimitry Andric return "<Invalid Breakpoint Name Object>"; 189acac075bSDimitry Andric return m_impl_up->GetName(); 190acac075bSDimitry Andric } 191acac075bSDimitry Andric 192acac075bSDimitry Andric void SBBreakpointName::SetEnabled(bool enable) { 193acac075bSDimitry Andric Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 194acac075bSDimitry Andric 195acac075bSDimitry Andric BreakpointName *bp_name = GetBreakpointName(); 196acac075bSDimitry Andric if (!bp_name) 197acac075bSDimitry Andric return; 198acac075bSDimitry Andric 199acac075bSDimitry Andric LLDB_LOG(log, "Name: {0} enabled: {1}\n", bp_name->GetName(), enable); 200acac075bSDimitry Andric std::lock_guard<std::recursive_mutex> guard( 201acac075bSDimitry Andric m_impl_up->GetTarget()->GetAPIMutex()); 202acac075bSDimitry Andric 203acac075bSDimitry Andric bp_name->GetOptions().SetEnabled(enable); 204acac075bSDimitry Andric } 205acac075bSDimitry Andric 206acac075bSDimitry Andric void SBBreakpointName::UpdateName(BreakpointName &bp_name) { 207acac075bSDimitry Andric if (!IsValid()) 208acac075bSDimitry Andric return; 209acac075bSDimitry Andric 210acac075bSDimitry Andric TargetSP target_sp = m_impl_up->GetTarget(); 211acac075bSDimitry Andric if (!target_sp) 212acac075bSDimitry Andric return; 213acac075bSDimitry Andric target_sp->ApplyNameToBreakpoints(bp_name); 214acac075bSDimitry Andric 215acac075bSDimitry Andric } 216acac075bSDimitry Andric 217acac075bSDimitry Andric bool SBBreakpointName::IsEnabled() { 218acac075bSDimitry Andric Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 219acac075bSDimitry Andric 220acac075bSDimitry Andric BreakpointName *bp_name = GetBreakpointName(); 221acac075bSDimitry Andric if (!bp_name) 222acac075bSDimitry Andric return false; 223acac075bSDimitry Andric 224acac075bSDimitry Andric LLDB_LOG(log, "Name: {0}\n", bp_name->GetName()); 225acac075bSDimitry Andric std::lock_guard<std::recursive_mutex> guard( 226acac075bSDimitry Andric m_impl_up->GetTarget()->GetAPIMutex()); 227acac075bSDimitry Andric 228acac075bSDimitry Andric return bp_name->GetOptions().IsEnabled(); 229acac075bSDimitry Andric } 230acac075bSDimitry Andric 231acac075bSDimitry Andric void SBBreakpointName::SetOneShot(bool one_shot) { 232acac075bSDimitry Andric Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 233acac075bSDimitry Andric 234acac075bSDimitry Andric BreakpointName *bp_name = GetBreakpointName(); 235acac075bSDimitry Andric if (!bp_name) 236acac075bSDimitry Andric return; 237acac075bSDimitry Andric 238acac075bSDimitry Andric LLDB_LOG(log, "Name: {0} one_shot: {1}\n", bp_name->GetName(), one_shot); 239acac075bSDimitry Andric std::lock_guard<std::recursive_mutex> guard( 240acac075bSDimitry Andric m_impl_up->GetTarget()->GetAPIMutex()); 241acac075bSDimitry Andric 242acac075bSDimitry Andric bp_name->GetOptions().SetOneShot(one_shot); 243acac075bSDimitry Andric UpdateName(*bp_name); 244acac075bSDimitry Andric } 245acac075bSDimitry Andric 246acac075bSDimitry Andric bool SBBreakpointName::IsOneShot() const { 247acac075bSDimitry Andric Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 248acac075bSDimitry Andric 249acac075bSDimitry Andric const BreakpointName *bp_name = GetBreakpointName(); 250acac075bSDimitry Andric if (!bp_name) 251acac075bSDimitry Andric return false; 252acac075bSDimitry Andric 253acac075bSDimitry Andric LLDB_LOG(log, "Name: {0}\n", bp_name->GetName()); 254acac075bSDimitry Andric std::lock_guard<std::recursive_mutex> guard( 255acac075bSDimitry Andric m_impl_up->GetTarget()->GetAPIMutex()); 256acac075bSDimitry Andric 257acac075bSDimitry Andric return bp_name->GetOptions().IsOneShot(); 258acac075bSDimitry Andric } 259acac075bSDimitry Andric 260acac075bSDimitry Andric void SBBreakpointName::SetIgnoreCount(uint32_t count) { 261acac075bSDimitry Andric Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 262acac075bSDimitry Andric 263acac075bSDimitry Andric BreakpointName *bp_name = GetBreakpointName(); 264acac075bSDimitry Andric if (!bp_name) 265acac075bSDimitry Andric return; 266acac075bSDimitry Andric 267acac075bSDimitry Andric LLDB_LOG(log, "Name: {0} one_shot: {1}\n", bp_name->GetName(), count); 268acac075bSDimitry Andric std::lock_guard<std::recursive_mutex> guard( 269acac075bSDimitry Andric m_impl_up->GetTarget()->GetAPIMutex()); 270acac075bSDimitry Andric 271acac075bSDimitry Andric bp_name->GetOptions().SetIgnoreCount(count); 272acac075bSDimitry Andric UpdateName(*bp_name); 273acac075bSDimitry Andric } 274acac075bSDimitry Andric 275acac075bSDimitry Andric uint32_t SBBreakpointName::GetIgnoreCount() const { 276acac075bSDimitry Andric Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 277acac075bSDimitry Andric 278acac075bSDimitry Andric BreakpointName *bp_name = GetBreakpointName(); 279acac075bSDimitry Andric if (!bp_name) 280acac075bSDimitry Andric return false; 281acac075bSDimitry Andric 282acac075bSDimitry Andric LLDB_LOG(log, "Name: {0}\n", bp_name->GetName()); 283acac075bSDimitry Andric std::lock_guard<std::recursive_mutex> guard( 284acac075bSDimitry Andric m_impl_up->GetTarget()->GetAPIMutex()); 285acac075bSDimitry Andric 286acac075bSDimitry Andric return bp_name->GetOptions().GetIgnoreCount(); 287acac075bSDimitry Andric } 288acac075bSDimitry Andric 289acac075bSDimitry Andric void SBBreakpointName::SetCondition(const char *condition) { 290acac075bSDimitry Andric Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 291acac075bSDimitry Andric 292acac075bSDimitry Andric BreakpointName *bp_name = GetBreakpointName(); 293acac075bSDimitry Andric if (!bp_name) 294acac075bSDimitry Andric return; 295acac075bSDimitry Andric 296acac075bSDimitry Andric LLDB_LOG(log, "Name: {0} one_shot: {1}\n", bp_name->GetName(), 297acac075bSDimitry Andric condition ? condition : "<NULL>"); 298acac075bSDimitry Andric 299acac075bSDimitry Andric std::lock_guard<std::recursive_mutex> guard( 300acac075bSDimitry Andric m_impl_up->GetTarget()->GetAPIMutex()); 301acac075bSDimitry Andric 302acac075bSDimitry Andric bp_name->GetOptions().SetCondition(condition); 303acac075bSDimitry Andric UpdateName(*bp_name); 304acac075bSDimitry Andric } 305acac075bSDimitry Andric 306acac075bSDimitry Andric const char *SBBreakpointName::GetCondition() { 307acac075bSDimitry Andric Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 308acac075bSDimitry Andric 309acac075bSDimitry Andric BreakpointName *bp_name = GetBreakpointName(); 310acac075bSDimitry Andric if (!bp_name) 311acac075bSDimitry Andric return nullptr; 312acac075bSDimitry Andric 313acac075bSDimitry Andric LLDB_LOG(log, "Name: {0}\n", bp_name->GetName()); 314acac075bSDimitry Andric std::lock_guard<std::recursive_mutex> guard( 315acac075bSDimitry Andric m_impl_up->GetTarget()->GetAPIMutex()); 316acac075bSDimitry Andric 317acac075bSDimitry Andric return bp_name->GetOptions().GetConditionText(); 318acac075bSDimitry Andric } 319acac075bSDimitry Andric 320acac075bSDimitry Andric void SBBreakpointName::SetAutoContinue(bool auto_continue) { 321acac075bSDimitry Andric Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 322acac075bSDimitry Andric 323acac075bSDimitry Andric BreakpointName *bp_name = GetBreakpointName(); 324acac075bSDimitry Andric if (!bp_name) 325acac075bSDimitry Andric return; 326acac075bSDimitry Andric 327acac075bSDimitry Andric LLDB_LOG(log, "Name: {0} auto-continue: {1}\n", bp_name->GetName(), auto_continue); 328acac075bSDimitry Andric 329acac075bSDimitry Andric std::lock_guard<std::recursive_mutex> guard( 330acac075bSDimitry Andric m_impl_up->GetTarget()->GetAPIMutex()); 331acac075bSDimitry Andric 332acac075bSDimitry Andric bp_name->GetOptions().SetAutoContinue(auto_continue); 333acac075bSDimitry Andric UpdateName(*bp_name); 334acac075bSDimitry Andric } 335acac075bSDimitry Andric 336acac075bSDimitry Andric bool SBBreakpointName::GetAutoContinue() { 337acac075bSDimitry Andric Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 338acac075bSDimitry Andric 339acac075bSDimitry Andric BreakpointName *bp_name = GetBreakpointName(); 340acac075bSDimitry Andric if (!bp_name) 341acac075bSDimitry Andric return false; 342acac075bSDimitry Andric 343acac075bSDimitry Andric LLDB_LOG(log, "Name: {0}\n", bp_name->GetName()); 344acac075bSDimitry Andric std::lock_guard<std::recursive_mutex> guard( 345acac075bSDimitry Andric m_impl_up->GetTarget()->GetAPIMutex()); 346acac075bSDimitry Andric 347acac075bSDimitry Andric return bp_name->GetOptions().IsAutoContinue(); 348acac075bSDimitry Andric } 349acac075bSDimitry Andric 350acac075bSDimitry Andric void SBBreakpointName::SetThreadID(tid_t tid) { 351acac075bSDimitry Andric Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 352acac075bSDimitry Andric 353acac075bSDimitry Andric BreakpointName *bp_name = GetBreakpointName(); 354acac075bSDimitry Andric if (!bp_name) 355acac075bSDimitry Andric return; 356acac075bSDimitry Andric 357acac075bSDimitry Andric LLDB_LOG(log, "Name: {0} tid: {1:x}\n", bp_name->GetName(), tid); 358acac075bSDimitry Andric 359acac075bSDimitry Andric std::lock_guard<std::recursive_mutex> guard( 360acac075bSDimitry Andric m_impl_up->GetTarget()->GetAPIMutex()); 361acac075bSDimitry Andric 362acac075bSDimitry Andric bp_name->GetOptions().SetThreadID(tid); 363acac075bSDimitry Andric UpdateName(*bp_name); 364acac075bSDimitry Andric } 365acac075bSDimitry Andric 366acac075bSDimitry Andric tid_t SBBreakpointName::GetThreadID() { 367acac075bSDimitry Andric Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 368acac075bSDimitry Andric 369acac075bSDimitry Andric BreakpointName *bp_name = GetBreakpointName(); 370acac075bSDimitry Andric if (!bp_name) 371acac075bSDimitry Andric return LLDB_INVALID_THREAD_ID; 372acac075bSDimitry Andric 373acac075bSDimitry Andric LLDB_LOG(log, "Name: {0}\n", bp_name->GetName()); 374acac075bSDimitry Andric std::lock_guard<std::recursive_mutex> guard( 375acac075bSDimitry Andric m_impl_up->GetTarget()->GetAPIMutex()); 376acac075bSDimitry Andric 377acac075bSDimitry Andric return bp_name->GetOptions().GetThreadSpec()->GetTID(); 378acac075bSDimitry Andric } 379acac075bSDimitry Andric 380acac075bSDimitry Andric void SBBreakpointName::SetThreadIndex(uint32_t index) { 381acac075bSDimitry Andric Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 382acac075bSDimitry Andric 383acac075bSDimitry Andric BreakpointName *bp_name = GetBreakpointName(); 384acac075bSDimitry Andric if (!bp_name) 385acac075bSDimitry Andric return; 386acac075bSDimitry Andric 387acac075bSDimitry Andric LLDB_LOG(log, "Name: {0} thread index: {1}\n", bp_name->GetName(), index); 388acac075bSDimitry Andric 389acac075bSDimitry Andric std::lock_guard<std::recursive_mutex> guard( 390acac075bSDimitry Andric m_impl_up->GetTarget()->GetAPIMutex()); 391acac075bSDimitry Andric 392acac075bSDimitry Andric bp_name->GetOptions().GetThreadSpec()->SetIndex(index); 393acac075bSDimitry Andric UpdateName(*bp_name); 394acac075bSDimitry Andric } 395acac075bSDimitry Andric 396acac075bSDimitry Andric uint32_t SBBreakpointName::GetThreadIndex() const { 397acac075bSDimitry Andric Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 398acac075bSDimitry Andric 399acac075bSDimitry Andric BreakpointName *bp_name = GetBreakpointName(); 400acac075bSDimitry Andric if (!bp_name) 401acac075bSDimitry Andric return LLDB_INVALID_THREAD_ID; 402acac075bSDimitry Andric 403acac075bSDimitry Andric LLDB_LOG(log, "Name: {0}\n", bp_name->GetName()); 404acac075bSDimitry Andric std::lock_guard<std::recursive_mutex> guard( 405acac075bSDimitry Andric m_impl_up->GetTarget()->GetAPIMutex()); 406acac075bSDimitry Andric 407acac075bSDimitry Andric return bp_name->GetOptions().GetThreadSpec()->GetIndex(); 408acac075bSDimitry Andric } 409acac075bSDimitry Andric 410acac075bSDimitry Andric void SBBreakpointName::SetThreadName(const char *thread_name) { 411acac075bSDimitry Andric Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 412acac075bSDimitry Andric 413acac075bSDimitry Andric BreakpointName *bp_name = GetBreakpointName(); 414acac075bSDimitry Andric if (!bp_name) 415acac075bSDimitry Andric return; 416acac075bSDimitry Andric 417acac075bSDimitry Andric LLDB_LOG(log, "Name: {0} thread name: {1}\n", bp_name->GetName(), thread_name); 418acac075bSDimitry Andric 419acac075bSDimitry Andric std::lock_guard<std::recursive_mutex> guard( 420acac075bSDimitry Andric m_impl_up->GetTarget()->GetAPIMutex()); 421acac075bSDimitry Andric 422acac075bSDimitry Andric bp_name->GetOptions().GetThreadSpec()->SetName(thread_name); 423acac075bSDimitry Andric UpdateName(*bp_name); 424acac075bSDimitry Andric } 425acac075bSDimitry Andric 426acac075bSDimitry Andric const char *SBBreakpointName::GetThreadName() const { 427acac075bSDimitry Andric Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 428acac075bSDimitry Andric 429acac075bSDimitry Andric BreakpointName *bp_name = GetBreakpointName(); 430acac075bSDimitry Andric if (!bp_name) 431acac075bSDimitry Andric return nullptr; 432acac075bSDimitry Andric 433acac075bSDimitry Andric LLDB_LOG(log, "Name: {0}\n", bp_name->GetName()); 434acac075bSDimitry Andric std::lock_guard<std::recursive_mutex> guard( 435acac075bSDimitry Andric m_impl_up->GetTarget()->GetAPIMutex()); 436acac075bSDimitry Andric 437acac075bSDimitry Andric return bp_name->GetOptions().GetThreadSpec()->GetName(); 438acac075bSDimitry Andric } 439acac075bSDimitry Andric 440acac075bSDimitry Andric void SBBreakpointName::SetQueueName(const char *queue_name) { 441acac075bSDimitry Andric Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 442acac075bSDimitry Andric 443acac075bSDimitry Andric BreakpointName *bp_name = GetBreakpointName(); 444acac075bSDimitry Andric if (!bp_name) 445acac075bSDimitry Andric return; 446acac075bSDimitry Andric 447acac075bSDimitry Andric LLDB_LOG(log, "Name: {0} queue name: {1}\n", bp_name->GetName(), queue_name); 448acac075bSDimitry Andric 449acac075bSDimitry Andric std::lock_guard<std::recursive_mutex> guard( 450acac075bSDimitry Andric m_impl_up->GetTarget()->GetAPIMutex()); 451acac075bSDimitry Andric 452acac075bSDimitry Andric bp_name->GetOptions().GetThreadSpec()->SetQueueName(queue_name); 453acac075bSDimitry Andric UpdateName(*bp_name); 454acac075bSDimitry Andric } 455acac075bSDimitry Andric 456acac075bSDimitry Andric const char *SBBreakpointName::GetQueueName() const { 457acac075bSDimitry Andric Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 458acac075bSDimitry Andric 459acac075bSDimitry Andric BreakpointName *bp_name = GetBreakpointName(); 460acac075bSDimitry Andric if (!bp_name) 461acac075bSDimitry Andric return nullptr; 462acac075bSDimitry Andric 463acac075bSDimitry Andric LLDB_LOG(log, "Name: {0}\n", bp_name->GetName()); 464acac075bSDimitry Andric std::lock_guard<std::recursive_mutex> guard( 465acac075bSDimitry Andric m_impl_up->GetTarget()->GetAPIMutex()); 466acac075bSDimitry Andric 467acac075bSDimitry Andric return bp_name->GetOptions().GetThreadSpec()->GetQueueName(); 468acac075bSDimitry Andric } 469acac075bSDimitry Andric 470acac075bSDimitry Andric void SBBreakpointName::SetCommandLineCommands(SBStringList &commands) { 471acac075bSDimitry Andric Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 472acac075bSDimitry Andric BreakpointName *bp_name = GetBreakpointName(); 473acac075bSDimitry Andric if (!bp_name) 474acac075bSDimitry Andric return; 475acac075bSDimitry Andric if (commands.GetSize() == 0) 476acac075bSDimitry Andric return; 477acac075bSDimitry Andric 478acac075bSDimitry Andric LLDB_LOG(log, "Name: {0} commands\n", bp_name->GetName()); 479acac075bSDimitry Andric 480acac075bSDimitry Andric std::lock_guard<std::recursive_mutex> guard( 481acac075bSDimitry Andric m_impl_up->GetTarget()->GetAPIMutex()); 482acac075bSDimitry Andric std::unique_ptr<BreakpointOptions::CommandData> cmd_data_up( 483acac075bSDimitry Andric new BreakpointOptions::CommandData(*commands, eScriptLanguageNone)); 484acac075bSDimitry Andric 485acac075bSDimitry Andric bp_name->GetOptions().SetCommandDataCallback(cmd_data_up); 486acac075bSDimitry Andric UpdateName(*bp_name); 487acac075bSDimitry Andric } 488acac075bSDimitry Andric 489acac075bSDimitry Andric bool SBBreakpointName::GetCommandLineCommands(SBStringList &commands) { 490acac075bSDimitry Andric Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 491acac075bSDimitry Andric 492acac075bSDimitry Andric BreakpointName *bp_name = GetBreakpointName(); 493acac075bSDimitry Andric if (!bp_name) 494acac075bSDimitry Andric return false; 495acac075bSDimitry Andric 496acac075bSDimitry Andric LLDB_LOG(log, "Name: {0}\n", bp_name->GetName()); 497acac075bSDimitry Andric StringList command_list; 498acac075bSDimitry Andric bool has_commands = 499acac075bSDimitry Andric bp_name->GetOptions().GetCommandLineCallbacks(command_list); 500acac075bSDimitry Andric if (has_commands) 501acac075bSDimitry Andric commands.AppendList(command_list); 502acac075bSDimitry Andric return has_commands; 503acac075bSDimitry Andric } 504acac075bSDimitry Andric 505acac075bSDimitry Andric const char *SBBreakpointName::GetHelpString() const { 506acac075bSDimitry Andric Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 507acac075bSDimitry Andric 508acac075bSDimitry Andric BreakpointName *bp_name = GetBreakpointName(); 509acac075bSDimitry Andric if (!bp_name) 510acac075bSDimitry Andric return ""; 511acac075bSDimitry Andric 512acac075bSDimitry Andric LLDB_LOG(log, "Help: {0}\n", bp_name->GetHelp()); 513acac075bSDimitry Andric return bp_name->GetHelp(); 514acac075bSDimitry Andric } 515acac075bSDimitry Andric 516acac075bSDimitry Andric void SBBreakpointName::SetHelpString(const char *help_string) { 517acac075bSDimitry Andric Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 518acac075bSDimitry Andric BreakpointName *bp_name = GetBreakpointName(); 519acac075bSDimitry Andric if (!bp_name) 520acac075bSDimitry Andric return; 521acac075bSDimitry Andric 522acac075bSDimitry Andric LLDB_LOG(log, "Name: {0} help: {1}\n", bp_name->GetName(), help_string); 523acac075bSDimitry Andric 524acac075bSDimitry Andric std::lock_guard<std::recursive_mutex> guard( 525acac075bSDimitry Andric m_impl_up->GetTarget()->GetAPIMutex()); 526acac075bSDimitry Andric bp_name->SetHelp(help_string); 527acac075bSDimitry Andric } 528acac075bSDimitry Andric 529acac075bSDimitry Andric bool SBBreakpointName::GetDescription(SBStream &s) { 530acac075bSDimitry Andric Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 531acac075bSDimitry Andric 532acac075bSDimitry Andric BreakpointName *bp_name = GetBreakpointName(); 533acac075bSDimitry Andric if (!bp_name) 534acac075bSDimitry Andric { 535acac075bSDimitry Andric s.Printf("No value"); 536acac075bSDimitry Andric return false; 537acac075bSDimitry Andric } 538acac075bSDimitry Andric 539acac075bSDimitry Andric LLDB_LOG(log, "Name: {0}\n", bp_name->GetName()); 540acac075bSDimitry Andric std::lock_guard<std::recursive_mutex> guard( 541acac075bSDimitry Andric m_impl_up->GetTarget()->GetAPIMutex()); 542acac075bSDimitry Andric bp_name->GetDescription(s.get(), eDescriptionLevelFull); 543acac075bSDimitry Andric return true; 544acac075bSDimitry Andric } 545acac075bSDimitry Andric 546acac075bSDimitry Andric void SBBreakpointName::SetCallback(SBBreakpointHitCallback callback, 547acac075bSDimitry Andric void *baton) { 548acac075bSDimitry Andric Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 549acac075bSDimitry Andric BreakpointName *bp_name = GetBreakpointName(); 550acac075bSDimitry Andric if (!bp_name) 551acac075bSDimitry Andric return; 552acac075bSDimitry Andric LLDB_LOG(log, "callback = {1}, baton = {2}", callback, baton); 553acac075bSDimitry Andric std::lock_guard<std::recursive_mutex> guard( 554acac075bSDimitry Andric m_impl_up->GetTarget()->GetAPIMutex()); 555acac075bSDimitry Andric 556acac075bSDimitry Andric BatonSP baton_sp(new SBBreakpointCallbackBaton(callback, baton)); 557acac075bSDimitry Andric bp_name->GetOptions().SetCallback(SBBreakpointCallbackBaton 558acac075bSDimitry Andric ::PrivateBreakpointHitCallback, 559acac075bSDimitry Andric baton_sp, 560acac075bSDimitry Andric false); 561acac075bSDimitry Andric UpdateName(*bp_name); 562acac075bSDimitry Andric } 563acac075bSDimitry Andric 564acac075bSDimitry Andric void SBBreakpointName::SetScriptCallbackFunction( 565acac075bSDimitry Andric const char *callback_function_name) { 566acac075bSDimitry Andric Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 567acac075bSDimitry Andric 568acac075bSDimitry Andric BreakpointName *bp_name = GetBreakpointName(); 569acac075bSDimitry Andric if (!bp_name) 570acac075bSDimitry Andric return; 571acac075bSDimitry Andric 572acac075bSDimitry Andric LLDB_LOG(log, "Name: {0} callback: {1}\n", bp_name->GetName(), 573acac075bSDimitry Andric callback_function_name); 574acac075bSDimitry Andric 575acac075bSDimitry Andric std::lock_guard<std::recursive_mutex> guard( 576acac075bSDimitry Andric m_impl_up->GetTarget()->GetAPIMutex()); 577acac075bSDimitry Andric 578acac075bSDimitry Andric BreakpointOptions &bp_options = bp_name->GetOptions(); 579acac075bSDimitry Andric m_impl_up->GetTarget() 580acac075bSDimitry Andric ->GetDebugger() 581acac075bSDimitry Andric .GetCommandInterpreter() 582acac075bSDimitry Andric .GetScriptInterpreter() 583acac075bSDimitry Andric ->SetBreakpointCommandCallbackFunction(&bp_options, 584acac075bSDimitry Andric callback_function_name); 585acac075bSDimitry Andric UpdateName(*bp_name); 586acac075bSDimitry Andric } 587acac075bSDimitry Andric 588acac075bSDimitry Andric SBError SBBreakpointName::SetScriptCallbackBody(const char *callback_body_text) 589acac075bSDimitry Andric { 590acac075bSDimitry Andric Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 591acac075bSDimitry Andric SBError sb_error; 592acac075bSDimitry Andric BreakpointName *bp_name = GetBreakpointName(); 593acac075bSDimitry Andric if (!bp_name) 594acac075bSDimitry Andric return sb_error; 595acac075bSDimitry Andric 596acac075bSDimitry Andric LLDB_LOG(log, "Name: {0} callback: {1}\n", bp_name->GetName(), 597acac075bSDimitry Andric callback_body_text); 598acac075bSDimitry Andric 599acac075bSDimitry Andric std::lock_guard<std::recursive_mutex> guard( 600acac075bSDimitry Andric m_impl_up->GetTarget()->GetAPIMutex()); 601acac075bSDimitry Andric 602acac075bSDimitry Andric BreakpointOptions &bp_options = bp_name->GetOptions(); 603acac075bSDimitry Andric Status error = 604acac075bSDimitry Andric m_impl_up->GetTarget() 605acac075bSDimitry Andric ->GetDebugger() 606acac075bSDimitry Andric .GetCommandInterpreter() 607acac075bSDimitry Andric .GetScriptInterpreter() 608acac075bSDimitry Andric ->SetBreakpointCommandCallback(&bp_options, callback_body_text); 609acac075bSDimitry Andric sb_error.SetError(error); 610acac075bSDimitry Andric if (!sb_error.Fail()) 611acac075bSDimitry Andric UpdateName(*bp_name); 612acac075bSDimitry Andric 613acac075bSDimitry Andric return sb_error; 614acac075bSDimitry Andric } 615acac075bSDimitry Andric 616acac075bSDimitry Andric bool SBBreakpointName::GetAllowList() const 617acac075bSDimitry Andric { 618acac075bSDimitry Andric BreakpointName *bp_name = GetBreakpointName(); 619acac075bSDimitry Andric if (!bp_name) 620acac075bSDimitry Andric return false; 621acac075bSDimitry Andric return bp_name->GetPermissions().GetAllowList(); 622acac075bSDimitry Andric } 623acac075bSDimitry Andric 624acac075bSDimitry Andric void SBBreakpointName::SetAllowList(bool value) 625acac075bSDimitry Andric { 626acac075bSDimitry Andric Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 627acac075bSDimitry Andric 628acac075bSDimitry Andric BreakpointName *bp_name = GetBreakpointName(); 629acac075bSDimitry Andric if (!bp_name) 630acac075bSDimitry Andric return; 631acac075bSDimitry Andric if (log) 632acac075bSDimitry Andric log->Printf("Setting allow list to %u for %s.", value, 633acac075bSDimitry Andric bp_name->GetName().AsCString()); 634acac075bSDimitry Andric bp_name->GetPermissions().SetAllowList(value); 635acac075bSDimitry Andric } 636acac075bSDimitry Andric 637acac075bSDimitry Andric bool SBBreakpointName::GetAllowDelete() 638acac075bSDimitry Andric { 639acac075bSDimitry Andric BreakpointName *bp_name = GetBreakpointName(); 640acac075bSDimitry Andric if (!bp_name) 641acac075bSDimitry Andric return false; 642acac075bSDimitry Andric return bp_name->GetPermissions().GetAllowDelete(); 643acac075bSDimitry Andric } 644acac075bSDimitry Andric 645acac075bSDimitry Andric void SBBreakpointName::SetAllowDelete(bool value) 646acac075bSDimitry Andric { 647acac075bSDimitry Andric Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 648acac075bSDimitry Andric 649acac075bSDimitry Andric BreakpointName *bp_name = GetBreakpointName(); 650acac075bSDimitry Andric if (!bp_name) 651acac075bSDimitry Andric return; 652acac075bSDimitry Andric if (log) 653acac075bSDimitry Andric log->Printf("Setting allow delete to %u for %s.", value, 654acac075bSDimitry Andric bp_name->GetName().AsCString()); 655acac075bSDimitry Andric bp_name->GetPermissions().SetAllowDelete(value); 656acac075bSDimitry Andric } 657acac075bSDimitry Andric 658acac075bSDimitry Andric bool SBBreakpointName::GetAllowDisable() 659acac075bSDimitry Andric { 660acac075bSDimitry Andric BreakpointName *bp_name = GetBreakpointName(); 661acac075bSDimitry Andric if (!bp_name) 662acac075bSDimitry Andric return false; 663acac075bSDimitry Andric return bp_name->GetPermissions().GetAllowDisable(); 664acac075bSDimitry Andric } 665acac075bSDimitry Andric 666acac075bSDimitry Andric void SBBreakpointName::SetAllowDisable(bool value) 667acac075bSDimitry Andric { 668acac075bSDimitry Andric Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 669acac075bSDimitry Andric 670acac075bSDimitry Andric BreakpointName *bp_name = GetBreakpointName(); 671acac075bSDimitry Andric if (!bp_name) 672acac075bSDimitry Andric return; 673acac075bSDimitry Andric if (log) 674acac075bSDimitry Andric log->Printf("Setting allow disable to %u for %s.", value, 675acac075bSDimitry Andric bp_name->GetName().AsCString()); 676acac075bSDimitry Andric bp_name->GetPermissions().SetAllowDisable(value); 677acac075bSDimitry Andric } 678acac075bSDimitry Andric 679acac075bSDimitry Andric lldb_private::BreakpointName *SBBreakpointName::GetBreakpointName() const 680acac075bSDimitry Andric { 681acac075bSDimitry Andric if (!IsValid()) 682acac075bSDimitry Andric return nullptr; 683acac075bSDimitry Andric return m_impl_up->GetBreakpointName(); 684acac075bSDimitry Andric } 685acac075bSDimitry Andric 686