blob: 619428eb8c88e72500f880064a23875a5343457d [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- SBBreakpointLocation.cpp --------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "lldb/API/SBBreakpointLocation.h"
11#include "lldb/API/SBDefines.h"
Greg Clayton980c7502011-09-24 01:37:21 +000012#include "lldb/API/SBAddress.h"
Chris Lattner24943d22010-06-08 16:52:24 +000013#include "lldb/API/SBDebugger.h"
Caroline Tice98f930f2010-09-20 05:20:02 +000014#include "lldb/API/SBStream.h"
Chris Lattner24943d22010-06-08 16:52:24 +000015
16#include "lldb/lldb-types.h"
17#include "lldb/lldb-defines.h"
Greg Clayton640dc6b2010-11-18 18:52:36 +000018#include "lldb/Breakpoint/Breakpoint.h"
Chris Lattner24943d22010-06-08 16:52:24 +000019#include "lldb/Breakpoint/BreakpointLocation.h"
Jim Ingham3c7b5b92010-06-16 02:00:15 +000020#include "lldb/Target/ThreadSpec.h"
Caroline Tice7826c882010-10-26 03:11:13 +000021#include "lldb/Core/Log.h"
Chris Lattner24943d22010-06-08 16:52:24 +000022#include "lldb/Core/Stream.h"
23#include "lldb/Core/StreamFile.h"
Greg Claytonbdcda462010-12-20 20:49:23 +000024#include "lldb/Target/Target.h"
Jim Ingham8e5e38f2010-06-18 01:47:08 +000025#include "lldb/Target/ThreadSpec.h"
Chris Lattner24943d22010-06-08 16:52:24 +000026
27using namespace lldb;
28using namespace lldb_private;
29
30
Greg Clayton538eb822010-11-05 23:17:00 +000031SBBreakpointLocation::SBBreakpointLocation () :
32 m_opaque_sp ()
Chris Lattner24943d22010-06-08 16:52:24 +000033{
34}
35
36SBBreakpointLocation::SBBreakpointLocation (const lldb::BreakpointLocationSP &break_loc_sp) :
Greg Clayton63094e02010-06-23 01:19:29 +000037 m_opaque_sp (break_loc_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000038{
Greg Claytone005f2c2010-11-06 01:53:30 +000039 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +000040
41 if (log)
42 {
43 SBStream sstr;
Johnny Chenbdc36bd2011-04-25 20:23:05 +000044 GetDescription (sstr, lldb::eDescriptionLevelBrief);
Caroline Tice61ba7ec2010-10-26 23:49:36 +000045 log->Printf ("SBBreakpointLocation::SBBreakpointLocaiton (const lldb::BreakpointLocationsSP &break_loc_sp"
46 "=%p) => this.sp = %p (%s)", break_loc_sp.get(), m_opaque_sp.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +000047 }
Chris Lattner24943d22010-06-08 16:52:24 +000048}
49
Greg Clayton538eb822010-11-05 23:17:00 +000050SBBreakpointLocation::SBBreakpointLocation(const SBBreakpointLocation &rhs) :
51 m_opaque_sp (rhs.m_opaque_sp)
52{
53}
54
55const SBBreakpointLocation &
56SBBreakpointLocation::operator = (const SBBreakpointLocation &rhs)
57{
58 if (this != &rhs)
59 m_opaque_sp = rhs.m_opaque_sp;
60 return *this;
61}
62
63
Chris Lattner24943d22010-06-08 16:52:24 +000064SBBreakpointLocation::~SBBreakpointLocation ()
65{
66}
67
68bool
69SBBreakpointLocation::IsValid() const
70{
Greg Clayton63094e02010-06-23 01:19:29 +000071 return m_opaque_sp.get() != NULL;
Chris Lattner24943d22010-06-08 16:52:24 +000072}
73
Jim Ingham9a29f002011-09-24 01:04:57 +000074SBAddress
75SBBreakpointLocation::GetAddress ()
76{
77 if (m_opaque_sp)
78 return SBAddress(&m_opaque_sp->GetAddress());
79 else
80 return SBAddress();
81}
82
Chris Lattner24943d22010-06-08 16:52:24 +000083addr_t
84SBBreakpointLocation::GetLoadAddress ()
85{
86 addr_t ret_addr = LLDB_INVALID_ADDRESS;
87
Greg Clayton63094e02010-06-23 01:19:29 +000088 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000089 {
Greg Claytonbdcda462010-12-20 20:49:23 +000090 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +000091 ret_addr = m_opaque_sp->GetLoadAddress();
Chris Lattner24943d22010-06-08 16:52:24 +000092 }
93
94 return ret_addr;
95}
96
97void
98SBBreakpointLocation::SetEnabled (bool enabled)
99{
Greg Clayton63094e02010-06-23 01:19:29 +0000100 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000101 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000102 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000103 m_opaque_sp->SetEnabled (enabled);
Chris Lattner24943d22010-06-08 16:52:24 +0000104 }
105}
106
107bool
108SBBreakpointLocation::IsEnabled ()
109{
Greg Clayton63094e02010-06-23 01:19:29 +0000110 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000111 {
112 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000113 return m_opaque_sp->IsEnabled();
Greg Claytonbdcda462010-12-20 20:49:23 +0000114 }
Chris Lattner24943d22010-06-08 16:52:24 +0000115 else
116 return false;
117}
118
Greg Clayton54e7afa2010-07-09 20:39:50 +0000119uint32_t
Chris Lattner24943d22010-06-08 16:52:24 +0000120SBBreakpointLocation::GetIgnoreCount ()
121{
Greg Clayton63094e02010-06-23 01:19:29 +0000122 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000123 {
124 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000125 return m_opaque_sp->GetIgnoreCount();
Greg Claytonbdcda462010-12-20 20:49:23 +0000126 }
Chris Lattner24943d22010-06-08 16:52:24 +0000127 else
128 return 0;
129}
130
131void
Greg Clayton54e7afa2010-07-09 20:39:50 +0000132SBBreakpointLocation::SetIgnoreCount (uint32_t n)
Chris Lattner24943d22010-06-08 16:52:24 +0000133{
Greg Clayton63094e02010-06-23 01:19:29 +0000134 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000135 {
136 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000137 m_opaque_sp->SetIgnoreCount (n);
Greg Claytonbdcda462010-12-20 20:49:23 +0000138 }
Chris Lattner24943d22010-06-08 16:52:24 +0000139}
140
141void
Jim Inghame3740832010-10-22 01:15:49 +0000142SBBreakpointLocation::SetCondition (const char *condition)
143{
Greg Claytonbdcda462010-12-20 20:49:23 +0000144 if (m_opaque_sp)
145 {
146 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
147 m_opaque_sp->SetCondition (condition);
148 }
Jim Inghame3740832010-10-22 01:15:49 +0000149}
150
151const char *
152SBBreakpointLocation::GetCondition ()
153{
Greg Claytonbdcda462010-12-20 20:49:23 +0000154 if (m_opaque_sp)
155 {
156 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
157 return m_opaque_sp->GetConditionText ();
158 }
159 return NULL;
Jim Inghame3740832010-10-22 01:15:49 +0000160}
161
162void
Chris Lattner24943d22010-06-08 16:52:24 +0000163SBBreakpointLocation::SetThreadID (tid_t thread_id)
164{
Greg Clayton63094e02010-06-23 01:19:29 +0000165 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000166 {
167 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000168 m_opaque_sp->SetThreadID (thread_id);
Greg Claytonbdcda462010-12-20 20:49:23 +0000169 }
Chris Lattner24943d22010-06-08 16:52:24 +0000170}
171
172tid_t
173SBBreakpointLocation::GetThreadID ()
174{
Greg Claytonbdcda462010-12-20 20:49:23 +0000175 tid_t tid = LLDB_INVALID_THREAD_ID;
Greg Clayton63094e02010-06-23 01:19:29 +0000176 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000177 {
178 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
179 const ThreadSpec *thread_spec = m_opaque_sp->GetLocationOptions()->GetThreadSpecNoCreate();
180 if (thread_spec)
181 tid = thread_spec->GetTID();
182 }
183 return tid;
Chris Lattner24943d22010-06-08 16:52:24 +0000184}
185
Jim Ingham8e5e38f2010-06-18 01:47:08 +0000186void
187SBBreakpointLocation::SetThreadIndex (uint32_t index)
188{
Greg Clayton63094e02010-06-23 01:19:29 +0000189 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000190 {
191 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000192 m_opaque_sp->GetLocationOptions()->GetThreadSpec()->SetIndex (index);
Greg Claytonbdcda462010-12-20 20:49:23 +0000193 }
Jim Ingham8e5e38f2010-06-18 01:47:08 +0000194}
195
196uint32_t
197SBBreakpointLocation::GetThreadIndex() const
198{
Greg Claytonbdcda462010-12-20 20:49:23 +0000199 uint32_t thread_idx = UINT32_MAX;
Greg Clayton63094e02010-06-23 01:19:29 +0000200 if (m_opaque_sp)
Jim Ingham8e5e38f2010-06-18 01:47:08 +0000201 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000202 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000203 const ThreadSpec *thread_spec = m_opaque_sp->GetOptionsNoCreate()->GetThreadSpecNoCreate();
Greg Claytonbdcda462010-12-20 20:49:23 +0000204 if (thread_spec)
205 thread_idx = thread_spec->GetIndex();
Jim Ingham8e5e38f2010-06-18 01:47:08 +0000206 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000207 return thread_idx;
Jim Ingham8e5e38f2010-06-18 01:47:08 +0000208}
209
210
211void
212SBBreakpointLocation::SetThreadName (const char *thread_name)
213{
Greg Clayton63094e02010-06-23 01:19:29 +0000214 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000215 {
216 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000217 m_opaque_sp->GetLocationOptions()->GetThreadSpec()->SetName (thread_name);
Greg Claytonbdcda462010-12-20 20:49:23 +0000218 }
Jim Ingham8e5e38f2010-06-18 01:47:08 +0000219}
220
221const char *
222SBBreakpointLocation::GetThreadName () const
223{
Greg Clayton63094e02010-06-23 01:19:29 +0000224 if (m_opaque_sp)
Jim Ingham8e5e38f2010-06-18 01:47:08 +0000225 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000226 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000227 const ThreadSpec *thread_spec = m_opaque_sp->GetOptionsNoCreate()->GetThreadSpecNoCreate();
Greg Claytonbdcda462010-12-20 20:49:23 +0000228 if (thread_spec)
Jim Ingham8e5e38f2010-06-18 01:47:08 +0000229 return thread_spec->GetName();
230 }
231 return NULL;
232}
233
234void
235SBBreakpointLocation::SetQueueName (const char *queue_name)
236{
Greg Clayton63094e02010-06-23 01:19:29 +0000237 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000238 {
239 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000240 m_opaque_sp->GetLocationOptions()->GetThreadSpec()->SetQueueName (queue_name);
Greg Claytonbdcda462010-12-20 20:49:23 +0000241 }
Jim Ingham8e5e38f2010-06-18 01:47:08 +0000242}
243
244const char *
245SBBreakpointLocation::GetQueueName () const
246{
Greg Clayton63094e02010-06-23 01:19:29 +0000247 if (m_opaque_sp)
Jim Ingham8e5e38f2010-06-18 01:47:08 +0000248 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000249 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000250 const ThreadSpec *thread_spec = m_opaque_sp->GetOptionsNoCreate()->GetThreadSpecNoCreate();
Greg Claytonbdcda462010-12-20 20:49:23 +0000251 if (thread_spec)
Jim Ingham8e5e38f2010-06-18 01:47:08 +0000252 return thread_spec->GetQueueName();
253 }
254 return NULL;
255}
256
Chris Lattner24943d22010-06-08 16:52:24 +0000257bool
258SBBreakpointLocation::IsResolved ()
259{
Greg Clayton63094e02010-06-23 01:19:29 +0000260 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000261 {
262 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000263 return m_opaque_sp->IsResolved();
Greg Claytonbdcda462010-12-20 20:49:23 +0000264 }
265 return false;
Chris Lattner24943d22010-06-08 16:52:24 +0000266}
267
268void
269SBBreakpointLocation::SetLocation (const lldb::BreakpointLocationSP &break_loc_sp)
270{
Greg Claytonbdcda462010-12-20 20:49:23 +0000271 // Uninstall the callbacks?
Greg Clayton63094e02010-06-23 01:19:29 +0000272 m_opaque_sp = break_loc_sp;
Chris Lattner24943d22010-06-08 16:52:24 +0000273}
274
Caroline Tice98f930f2010-09-20 05:20:02 +0000275bool
Johnny Chenbdc36bd2011-04-25 20:23:05 +0000276SBBreakpointLocation::GetDescription (SBStream &description, DescriptionLevel level)
Chris Lattner24943d22010-06-08 16:52:24 +0000277{
Greg Clayton96154be2011-11-13 06:57:31 +0000278 Stream &strm = description.ref();
279
Greg Clayton63094e02010-06-23 01:19:29 +0000280 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000281 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000282 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
Greg Clayton96154be2011-11-13 06:57:31 +0000283 m_opaque_sp->GetDescription (&strm, level);
284 strm.EOL();
Chris Lattner24943d22010-06-08 16:52:24 +0000285 }
Caroline Tice98f930f2010-09-20 05:20:02 +0000286 else
Greg Clayton96154be2011-11-13 06:57:31 +0000287 strm.PutCString ("No value");
Caroline Tice98f930f2010-09-20 05:20:02 +0000288
289 return true;
290}
291
Chris Lattner24943d22010-06-08 16:52:24 +0000292SBBreakpoint
293SBBreakpointLocation::GetBreakpoint ()
294{
Greg Claytone005f2c2010-11-06 01:53:30 +0000295 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000296
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000297 //if (log)
298 // log->Printf ("SBBreakpointLocation::GetBreakpoint ()");
Caroline Tice7826c882010-10-26 03:11:13 +0000299
Chris Lattner24943d22010-06-08 16:52:24 +0000300 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000301 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000302 {
303 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
304 *sb_bp = m_opaque_sp->GetBreakpoint ().GetSP();
305 }
Caroline Tice7826c882010-10-26 03:11:13 +0000306
307 if (log)
308 {
309 SBStream sstr;
310 sb_bp.GetDescription (sstr);
Greg Clayton49ce6822010-10-31 03:01:06 +0000311 log->Printf ("SBBreakpointLocation(%p)::GetBreakpoint () => SBBreakpoint(%p) %s",
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000312 m_opaque_sp.get(), sb_bp.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000313 }
Chris Lattner24943d22010-06-08 16:52:24 +0000314 return sb_bp;
315}
316