blob: 9ab952261a6752c95d3380fd7e3b286d688a0749 [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
73addr_t
74SBBreakpointLocation::GetLoadAddress ()
75{
76 addr_t ret_addr = LLDB_INVALID_ADDRESS;
77
Greg Clayton63094e02010-06-23 01:19:29 +000078 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000079 {
Greg Claytonbdcda462010-12-20 20:49:23 +000080 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +000081 ret_addr = m_opaque_sp->GetLoadAddress();
Chris Lattner24943d22010-06-08 16:52:24 +000082 }
83
84 return ret_addr;
85}
86
87void
88SBBreakpointLocation::SetEnabled (bool enabled)
89{
Greg Clayton63094e02010-06-23 01:19:29 +000090 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +000091 {
Greg Claytonbdcda462010-12-20 20:49:23 +000092 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +000093 m_opaque_sp->SetEnabled (enabled);
Chris Lattner24943d22010-06-08 16:52:24 +000094 }
95}
96
97bool
98SBBreakpointLocation::IsEnabled ()
99{
Greg Clayton63094e02010-06-23 01:19:29 +0000100 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000101 {
102 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000103 return m_opaque_sp->IsEnabled();
Greg Claytonbdcda462010-12-20 20:49:23 +0000104 }
Chris Lattner24943d22010-06-08 16:52:24 +0000105 else
106 return false;
107}
108
Greg Clayton54e7afa2010-07-09 20:39:50 +0000109uint32_t
Chris Lattner24943d22010-06-08 16:52:24 +0000110SBBreakpointLocation::GetIgnoreCount ()
111{
Greg Clayton63094e02010-06-23 01:19:29 +0000112 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000113 {
114 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000115 return m_opaque_sp->GetIgnoreCount();
Greg Claytonbdcda462010-12-20 20:49:23 +0000116 }
Chris Lattner24943d22010-06-08 16:52:24 +0000117 else
118 return 0;
119}
120
121void
Greg Clayton54e7afa2010-07-09 20:39:50 +0000122SBBreakpointLocation::SetIgnoreCount (uint32_t n)
Chris Lattner24943d22010-06-08 16:52:24 +0000123{
Greg Clayton63094e02010-06-23 01:19:29 +0000124 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000125 {
126 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000127 m_opaque_sp->SetIgnoreCount (n);
Greg Claytonbdcda462010-12-20 20:49:23 +0000128 }
Chris Lattner24943d22010-06-08 16:52:24 +0000129}
130
131void
Jim Inghame3740832010-10-22 01:15:49 +0000132SBBreakpointLocation::SetCondition (const char *condition)
133{
Greg Claytonbdcda462010-12-20 20:49:23 +0000134 if (m_opaque_sp)
135 {
136 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
137 m_opaque_sp->SetCondition (condition);
138 }
Jim Inghame3740832010-10-22 01:15:49 +0000139}
140
141const char *
142SBBreakpointLocation::GetCondition ()
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 return m_opaque_sp->GetConditionText ();
148 }
149 return NULL;
Jim Inghame3740832010-10-22 01:15:49 +0000150}
151
152void
Chris Lattner24943d22010-06-08 16:52:24 +0000153SBBreakpointLocation::SetThreadID (tid_t thread_id)
154{
Greg Clayton63094e02010-06-23 01:19:29 +0000155 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000156 {
157 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000158 m_opaque_sp->SetThreadID (thread_id);
Greg Claytonbdcda462010-12-20 20:49:23 +0000159 }
Chris Lattner24943d22010-06-08 16:52:24 +0000160}
161
162tid_t
163SBBreakpointLocation::GetThreadID ()
164{
Greg Claytonbdcda462010-12-20 20:49:23 +0000165 tid_t tid = LLDB_INVALID_THREAD_ID;
Greg Clayton63094e02010-06-23 01:19:29 +0000166 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000167 {
168 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
169 const ThreadSpec *thread_spec = m_opaque_sp->GetLocationOptions()->GetThreadSpecNoCreate();
170 if (thread_spec)
171 tid = thread_spec->GetTID();
172 }
173 return tid;
Chris Lattner24943d22010-06-08 16:52:24 +0000174}
175
Jim Ingham8e5e38f2010-06-18 01:47:08 +0000176void
177SBBreakpointLocation::SetThreadIndex (uint32_t index)
178{
Greg Clayton63094e02010-06-23 01:19:29 +0000179 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000180 {
181 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000182 m_opaque_sp->GetLocationOptions()->GetThreadSpec()->SetIndex (index);
Greg Claytonbdcda462010-12-20 20:49:23 +0000183 }
Jim Ingham8e5e38f2010-06-18 01:47:08 +0000184}
185
186uint32_t
187SBBreakpointLocation::GetThreadIndex() const
188{
Greg Claytonbdcda462010-12-20 20:49:23 +0000189 uint32_t thread_idx = UINT32_MAX;
Greg Clayton63094e02010-06-23 01:19:29 +0000190 if (m_opaque_sp)
Jim Ingham8e5e38f2010-06-18 01:47:08 +0000191 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000192 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000193 const ThreadSpec *thread_spec = m_opaque_sp->GetOptionsNoCreate()->GetThreadSpecNoCreate();
Greg Claytonbdcda462010-12-20 20:49:23 +0000194 if (thread_spec)
195 thread_idx = thread_spec->GetIndex();
Jim Ingham8e5e38f2010-06-18 01:47:08 +0000196 }
Greg Claytonbdcda462010-12-20 20:49:23 +0000197 return thread_idx;
Jim Ingham8e5e38f2010-06-18 01:47:08 +0000198}
199
200
201void
202SBBreakpointLocation::SetThreadName (const char *thread_name)
203{
Greg Clayton63094e02010-06-23 01:19:29 +0000204 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000205 {
206 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000207 m_opaque_sp->GetLocationOptions()->GetThreadSpec()->SetName (thread_name);
Greg Claytonbdcda462010-12-20 20:49:23 +0000208 }
Jim Ingham8e5e38f2010-06-18 01:47:08 +0000209}
210
211const char *
212SBBreakpointLocation::GetThreadName () const
213{
Greg Clayton63094e02010-06-23 01:19:29 +0000214 if (m_opaque_sp)
Jim Ingham8e5e38f2010-06-18 01:47:08 +0000215 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000216 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000217 const ThreadSpec *thread_spec = m_opaque_sp->GetOptionsNoCreate()->GetThreadSpecNoCreate();
Greg Claytonbdcda462010-12-20 20:49:23 +0000218 if (thread_spec)
Jim Ingham8e5e38f2010-06-18 01:47:08 +0000219 return thread_spec->GetName();
220 }
221 return NULL;
222}
223
224void
225SBBreakpointLocation::SetQueueName (const char *queue_name)
226{
Greg Clayton63094e02010-06-23 01:19:29 +0000227 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000228 {
229 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000230 m_opaque_sp->GetLocationOptions()->GetThreadSpec()->SetQueueName (queue_name);
Greg Claytonbdcda462010-12-20 20:49:23 +0000231 }
Jim Ingham8e5e38f2010-06-18 01:47:08 +0000232}
233
234const char *
235SBBreakpointLocation::GetQueueName () const
236{
Greg Clayton63094e02010-06-23 01:19:29 +0000237 if (m_opaque_sp)
Jim Ingham8e5e38f2010-06-18 01:47:08 +0000238 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000239 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000240 const ThreadSpec *thread_spec = m_opaque_sp->GetOptionsNoCreate()->GetThreadSpecNoCreate();
Greg Claytonbdcda462010-12-20 20:49:23 +0000241 if (thread_spec)
Jim Ingham8e5e38f2010-06-18 01:47:08 +0000242 return thread_spec->GetQueueName();
243 }
244 return NULL;
245}
246
Chris Lattner24943d22010-06-08 16:52:24 +0000247bool
248SBBreakpointLocation::IsResolved ()
249{
Greg Clayton63094e02010-06-23 01:19:29 +0000250 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000251 {
252 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
Greg Clayton63094e02010-06-23 01:19:29 +0000253 return m_opaque_sp->IsResolved();
Greg Claytonbdcda462010-12-20 20:49:23 +0000254 }
255 return false;
Chris Lattner24943d22010-06-08 16:52:24 +0000256}
257
258void
259SBBreakpointLocation::SetLocation (const lldb::BreakpointLocationSP &break_loc_sp)
260{
Greg Claytonbdcda462010-12-20 20:49:23 +0000261 // Uninstall the callbacks?
Greg Clayton63094e02010-06-23 01:19:29 +0000262 m_opaque_sp = break_loc_sp;
Chris Lattner24943d22010-06-08 16:52:24 +0000263}
264
Caroline Tice98f930f2010-09-20 05:20:02 +0000265bool
Johnny Chenbdc36bd2011-04-25 20:23:05 +0000266SBBreakpointLocation::GetDescription (SBStream &description, DescriptionLevel level)
Chris Lattner24943d22010-06-08 16:52:24 +0000267{
Greg Clayton63094e02010-06-23 01:19:29 +0000268 if (m_opaque_sp)
Chris Lattner24943d22010-06-08 16:52:24 +0000269 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000270 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
Caroline Ticee49ec182010-09-22 23:01:29 +0000271 description.ref();
Caroline Tice98f930f2010-09-20 05:20:02 +0000272 m_opaque_sp->GetDescription (description.get(), level);
273 description.get()->EOL();
Chris Lattner24943d22010-06-08 16:52:24 +0000274 }
Caroline Tice98f930f2010-09-20 05:20:02 +0000275 else
276 description.Printf ("No value");
277
278 return true;
279}
280
Chris Lattner24943d22010-06-08 16:52:24 +0000281SBBreakpoint
282SBBreakpointLocation::GetBreakpoint ()
283{
Greg Claytone005f2c2010-11-06 01:53:30 +0000284 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000285
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000286 //if (log)
287 // log->Printf ("SBBreakpointLocation::GetBreakpoint ()");
Caroline Tice7826c882010-10-26 03:11:13 +0000288
Chris Lattner24943d22010-06-08 16:52:24 +0000289 SBBreakpoint sb_bp;
Greg Clayton63094e02010-06-23 01:19:29 +0000290 if (m_opaque_sp)
Greg Claytonbdcda462010-12-20 20:49:23 +0000291 {
292 Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
293 *sb_bp = m_opaque_sp->GetBreakpoint ().GetSP();
294 }
Caroline Tice7826c882010-10-26 03:11:13 +0000295
296 if (log)
297 {
298 SBStream sstr;
299 sb_bp.GetDescription (sstr);
Greg Clayton49ce6822010-10-31 03:01:06 +0000300 log->Printf ("SBBreakpointLocation(%p)::GetBreakpoint () => SBBreakpoint(%p) %s",
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000301 m_opaque_sp.get(), sb_bp.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000302 }
Chris Lattner24943d22010-06-08 16:52:24 +0000303 return sb_bp;
304}
305