1*30fdc8d8SChris Lattner //===-- SBBreakpoint.cpp ----------------------------------------*- C++ -*-===//
2*30fdc8d8SChris Lattner //
3*30fdc8d8SChris Lattner //                     The LLVM Compiler Infrastructure
4*30fdc8d8SChris Lattner //
5*30fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source
6*30fdc8d8SChris Lattner // License. See LICENSE.TXT for details.
7*30fdc8d8SChris Lattner //
8*30fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
9*30fdc8d8SChris Lattner 
10*30fdc8d8SChris Lattner #include "lldb/API/SBBreakpoint.h"
11*30fdc8d8SChris Lattner #include "lldb/API/SBBreakpointLocation.h"
12*30fdc8d8SChris Lattner #include "lldb/API/SBDebugger.h"
13*30fdc8d8SChris Lattner #include "lldb/API/SBProcess.h"
14*30fdc8d8SChris Lattner #include "lldb/API/SBThread.h"
15*30fdc8d8SChris Lattner 
16*30fdc8d8SChris Lattner #include "lldb/Breakpoint/Breakpoint.h"
17*30fdc8d8SChris Lattner #include "lldb/Breakpoint/BreakpointLocation.h"
18*30fdc8d8SChris Lattner #include "lldb/Breakpoint/StoppointCallbackContext.h"
19*30fdc8d8SChris Lattner #include "lldb/Core/Address.h"
20*30fdc8d8SChris Lattner #include "lldb/Core/Stream.h"
21*30fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
22*30fdc8d8SChris Lattner #include "lldb/Target/Process.h"
23*30fdc8d8SChris Lattner #include "lldb/Target/Thread.h"
24*30fdc8d8SChris Lattner #include "lldb/Target/Target.h"
25*30fdc8d8SChris Lattner 
26*30fdc8d8SChris Lattner 
27*30fdc8d8SChris Lattner #include "lldb/lldb-enumerations.h"
28*30fdc8d8SChris Lattner 
29*30fdc8d8SChris Lattner using namespace lldb;
30*30fdc8d8SChris Lattner using namespace lldb_private;
31*30fdc8d8SChris Lattner 
32*30fdc8d8SChris Lattner struct CallbackData
33*30fdc8d8SChris Lattner {
34*30fdc8d8SChris Lattner     SBBreakpoint::BreakpointHitCallback callback;
35*30fdc8d8SChris Lattner     void *callback_baton;
36*30fdc8d8SChris Lattner };
37*30fdc8d8SChris Lattner 
38*30fdc8d8SChris Lattner class SBBreakpointCallbackBaton : public Baton
39*30fdc8d8SChris Lattner {
40*30fdc8d8SChris Lattner public:
41*30fdc8d8SChris Lattner 
42*30fdc8d8SChris Lattner     SBBreakpointCallbackBaton (SBBreakpoint::BreakpointHitCallback callback, void *baton) :
43*30fdc8d8SChris Lattner         Baton (new CallbackData)
44*30fdc8d8SChris Lattner     {
45*30fdc8d8SChris Lattner         CallbackData *data = (CallbackData *)m_data;
46*30fdc8d8SChris Lattner         data->callback = callback;
47*30fdc8d8SChris Lattner         data->callback_baton = baton;
48*30fdc8d8SChris Lattner     }
49*30fdc8d8SChris Lattner 
50*30fdc8d8SChris Lattner     virtual ~SBBreakpointCallbackBaton()
51*30fdc8d8SChris Lattner     {
52*30fdc8d8SChris Lattner         CallbackData *data = (CallbackData *)m_data;
53*30fdc8d8SChris Lattner 
54*30fdc8d8SChris Lattner         if (data)
55*30fdc8d8SChris Lattner         {
56*30fdc8d8SChris Lattner             delete data;
57*30fdc8d8SChris Lattner             m_data = NULL;
58*30fdc8d8SChris Lattner         }
59*30fdc8d8SChris Lattner     }
60*30fdc8d8SChris Lattner };
61*30fdc8d8SChris Lattner 
62*30fdc8d8SChris Lattner 
63*30fdc8d8SChris Lattner SBBreakpoint::SBBreakpoint () :
64*30fdc8d8SChris Lattner     m_break_sp ()
65*30fdc8d8SChris Lattner {
66*30fdc8d8SChris Lattner }
67*30fdc8d8SChris Lattner 
68*30fdc8d8SChris Lattner SBBreakpoint::SBBreakpoint (const SBBreakpoint& rhs) :
69*30fdc8d8SChris Lattner     m_break_sp (rhs.m_break_sp)
70*30fdc8d8SChris Lattner {
71*30fdc8d8SChris Lattner }
72*30fdc8d8SChris Lattner 
73*30fdc8d8SChris Lattner 
74*30fdc8d8SChris Lattner SBBreakpoint::SBBreakpoint (const lldb::BreakpointSP &bp_sp) :
75*30fdc8d8SChris Lattner     m_break_sp (bp_sp)
76*30fdc8d8SChris Lattner {
77*30fdc8d8SChris Lattner }
78*30fdc8d8SChris Lattner 
79*30fdc8d8SChris Lattner SBBreakpoint::~SBBreakpoint()
80*30fdc8d8SChris Lattner {
81*30fdc8d8SChris Lattner }
82*30fdc8d8SChris Lattner 
83*30fdc8d8SChris Lattner const SBBreakpoint &
84*30fdc8d8SChris Lattner SBBreakpoint::operator = (const SBBreakpoint& rhs)
85*30fdc8d8SChris Lattner {
86*30fdc8d8SChris Lattner     if (this != &rhs)
87*30fdc8d8SChris Lattner     {
88*30fdc8d8SChris Lattner         m_break_sp = rhs.m_break_sp;
89*30fdc8d8SChris Lattner     }
90*30fdc8d8SChris Lattner     return *this;
91*30fdc8d8SChris Lattner }
92*30fdc8d8SChris Lattner 
93*30fdc8d8SChris Lattner break_id_t
94*30fdc8d8SChris Lattner SBBreakpoint::GetID () const
95*30fdc8d8SChris Lattner {
96*30fdc8d8SChris Lattner     if (m_break_sp)
97*30fdc8d8SChris Lattner         return m_break_sp->GetID();
98*30fdc8d8SChris Lattner     return LLDB_INVALID_BREAK_ID;
99*30fdc8d8SChris Lattner }
100*30fdc8d8SChris Lattner 
101*30fdc8d8SChris Lattner 
102*30fdc8d8SChris Lattner bool
103*30fdc8d8SChris Lattner SBBreakpoint::IsValid() const
104*30fdc8d8SChris Lattner {
105*30fdc8d8SChris Lattner     return m_break_sp;
106*30fdc8d8SChris Lattner }
107*30fdc8d8SChris Lattner 
108*30fdc8d8SChris Lattner void
109*30fdc8d8SChris Lattner SBBreakpoint::Dump (FILE *f)
110*30fdc8d8SChris Lattner {
111*30fdc8d8SChris Lattner     if (m_break_sp)
112*30fdc8d8SChris Lattner     {
113*30fdc8d8SChris Lattner         if (f == NULL)
114*30fdc8d8SChris Lattner             f = SBDebugger::GetOutputFileHandle();
115*30fdc8d8SChris Lattner         if (f == NULL)
116*30fdc8d8SChris Lattner             return;
117*30fdc8d8SChris Lattner         lldb_private::StreamFile str (f);
118*30fdc8d8SChris Lattner         m_break_sp->Dump (&str);
119*30fdc8d8SChris Lattner     }
120*30fdc8d8SChris Lattner }
121*30fdc8d8SChris Lattner 
122*30fdc8d8SChris Lattner void
123*30fdc8d8SChris Lattner SBBreakpoint::ClearAllBreakpointSites ()
124*30fdc8d8SChris Lattner {
125*30fdc8d8SChris Lattner     if (m_break_sp)
126*30fdc8d8SChris Lattner         m_break_sp->ClearAllBreakpointSites ();
127*30fdc8d8SChris Lattner }
128*30fdc8d8SChris Lattner 
129*30fdc8d8SChris Lattner SBBreakpointLocation
130*30fdc8d8SChris Lattner SBBreakpoint::FindLocationByAddress (addr_t vm_addr)
131*30fdc8d8SChris Lattner {
132*30fdc8d8SChris Lattner     SBBreakpointLocation sb_bp_location;
133*30fdc8d8SChris Lattner 
134*30fdc8d8SChris Lattner     if (m_break_sp)
135*30fdc8d8SChris Lattner     {
136*30fdc8d8SChris Lattner         if (vm_addr != LLDB_INVALID_ADDRESS)
137*30fdc8d8SChris Lattner         {
138*30fdc8d8SChris Lattner             Address address;
139*30fdc8d8SChris Lattner             Process *sb_process = m_break_sp->GetTarget().GetProcessSP().get();
140*30fdc8d8SChris Lattner             if (sb_process == NULL || sb_process->ResolveLoadAddress (vm_addr, address) == false)
141*30fdc8d8SChris Lattner             {
142*30fdc8d8SChris Lattner                 address.SetSection (NULL);
143*30fdc8d8SChris Lattner                 address.SetOffset (vm_addr);
144*30fdc8d8SChris Lattner             }
145*30fdc8d8SChris Lattner             sb_bp_location.SetLocation (m_break_sp->FindLocationByAddress (address));
146*30fdc8d8SChris Lattner         }
147*30fdc8d8SChris Lattner     }
148*30fdc8d8SChris Lattner     return sb_bp_location;
149*30fdc8d8SChris Lattner }
150*30fdc8d8SChris Lattner 
151*30fdc8d8SChris Lattner break_id_t
152*30fdc8d8SChris Lattner SBBreakpoint::FindLocationIDByAddress (addr_t vm_addr)
153*30fdc8d8SChris Lattner {
154*30fdc8d8SChris Lattner     break_id_t lldb_id = (break_id_t) 0;
155*30fdc8d8SChris Lattner 
156*30fdc8d8SChris Lattner     if (m_break_sp)
157*30fdc8d8SChris Lattner     {
158*30fdc8d8SChris Lattner         if (vm_addr != LLDB_INVALID_ADDRESS)
159*30fdc8d8SChris Lattner         {
160*30fdc8d8SChris Lattner             Address address;
161*30fdc8d8SChris Lattner             Process *sb_process = m_break_sp->GetTarget().GetProcessSP().get();
162*30fdc8d8SChris Lattner             if (sb_process == NULL || sb_process->ResolveLoadAddress (vm_addr, address) == false)
163*30fdc8d8SChris Lattner             {
164*30fdc8d8SChris Lattner                 address.SetSection (NULL);
165*30fdc8d8SChris Lattner                 address.SetOffset (vm_addr);
166*30fdc8d8SChris Lattner             }
167*30fdc8d8SChris Lattner             lldb_id = m_break_sp->FindLocationIDByAddress (address);
168*30fdc8d8SChris Lattner         }
169*30fdc8d8SChris Lattner     }
170*30fdc8d8SChris Lattner 
171*30fdc8d8SChris Lattner     return lldb_id;
172*30fdc8d8SChris Lattner }
173*30fdc8d8SChris Lattner 
174*30fdc8d8SChris Lattner SBBreakpointLocation
175*30fdc8d8SChris Lattner SBBreakpoint::FindLocationByID (break_id_t bp_loc_id)
176*30fdc8d8SChris Lattner {
177*30fdc8d8SChris Lattner     SBBreakpointLocation sb_bp_location;
178*30fdc8d8SChris Lattner 
179*30fdc8d8SChris Lattner     if (m_break_sp)
180*30fdc8d8SChris Lattner         sb_bp_location.SetLocation (m_break_sp->FindLocationByID (bp_loc_id));
181*30fdc8d8SChris Lattner 
182*30fdc8d8SChris Lattner     return sb_bp_location;
183*30fdc8d8SChris Lattner }
184*30fdc8d8SChris Lattner 
185*30fdc8d8SChris Lattner SBBreakpointLocation
186*30fdc8d8SChris Lattner SBBreakpoint::GetLocationAtIndex (uint32_t index)
187*30fdc8d8SChris Lattner {
188*30fdc8d8SChris Lattner     SBBreakpointLocation sb_bp_location;
189*30fdc8d8SChris Lattner 
190*30fdc8d8SChris Lattner     if (m_break_sp)
191*30fdc8d8SChris Lattner         sb_bp_location.SetLocation (m_break_sp->GetLocationAtIndex (index));
192*30fdc8d8SChris Lattner 
193*30fdc8d8SChris Lattner     return sb_bp_location;
194*30fdc8d8SChris Lattner }
195*30fdc8d8SChris Lattner 
196*30fdc8d8SChris Lattner void
197*30fdc8d8SChris Lattner SBBreakpoint::ListLocations (FILE* f, const char *description_level)
198*30fdc8d8SChris Lattner {
199*30fdc8d8SChris Lattner    if (f == NULL)
200*30fdc8d8SChris Lattner        f = SBDebugger::GetOutputFileHandle();
201*30fdc8d8SChris Lattner 
202*30fdc8d8SChris Lattner    if (f == NULL)
203*30fdc8d8SChris Lattner        return;
204*30fdc8d8SChris Lattner 
205*30fdc8d8SChris Lattner     if (m_break_sp)
206*30fdc8d8SChris Lattner     {
207*30fdc8d8SChris Lattner         DescriptionLevel level;
208*30fdc8d8SChris Lattner         if (strcmp (description_level, "brief") == 0)
209*30fdc8d8SChris Lattner             level = eDescriptionLevelBrief;
210*30fdc8d8SChris Lattner         else if (strcmp (description_level, "full") == 0)
211*30fdc8d8SChris Lattner             level = eDescriptionLevelFull;
212*30fdc8d8SChris Lattner         else if (strcmp (description_level, "verbose") == 0)
213*30fdc8d8SChris Lattner             level = eDescriptionLevelVerbose;
214*30fdc8d8SChris Lattner         else
215*30fdc8d8SChris Lattner             level = eDescriptionLevelBrief;
216*30fdc8d8SChris Lattner 
217*30fdc8d8SChris Lattner         StreamFile str (f);
218*30fdc8d8SChris Lattner 
219*30fdc8d8SChris Lattner         str.IndentMore();
220*30fdc8d8SChris Lattner         int num_locs = m_break_sp->GetNumLocations();
221*30fdc8d8SChris Lattner         for (int i = 0; i < num_locs; ++i)
222*30fdc8d8SChris Lattner         {
223*30fdc8d8SChris Lattner             BreakpointLocation *loc = m_break_sp->GetLocationAtIndex (i).get();
224*30fdc8d8SChris Lattner             loc->GetDescription (&str, level);
225*30fdc8d8SChris Lattner             str.EOL();
226*30fdc8d8SChris Lattner         }
227*30fdc8d8SChris Lattner     }
228*30fdc8d8SChris Lattner }
229*30fdc8d8SChris Lattner 
230*30fdc8d8SChris Lattner void
231*30fdc8d8SChris Lattner SBBreakpoint::SetEnabled (bool enable)
232*30fdc8d8SChris Lattner {
233*30fdc8d8SChris Lattner     if (m_break_sp)
234*30fdc8d8SChris Lattner         m_break_sp->SetEnabled (enable);
235*30fdc8d8SChris Lattner }
236*30fdc8d8SChris Lattner 
237*30fdc8d8SChris Lattner bool
238*30fdc8d8SChris Lattner SBBreakpoint::IsEnabled ()
239*30fdc8d8SChris Lattner {
240*30fdc8d8SChris Lattner     if (m_break_sp)
241*30fdc8d8SChris Lattner         return m_break_sp->IsEnabled();
242*30fdc8d8SChris Lattner     else
243*30fdc8d8SChris Lattner         return false;
244*30fdc8d8SChris Lattner }
245*30fdc8d8SChris Lattner 
246*30fdc8d8SChris Lattner void
247*30fdc8d8SChris Lattner SBBreakpoint::SetIgnoreCount (int32_t count)
248*30fdc8d8SChris Lattner {
249*30fdc8d8SChris Lattner     if (m_break_sp)
250*30fdc8d8SChris Lattner         m_break_sp->SetIgnoreCount (count);
251*30fdc8d8SChris Lattner }
252*30fdc8d8SChris Lattner 
253*30fdc8d8SChris Lattner int32_t
254*30fdc8d8SChris Lattner SBBreakpoint::GetIgnoreCount () const
255*30fdc8d8SChris Lattner {
256*30fdc8d8SChris Lattner     if (m_break_sp)
257*30fdc8d8SChris Lattner         return m_break_sp->GetIgnoreCount();
258*30fdc8d8SChris Lattner     else
259*30fdc8d8SChris Lattner         return 0;
260*30fdc8d8SChris Lattner }
261*30fdc8d8SChris Lattner 
262*30fdc8d8SChris Lattner void
263*30fdc8d8SChris Lattner SBBreakpoint::SetThreadID (tid_t sb_thread_id)
264*30fdc8d8SChris Lattner {
265*30fdc8d8SChris Lattner     if (m_break_sp)
266*30fdc8d8SChris Lattner         m_break_sp->SetThreadID (sb_thread_id);
267*30fdc8d8SChris Lattner }
268*30fdc8d8SChris Lattner 
269*30fdc8d8SChris Lattner tid_t
270*30fdc8d8SChris Lattner SBBreakpoint::GetThreadID ()
271*30fdc8d8SChris Lattner {
272*30fdc8d8SChris Lattner     tid_t lldb_thread_id = LLDB_INVALID_THREAD_ID;
273*30fdc8d8SChris Lattner     if (m_break_sp)
274*30fdc8d8SChris Lattner         lldb_thread_id = m_break_sp->GetThreadID();
275*30fdc8d8SChris Lattner 
276*30fdc8d8SChris Lattner     return lldb_thread_id;
277*30fdc8d8SChris Lattner }
278*30fdc8d8SChris Lattner 
279*30fdc8d8SChris Lattner size_t
280*30fdc8d8SChris Lattner SBBreakpoint::GetNumResolvedLocations() const
281*30fdc8d8SChris Lattner {
282*30fdc8d8SChris Lattner     if (m_break_sp)
283*30fdc8d8SChris Lattner         return m_break_sp->GetNumResolvedLocations();
284*30fdc8d8SChris Lattner     else
285*30fdc8d8SChris Lattner         return 0;
286*30fdc8d8SChris Lattner }
287*30fdc8d8SChris Lattner 
288*30fdc8d8SChris Lattner size_t
289*30fdc8d8SChris Lattner SBBreakpoint::GetNumLocations() const
290*30fdc8d8SChris Lattner {
291*30fdc8d8SChris Lattner     if (m_break_sp)
292*30fdc8d8SChris Lattner         return m_break_sp->GetNumLocations();
293*30fdc8d8SChris Lattner     else
294*30fdc8d8SChris Lattner         return 0;
295*30fdc8d8SChris Lattner }
296*30fdc8d8SChris Lattner 
297*30fdc8d8SChris Lattner void
298*30fdc8d8SChris Lattner SBBreakpoint::GetDescription (FILE *f, const char *description_level, bool describe_locations)
299*30fdc8d8SChris Lattner {
300*30fdc8d8SChris Lattner     if (f == NULL)
301*30fdc8d8SChris Lattner         return;
302*30fdc8d8SChris Lattner 
303*30fdc8d8SChris Lattner     if (m_break_sp)
304*30fdc8d8SChris Lattner     {
305*30fdc8d8SChris Lattner         DescriptionLevel level;
306*30fdc8d8SChris Lattner         if (strcmp (description_level, "brief") == 0)
307*30fdc8d8SChris Lattner             level = eDescriptionLevelBrief;
308*30fdc8d8SChris Lattner         else if (strcmp (description_level, "full") == 0)
309*30fdc8d8SChris Lattner             level = eDescriptionLevelFull;
310*30fdc8d8SChris Lattner         else if (strcmp (description_level, "verbose") == 0)
311*30fdc8d8SChris Lattner             level = eDescriptionLevelVerbose;
312*30fdc8d8SChris Lattner         else
313*30fdc8d8SChris Lattner             level = eDescriptionLevelBrief;
314*30fdc8d8SChris Lattner 
315*30fdc8d8SChris Lattner         StreamFile str (f);
316*30fdc8d8SChris Lattner 
317*30fdc8d8SChris Lattner         m_break_sp->GetDescription (&str, level);
318*30fdc8d8SChris Lattner         str.EOL();
319*30fdc8d8SChris Lattner         if (describe_locations)
320*30fdc8d8SChris Lattner         {
321*30fdc8d8SChris Lattner           //str.IndentMore();
322*30fdc8d8SChris Lattner           // int num_locs = m_break_sp->GetNumLocations();
323*30fdc8d8SChris Lattner           //  for (int i = 0; i < num_locs; ++i)
324*30fdc8d8SChris Lattner           //  {
325*30fdc8d8SChris Lattner           //      BreakpointLocation *loc = m_break_sp->FindLocationByIndex (i);
326*30fdc8d8SChris Lattner           //      loc->GetDescription (&str, level);
327*30fdc8d8SChris Lattner           //      str.EOL();
328*30fdc8d8SChris Lattner           //  }
329*30fdc8d8SChris Lattner             ListLocations (f, description_level);
330*30fdc8d8SChris Lattner         }
331*30fdc8d8SChris Lattner     }
332*30fdc8d8SChris Lattner }
333*30fdc8d8SChris Lattner 
334*30fdc8d8SChris Lattner bool
335*30fdc8d8SChris Lattner SBBreakpoint::PrivateBreakpointHitCallback
336*30fdc8d8SChris Lattner (
337*30fdc8d8SChris Lattner     void *baton,
338*30fdc8d8SChris Lattner     StoppointCallbackContext *ctx,
339*30fdc8d8SChris Lattner     lldb::user_id_t break_id,
340*30fdc8d8SChris Lattner     lldb::user_id_t break_loc_id
341*30fdc8d8SChris Lattner )
342*30fdc8d8SChris Lattner {
343*30fdc8d8SChris Lattner     BreakpointSP bp_sp(ctx->context.target->GetBreakpointList().FindBreakpointByID(break_id));
344*30fdc8d8SChris Lattner     if (baton && bp_sp)
345*30fdc8d8SChris Lattner     {
346*30fdc8d8SChris Lattner         CallbackData *data = (CallbackData *)baton;
347*30fdc8d8SChris Lattner         lldb_private::Breakpoint *bp = bp_sp.get();
348*30fdc8d8SChris Lattner         if (bp && data->callback)
349*30fdc8d8SChris Lattner         {
350*30fdc8d8SChris Lattner             if (ctx->context.process)
351*30fdc8d8SChris Lattner             {
352*30fdc8d8SChris Lattner                 SBProcess sb_process (ctx->context.process->GetSP());
353*30fdc8d8SChris Lattner                 SBThread sb_thread;
354*30fdc8d8SChris Lattner                 SBBreakpointLocation sb_location;
355*30fdc8d8SChris Lattner                 assert (bp_sp);
356*30fdc8d8SChris Lattner                 sb_location.SetLocation (bp_sp->FindLocationByID (break_loc_id));
357*30fdc8d8SChris Lattner                 if (ctx->context.thread)
358*30fdc8d8SChris Lattner                     sb_thread.SetThread(ctx->context.thread->GetSP());
359*30fdc8d8SChris Lattner 
360*30fdc8d8SChris Lattner                 return data->callback (data->callback_baton,
361*30fdc8d8SChris Lattner                                           sb_process,
362*30fdc8d8SChris Lattner                                           sb_thread,
363*30fdc8d8SChris Lattner                                           sb_location);
364*30fdc8d8SChris Lattner             }
365*30fdc8d8SChris Lattner         }
366*30fdc8d8SChris Lattner     }
367*30fdc8d8SChris Lattner     return true;    // Return true if we should stop at this breakpoint
368*30fdc8d8SChris Lattner }
369*30fdc8d8SChris Lattner 
370*30fdc8d8SChris Lattner void
371*30fdc8d8SChris Lattner SBBreakpoint::SetCallback (BreakpointHitCallback callback, void *baton)
372*30fdc8d8SChris Lattner {
373*30fdc8d8SChris Lattner     if (m_break_sp.get())
374*30fdc8d8SChris Lattner     {
375*30fdc8d8SChris Lattner         BatonSP baton_sp(new SBBreakpointCallbackBaton (callback, baton));
376*30fdc8d8SChris Lattner         m_break_sp->SetCallback (SBBreakpoint::PrivateBreakpointHitCallback, baton_sp, false);
377*30fdc8d8SChris Lattner     }
378*30fdc8d8SChris Lattner }
379*30fdc8d8SChris Lattner 
380*30fdc8d8SChris Lattner 
381*30fdc8d8SChris Lattner lldb_private::Breakpoint *
382*30fdc8d8SChris Lattner SBBreakpoint::operator->() const
383*30fdc8d8SChris Lattner {
384*30fdc8d8SChris Lattner     return m_break_sp.get();
385*30fdc8d8SChris Lattner }
386*30fdc8d8SChris Lattner 
387*30fdc8d8SChris Lattner lldb_private::Breakpoint *
388*30fdc8d8SChris Lattner SBBreakpoint::get() const
389*30fdc8d8SChris Lattner {
390*30fdc8d8SChris Lattner     return m_break_sp.get();
391*30fdc8d8SChris Lattner }
392*30fdc8d8SChris Lattner 
393*30fdc8d8SChris Lattner lldb::BreakpointSP &
394*30fdc8d8SChris Lattner SBBreakpoint::operator *()
395*30fdc8d8SChris Lattner {
396*30fdc8d8SChris Lattner     return m_break_sp;
397*30fdc8d8SChris Lattner }
398*30fdc8d8SChris Lattner 
399*30fdc8d8SChris Lattner const lldb::BreakpointSP &
400*30fdc8d8SChris Lattner SBBreakpoint::operator *() const
401*30fdc8d8SChris Lattner {
402*30fdc8d8SChris Lattner     return m_break_sp;
403*30fdc8d8SChris Lattner }
404*30fdc8d8SChris Lattner 
405