blob: c5a2def9322579e0d9908481ad4ac18b6d21c3cf [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"
12#include "lldb/API/SBDebugger.h"
Caroline Tice98f930f2010-09-20 05:20:02 +000013#include "lldb/API/SBStream.h"
Chris Lattner24943d22010-06-08 16:52:24 +000014
15#include "lldb/lldb-types.h"
16#include "lldb/lldb-defines.h"
Greg Clayton640dc6b2010-11-18 18:52:36 +000017#include "lldb/Breakpoint/Breakpoint.h"
Chris Lattner24943d22010-06-08 16:52:24 +000018#include "lldb/Breakpoint/BreakpointLocation.h"
Jim Ingham3c7b5b92010-06-16 02:00:15 +000019#include "lldb/Target/ThreadSpec.h"
Caroline Tice7826c882010-10-26 03:11:13 +000020#include "lldb/Core/Log.h"
Chris Lattner24943d22010-06-08 16:52:24 +000021#include "lldb/Core/Stream.h"
22#include "lldb/Core/StreamFile.h"
Greg Claytonbdcda462010-12-20 20:49:23 +000023#include "lldb/Target/Target.h"
Jim Ingham8e5e38f2010-06-18 01:47:08 +000024#include "lldb/Target/ThreadSpec.h"
Chris Lattner24943d22010-06-08 16:52:24 +000025
26using namespace lldb;
27using namespace lldb_private;
28
29
Greg Clayton538eb822010-11-05 23:17:00 +000030SBBreakpointLocation::SBBreakpointLocation () :
31 m_opaque_sp ()
Chris Lattner24943d22010-06-08 16:52:24 +000032{
33}
34
35SBBreakpointLocation::SBBreakpointLocation (const lldb::BreakpointLocationSP &break_loc_sp) :
Greg Clayton63094e02010-06-23 01:19:29 +000036 m_opaque_sp (break_loc_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000037{
Greg Claytone005f2c2010-11-06 01:53:30 +000038 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +000039
40 if (log)
41 {
42 SBStream sstr;
Johnny Chenbdc36bd2011-04-25 20:23:05 +000043 GetDescription (sstr, lldb::eDescriptionLevelBrief);
Caroline Tice61ba7ec2010-10-26 23:49:36 +000044 log->Printf ("SBBreakpointLocation::SBBreakpointLocaiton (const lldb::BreakpointLocationsSP &break_loc_sp"
45 "=%p) => this.sp = %p (%s)", break_loc_sp.get(), m_opaque_sp.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +000046 }
Chris Lattner24943d22010-06-08 16:52:24 +000047}
48
Greg Clayton538eb822010-11-05 23:17:00 +000049SBBreakpointLocation::SBBreakpointLocation(const SBBreakpointLocation &rhs) :
50 m_opaque_sp (rhs.m_opaque_sp)
51{
52}
53
54const SBBreakpointLocation &
55SBBreakpointLocation::operator = (const SBBreakpointLocation &rhs)
56{
57 if (this != &rhs)
58 m_opaque_sp = rhs.m_opaque_sp;
59 return *this;
60}
61
62
Chris Lattner24943d22010-06-08 16:52:24 +000063SBBreakpointLocation::~SBBreakpointLocation ()
64{
65}
66
67bool
68SBBreakpointLocation::IsValid() const
69{
Greg Clayton63094e02010-06-23 01:19:29 +000070 return m_opaque_sp.get() != NULL;
Chris Lattner24943d22010-06-08 16:52:24 +000071}
72
Jim Ingham9a29f002011-09-24 01:04:57 +000073SBAddress
74SBBreakpointLocation::GetAddress ()
75{
76 if (m_opaque_sp)
77 return SBAddress(&m_opaque_sp->GetAddress());
78 else
79 return SBAddress();
80}
81
Chris Lattner24943d22010-06-08 16:52:24 +000082addr_t
83SBBreakpointLocation::GetLoadAddress ()
84{
85 addr_t ret_addr = LLDB_INVALID_ADDRESS;
86
Greg Clayton63094e02010-06-23 01:19:29 +000087 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000088 {
Greg Claytonbdcda462010-12-20 20:49:23 +000089 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +000090 ret_addr = m_opaque_sp->GetLoadAddress();
Chris Lattner24943d22010-06-08 16:52:24 +000091 }
92
93 return ret_addr;
94}
95
96void
97SBBreakpointLocation::SetEnabled (bool enabled)
98{
Greg Clayton63094e02010-06-23 01:19:29 +000099 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000100 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000101 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000102 m_opaque_sp->SetEnabled (enabled);
Chris Lattner24943d22010-06-08 16:52:24 +0000103 }
104}
105
106bool
107SBBreakpointLocation::IsEnabled ()
108{
Greg Clayton63094e02010-06-23 01:19:29 +0000109 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000110 {
111 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000112 return m_opaque_sp->IsEnabled();
Greg Claytonbdcda462010-12-20 20:49:23 +0000113 }
Chris Lattner24943d22010-06-08 16:52:24 +0000114 else
115 return false;
116}
117
Greg Clayton54e7afa2010-07-09 20:39:50 +0000118uint32_t
Chris Lattner24943d22010-06-08 16:52:24 +0000119SBBreakpointLocation::GetIgnoreCount ()
120{
Greg Clayton63094e02010-06-23 01:19:29 +0000121 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000122 {
123 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000124 return m_opaque_sp->GetIgnoreCount();
Greg Claytonbdcda462010-12-20 20:49:23 +0000125 }
Chris Lattner24943d22010-06-08 16:52:24 +0000126 else
127 return 0;
128}
129
130void
Greg Clayton54e7afa2010-07-09 20:39:50 +0000131SBBreakpointLocation::SetIgnoreCount (uint32_t n)
Chris Lattner24943d22010-06-08 16:52:24 +0000132{
Greg Clayton63094e02010-06-23 01:19:29 +0000133 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000134 {
135 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000136 m_opaque_sp->SetIgnoreCount (n);
Greg Claytonbdcda462010-12-20 20:49:23 +0000137 }
Chris Lattner24943d22010-06-08 16:52:24 +0000138}
139
140void
Jim Inghame3740832010-10-22 01:15:49 +0000141SBBreakpointLocation::SetCondition (const char *condition)
142{
Greg Claytonbdcda462010-12-20 20:49:23 +0000143 if (m_opaque_sp)
144 {
145 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
146 m_opaque_sp->SetCondition (condition);
147 }
Jim Inghame3740832010-10-22 01:15:49 +0000148}
149
150const char *
151SBBreakpointLocation::GetCondition ()
152{
Greg Claytonbdcda462010-12-20 20:49:23 +0000153 if (m_opaque_sp)
154 {
155 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
156 return m_opaque_sp->GetConditionText ();
157 }
158 return NULL;
Jim Inghame3740832010-10-22 01:15:49 +0000159}
160
161void
Chris Lattner24943d22010-06-08 16:52:24 +0000162SBBreakpointLocation::SetThreadID (tid_t thread_id)
163{
Greg Clayton63094e02010-06-23 01:19:29 +0000164 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000165 {
166 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000167 m_opaque_sp->SetThreadID (thread_id);
Greg Claytonbdcda462010-12-20 20:49:23 +0000168 }
Chris Lattner24943d22010-06-08 16:52:24 +0000169}
170
171tid_t
172SBBreakpointLocation::GetThreadID ()
173{
Greg Claytonbdcda462010-12-20 20:49:23 +0000174 tid_t tid = LLDB_INVALID_THREAD_ID;
Greg Clayton63094e02010-06-23 01:19:29 +0000175 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000176 {
177 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
178 const ThreadSpec *thread_spec = m_opaque_sp->GetLocationOptions()->GetThreadSpecNoCreate();
179 if (thread_spec)
180 tid = thread_spec->GetTID();
181 }
182 return tid;
Chris Lattner24943d22010-06-08 16:52:24 +0000183}
184
Jim Ingham8e5e38f2010-06-18 01:47:08 +0000185void
186SBBreakpointLocation::SetThreadIndex (uint32_t index)
187{
Greg Clayton63094e02010-06-23 01:19:29 +0000188 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000189 {
190 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000191 m_opaque_sp->GetLocationOptions()->GetThreadSpec()->SetIndex (index);
Greg Claytonbdcda462010-12-20 20:49:23 +0000192 }
Jim Ingham8e5e38f2010-06-18 01:47:08 +0000193}
194
195uint32_t
196SBBreakpointLocation::GetThreadIndex() const
197{
Greg Claytonbdcda462010-12-20 20:49:23 +0000198 uint32_t thread_idx = UINT32_MAX;
Greg Clayton63094e02010-06-23 01:19:29 +0000199 if (m_opaque_sp)
Jim Ingham8e5e38f2010-06-18 01:47:08 +0000200 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000201 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000202 const ThreadSpec *thread_spec = m_opaque_sp->GetOptionsNoCreate()->GetThreadSpecNoCreate();
Greg Claytonbdcda462010-12-20 20:49:23 +0000203 if (thread_spec)
204 thread_idx = thread_spec->GetIndex();
Jim Ingham8e5e38f2010-06-18 01:47:08 +0000205 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000206 return thread_idx;
Jim Ingham8e5e38f2010-06-18 01:47:08 +0000207}
208
209
210void
211SBBreakpointLocation::SetThreadName (const char *thread_name)
212{
Greg Clayton63094e02010-06-23 01:19:29 +0000213 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000214 {
215 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000216 m_opaque_sp->GetLocationOptions()->GetThreadSpec()->SetName (thread_name);
Greg Claytonbdcda462010-12-20 20:49:23 +0000217 }
Jim Ingham8e5e38f2010-06-18 01:47:08 +0000218}
219
220const char *
221SBBreakpointLocation::GetThreadName () const
222{
Greg Clayton63094e02010-06-23 01:19:29 +0000223 if (m_opaque_sp)
Jim Ingham8e5e38f2010-06-18 01:47:08 +0000224 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000225 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000226 const ThreadSpec *thread_spec = m_opaque_sp->GetOptionsNoCreate()->GetThreadSpecNoCreate();
Greg Claytonbdcda462010-12-20 20:49:23 +0000227 if (thread_spec)
Jim Ingham8e5e38f2010-06-18 01:47:08 +0000228 return thread_spec->GetName();
229 }
230 return NULL;
231}
232
233void
234SBBreakpointLocation::SetQueueName (const char *queue_name)
235{
Greg Clayton63094e02010-06-23 01:19:29 +0000236 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000237 {
238 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000239 m_opaque_sp->GetLocationOptions()->GetThreadSpec()->SetQueueName (queue_name);
Greg Claytonbdcda462010-12-20 20:49:23 +0000240 }
Jim Ingham8e5e38f2010-06-18 01:47:08 +0000241}
242
243const char *
244SBBreakpointLocation::GetQueueName () const
245{
Greg Clayton63094e02010-06-23 01:19:29 +0000246 if (m_opaque_sp)
Jim Ingham8e5e38f2010-06-18 01:47:08 +0000247 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000248 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000249 const ThreadSpec *thread_spec = m_opaque_sp->GetOptionsNoCreate()->GetThreadSpecNoCreate();
Greg Claytonbdcda462010-12-20 20:49:23 +0000250 if (thread_spec)
Jim Ingham8e5e38f2010-06-18 01:47:08 +0000251 return thread_spec->GetQueueName();
252 }
253 return NULL;
254}
255
Chris Lattner24943d22010-06-08 16:52:24 +0000256bool
257SBBreakpointLocation::IsResolved ()
258{
Greg Clayton63094e02010-06-23 01:19:29 +0000259 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000260 {
261 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000262 return m_opaque_sp->IsResolved();
Greg Claytonbdcda462010-12-20 20:49:23 +0000263 }
264 return false;
Chris Lattner24943d22010-06-08 16:52:24 +0000265}
266
267void
268SBBreakpointLocation::SetLocation (const lldb::BreakpointLocationSP &break_loc_sp)
269{
Greg Claytonbdcda462010-12-20 20:49:23 +0000270 // Uninstall the callbacks?
Greg Clayton63094e02010-06-23 01:19:29 +0000271 m_opaque_sp = break_loc_sp;
Chris Lattner24943d22010-06-08 16:52:24 +0000272}
273
Caroline Tice98f930f2010-09-20 05:20:02 +0000274bool
Johnny Chenbdc36bd2011-04-25 20:23:05 +0000275SBBreakpointLocation::GetDescription (SBStream &description, DescriptionLevel level)
Chris Lattner24943d22010-06-08 16:52:24 +0000276{
Greg Clayton63094e02010-06-23 01:19:29 +0000277 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000278 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000279 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
Caroline Ticee49ec182010-09-22 23:01:29 +0000280 description.ref();
Caroline Tice98f930f2010-09-20 05:20:02 +0000281 m_opaque_sp->GetDescription (description.get(), level);
282 description.get()->EOL();
Chris Lattner24943d22010-06-08 16:52:24 +0000283 }
Caroline Tice98f930f2010-09-20 05:20:02 +0000284 else
285 description.Printf ("No value");
286
287 return true;
288}
289
Chris Lattner24943d22010-06-08 16:52:24 +0000290SBBreakpoint
291SBBreakpointLocation::GetBreakpoint ()
292{
Greg Claytone005f2c2010-11-06 01:53:30 +0000293 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000294
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000295 //if (log)
296 // log->Printf ("SBBreakpointLocation::GetBreakpoint ()");
Caroline Tice7826c882010-10-26 03:11:13 +0000297
Chris Lattner24943d22010-06-08 16:52:24 +0000298 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000299 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000300 {
301 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
302 *sb_bp = m_opaque_sp->GetBreakpoint ().GetSP();
303 }
Caroline Tice7826c882010-10-26 03:11:13 +0000304
305 if (log)
306 {
307 SBStream sstr;
308 sb_bp.GetDescription (sstr);
Greg Clayton49ce6822010-10-31 03:01:06 +0000309 log->Printf ("SBBreakpointLocation(%p)::GetBreakpoint () => SBBreakpoint(%p) %s",
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000310 m_opaque_sp.get(), sb_bp.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000311 }
Chris Lattner24943d22010-06-08 16:52:24 +0000312 return sb_bp;
313}
314