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" 174e78f606SGreg Clayton #include "lldb/Breakpoint/Breakpoint.h" 1830fdc8d8SChris Lattner #include "lldb/Breakpoint/BreakpointLocation.h" 191b54c88cSJim Ingham #include "lldb/Target/ThreadSpec.h" 20ceb6b139SCaroline Tice #include "lldb/Core/Log.h" 2130fdc8d8SChris Lattner #include "lldb/Core/Stream.h" 2230fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 23*af67cecdSGreg Clayton #include "lldb/Target/Target.h" 2462b02c61SJim Ingham #include "lldb/Target/ThreadSpec.h" 2530fdc8d8SChris Lattner 2630fdc8d8SChris Lattner using namespace lldb; 2730fdc8d8SChris Lattner using namespace lldb_private; 2830fdc8d8SChris Lattner 2930fdc8d8SChris Lattner 30efabb123SGreg Clayton SBBreakpointLocation::SBBreakpointLocation () : 31efabb123SGreg Clayton m_opaque_sp () 3230fdc8d8SChris Lattner { 3330fdc8d8SChris Lattner } 3430fdc8d8SChris Lattner 3530fdc8d8SChris Lattner SBBreakpointLocation::SBBreakpointLocation (const lldb::BreakpointLocationSP &break_loc_sp) : 366611103cSGreg Clayton m_opaque_sp (break_loc_sp) 3730fdc8d8SChris Lattner { 382d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 39ceb6b139SCaroline Tice 40ceb6b139SCaroline Tice if (log) 41ceb6b139SCaroline Tice { 42ceb6b139SCaroline Tice SBStream sstr; 43ceb6b139SCaroline Tice GetDescription (lldb::eDescriptionLevelBrief, sstr); 44750cd175SCaroline Tice log->Printf ("SBBreakpointLocation::SBBreakpointLocaiton (const lldb::BreakpointLocationsSP &break_loc_sp" 45750cd175SCaroline Tice "=%p) => this.sp = %p (%s)", break_loc_sp.get(), m_opaque_sp.get(), sstr.GetData()); 46ceb6b139SCaroline Tice } 4730fdc8d8SChris Lattner } 4830fdc8d8SChris Lattner 49efabb123SGreg Clayton SBBreakpointLocation::SBBreakpointLocation(const SBBreakpointLocation &rhs) : 50efabb123SGreg Clayton m_opaque_sp (rhs.m_opaque_sp) 51efabb123SGreg Clayton { 52efabb123SGreg Clayton } 53efabb123SGreg Clayton 54efabb123SGreg Clayton const SBBreakpointLocation & 55efabb123SGreg Clayton SBBreakpointLocation::operator = (const SBBreakpointLocation &rhs) 56efabb123SGreg Clayton { 57efabb123SGreg Clayton if (this != &rhs) 58efabb123SGreg Clayton m_opaque_sp = rhs.m_opaque_sp; 59efabb123SGreg Clayton return *this; 60efabb123SGreg Clayton } 61efabb123SGreg Clayton 62efabb123SGreg Clayton 6330fdc8d8SChris Lattner SBBreakpointLocation::~SBBreakpointLocation () 6430fdc8d8SChris Lattner { 6530fdc8d8SChris Lattner } 6630fdc8d8SChris Lattner 6730fdc8d8SChris Lattner bool 6830fdc8d8SChris Lattner SBBreakpointLocation::IsValid() const 6930fdc8d8SChris Lattner { 706611103cSGreg Clayton return m_opaque_sp.get() != NULL; 7130fdc8d8SChris Lattner } 7230fdc8d8SChris Lattner 7330fdc8d8SChris Lattner addr_t 7430fdc8d8SChris Lattner SBBreakpointLocation::GetLoadAddress () 7530fdc8d8SChris Lattner { 7630fdc8d8SChris Lattner addr_t ret_addr = LLDB_INVALID_ADDRESS; 7730fdc8d8SChris Lattner 786611103cSGreg Clayton if (m_opaque_sp) 7930fdc8d8SChris Lattner { 80*af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex()); 816611103cSGreg Clayton ret_addr = m_opaque_sp->GetLoadAddress(); 8230fdc8d8SChris Lattner } 8330fdc8d8SChris Lattner 8430fdc8d8SChris Lattner return ret_addr; 8530fdc8d8SChris Lattner } 8630fdc8d8SChris Lattner 8730fdc8d8SChris Lattner void 8830fdc8d8SChris Lattner SBBreakpointLocation::SetEnabled (bool enabled) 8930fdc8d8SChris Lattner { 906611103cSGreg Clayton if (m_opaque_sp) 9130fdc8d8SChris Lattner { 92*af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex()); 936611103cSGreg Clayton m_opaque_sp->SetEnabled (enabled); 9430fdc8d8SChris Lattner } 9530fdc8d8SChris Lattner } 9630fdc8d8SChris Lattner 9730fdc8d8SChris Lattner bool 9830fdc8d8SChris Lattner SBBreakpointLocation::IsEnabled () 9930fdc8d8SChris Lattner { 1006611103cSGreg Clayton if (m_opaque_sp) 101*af67cecdSGreg Clayton { 102*af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex()); 1036611103cSGreg Clayton return m_opaque_sp->IsEnabled(); 104*af67cecdSGreg Clayton } 10530fdc8d8SChris Lattner else 10630fdc8d8SChris Lattner return false; 10730fdc8d8SChris Lattner } 10830fdc8d8SChris Lattner 109c982c768SGreg Clayton uint32_t 11030fdc8d8SChris Lattner SBBreakpointLocation::GetIgnoreCount () 11130fdc8d8SChris Lattner { 1126611103cSGreg Clayton if (m_opaque_sp) 113*af67cecdSGreg Clayton { 114*af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex()); 1156611103cSGreg Clayton return m_opaque_sp->GetIgnoreCount(); 116*af67cecdSGreg Clayton } 11730fdc8d8SChris Lattner else 11830fdc8d8SChris Lattner return 0; 11930fdc8d8SChris Lattner } 12030fdc8d8SChris Lattner 12130fdc8d8SChris Lattner void 122c982c768SGreg Clayton SBBreakpointLocation::SetIgnoreCount (uint32_t n) 12330fdc8d8SChris Lattner { 1246611103cSGreg Clayton if (m_opaque_sp) 125*af67cecdSGreg Clayton { 126*af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex()); 1276611103cSGreg Clayton m_opaque_sp->SetIgnoreCount (n); 12830fdc8d8SChris Lattner } 129*af67cecdSGreg Clayton } 13030fdc8d8SChris Lattner 13130fdc8d8SChris Lattner void 132041a12fcSJim Ingham SBBreakpointLocation::SetCondition (const char *condition) 133041a12fcSJim Ingham { 134*af67cecdSGreg Clayton if (m_opaque_sp) 135*af67cecdSGreg Clayton { 136*af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex()); 137041a12fcSJim Ingham m_opaque_sp->SetCondition (condition); 138041a12fcSJim Ingham } 139*af67cecdSGreg Clayton } 140041a12fcSJim Ingham 141041a12fcSJim Ingham const char * 142041a12fcSJim Ingham SBBreakpointLocation::GetCondition () 143041a12fcSJim Ingham { 144*af67cecdSGreg Clayton if (m_opaque_sp) 145*af67cecdSGreg Clayton { 146*af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex()); 147041a12fcSJim Ingham return m_opaque_sp->GetConditionText (); 148041a12fcSJim Ingham } 149*af67cecdSGreg Clayton return NULL; 150*af67cecdSGreg Clayton } 151041a12fcSJim Ingham 152041a12fcSJim Ingham void 15330fdc8d8SChris Lattner SBBreakpointLocation::SetThreadID (tid_t thread_id) 15430fdc8d8SChris Lattner { 1556611103cSGreg Clayton if (m_opaque_sp) 156*af67cecdSGreg Clayton { 157*af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex()); 1586611103cSGreg Clayton m_opaque_sp->SetThreadID (thread_id); 15930fdc8d8SChris Lattner } 160*af67cecdSGreg Clayton } 16130fdc8d8SChris Lattner 16230fdc8d8SChris Lattner tid_t 16330fdc8d8SChris Lattner SBBreakpointLocation::GetThreadID () 16430fdc8d8SChris Lattner { 165*af67cecdSGreg Clayton tid_t tid = LLDB_INVALID_THREAD_ID; 1666611103cSGreg Clayton if (m_opaque_sp) 167*af67cecdSGreg Clayton { 168*af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex()); 169*af67cecdSGreg Clayton const ThreadSpec *thread_spec = m_opaque_sp->GetLocationOptions()->GetThreadSpecNoCreate(); 170*af67cecdSGreg Clayton if (thread_spec) 171*af67cecdSGreg Clayton tid = thread_spec->GetTID(); 172*af67cecdSGreg Clayton } 173*af67cecdSGreg Clayton return tid; 17430fdc8d8SChris Lattner } 17530fdc8d8SChris Lattner 17662b02c61SJim Ingham void 17762b02c61SJim Ingham SBBreakpointLocation::SetThreadIndex (uint32_t index) 17862b02c61SJim Ingham { 1796611103cSGreg Clayton if (m_opaque_sp) 180*af67cecdSGreg Clayton { 181*af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex()); 1826611103cSGreg Clayton m_opaque_sp->GetLocationOptions()->GetThreadSpec()->SetIndex (index); 18362b02c61SJim Ingham } 184*af67cecdSGreg Clayton } 18562b02c61SJim Ingham 18662b02c61SJim Ingham uint32_t 18762b02c61SJim Ingham SBBreakpointLocation::GetThreadIndex() const 18862b02c61SJim Ingham { 189*af67cecdSGreg Clayton uint32_t thread_idx = UINT32_MAX; 1906611103cSGreg Clayton if (m_opaque_sp) 19162b02c61SJim Ingham { 192*af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex()); 1936611103cSGreg Clayton const ThreadSpec *thread_spec = m_opaque_sp->GetOptionsNoCreate()->GetThreadSpecNoCreate(); 194*af67cecdSGreg Clayton if (thread_spec) 195*af67cecdSGreg Clayton thread_idx = thread_spec->GetIndex(); 19662b02c61SJim Ingham } 197*af67cecdSGreg Clayton return thread_idx; 19862b02c61SJim Ingham } 19962b02c61SJim Ingham 20062b02c61SJim Ingham 20162b02c61SJim Ingham void 20262b02c61SJim Ingham SBBreakpointLocation::SetThreadName (const char *thread_name) 20362b02c61SJim Ingham { 2046611103cSGreg Clayton if (m_opaque_sp) 205*af67cecdSGreg Clayton { 206*af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex()); 2076611103cSGreg Clayton m_opaque_sp->GetLocationOptions()->GetThreadSpec()->SetName (thread_name); 20862b02c61SJim Ingham } 209*af67cecdSGreg Clayton } 21062b02c61SJim Ingham 21162b02c61SJim Ingham const char * 21262b02c61SJim Ingham SBBreakpointLocation::GetThreadName () const 21362b02c61SJim Ingham { 2146611103cSGreg Clayton if (m_opaque_sp) 21562b02c61SJim Ingham { 216*af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex()); 2176611103cSGreg Clayton const ThreadSpec *thread_spec = m_opaque_sp->GetOptionsNoCreate()->GetThreadSpecNoCreate(); 218*af67cecdSGreg Clayton if (thread_spec) 21962b02c61SJim Ingham return thread_spec->GetName(); 22062b02c61SJim Ingham } 22162b02c61SJim Ingham return NULL; 22262b02c61SJim Ingham } 22362b02c61SJim Ingham 22462b02c61SJim Ingham void 22562b02c61SJim Ingham SBBreakpointLocation::SetQueueName (const char *queue_name) 22662b02c61SJim Ingham { 2276611103cSGreg Clayton if (m_opaque_sp) 228*af67cecdSGreg Clayton { 229*af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex()); 2306611103cSGreg Clayton m_opaque_sp->GetLocationOptions()->GetThreadSpec()->SetQueueName (queue_name); 23162b02c61SJim Ingham } 232*af67cecdSGreg Clayton } 23362b02c61SJim Ingham 23462b02c61SJim Ingham const char * 23562b02c61SJim Ingham SBBreakpointLocation::GetQueueName () const 23662b02c61SJim Ingham { 2376611103cSGreg Clayton if (m_opaque_sp) 23862b02c61SJim Ingham { 239*af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex()); 2406611103cSGreg Clayton const ThreadSpec *thread_spec = m_opaque_sp->GetOptionsNoCreate()->GetThreadSpecNoCreate(); 241*af67cecdSGreg Clayton if (thread_spec) 24262b02c61SJim Ingham return thread_spec->GetQueueName(); 24362b02c61SJim Ingham } 24462b02c61SJim Ingham return NULL; 24562b02c61SJim Ingham } 24662b02c61SJim Ingham 24730fdc8d8SChris Lattner bool 24830fdc8d8SChris Lattner SBBreakpointLocation::IsResolved () 24930fdc8d8SChris Lattner { 2506611103cSGreg Clayton if (m_opaque_sp) 251*af67cecdSGreg Clayton { 252*af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex()); 2536611103cSGreg Clayton return m_opaque_sp->IsResolved(); 254*af67cecdSGreg Clayton } 25530fdc8d8SChris Lattner return false; 25630fdc8d8SChris Lattner } 25730fdc8d8SChris Lattner 25830fdc8d8SChris Lattner void 25930fdc8d8SChris Lattner SBBreakpointLocation::SetLocation (const lldb::BreakpointLocationSP &break_loc_sp) 26030fdc8d8SChris Lattner { 26130fdc8d8SChris Lattner // Uninstall the callbacks? 2626611103cSGreg Clayton m_opaque_sp = break_loc_sp; 26330fdc8d8SChris Lattner } 26430fdc8d8SChris Lattner 265dde9cff3SCaroline Tice bool 266ceb6b139SCaroline Tice SBBreakpointLocation::GetDescription (DescriptionLevel level, SBStream &description) 26730fdc8d8SChris Lattner { 2686611103cSGreg Clayton if (m_opaque_sp) 26930fdc8d8SChris Lattner { 270*af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex()); 271dac97f31SCaroline Tice description.ref(); 272dde9cff3SCaroline Tice m_opaque_sp->GetDescription (description.get(), level); 273dde9cff3SCaroline Tice description.get()->EOL(); 27430fdc8d8SChris Lattner } 275dde9cff3SCaroline Tice else 276dde9cff3SCaroline Tice description.Printf ("No value"); 277dde9cff3SCaroline Tice 278dde9cff3SCaroline Tice return true; 279dde9cff3SCaroline Tice } 280dde9cff3SCaroline Tice 28130fdc8d8SChris Lattner SBBreakpoint 28230fdc8d8SChris Lattner SBBreakpointLocation::GetBreakpoint () 28330fdc8d8SChris Lattner { 2842d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 285ceb6b139SCaroline Tice 286750cd175SCaroline Tice //if (log) 287750cd175SCaroline Tice // log->Printf ("SBBreakpointLocation::GetBreakpoint ()"); 288ceb6b139SCaroline Tice 28930fdc8d8SChris Lattner SBBreakpoint sb_bp; 2906611103cSGreg Clayton if (m_opaque_sp) 291*af67cecdSGreg Clayton { 292*af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex()); 2936611103cSGreg Clayton *sb_bp = m_opaque_sp->GetBreakpoint ().GetSP(); 294*af67cecdSGreg Clayton } 295ceb6b139SCaroline Tice 296ceb6b139SCaroline Tice if (log) 297ceb6b139SCaroline Tice { 298ceb6b139SCaroline Tice SBStream sstr; 299ceb6b139SCaroline Tice sb_bp.GetDescription (sstr); 300cfd1acedSGreg Clayton log->Printf ("SBBreakpointLocation(%p)::GetBreakpoint () => SBBreakpoint(%p) %s", 301750cd175SCaroline Tice m_opaque_sp.get(), sb_bp.get(), sstr.GetData()); 302ceb6b139SCaroline Tice } 30330fdc8d8SChris Lattner return sb_bp; 30430fdc8d8SChris Lattner } 30530fdc8d8SChris Lattner 306