130fdc8d8SChris Lattner //===-- SBBreakpoint.cpp ----------------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
330fdc8d8SChris Lattner //                     The LLVM Compiler Infrastructure
430fdc8d8SChris Lattner //
530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source
630fdc8d8SChris Lattner // License. See LICENSE.TXT for details.
730fdc8d8SChris Lattner //
830fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
930fdc8d8SChris Lattner 
1030fdc8d8SChris Lattner #include "lldb/API/SBBreakpoint.h"
1130fdc8d8SChris Lattner #include "lldb/API/SBBreakpointLocation.h"
1230fdc8d8SChris Lattner #include "lldb/API/SBDebugger.h"
139fed0d85SGreg Clayton #include "lldb/API/SBEvent.h"
1430fdc8d8SChris Lattner #include "lldb/API/SBProcess.h"
15dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
1630fdc8d8SChris Lattner #include "lldb/API/SBThread.h"
1730fdc8d8SChris Lattner 
1830fdc8d8SChris Lattner #include "lldb/Breakpoint/Breakpoint.h"
1930fdc8d8SChris Lattner #include "lldb/Breakpoint/BreakpointLocation.h"
2030fdc8d8SChris Lattner #include "lldb/Breakpoint/StoppointCallbackContext.h"
2130fdc8d8SChris Lattner #include "lldb/Core/Address.h"
22ceb6b139SCaroline Tice #include "lldb/Core/Log.h"
2330fdc8d8SChris Lattner #include "lldb/Core/Stream.h"
2430fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
2530fdc8d8SChris Lattner #include "lldb/Target/Process.h"
2630fdc8d8SChris Lattner #include "lldb/Target/Target.h"
2762b02c61SJim Ingham #include "lldb/Target/Thread.h"
2862b02c61SJim Ingham #include "lldb/Target/ThreadSpec.h"
2930fdc8d8SChris Lattner 
3030fdc8d8SChris Lattner 
3130fdc8d8SChris Lattner #include "lldb/lldb-enumerations.h"
3230fdc8d8SChris Lattner 
3330fdc8d8SChris Lattner using namespace lldb;
3430fdc8d8SChris Lattner using namespace lldb_private;
3530fdc8d8SChris Lattner 
3630fdc8d8SChris Lattner struct CallbackData
3730fdc8d8SChris Lattner {
3830fdc8d8SChris Lattner     SBBreakpoint::BreakpointHitCallback callback;
3930fdc8d8SChris Lattner     void *callback_baton;
4030fdc8d8SChris Lattner };
4130fdc8d8SChris Lattner 
4230fdc8d8SChris Lattner class SBBreakpointCallbackBaton : public Baton
4330fdc8d8SChris Lattner {
4430fdc8d8SChris Lattner public:
4530fdc8d8SChris Lattner 
4630fdc8d8SChris Lattner     SBBreakpointCallbackBaton (SBBreakpoint::BreakpointHitCallback callback, void *baton) :
4730fdc8d8SChris Lattner         Baton (new CallbackData)
4830fdc8d8SChris Lattner     {
4930fdc8d8SChris Lattner         CallbackData *data = (CallbackData *)m_data;
5030fdc8d8SChris Lattner         data->callback = callback;
5130fdc8d8SChris Lattner         data->callback_baton = baton;
5230fdc8d8SChris Lattner     }
5330fdc8d8SChris Lattner 
5430fdc8d8SChris Lattner     virtual ~SBBreakpointCallbackBaton()
5530fdc8d8SChris Lattner     {
5630fdc8d8SChris Lattner         CallbackData *data = (CallbackData *)m_data;
5730fdc8d8SChris Lattner 
5830fdc8d8SChris Lattner         if (data)
5930fdc8d8SChris Lattner         {
6030fdc8d8SChris Lattner             delete data;
6130fdc8d8SChris Lattner             m_data = NULL;
6230fdc8d8SChris Lattner         }
6330fdc8d8SChris Lattner     }
6430fdc8d8SChris Lattner };
6530fdc8d8SChris Lattner 
6630fdc8d8SChris Lattner 
6730fdc8d8SChris Lattner SBBreakpoint::SBBreakpoint () :
686611103cSGreg Clayton     m_opaque_sp ()
6930fdc8d8SChris Lattner {
7030fdc8d8SChris Lattner }
7130fdc8d8SChris Lattner 
7230fdc8d8SChris Lattner SBBreakpoint::SBBreakpoint (const SBBreakpoint& rhs) :
736611103cSGreg Clayton     m_opaque_sp (rhs.m_opaque_sp)
7430fdc8d8SChris Lattner {
7530fdc8d8SChris Lattner }
7630fdc8d8SChris Lattner 
7730fdc8d8SChris Lattner 
7830fdc8d8SChris Lattner SBBreakpoint::SBBreakpoint (const lldb::BreakpointSP &bp_sp) :
796611103cSGreg Clayton     m_opaque_sp (bp_sp)
8030fdc8d8SChris Lattner {
8130fdc8d8SChris Lattner }
8230fdc8d8SChris Lattner 
8330fdc8d8SChris Lattner SBBreakpoint::~SBBreakpoint()
8430fdc8d8SChris Lattner {
8530fdc8d8SChris Lattner }
8630fdc8d8SChris Lattner 
8730fdc8d8SChris Lattner const SBBreakpoint &
8830fdc8d8SChris Lattner SBBreakpoint::operator = (const SBBreakpoint& rhs)
8930fdc8d8SChris Lattner {
9030fdc8d8SChris Lattner     if (this != &rhs)
916611103cSGreg Clayton         m_opaque_sp = rhs.m_opaque_sp;
9230fdc8d8SChris Lattner     return *this;
9330fdc8d8SChris Lattner }
9430fdc8d8SChris Lattner 
95ac2eb9b1SGreg Clayton bool
96ac2eb9b1SGreg Clayton SBBreakpoint::operator == (const lldb::SBBreakpoint& rhs)
97ac2eb9b1SGreg Clayton {
98ac2eb9b1SGreg Clayton     if (m_opaque_sp && rhs.m_opaque_sp)
99ac2eb9b1SGreg Clayton         return m_opaque_sp.get() == rhs.m_opaque_sp.get();
100ac2eb9b1SGreg Clayton     return false;
101ac2eb9b1SGreg Clayton }
102ac2eb9b1SGreg Clayton 
10330fdc8d8SChris Lattner break_id_t
10430fdc8d8SChris Lattner SBBreakpoint::GetID () const
10530fdc8d8SChris Lattner {
1062d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
107ceb6b139SCaroline Tice 
108af67cecdSGreg Clayton     break_id_t break_id = LLDB_INVALID_BREAK_ID;
1096611103cSGreg Clayton     if (m_opaque_sp)
110af67cecdSGreg Clayton         break_id = m_opaque_sp->GetID();
111af67cecdSGreg Clayton 
112ceb6b139SCaroline Tice     if (log)
113af67cecdSGreg Clayton     {
114af67cecdSGreg Clayton         if (break_id == LLDB_INVALID_BREAK_ID)
115af67cecdSGreg Clayton             log->Printf ("SBBreakpoint(%p)::GetID () => LLDB_INVALID_BREAK_ID", m_opaque_sp.get());
116af67cecdSGreg Clayton         else
1174838131bSGreg Clayton             log->Printf ("SBBreakpoint(%p)::GetID () => %u", m_opaque_sp.get(), break_id);
118ceb6b139SCaroline Tice     }
119ceb6b139SCaroline Tice 
120af67cecdSGreg Clayton     return break_id;
12130fdc8d8SChris Lattner }
12230fdc8d8SChris Lattner 
12330fdc8d8SChris Lattner 
12430fdc8d8SChris Lattner bool
12530fdc8d8SChris Lattner SBBreakpoint::IsValid() const
12630fdc8d8SChris Lattner {
127*f94e1791SJim Ingham     return (bool) m_opaque_sp;
12830fdc8d8SChris Lattner }
12930fdc8d8SChris Lattner 
13030fdc8d8SChris Lattner void
13130fdc8d8SChris Lattner SBBreakpoint::ClearAllBreakpointSites ()
13230fdc8d8SChris Lattner {
1336611103cSGreg Clayton     if (m_opaque_sp)
134af67cecdSGreg Clayton     {
135af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
1366611103cSGreg Clayton         m_opaque_sp->ClearAllBreakpointSites ();
13730fdc8d8SChris Lattner     }
138af67cecdSGreg Clayton }
13930fdc8d8SChris Lattner 
14030fdc8d8SChris Lattner SBBreakpointLocation
14130fdc8d8SChris Lattner SBBreakpoint::FindLocationByAddress (addr_t vm_addr)
14230fdc8d8SChris Lattner {
14330fdc8d8SChris Lattner     SBBreakpointLocation sb_bp_location;
14430fdc8d8SChris Lattner 
1456611103cSGreg Clayton     if (m_opaque_sp)
14630fdc8d8SChris Lattner     {
14730fdc8d8SChris Lattner         if (vm_addr != LLDB_INVALID_ADDRESS)
14830fdc8d8SChris Lattner         {
149af67cecdSGreg Clayton             Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
15030fdc8d8SChris Lattner             Address address;
151f5e56de0SGreg Clayton             Target &target = m_opaque_sp->GetTarget();
152f5e56de0SGreg Clayton             if (target.GetSectionLoadList().ResolveLoadAddress (vm_addr, address) == false)
15330fdc8d8SChris Lattner             {
154e72dfb32SGreg Clayton                 address.SetRawAddress (vm_addr);
15530fdc8d8SChris Lattner             }
1566611103cSGreg Clayton             sb_bp_location.SetLocation (m_opaque_sp->FindLocationByAddress (address));
15730fdc8d8SChris Lattner         }
15830fdc8d8SChris Lattner     }
15930fdc8d8SChris Lattner     return sb_bp_location;
16030fdc8d8SChris Lattner }
16130fdc8d8SChris Lattner 
16230fdc8d8SChris Lattner break_id_t
16330fdc8d8SChris Lattner SBBreakpoint::FindLocationIDByAddress (addr_t vm_addr)
16430fdc8d8SChris Lattner {
165af67cecdSGreg Clayton     break_id_t break_id = LLDB_INVALID_BREAK_ID;
16630fdc8d8SChris Lattner 
167af67cecdSGreg Clayton     if (m_opaque_sp && vm_addr != LLDB_INVALID_ADDRESS)
16830fdc8d8SChris Lattner     {
169af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
17030fdc8d8SChris Lattner         Address address;
171f5e56de0SGreg Clayton         Target &target = m_opaque_sp->GetTarget();
172f5e56de0SGreg Clayton         if (target.GetSectionLoadList().ResolveLoadAddress (vm_addr, address) == false)
17330fdc8d8SChris Lattner         {
174e72dfb32SGreg Clayton             address.SetRawAddress (vm_addr);
17530fdc8d8SChris Lattner         }
176af67cecdSGreg Clayton         break_id = m_opaque_sp->FindLocationIDByAddress (address);
17730fdc8d8SChris Lattner     }
17830fdc8d8SChris Lattner 
179af67cecdSGreg Clayton     return break_id;
18030fdc8d8SChris Lattner }
18130fdc8d8SChris Lattner 
18230fdc8d8SChris Lattner SBBreakpointLocation
18330fdc8d8SChris Lattner SBBreakpoint::FindLocationByID (break_id_t bp_loc_id)
18430fdc8d8SChris Lattner {
18530fdc8d8SChris Lattner     SBBreakpointLocation sb_bp_location;
18630fdc8d8SChris Lattner 
1876611103cSGreg Clayton     if (m_opaque_sp)
188af67cecdSGreg Clayton     {
189af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
1906611103cSGreg Clayton         sb_bp_location.SetLocation (m_opaque_sp->FindLocationByID (bp_loc_id));
191af67cecdSGreg Clayton     }
19230fdc8d8SChris Lattner 
19330fdc8d8SChris Lattner     return sb_bp_location;
19430fdc8d8SChris Lattner }
19530fdc8d8SChris Lattner 
19630fdc8d8SChris Lattner SBBreakpointLocation
19730fdc8d8SChris Lattner SBBreakpoint::GetLocationAtIndex (uint32_t index)
19830fdc8d8SChris Lattner {
19930fdc8d8SChris Lattner     SBBreakpointLocation sb_bp_location;
20030fdc8d8SChris Lattner 
2016611103cSGreg Clayton     if (m_opaque_sp)
202af67cecdSGreg Clayton     {
203af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
2046611103cSGreg Clayton         sb_bp_location.SetLocation (m_opaque_sp->GetLocationAtIndex (index));
205af67cecdSGreg Clayton     }
20630fdc8d8SChris Lattner 
20730fdc8d8SChris Lattner     return sb_bp_location;
20830fdc8d8SChris Lattner }
20930fdc8d8SChris Lattner 
21030fdc8d8SChris Lattner void
21130fdc8d8SChris Lattner SBBreakpoint::SetEnabled (bool enable)
21230fdc8d8SChris Lattner {
2132d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
214ceb6b139SCaroline Tice 
215ceb6b139SCaroline Tice     if (log)
2164838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::SetEnabled (enabled=%i)", m_opaque_sp.get(), enable);
217ceb6b139SCaroline Tice 
2186611103cSGreg Clayton     if (m_opaque_sp)
219af67cecdSGreg Clayton     {
220af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
2216611103cSGreg Clayton         m_opaque_sp->SetEnabled (enable);
22230fdc8d8SChris Lattner     }
223af67cecdSGreg Clayton }
22430fdc8d8SChris Lattner 
22530fdc8d8SChris Lattner bool
22630fdc8d8SChris Lattner SBBreakpoint::IsEnabled ()
22730fdc8d8SChris Lattner {
2286611103cSGreg Clayton     if (m_opaque_sp)
229af67cecdSGreg Clayton     {
230af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
2316611103cSGreg Clayton         return m_opaque_sp->IsEnabled();
232af67cecdSGreg Clayton     }
23330fdc8d8SChris Lattner     else
23430fdc8d8SChris Lattner         return false;
23530fdc8d8SChris Lattner }
23630fdc8d8SChris Lattner 
23730fdc8d8SChris Lattner void
238c982c768SGreg Clayton SBBreakpoint::SetIgnoreCount (uint32_t count)
23930fdc8d8SChris Lattner {
2402d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
241ceb6b139SCaroline Tice 
242ceb6b139SCaroline Tice     if (log)
2434838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::SetIgnoreCount (count=%u)", m_opaque_sp.get(), count);
244ceb6b139SCaroline Tice 
2456611103cSGreg Clayton     if (m_opaque_sp)
246af67cecdSGreg Clayton     {
247af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
2486611103cSGreg Clayton         m_opaque_sp->SetIgnoreCount (count);
24930fdc8d8SChris Lattner     }
250af67cecdSGreg Clayton }
25130fdc8d8SChris Lattner 
252041a12fcSJim Ingham void
253041a12fcSJim Ingham SBBreakpoint::SetCondition (const char *condition)
254041a12fcSJim Ingham {
255af67cecdSGreg Clayton     if (m_opaque_sp)
256af67cecdSGreg Clayton     {
257af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
258041a12fcSJim Ingham         m_opaque_sp->SetCondition (condition);
259041a12fcSJim Ingham     }
260af67cecdSGreg Clayton }
261041a12fcSJim Ingham 
262041a12fcSJim Ingham const char *
263041a12fcSJim Ingham SBBreakpoint::GetCondition ()
264041a12fcSJim Ingham {
265af67cecdSGreg Clayton     if (m_opaque_sp)
266af67cecdSGreg Clayton     {
267af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
268041a12fcSJim Ingham         return m_opaque_sp->GetConditionText ();
269041a12fcSJim Ingham     }
270af67cecdSGreg Clayton     return NULL;
271af67cecdSGreg Clayton }
272041a12fcSJim Ingham 
273c982c768SGreg Clayton uint32_t
2749fed0d85SGreg Clayton SBBreakpoint::GetHitCount () const
2759fed0d85SGreg Clayton {
2764838131bSGreg Clayton     uint32_t count = 0;
2779fed0d85SGreg Clayton     if (m_opaque_sp)
278af67cecdSGreg Clayton     {
279af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
2804838131bSGreg Clayton         count = m_opaque_sp->GetHitCount();
281af67cecdSGreg Clayton     }
2824838131bSGreg Clayton 
2832d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
284ceb6b139SCaroline Tice     if (log)
2854838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::GetHitCount () => %u", m_opaque_sp.get(), count);
2864838131bSGreg Clayton 
2874838131bSGreg Clayton     return count;
288ceb6b139SCaroline Tice }
2899fed0d85SGreg Clayton 
2909fed0d85SGreg Clayton uint32_t
29130fdc8d8SChris Lattner SBBreakpoint::GetIgnoreCount () const
29230fdc8d8SChris Lattner {
2934838131bSGreg Clayton     uint32_t count = 0;
2946611103cSGreg Clayton     if (m_opaque_sp)
295af67cecdSGreg Clayton     {
296af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
2974838131bSGreg Clayton         count = m_opaque_sp->GetIgnoreCount();
298af67cecdSGreg Clayton     }
2994838131bSGreg Clayton 
3002d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3014838131bSGreg Clayton     if (log)
3024838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::GetIgnoreCount () => %u", m_opaque_sp.get(), count);
3034838131bSGreg Clayton 
3044838131bSGreg Clayton     return count;
30530fdc8d8SChris Lattner }
30630fdc8d8SChris Lattner 
30730fdc8d8SChris Lattner void
3084838131bSGreg Clayton SBBreakpoint::SetThreadID (tid_t tid)
30930fdc8d8SChris Lattner {
3106611103cSGreg Clayton     if (m_opaque_sp)
311af67cecdSGreg Clayton     {
312af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
3134838131bSGreg Clayton         m_opaque_sp->SetThreadID (tid);
314af67cecdSGreg Clayton     }
3152d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3164838131bSGreg Clayton     if (log)
31761e7a58cSGreg Clayton         log->Printf ("SBBreakpoint(%p)::SetThreadID (tid=0x%4.4llx)", m_opaque_sp.get(), tid);
3184838131bSGreg Clayton 
31930fdc8d8SChris Lattner }
32030fdc8d8SChris Lattner 
32130fdc8d8SChris Lattner tid_t
32230fdc8d8SChris Lattner SBBreakpoint::GetThreadID ()
32330fdc8d8SChris Lattner {
3244838131bSGreg Clayton     tid_t tid = LLDB_INVALID_THREAD_ID;
3256611103cSGreg Clayton     if (m_opaque_sp)
326af67cecdSGreg Clayton     {
327af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
3284838131bSGreg Clayton         tid = m_opaque_sp->GetThreadID();
329af67cecdSGreg Clayton     }
33030fdc8d8SChris Lattner 
3312d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3324838131bSGreg Clayton     if (log)
33361e7a58cSGreg Clayton         log->Printf ("SBBreakpoint(%p)::GetThreadID () => 0x%4.4llx", m_opaque_sp.get(), tid);
3344838131bSGreg Clayton     return tid;
33530fdc8d8SChris Lattner }
33630fdc8d8SChris Lattner 
33762b02c61SJim Ingham void
33862b02c61SJim Ingham SBBreakpoint::SetThreadIndex (uint32_t index)
33962b02c61SJim Ingham {
3402d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3414838131bSGreg Clayton     if (log)
3424838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::SetThreadIndex (%u)", m_opaque_sp.get(), index);
3436611103cSGreg Clayton     if (m_opaque_sp)
344af67cecdSGreg Clayton     {
345af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
3466611103cSGreg Clayton         m_opaque_sp->GetOptions()->GetThreadSpec()->SetIndex (index);
34762b02c61SJim Ingham     }
348af67cecdSGreg Clayton }
34962b02c61SJim Ingham 
35062b02c61SJim Ingham uint32_t
35162b02c61SJim Ingham SBBreakpoint::GetThreadIndex() const
35262b02c61SJim Ingham {
353bdf4c6acSGreg Clayton     uint32_t thread_idx = UINT32_MAX;
3546611103cSGreg Clayton     if (m_opaque_sp)
35562b02c61SJim Ingham     {
356af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
357af67cecdSGreg Clayton         const ThreadSpec *thread_spec = m_opaque_sp->GetOptions()->GetThreadSpecNoCreate();
358763d1a17SJohnny Chen         if (thread_spec != NULL)
3594838131bSGreg Clayton             thread_idx = thread_spec->GetIndex();
36062b02c61SJim Ingham     }
3612d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3624838131bSGreg Clayton     if (log)
363bdf4c6acSGreg Clayton         log->Printf ("SBBreakpoint(%p)::GetThreadIndex () => %u", m_opaque_sp.get(), thread_idx);
3644838131bSGreg Clayton 
365763d1a17SJohnny Chen     return thread_idx;
36662b02c61SJim Ingham }
36762b02c61SJim Ingham 
36862b02c61SJim Ingham 
36962b02c61SJim Ingham void
37062b02c61SJim Ingham SBBreakpoint::SetThreadName (const char *thread_name)
37162b02c61SJim Ingham {
3722d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3734838131bSGreg Clayton     if (log)
3744838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::SetThreadName (%s)", m_opaque_sp.get(), thread_name);
3754838131bSGreg Clayton 
3766611103cSGreg Clayton     if (m_opaque_sp)
377af67cecdSGreg Clayton     {
378af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
3796611103cSGreg Clayton         m_opaque_sp->GetOptions()->GetThreadSpec()->SetName (thread_name);
38062b02c61SJim Ingham     }
381af67cecdSGreg Clayton }
38262b02c61SJim Ingham 
38362b02c61SJim Ingham const char *
38462b02c61SJim Ingham SBBreakpoint::GetThreadName () const
38562b02c61SJim Ingham {
3864838131bSGreg Clayton     const char *name = NULL;
3876611103cSGreg Clayton     if (m_opaque_sp)
38862b02c61SJim Ingham     {
389af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
390af67cecdSGreg Clayton         const ThreadSpec *thread_spec = m_opaque_sp->GetOptions()->GetThreadSpecNoCreate();
391763d1a17SJohnny Chen         if (thread_spec != NULL)
3924838131bSGreg Clayton             name = thread_spec->GetName();
39362b02c61SJim Ingham     }
3942d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3954838131bSGreg Clayton     if (log)
3964838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::GetThreadName () => %s", m_opaque_sp.get(), name);
3974838131bSGreg Clayton 
3984838131bSGreg Clayton     return name;
39962b02c61SJim Ingham }
40062b02c61SJim Ingham 
40162b02c61SJim Ingham void
40262b02c61SJim Ingham SBBreakpoint::SetQueueName (const char *queue_name)
40362b02c61SJim Ingham {
4042d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4054838131bSGreg Clayton     if (log)
4064838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::SetQueueName (%s)", m_opaque_sp.get(), queue_name);
4076611103cSGreg Clayton     if (m_opaque_sp)
408af67cecdSGreg Clayton     {
409af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
4106611103cSGreg Clayton         m_opaque_sp->GetOptions()->GetThreadSpec()->SetQueueName (queue_name);
41162b02c61SJim Ingham     }
412af67cecdSGreg Clayton }
41362b02c61SJim Ingham 
41462b02c61SJim Ingham const char *
41562b02c61SJim Ingham SBBreakpoint::GetQueueName () const
41662b02c61SJim Ingham {
4174838131bSGreg Clayton     const char *name = NULL;
4186611103cSGreg Clayton     if (m_opaque_sp)
41962b02c61SJim Ingham     {
420af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
421af67cecdSGreg Clayton         const ThreadSpec *thread_spec = m_opaque_sp->GetOptions()->GetThreadSpecNoCreate();
422af67cecdSGreg Clayton         if (thread_spec)
4234838131bSGreg Clayton             name = thread_spec->GetQueueName();
42462b02c61SJim Ingham     }
4252d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4264838131bSGreg Clayton     if (log)
4274838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::GetQueueName () => %s", m_opaque_sp.get(), name);
4284838131bSGreg Clayton 
4294838131bSGreg Clayton     return name;
43062b02c61SJim Ingham }
43162b02c61SJim Ingham 
43230fdc8d8SChris Lattner size_t
43330fdc8d8SChris Lattner SBBreakpoint::GetNumResolvedLocations() const
43430fdc8d8SChris Lattner {
4354838131bSGreg Clayton     size_t num_resolved = 0;
4366611103cSGreg Clayton     if (m_opaque_sp)
437af67cecdSGreg Clayton     {
438af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
4394838131bSGreg Clayton         num_resolved = m_opaque_sp->GetNumResolvedLocations();
440af67cecdSGreg Clayton     }
4412d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4424838131bSGreg Clayton     if (log)
4434838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::GetNumResolvedLocations () => %zu", m_opaque_sp.get(), num_resolved);
4444838131bSGreg Clayton     return num_resolved;
44530fdc8d8SChris Lattner }
44630fdc8d8SChris Lattner 
44730fdc8d8SChris Lattner size_t
44830fdc8d8SChris Lattner SBBreakpoint::GetNumLocations() const
44930fdc8d8SChris Lattner {
4504838131bSGreg Clayton     size_t num_locs = 0;
4516611103cSGreg Clayton     if (m_opaque_sp)
452af67cecdSGreg Clayton     {
453af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
4544838131bSGreg Clayton         num_locs = m_opaque_sp->GetNumLocations();
455af67cecdSGreg Clayton     }
4562d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4574838131bSGreg Clayton     if (log)
4584838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::GetNumLocations () => %zu", m_opaque_sp.get(), num_locs);
4594838131bSGreg Clayton     return num_locs;
46030fdc8d8SChris Lattner }
46130fdc8d8SChris Lattner 
462dde9cff3SCaroline Tice bool
46305faeb71SGreg Clayton SBBreakpoint::GetDescription (SBStream &s)
46430fdc8d8SChris Lattner {
4656611103cSGreg Clayton     if (m_opaque_sp)
46630fdc8d8SChris Lattner     {
467af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
46805faeb71SGreg Clayton         s.Printf("SBBreakpoint: id = %i, ", m_opaque_sp->GetID());
46905faeb71SGreg Clayton         m_opaque_sp->GetResolverDescription (s.get());
47005faeb71SGreg Clayton         m_opaque_sp->GetFilterDescription (s.get());
47105faeb71SGreg Clayton         const size_t num_locations = m_opaque_sp->GetNumLocations ();
47205faeb71SGreg Clayton         s.Printf(", locations = %zu", num_locations);
473dde9cff3SCaroline Tice         return true;
474dde9cff3SCaroline Tice     }
47505faeb71SGreg Clayton     s.Printf ("No value");
47605faeb71SGreg Clayton     return false;
47705faeb71SGreg Clayton }
478dde9cff3SCaroline Tice 
47930fdc8d8SChris Lattner bool
48030fdc8d8SChris Lattner SBBreakpoint::PrivateBreakpointHitCallback
48130fdc8d8SChris Lattner (
48230fdc8d8SChris Lattner     void *baton,
48330fdc8d8SChris Lattner     StoppointCallbackContext *ctx,
48430fdc8d8SChris Lattner     lldb::user_id_t break_id,
48530fdc8d8SChris Lattner     lldb::user_id_t break_loc_id
48630fdc8d8SChris Lattner )
48730fdc8d8SChris Lattner {
4881ac04c30SGreg Clayton     ExecutionContext exe_ctx (ctx->exe_ctx_ref);
4891ac04c30SGreg Clayton     BreakpointSP bp_sp(exe_ctx.GetTargetRef().GetBreakpointList().FindBreakpointByID(break_id));
49030fdc8d8SChris Lattner     if (baton && bp_sp)
49130fdc8d8SChris Lattner     {
49230fdc8d8SChris Lattner         CallbackData *data = (CallbackData *)baton;
49330fdc8d8SChris Lattner         lldb_private::Breakpoint *bp = bp_sp.get();
49430fdc8d8SChris Lattner         if (bp && data->callback)
49530fdc8d8SChris Lattner         {
4961ac04c30SGreg Clayton             Process *process = exe_ctx.GetProcessPtr();
497c14ee32dSGreg Clayton             if (process)
49830fdc8d8SChris Lattner             {
499e1cd1be6SGreg Clayton                 SBProcess sb_process (process->shared_from_this());
50030fdc8d8SChris Lattner                 SBThread sb_thread;
50130fdc8d8SChris Lattner                 SBBreakpointLocation sb_location;
50230fdc8d8SChris Lattner                 assert (bp_sp);
50330fdc8d8SChris Lattner                 sb_location.SetLocation (bp_sp->FindLocationByID (break_loc_id));
5041ac04c30SGreg Clayton                 Thread *thread = exe_ctx.GetThreadPtr();
505c14ee32dSGreg Clayton                 if (thread)
506e1cd1be6SGreg Clayton                     sb_thread.SetThread(thread->shared_from_this());
50730fdc8d8SChris Lattner 
50830fdc8d8SChris Lattner                 return data->callback (data->callback_baton,
50930fdc8d8SChris Lattner                                           sb_process,
51030fdc8d8SChris Lattner                                           sb_thread,
51130fdc8d8SChris Lattner                                           sb_location);
51230fdc8d8SChris Lattner             }
51330fdc8d8SChris Lattner         }
51430fdc8d8SChris Lattner     }
51530fdc8d8SChris Lattner     return true;    // Return true if we should stop at this breakpoint
51630fdc8d8SChris Lattner }
51730fdc8d8SChris Lattner 
51830fdc8d8SChris Lattner void
51930fdc8d8SChris Lattner SBBreakpoint::SetCallback (BreakpointHitCallback callback, void *baton)
52030fdc8d8SChris Lattner {
5212d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
522ceb6b139SCaroline Tice 
523ceb6b139SCaroline Tice     if (log)
5244838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::SetCallback (callback=%p, baton=%p)", m_opaque_sp.get(), callback, baton);
525ceb6b139SCaroline Tice 
526c14ee32dSGreg Clayton     if (m_opaque_sp)
52730fdc8d8SChris Lattner     {
528af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
52930fdc8d8SChris Lattner         BatonSP baton_sp(new SBBreakpointCallbackBaton (callback, baton));
5306611103cSGreg Clayton         m_opaque_sp->SetCallback (SBBreakpoint::PrivateBreakpointHitCallback, baton_sp, false);
53130fdc8d8SChris Lattner     }
53230fdc8d8SChris Lattner }
53330fdc8d8SChris Lattner 
53430fdc8d8SChris Lattner 
53530fdc8d8SChris Lattner lldb_private::Breakpoint *
53630fdc8d8SChris Lattner SBBreakpoint::operator->() const
53730fdc8d8SChris Lattner {
5386611103cSGreg Clayton     return m_opaque_sp.get();
53930fdc8d8SChris Lattner }
54030fdc8d8SChris Lattner 
54130fdc8d8SChris Lattner lldb_private::Breakpoint *
54230fdc8d8SChris Lattner SBBreakpoint::get() const
54330fdc8d8SChris Lattner {
5446611103cSGreg Clayton     return m_opaque_sp.get();
54530fdc8d8SChris Lattner }
54630fdc8d8SChris Lattner 
54730fdc8d8SChris Lattner lldb::BreakpointSP &
54830fdc8d8SChris Lattner SBBreakpoint::operator *()
54930fdc8d8SChris Lattner {
5506611103cSGreg Clayton     return m_opaque_sp;
55130fdc8d8SChris Lattner }
55230fdc8d8SChris Lattner 
55330fdc8d8SChris Lattner const lldb::BreakpointSP &
55430fdc8d8SChris Lattner SBBreakpoint::operator *() const
55530fdc8d8SChris Lattner {
5566611103cSGreg Clayton     return m_opaque_sp;
55730fdc8d8SChris Lattner }
55830fdc8d8SChris Lattner 
559e6bc6cb9SJim Ingham bool
560e6bc6cb9SJim Ingham SBBreakpoint::EventIsBreakpointEvent (const lldb::SBEvent &event)
561e6bc6cb9SJim Ingham {
562e6bc6cb9SJim Ingham     return Breakpoint::BreakpointEventData::GetEventDataFromEvent(event.get()) != NULL;
563e6bc6cb9SJim Ingham 
564e6bc6cb9SJim Ingham }
565e6bc6cb9SJim Ingham 
5669fed0d85SGreg Clayton BreakpointEventType
5679fed0d85SGreg Clayton SBBreakpoint::GetBreakpointEventTypeFromEvent (const SBEvent& event)
5689fed0d85SGreg Clayton {
5699fed0d85SGreg Clayton     if (event.IsValid())
5709fed0d85SGreg Clayton         return Breakpoint::BreakpointEventData::GetBreakpointEventTypeFromEvent (event.GetSP());
5719fed0d85SGreg Clayton     return eBreakpointEventTypeInvalidType;
5729fed0d85SGreg Clayton }
5739fed0d85SGreg Clayton 
5749fed0d85SGreg Clayton SBBreakpoint
5759fed0d85SGreg Clayton SBBreakpoint::GetBreakpointFromEvent (const lldb::SBEvent& event)
5769fed0d85SGreg Clayton {
5779fed0d85SGreg Clayton     SBBreakpoint sb_breakpoint;
5789fed0d85SGreg Clayton     if (event.IsValid())
5799fed0d85SGreg Clayton         sb_breakpoint.m_opaque_sp = Breakpoint::BreakpointEventData::GetBreakpointFromEvent (event.GetSP());
5809fed0d85SGreg Clayton     return sb_breakpoint;
5819fed0d85SGreg Clayton }
5829fed0d85SGreg Clayton 
5839fed0d85SGreg Clayton SBBreakpointLocation
5849fed0d85SGreg Clayton SBBreakpoint::GetBreakpointLocationAtIndexFromEvent (const lldb::SBEvent& event, uint32_t loc_idx)
5859fed0d85SGreg Clayton {
5869fed0d85SGreg Clayton     SBBreakpointLocation sb_breakpoint_loc;
5879fed0d85SGreg Clayton     if (event.IsValid())
5889fed0d85SGreg Clayton         sb_breakpoint_loc.SetLocation (Breakpoint::BreakpointEventData::GetBreakpointLocationAtIndexFromEvent (event.GetSP(), loc_idx));
5899fed0d85SGreg Clayton     return sb_breakpoint_loc;
5909fed0d85SGreg Clayton }
5919fed0d85SGreg Clayton 
592e6bc6cb9SJim Ingham uint32_t
593e6bc6cb9SJim Ingham SBBreakpoint::GetNumBreakpointLocationsFromEvent (const lldb::SBEvent &event)
594e6bc6cb9SJim Ingham {
595e6bc6cb9SJim Ingham     uint32_t num_locations = 0;
596e6bc6cb9SJim Ingham     if (event.IsValid())
597e6bc6cb9SJim Ingham         num_locations = (Breakpoint::BreakpointEventData::GetNumBreakpointLocationsFromEvent (event.GetSP()));
598e6bc6cb9SJim Ingham     return num_locations;
599e6bc6cb9SJim Ingham }
600e6bc6cb9SJim Ingham 
6019fed0d85SGreg Clayton 
602