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 1030fdc8d8SChris Lattner #include "lldb/API/SBBreakpointLocation.h" 1130fdc8d8SChris Lattner #include "lldb/API/SBDefines.h" 1230fdc8d8SChris Lattner #include "lldb/API/SBDebugger.h" 13dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 1430fdc8d8SChris Lattner 1530fdc8d8SChris Lattner #include "lldb/lldb-types.h" 1630fdc8d8SChris Lattner #include "lldb/lldb-defines.h" 1730fdc8d8SChris Lattner #include "lldb/Breakpoint/BreakpointLocation.h" 181b54c88cSJim Ingham #include "lldb/Target/ThreadSpec.h" 19ceb6b139SCaroline Tice #include "lldb/Core/Log.h" 2030fdc8d8SChris Lattner #include "lldb/Core/Stream.h" 2130fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 2262b02c61SJim Ingham #include "lldb/Target/ThreadSpec.h" 2330fdc8d8SChris Lattner 2430fdc8d8SChris Lattner using namespace lldb; 2530fdc8d8SChris Lattner using namespace lldb_private; 2630fdc8d8SChris Lattner 2730fdc8d8SChris Lattner 28efabb123SGreg Clayton SBBreakpointLocation::SBBreakpointLocation () : 29efabb123SGreg Clayton m_opaque_sp () 3030fdc8d8SChris Lattner { 3130fdc8d8SChris Lattner } 3230fdc8d8SChris Lattner 3330fdc8d8SChris Lattner SBBreakpointLocation::SBBreakpointLocation (const lldb::BreakpointLocationSP &break_loc_sp) : 346611103cSGreg Clayton m_opaque_sp (break_loc_sp) 3530fdc8d8SChris Lattner { 36*2d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 37ceb6b139SCaroline Tice 38ceb6b139SCaroline Tice if (log) 39ceb6b139SCaroline Tice { 40ceb6b139SCaroline Tice SBStream sstr; 41ceb6b139SCaroline Tice GetDescription (lldb::eDescriptionLevelBrief, sstr); 42750cd175SCaroline Tice log->Printf ("SBBreakpointLocation::SBBreakpointLocaiton (const lldb::BreakpointLocationsSP &break_loc_sp" 43750cd175SCaroline Tice "=%p) => this.sp = %p (%s)", break_loc_sp.get(), m_opaque_sp.get(), sstr.GetData()); 44ceb6b139SCaroline Tice } 4530fdc8d8SChris Lattner } 4630fdc8d8SChris Lattner 47efabb123SGreg Clayton SBBreakpointLocation::SBBreakpointLocation(const SBBreakpointLocation &rhs) : 48efabb123SGreg Clayton m_opaque_sp (rhs.m_opaque_sp) 49efabb123SGreg Clayton { 50efabb123SGreg Clayton } 51efabb123SGreg Clayton 52efabb123SGreg Clayton const SBBreakpointLocation & 53efabb123SGreg Clayton SBBreakpointLocation::operator = (const SBBreakpointLocation &rhs) 54efabb123SGreg Clayton { 55efabb123SGreg Clayton if (this != &rhs) 56efabb123SGreg Clayton m_opaque_sp = rhs.m_opaque_sp; 57efabb123SGreg Clayton return *this; 58efabb123SGreg Clayton } 59efabb123SGreg Clayton 60efabb123SGreg Clayton 6130fdc8d8SChris Lattner SBBreakpointLocation::~SBBreakpointLocation () 6230fdc8d8SChris Lattner { 6330fdc8d8SChris Lattner } 6430fdc8d8SChris Lattner 6530fdc8d8SChris Lattner bool 6630fdc8d8SChris Lattner SBBreakpointLocation::IsValid() const 6730fdc8d8SChris Lattner { 686611103cSGreg Clayton return m_opaque_sp.get() != NULL; 6930fdc8d8SChris Lattner } 7030fdc8d8SChris Lattner 7130fdc8d8SChris Lattner addr_t 7230fdc8d8SChris Lattner SBBreakpointLocation::GetLoadAddress () 7330fdc8d8SChris Lattner { 7430fdc8d8SChris Lattner addr_t ret_addr = LLDB_INVALID_ADDRESS; 7530fdc8d8SChris Lattner 766611103cSGreg Clayton if (m_opaque_sp) 7730fdc8d8SChris Lattner { 786611103cSGreg Clayton ret_addr = m_opaque_sp->GetLoadAddress(); 7930fdc8d8SChris Lattner } 8030fdc8d8SChris Lattner 8130fdc8d8SChris Lattner return ret_addr; 8230fdc8d8SChris Lattner } 8330fdc8d8SChris Lattner 8430fdc8d8SChris Lattner void 8530fdc8d8SChris Lattner SBBreakpointLocation::SetEnabled (bool enabled) 8630fdc8d8SChris Lattner { 876611103cSGreg Clayton if (m_opaque_sp) 8830fdc8d8SChris Lattner { 896611103cSGreg Clayton m_opaque_sp->SetEnabled (enabled); 9030fdc8d8SChris Lattner } 9130fdc8d8SChris Lattner } 9230fdc8d8SChris Lattner 9330fdc8d8SChris Lattner bool 9430fdc8d8SChris Lattner SBBreakpointLocation::IsEnabled () 9530fdc8d8SChris Lattner { 966611103cSGreg Clayton if (m_opaque_sp) 976611103cSGreg Clayton return m_opaque_sp->IsEnabled(); 9830fdc8d8SChris Lattner else 9930fdc8d8SChris Lattner return false; 10030fdc8d8SChris Lattner } 10130fdc8d8SChris Lattner 102c982c768SGreg Clayton uint32_t 10330fdc8d8SChris Lattner SBBreakpointLocation::GetIgnoreCount () 10430fdc8d8SChris Lattner { 1056611103cSGreg Clayton if (m_opaque_sp) 1066611103cSGreg Clayton return m_opaque_sp->GetIgnoreCount(); 10730fdc8d8SChris Lattner else 10830fdc8d8SChris Lattner return 0; 10930fdc8d8SChris Lattner } 11030fdc8d8SChris Lattner 11130fdc8d8SChris Lattner void 112c982c768SGreg Clayton SBBreakpointLocation::SetIgnoreCount (uint32_t n) 11330fdc8d8SChris Lattner { 1146611103cSGreg Clayton if (m_opaque_sp) 1156611103cSGreg Clayton m_opaque_sp->SetIgnoreCount (n); 11630fdc8d8SChris Lattner } 11730fdc8d8SChris Lattner 11830fdc8d8SChris Lattner void 119041a12fcSJim Ingham SBBreakpointLocation::SetCondition (const char *condition) 120041a12fcSJim Ingham { 121041a12fcSJim Ingham m_opaque_sp->SetCondition (condition); 122041a12fcSJim Ingham } 123041a12fcSJim Ingham 124041a12fcSJim Ingham const char * 125041a12fcSJim Ingham SBBreakpointLocation::GetCondition () 126041a12fcSJim Ingham { 127041a12fcSJim Ingham return m_opaque_sp->GetConditionText (); 128041a12fcSJim Ingham } 129041a12fcSJim Ingham 130041a12fcSJim Ingham void 13130fdc8d8SChris Lattner SBBreakpointLocation::SetThreadID (tid_t thread_id) 13230fdc8d8SChris Lattner { 1336611103cSGreg Clayton if (m_opaque_sp) 1346611103cSGreg Clayton m_opaque_sp->SetThreadID (thread_id); 13530fdc8d8SChris Lattner } 13630fdc8d8SChris Lattner 13730fdc8d8SChris Lattner tid_t 13830fdc8d8SChris Lattner SBBreakpointLocation::GetThreadID () 13930fdc8d8SChris Lattner { 14030fdc8d8SChris Lattner tid_t sb_thread_id = (lldb::tid_t) LLDB_INVALID_THREAD_ID; 1416611103cSGreg Clayton if (m_opaque_sp) 1426611103cSGreg Clayton sb_thread_id = m_opaque_sp->GetLocationOptions()->GetThreadSpecNoCreate()->GetTID(); 14330fdc8d8SChris Lattner return sb_thread_id; 14430fdc8d8SChris Lattner } 14530fdc8d8SChris Lattner 14662b02c61SJim Ingham void 14762b02c61SJim Ingham SBBreakpointLocation::SetThreadIndex (uint32_t index) 14862b02c61SJim Ingham { 1496611103cSGreg Clayton if (m_opaque_sp) 1506611103cSGreg Clayton m_opaque_sp->GetLocationOptions()->GetThreadSpec()->SetIndex (index); 15162b02c61SJim Ingham } 15262b02c61SJim Ingham 15362b02c61SJim Ingham uint32_t 15462b02c61SJim Ingham SBBreakpointLocation::GetThreadIndex() const 15562b02c61SJim Ingham { 1566611103cSGreg Clayton if (m_opaque_sp) 15762b02c61SJim Ingham { 1586611103cSGreg Clayton const ThreadSpec *thread_spec = m_opaque_sp->GetOptionsNoCreate()->GetThreadSpecNoCreate(); 15962b02c61SJim Ingham if (thread_spec == NULL) 16062b02c61SJim Ingham return 0; 16162b02c61SJim Ingham else 16262b02c61SJim Ingham return thread_spec->GetIndex(); 16362b02c61SJim Ingham } 16462b02c61SJim Ingham return 0; 16562b02c61SJim Ingham } 16662b02c61SJim Ingham 16762b02c61SJim Ingham 16862b02c61SJim Ingham void 16962b02c61SJim Ingham SBBreakpointLocation::SetThreadName (const char *thread_name) 17062b02c61SJim Ingham { 1716611103cSGreg Clayton if (m_opaque_sp) 1726611103cSGreg Clayton m_opaque_sp->GetLocationOptions()->GetThreadSpec()->SetName (thread_name); 17362b02c61SJim Ingham } 17462b02c61SJim Ingham 17562b02c61SJim Ingham const char * 17662b02c61SJim Ingham SBBreakpointLocation::GetThreadName () const 17762b02c61SJim Ingham { 1786611103cSGreg Clayton if (m_opaque_sp) 17962b02c61SJim Ingham { 1806611103cSGreg Clayton const ThreadSpec *thread_spec = m_opaque_sp->GetOptionsNoCreate()->GetThreadSpecNoCreate(); 18162b02c61SJim Ingham if (thread_spec == NULL) 18262b02c61SJim Ingham return NULL; 18362b02c61SJim Ingham else 18462b02c61SJim Ingham return thread_spec->GetName(); 18562b02c61SJim Ingham } 18662b02c61SJim Ingham return NULL; 18762b02c61SJim Ingham } 18862b02c61SJim Ingham 18962b02c61SJim Ingham void 19062b02c61SJim Ingham SBBreakpointLocation::SetQueueName (const char *queue_name) 19162b02c61SJim Ingham { 1926611103cSGreg Clayton if (m_opaque_sp) 1936611103cSGreg Clayton m_opaque_sp->GetLocationOptions()->GetThreadSpec()->SetQueueName (queue_name); 19462b02c61SJim Ingham } 19562b02c61SJim Ingham 19662b02c61SJim Ingham const char * 19762b02c61SJim Ingham SBBreakpointLocation::GetQueueName () const 19862b02c61SJim Ingham { 1996611103cSGreg Clayton if (m_opaque_sp) 20062b02c61SJim Ingham { 2016611103cSGreg Clayton const ThreadSpec *thread_spec = m_opaque_sp->GetOptionsNoCreate()->GetThreadSpecNoCreate(); 20262b02c61SJim Ingham if (thread_spec == NULL) 20362b02c61SJim Ingham return NULL; 20462b02c61SJim Ingham else 20562b02c61SJim Ingham return thread_spec->GetQueueName(); 20662b02c61SJim Ingham } 20762b02c61SJim Ingham return NULL; 20862b02c61SJim Ingham } 20962b02c61SJim Ingham 21030fdc8d8SChris Lattner bool 21130fdc8d8SChris Lattner SBBreakpointLocation::IsResolved () 21230fdc8d8SChris Lattner { 2136611103cSGreg Clayton if (m_opaque_sp) 2146611103cSGreg Clayton return m_opaque_sp->IsResolved(); 21530fdc8d8SChris Lattner else 21630fdc8d8SChris Lattner return false; 21730fdc8d8SChris Lattner } 21830fdc8d8SChris Lattner 21930fdc8d8SChris Lattner void 22030fdc8d8SChris Lattner SBBreakpointLocation::SetLocation (const lldb::BreakpointLocationSP &break_loc_sp) 22130fdc8d8SChris Lattner { 2226611103cSGreg Clayton if (m_opaque_sp) 22330fdc8d8SChris Lattner { 22430fdc8d8SChris Lattner // Uninstall the callbacks? 22530fdc8d8SChris Lattner } 2266611103cSGreg Clayton m_opaque_sp = break_loc_sp; 22730fdc8d8SChris Lattner } 22830fdc8d8SChris Lattner 229dde9cff3SCaroline Tice bool 230ceb6b139SCaroline Tice SBBreakpointLocation::GetDescription (DescriptionLevel level, SBStream &description) 23130fdc8d8SChris Lattner { 2326611103cSGreg Clayton if (m_opaque_sp) 23330fdc8d8SChris Lattner { 234dac97f31SCaroline Tice description.ref(); 235dde9cff3SCaroline Tice m_opaque_sp->GetDescription (description.get(), level); 236dde9cff3SCaroline Tice description.get()->EOL(); 23730fdc8d8SChris Lattner } 238dde9cff3SCaroline Tice else 239dde9cff3SCaroline Tice description.Printf ("No value"); 240dde9cff3SCaroline Tice 241dde9cff3SCaroline Tice return true; 242dde9cff3SCaroline Tice } 243dde9cff3SCaroline Tice 24430fdc8d8SChris Lattner SBBreakpoint 24530fdc8d8SChris Lattner SBBreakpointLocation::GetBreakpoint () 24630fdc8d8SChris Lattner { 247*2d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 248ceb6b139SCaroline Tice 249750cd175SCaroline Tice //if (log) 250750cd175SCaroline Tice // log->Printf ("SBBreakpointLocation::GetBreakpoint ()"); 251ceb6b139SCaroline Tice 25230fdc8d8SChris Lattner SBBreakpoint sb_bp; 2536611103cSGreg Clayton if (m_opaque_sp) 2546611103cSGreg Clayton *sb_bp = m_opaque_sp->GetBreakpoint ().GetSP(); 255ceb6b139SCaroline Tice 256ceb6b139SCaroline Tice if (log) 257ceb6b139SCaroline Tice { 258ceb6b139SCaroline Tice SBStream sstr; 259ceb6b139SCaroline Tice sb_bp.GetDescription (sstr); 260cfd1acedSGreg Clayton log->Printf ("SBBreakpointLocation(%p)::GetBreakpoint () => SBBreakpoint(%p) %s", 261750cd175SCaroline Tice m_opaque_sp.get(), sb_bp.get(), sstr.GetData()); 262ceb6b139SCaroline Tice } 26330fdc8d8SChris Lattner return sb_bp; 26430fdc8d8SChris Lattner } 26530fdc8d8SChris Lattner 266