130fdc8d8SChris Lattner //===-- SBBreakpointLocation.cpp --------------------------------*- C++ -*-===// 230fdc8d8SChris Lattner // 330fdc8d8SChris Lattner // The LLVM Compiler Infrastructure 430fdc8d8SChris Lattner // 530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source 630fdc8d8SChris Lattner // License. See LICENSE.TXT for details. 730fdc8d8SChris Lattner // 830fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 930fdc8d8SChris Lattner 10dde9cff3SCaroline Tice // In order to guarantee correct working with Python, Python.h *MUST* be 11dde9cff3SCaroline Tice // the *FIRST* header file included: 12dde9cff3SCaroline Tice 13dde9cff3SCaroline Tice #include <Python.h> 14dde9cff3SCaroline Tice 1530fdc8d8SChris Lattner #include "lldb/API/SBBreakpointLocation.h" 1630fdc8d8SChris Lattner #include "lldb/API/SBDefines.h" 1730fdc8d8SChris Lattner #include "lldb/API/SBDebugger.h" 18dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 1930fdc8d8SChris Lattner 2030fdc8d8SChris Lattner #include "lldb/lldb-types.h" 2130fdc8d8SChris Lattner #include "lldb/lldb-defines.h" 2230fdc8d8SChris Lattner #include "lldb/Breakpoint/BreakpointLocation.h" 231b54c88cSJim Ingham #include "lldb/Target/ThreadSpec.h" 24ceb6b139SCaroline Tice #include "lldb/Core/Log.h" 2530fdc8d8SChris Lattner #include "lldb/Core/Stream.h" 2630fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 2762b02c61SJim Ingham #include "lldb/Target/ThreadSpec.h" 2830fdc8d8SChris Lattner 2930fdc8d8SChris Lattner using namespace lldb; 3030fdc8d8SChris Lattner using namespace lldb_private; 3130fdc8d8SChris Lattner 3230fdc8d8SChris Lattner 3330fdc8d8SChris Lattner SBBreakpointLocation::SBBreakpointLocation () 3430fdc8d8SChris Lattner { 3530fdc8d8SChris Lattner } 3630fdc8d8SChris Lattner 3730fdc8d8SChris Lattner SBBreakpointLocation::SBBreakpointLocation (const lldb::BreakpointLocationSP &break_loc_sp) : 386611103cSGreg Clayton m_opaque_sp (break_loc_sp) 3930fdc8d8SChris Lattner { 40*750cd175SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 41ceb6b139SCaroline Tice 42ceb6b139SCaroline Tice if (log) 43ceb6b139SCaroline Tice { 44ceb6b139SCaroline Tice SBStream sstr; 45ceb6b139SCaroline Tice GetDescription (lldb::eDescriptionLevelBrief, sstr); 46*750cd175SCaroline Tice log->Printf ("SBBreakpointLocation::SBBreakpointLocaiton (const lldb::BreakpointLocationsSP &break_loc_sp" 47*750cd175SCaroline Tice "=%p) => this.sp = %p (%s)", break_loc_sp.get(), m_opaque_sp.get(), sstr.GetData()); 48ceb6b139SCaroline Tice } 4930fdc8d8SChris Lattner } 5030fdc8d8SChris Lattner 5130fdc8d8SChris Lattner SBBreakpointLocation::~SBBreakpointLocation () 5230fdc8d8SChris Lattner { 5330fdc8d8SChris Lattner } 5430fdc8d8SChris Lattner 5530fdc8d8SChris Lattner bool 5630fdc8d8SChris Lattner SBBreakpointLocation::IsValid() const 5730fdc8d8SChris Lattner { 586611103cSGreg Clayton return m_opaque_sp.get() != NULL; 5930fdc8d8SChris Lattner } 6030fdc8d8SChris Lattner 6130fdc8d8SChris Lattner addr_t 6230fdc8d8SChris Lattner SBBreakpointLocation::GetLoadAddress () 6330fdc8d8SChris Lattner { 6430fdc8d8SChris Lattner addr_t ret_addr = LLDB_INVALID_ADDRESS; 6530fdc8d8SChris Lattner 666611103cSGreg Clayton if (m_opaque_sp) 6730fdc8d8SChris Lattner { 686611103cSGreg Clayton ret_addr = m_opaque_sp->GetLoadAddress(); 6930fdc8d8SChris Lattner } 7030fdc8d8SChris Lattner 7130fdc8d8SChris Lattner return ret_addr; 7230fdc8d8SChris Lattner } 7330fdc8d8SChris Lattner 7430fdc8d8SChris Lattner void 7530fdc8d8SChris Lattner SBBreakpointLocation::SetEnabled (bool enabled) 7630fdc8d8SChris Lattner { 776611103cSGreg Clayton if (m_opaque_sp) 7830fdc8d8SChris Lattner { 796611103cSGreg Clayton m_opaque_sp->SetEnabled (enabled); 8030fdc8d8SChris Lattner } 8130fdc8d8SChris Lattner } 8230fdc8d8SChris Lattner 8330fdc8d8SChris Lattner bool 8430fdc8d8SChris Lattner SBBreakpointLocation::IsEnabled () 8530fdc8d8SChris Lattner { 866611103cSGreg Clayton if (m_opaque_sp) 876611103cSGreg Clayton return m_opaque_sp->IsEnabled(); 8830fdc8d8SChris Lattner else 8930fdc8d8SChris Lattner return false; 9030fdc8d8SChris Lattner } 9130fdc8d8SChris Lattner 92c982c768SGreg Clayton uint32_t 9330fdc8d8SChris Lattner SBBreakpointLocation::GetIgnoreCount () 9430fdc8d8SChris Lattner { 956611103cSGreg Clayton if (m_opaque_sp) 966611103cSGreg Clayton return m_opaque_sp->GetIgnoreCount(); 9730fdc8d8SChris Lattner else 9830fdc8d8SChris Lattner return 0; 9930fdc8d8SChris Lattner } 10030fdc8d8SChris Lattner 10130fdc8d8SChris Lattner void 102c982c768SGreg Clayton SBBreakpointLocation::SetIgnoreCount (uint32_t n) 10330fdc8d8SChris Lattner { 1046611103cSGreg Clayton if (m_opaque_sp) 1056611103cSGreg Clayton m_opaque_sp->SetIgnoreCount (n); 10630fdc8d8SChris Lattner } 10730fdc8d8SChris Lattner 10830fdc8d8SChris Lattner void 109041a12fcSJim Ingham SBBreakpointLocation::SetCondition (const char *condition) 110041a12fcSJim Ingham { 111041a12fcSJim Ingham m_opaque_sp->SetCondition (condition); 112041a12fcSJim Ingham } 113041a12fcSJim Ingham 114041a12fcSJim Ingham const char * 115041a12fcSJim Ingham SBBreakpointLocation::GetCondition () 116041a12fcSJim Ingham { 117041a12fcSJim Ingham return m_opaque_sp->GetConditionText (); 118041a12fcSJim Ingham } 119041a12fcSJim Ingham 120041a12fcSJim Ingham void 12130fdc8d8SChris Lattner SBBreakpointLocation::SetThreadID (tid_t thread_id) 12230fdc8d8SChris Lattner { 1236611103cSGreg Clayton if (m_opaque_sp) 1246611103cSGreg Clayton m_opaque_sp->SetThreadID (thread_id); 12530fdc8d8SChris Lattner } 12630fdc8d8SChris Lattner 12730fdc8d8SChris Lattner tid_t 12830fdc8d8SChris Lattner SBBreakpointLocation::GetThreadID () 12930fdc8d8SChris Lattner { 13030fdc8d8SChris Lattner tid_t sb_thread_id = (lldb::tid_t) LLDB_INVALID_THREAD_ID; 1316611103cSGreg Clayton if (m_opaque_sp) 1326611103cSGreg Clayton sb_thread_id = m_opaque_sp->GetLocationOptions()->GetThreadSpecNoCreate()->GetTID(); 13330fdc8d8SChris Lattner return sb_thread_id; 13430fdc8d8SChris Lattner } 13530fdc8d8SChris Lattner 13662b02c61SJim Ingham void 13762b02c61SJim Ingham SBBreakpointLocation::SetThreadIndex (uint32_t index) 13862b02c61SJim Ingham { 1396611103cSGreg Clayton if (m_opaque_sp) 1406611103cSGreg Clayton m_opaque_sp->GetLocationOptions()->GetThreadSpec()->SetIndex (index); 14162b02c61SJim Ingham } 14262b02c61SJim Ingham 14362b02c61SJim Ingham uint32_t 14462b02c61SJim Ingham SBBreakpointLocation::GetThreadIndex() const 14562b02c61SJim Ingham { 1466611103cSGreg Clayton if (m_opaque_sp) 14762b02c61SJim Ingham { 1486611103cSGreg Clayton const ThreadSpec *thread_spec = m_opaque_sp->GetOptionsNoCreate()->GetThreadSpecNoCreate(); 14962b02c61SJim Ingham if (thread_spec == NULL) 15062b02c61SJim Ingham return 0; 15162b02c61SJim Ingham else 15262b02c61SJim Ingham return thread_spec->GetIndex(); 15362b02c61SJim Ingham } 15462b02c61SJim Ingham return 0; 15562b02c61SJim Ingham } 15662b02c61SJim Ingham 15762b02c61SJim Ingham 15862b02c61SJim Ingham void 15962b02c61SJim Ingham SBBreakpointLocation::SetThreadName (const char *thread_name) 16062b02c61SJim Ingham { 1616611103cSGreg Clayton if (m_opaque_sp) 1626611103cSGreg Clayton m_opaque_sp->GetLocationOptions()->GetThreadSpec()->SetName (thread_name); 16362b02c61SJim Ingham } 16462b02c61SJim Ingham 16562b02c61SJim Ingham const char * 16662b02c61SJim Ingham SBBreakpointLocation::GetThreadName () const 16762b02c61SJim Ingham { 1686611103cSGreg Clayton if (m_opaque_sp) 16962b02c61SJim Ingham { 1706611103cSGreg Clayton const ThreadSpec *thread_spec = m_opaque_sp->GetOptionsNoCreate()->GetThreadSpecNoCreate(); 17162b02c61SJim Ingham if (thread_spec == NULL) 17262b02c61SJim Ingham return NULL; 17362b02c61SJim Ingham else 17462b02c61SJim Ingham return thread_spec->GetName(); 17562b02c61SJim Ingham } 17662b02c61SJim Ingham return NULL; 17762b02c61SJim Ingham } 17862b02c61SJim Ingham 17962b02c61SJim Ingham void 18062b02c61SJim Ingham SBBreakpointLocation::SetQueueName (const char *queue_name) 18162b02c61SJim Ingham { 1826611103cSGreg Clayton if (m_opaque_sp) 1836611103cSGreg Clayton m_opaque_sp->GetLocationOptions()->GetThreadSpec()->SetQueueName (queue_name); 18462b02c61SJim Ingham } 18562b02c61SJim Ingham 18662b02c61SJim Ingham const char * 18762b02c61SJim Ingham SBBreakpointLocation::GetQueueName () const 18862b02c61SJim Ingham { 1896611103cSGreg Clayton if (m_opaque_sp) 19062b02c61SJim Ingham { 1916611103cSGreg Clayton const ThreadSpec *thread_spec = m_opaque_sp->GetOptionsNoCreate()->GetThreadSpecNoCreate(); 19262b02c61SJim Ingham if (thread_spec == NULL) 19362b02c61SJim Ingham return NULL; 19462b02c61SJim Ingham else 19562b02c61SJim Ingham return thread_spec->GetQueueName(); 19662b02c61SJim Ingham } 19762b02c61SJim Ingham return NULL; 19862b02c61SJim Ingham } 19962b02c61SJim Ingham 20030fdc8d8SChris Lattner bool 20130fdc8d8SChris Lattner SBBreakpointLocation::IsResolved () 20230fdc8d8SChris Lattner { 2036611103cSGreg Clayton if (m_opaque_sp) 2046611103cSGreg Clayton return m_opaque_sp->IsResolved(); 20530fdc8d8SChris Lattner else 20630fdc8d8SChris Lattner return false; 20730fdc8d8SChris Lattner } 20830fdc8d8SChris Lattner 20930fdc8d8SChris Lattner void 21030fdc8d8SChris Lattner SBBreakpointLocation::SetLocation (const lldb::BreakpointLocationSP &break_loc_sp) 21130fdc8d8SChris Lattner { 2126611103cSGreg Clayton if (m_opaque_sp) 21330fdc8d8SChris Lattner { 21430fdc8d8SChris Lattner // Uninstall the callbacks? 21530fdc8d8SChris Lattner } 2166611103cSGreg Clayton m_opaque_sp = break_loc_sp; 21730fdc8d8SChris Lattner } 21830fdc8d8SChris Lattner 219dde9cff3SCaroline Tice bool 220ceb6b139SCaroline Tice SBBreakpointLocation::GetDescription (DescriptionLevel level, SBStream &description) 22130fdc8d8SChris Lattner { 2226611103cSGreg Clayton if (m_opaque_sp) 22330fdc8d8SChris Lattner { 224dac97f31SCaroline Tice description.ref(); 225dde9cff3SCaroline Tice m_opaque_sp->GetDescription (description.get(), level); 226dde9cff3SCaroline Tice description.get()->EOL(); 22730fdc8d8SChris Lattner } 228dde9cff3SCaroline Tice else 229dde9cff3SCaroline Tice description.Printf ("No value"); 230dde9cff3SCaroline Tice 231dde9cff3SCaroline Tice return true; 232dde9cff3SCaroline Tice } 233dde9cff3SCaroline Tice 23430fdc8d8SChris Lattner SBBreakpoint 23530fdc8d8SChris Lattner SBBreakpointLocation::GetBreakpoint () 23630fdc8d8SChris Lattner { 237ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 238ceb6b139SCaroline Tice 239*750cd175SCaroline Tice //if (log) 240*750cd175SCaroline Tice // log->Printf ("SBBreakpointLocation::GetBreakpoint ()"); 241ceb6b139SCaroline Tice 24230fdc8d8SChris Lattner SBBreakpoint sb_bp; 2436611103cSGreg Clayton if (m_opaque_sp) 2446611103cSGreg Clayton *sb_bp = m_opaque_sp->GetBreakpoint ().GetSP(); 245ceb6b139SCaroline Tice 246ceb6b139SCaroline Tice if (log) 247ceb6b139SCaroline Tice { 248ceb6b139SCaroline Tice SBStream sstr; 249ceb6b139SCaroline Tice sb_bp.GetDescription (sstr); 250*750cd175SCaroline Tice log->Printf ("SBBreakpointLocation::GetBreakpoint (this.sp=%p) => SBBreakpoint: m_opaque_sp=%p, '%s'", 251*750cd175SCaroline Tice m_opaque_sp.get(), sb_bp.get(), sstr.GetData()); 252ceb6b139SCaroline Tice } 25330fdc8d8SChris Lattner return sb_bp; 25430fdc8d8SChris Lattner } 25530fdc8d8SChris Lattner 256