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