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 2830fdc8d8SChris Lattner SBBreakpointLocation::SBBreakpointLocation () 2930fdc8d8SChris Lattner { 3030fdc8d8SChris Lattner } 3130fdc8d8SChris Lattner 3230fdc8d8SChris Lattner SBBreakpointLocation::SBBreakpointLocation (const lldb::BreakpointLocationSP &break_loc_sp) : 336611103cSGreg Clayton m_opaque_sp (break_loc_sp) 3430fdc8d8SChris Lattner { 35750cd175SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 36ceb6b139SCaroline Tice 37ceb6b139SCaroline Tice if (log) 38ceb6b139SCaroline Tice { 39ceb6b139SCaroline Tice SBStream sstr; 40ceb6b139SCaroline Tice GetDescription (lldb::eDescriptionLevelBrief, sstr); 41750cd175SCaroline Tice log->Printf ("SBBreakpointLocation::SBBreakpointLocaiton (const lldb::BreakpointLocationsSP &break_loc_sp" 42750cd175SCaroline Tice "=%p) => this.sp = %p (%s)", break_loc_sp.get(), m_opaque_sp.get(), sstr.GetData()); 43ceb6b139SCaroline Tice } 4430fdc8d8SChris Lattner } 4530fdc8d8SChris Lattner 4630fdc8d8SChris Lattner SBBreakpointLocation::~SBBreakpointLocation () 4730fdc8d8SChris Lattner { 4830fdc8d8SChris Lattner } 4930fdc8d8SChris Lattner 5030fdc8d8SChris Lattner bool 5130fdc8d8SChris Lattner SBBreakpointLocation::IsValid() const 5230fdc8d8SChris Lattner { 536611103cSGreg Clayton return m_opaque_sp.get() != NULL; 5430fdc8d8SChris Lattner } 5530fdc8d8SChris Lattner 5630fdc8d8SChris Lattner addr_t 5730fdc8d8SChris Lattner SBBreakpointLocation::GetLoadAddress () 5830fdc8d8SChris Lattner { 5930fdc8d8SChris Lattner addr_t ret_addr = LLDB_INVALID_ADDRESS; 6030fdc8d8SChris Lattner 616611103cSGreg Clayton if (m_opaque_sp) 6230fdc8d8SChris Lattner { 636611103cSGreg Clayton ret_addr = m_opaque_sp->GetLoadAddress(); 6430fdc8d8SChris Lattner } 6530fdc8d8SChris Lattner 6630fdc8d8SChris Lattner return ret_addr; 6730fdc8d8SChris Lattner } 6830fdc8d8SChris Lattner 6930fdc8d8SChris Lattner void 7030fdc8d8SChris Lattner SBBreakpointLocation::SetEnabled (bool enabled) 7130fdc8d8SChris Lattner { 726611103cSGreg Clayton if (m_opaque_sp) 7330fdc8d8SChris Lattner { 746611103cSGreg Clayton m_opaque_sp->SetEnabled (enabled); 7530fdc8d8SChris Lattner } 7630fdc8d8SChris Lattner } 7730fdc8d8SChris Lattner 7830fdc8d8SChris Lattner bool 7930fdc8d8SChris Lattner SBBreakpointLocation::IsEnabled () 8030fdc8d8SChris Lattner { 816611103cSGreg Clayton if (m_opaque_sp) 826611103cSGreg Clayton return m_opaque_sp->IsEnabled(); 8330fdc8d8SChris Lattner else 8430fdc8d8SChris Lattner return false; 8530fdc8d8SChris Lattner } 8630fdc8d8SChris Lattner 87c982c768SGreg Clayton uint32_t 8830fdc8d8SChris Lattner SBBreakpointLocation::GetIgnoreCount () 8930fdc8d8SChris Lattner { 906611103cSGreg Clayton if (m_opaque_sp) 916611103cSGreg Clayton return m_opaque_sp->GetIgnoreCount(); 9230fdc8d8SChris Lattner else 9330fdc8d8SChris Lattner return 0; 9430fdc8d8SChris Lattner } 9530fdc8d8SChris Lattner 9630fdc8d8SChris Lattner void 97c982c768SGreg Clayton SBBreakpointLocation::SetIgnoreCount (uint32_t n) 9830fdc8d8SChris Lattner { 996611103cSGreg Clayton if (m_opaque_sp) 1006611103cSGreg Clayton m_opaque_sp->SetIgnoreCount (n); 10130fdc8d8SChris Lattner } 10230fdc8d8SChris Lattner 10330fdc8d8SChris Lattner void 104041a12fcSJim Ingham SBBreakpointLocation::SetCondition (const char *condition) 105041a12fcSJim Ingham { 106041a12fcSJim Ingham m_opaque_sp->SetCondition (condition); 107041a12fcSJim Ingham } 108041a12fcSJim Ingham 109041a12fcSJim Ingham const char * 110041a12fcSJim Ingham SBBreakpointLocation::GetCondition () 111041a12fcSJim Ingham { 112041a12fcSJim Ingham return m_opaque_sp->GetConditionText (); 113041a12fcSJim Ingham } 114041a12fcSJim Ingham 115041a12fcSJim Ingham void 11630fdc8d8SChris Lattner SBBreakpointLocation::SetThreadID (tid_t thread_id) 11730fdc8d8SChris Lattner { 1186611103cSGreg Clayton if (m_opaque_sp) 1196611103cSGreg Clayton m_opaque_sp->SetThreadID (thread_id); 12030fdc8d8SChris Lattner } 12130fdc8d8SChris Lattner 12230fdc8d8SChris Lattner tid_t 12330fdc8d8SChris Lattner SBBreakpointLocation::GetThreadID () 12430fdc8d8SChris Lattner { 12530fdc8d8SChris Lattner tid_t sb_thread_id = (lldb::tid_t) LLDB_INVALID_THREAD_ID; 1266611103cSGreg Clayton if (m_opaque_sp) 1276611103cSGreg Clayton sb_thread_id = m_opaque_sp->GetLocationOptions()->GetThreadSpecNoCreate()->GetTID(); 12830fdc8d8SChris Lattner return sb_thread_id; 12930fdc8d8SChris Lattner } 13030fdc8d8SChris Lattner 13162b02c61SJim Ingham void 13262b02c61SJim Ingham SBBreakpointLocation::SetThreadIndex (uint32_t index) 13362b02c61SJim Ingham { 1346611103cSGreg Clayton if (m_opaque_sp) 1356611103cSGreg Clayton m_opaque_sp->GetLocationOptions()->GetThreadSpec()->SetIndex (index); 13662b02c61SJim Ingham } 13762b02c61SJim Ingham 13862b02c61SJim Ingham uint32_t 13962b02c61SJim Ingham SBBreakpointLocation::GetThreadIndex() const 14062b02c61SJim Ingham { 1416611103cSGreg Clayton if (m_opaque_sp) 14262b02c61SJim Ingham { 1436611103cSGreg Clayton const ThreadSpec *thread_spec = m_opaque_sp->GetOptionsNoCreate()->GetThreadSpecNoCreate(); 14462b02c61SJim Ingham if (thread_spec == NULL) 14562b02c61SJim Ingham return 0; 14662b02c61SJim Ingham else 14762b02c61SJim Ingham return thread_spec->GetIndex(); 14862b02c61SJim Ingham } 14962b02c61SJim Ingham return 0; 15062b02c61SJim Ingham } 15162b02c61SJim Ingham 15262b02c61SJim Ingham 15362b02c61SJim Ingham void 15462b02c61SJim Ingham SBBreakpointLocation::SetThreadName (const char *thread_name) 15562b02c61SJim Ingham { 1566611103cSGreg Clayton if (m_opaque_sp) 1576611103cSGreg Clayton m_opaque_sp->GetLocationOptions()->GetThreadSpec()->SetName (thread_name); 15862b02c61SJim Ingham } 15962b02c61SJim Ingham 16062b02c61SJim Ingham const char * 16162b02c61SJim Ingham SBBreakpointLocation::GetThreadName () const 16262b02c61SJim Ingham { 1636611103cSGreg Clayton if (m_opaque_sp) 16462b02c61SJim Ingham { 1656611103cSGreg Clayton const ThreadSpec *thread_spec = m_opaque_sp->GetOptionsNoCreate()->GetThreadSpecNoCreate(); 16662b02c61SJim Ingham if (thread_spec == NULL) 16762b02c61SJim Ingham return NULL; 16862b02c61SJim Ingham else 16962b02c61SJim Ingham return thread_spec->GetName(); 17062b02c61SJim Ingham } 17162b02c61SJim Ingham return NULL; 17262b02c61SJim Ingham } 17362b02c61SJim Ingham 17462b02c61SJim Ingham void 17562b02c61SJim Ingham SBBreakpointLocation::SetQueueName (const char *queue_name) 17662b02c61SJim Ingham { 1776611103cSGreg Clayton if (m_opaque_sp) 1786611103cSGreg Clayton m_opaque_sp->GetLocationOptions()->GetThreadSpec()->SetQueueName (queue_name); 17962b02c61SJim Ingham } 18062b02c61SJim Ingham 18162b02c61SJim Ingham const char * 18262b02c61SJim Ingham SBBreakpointLocation::GetQueueName () const 18362b02c61SJim Ingham { 1846611103cSGreg Clayton if (m_opaque_sp) 18562b02c61SJim Ingham { 1866611103cSGreg Clayton const ThreadSpec *thread_spec = m_opaque_sp->GetOptionsNoCreate()->GetThreadSpecNoCreate(); 18762b02c61SJim Ingham if (thread_spec == NULL) 18862b02c61SJim Ingham return NULL; 18962b02c61SJim Ingham else 19062b02c61SJim Ingham return thread_spec->GetQueueName(); 19162b02c61SJim Ingham } 19262b02c61SJim Ingham return NULL; 19362b02c61SJim Ingham } 19462b02c61SJim Ingham 19530fdc8d8SChris Lattner bool 19630fdc8d8SChris Lattner SBBreakpointLocation::IsResolved () 19730fdc8d8SChris Lattner { 1986611103cSGreg Clayton if (m_opaque_sp) 1996611103cSGreg Clayton return m_opaque_sp->IsResolved(); 20030fdc8d8SChris Lattner else 20130fdc8d8SChris Lattner return false; 20230fdc8d8SChris Lattner } 20330fdc8d8SChris Lattner 20430fdc8d8SChris Lattner void 20530fdc8d8SChris Lattner SBBreakpointLocation::SetLocation (const lldb::BreakpointLocationSP &break_loc_sp) 20630fdc8d8SChris Lattner { 2076611103cSGreg Clayton if (m_opaque_sp) 20830fdc8d8SChris Lattner { 20930fdc8d8SChris Lattner // Uninstall the callbacks? 21030fdc8d8SChris Lattner } 2116611103cSGreg Clayton m_opaque_sp = break_loc_sp; 21230fdc8d8SChris Lattner } 21330fdc8d8SChris Lattner 214dde9cff3SCaroline Tice bool 215ceb6b139SCaroline Tice SBBreakpointLocation::GetDescription (DescriptionLevel level, SBStream &description) 21630fdc8d8SChris Lattner { 2176611103cSGreg Clayton if (m_opaque_sp) 21830fdc8d8SChris Lattner { 219dac97f31SCaroline Tice description.ref(); 220dde9cff3SCaroline Tice m_opaque_sp->GetDescription (description.get(), level); 221dde9cff3SCaroline Tice description.get()->EOL(); 22230fdc8d8SChris Lattner } 223dde9cff3SCaroline Tice else 224dde9cff3SCaroline Tice description.Printf ("No value"); 225dde9cff3SCaroline Tice 226dde9cff3SCaroline Tice return true; 227dde9cff3SCaroline Tice } 228dde9cff3SCaroline Tice 22930fdc8d8SChris Lattner SBBreakpoint 23030fdc8d8SChris Lattner SBBreakpointLocation::GetBreakpoint () 23130fdc8d8SChris Lattner { 232ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 233ceb6b139SCaroline Tice 234750cd175SCaroline Tice //if (log) 235750cd175SCaroline Tice // log->Printf ("SBBreakpointLocation::GetBreakpoint ()"); 236ceb6b139SCaroline Tice 23730fdc8d8SChris Lattner SBBreakpoint sb_bp; 2386611103cSGreg Clayton if (m_opaque_sp) 2396611103cSGreg Clayton *sb_bp = m_opaque_sp->GetBreakpoint ().GetSP(); 240ceb6b139SCaroline Tice 241ceb6b139SCaroline Tice if (log) 242ceb6b139SCaroline Tice { 243ceb6b139SCaroline Tice SBStream sstr; 244ceb6b139SCaroline Tice sb_bp.GetDescription (sstr); 245*cfd1acedSGreg Clayton log->Printf ("SBBreakpointLocation(%p)::GetBreakpoint () => SBBreakpoint(%p) %s", 246750cd175SCaroline Tice m_opaque_sp.get(), sb_bp.get(), sstr.GetData()); 247ceb6b139SCaroline Tice } 24830fdc8d8SChris Lattner return sb_bp; 24930fdc8d8SChris Lattner } 25030fdc8d8SChris Lattner 251