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 {
1276611103cSGreg Clayton     return 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             {
15430fdc8d8SChris Lattner                 address.SetSection (NULL);
15530fdc8d8SChris Lattner                 address.SetOffset (vm_addr);
15630fdc8d8SChris Lattner             }
1576611103cSGreg Clayton             sb_bp_location.SetLocation (m_opaque_sp->FindLocationByAddress (address));
15830fdc8d8SChris Lattner         }
15930fdc8d8SChris Lattner     }
16030fdc8d8SChris Lattner     return sb_bp_location;
16130fdc8d8SChris Lattner }
16230fdc8d8SChris Lattner 
16330fdc8d8SChris Lattner break_id_t
16430fdc8d8SChris Lattner SBBreakpoint::FindLocationIDByAddress (addr_t vm_addr)
16530fdc8d8SChris Lattner {
166af67cecdSGreg Clayton     break_id_t break_id = LLDB_INVALID_BREAK_ID;
16730fdc8d8SChris Lattner 
168af67cecdSGreg Clayton     if (m_opaque_sp && vm_addr != LLDB_INVALID_ADDRESS)
16930fdc8d8SChris Lattner     {
170af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
17130fdc8d8SChris Lattner         Address address;
172f5e56de0SGreg Clayton         Target &target = m_opaque_sp->GetTarget();
173f5e56de0SGreg Clayton         if (target.GetSectionLoadList().ResolveLoadAddress (vm_addr, address) == false)
17430fdc8d8SChris Lattner         {
17530fdc8d8SChris Lattner             address.SetSection (NULL);
17630fdc8d8SChris Lattner             address.SetOffset (vm_addr);
17730fdc8d8SChris Lattner         }
178af67cecdSGreg Clayton         break_id = m_opaque_sp->FindLocationIDByAddress (address);
17930fdc8d8SChris Lattner     }
18030fdc8d8SChris Lattner 
181af67cecdSGreg Clayton     return break_id;
18230fdc8d8SChris Lattner }
18330fdc8d8SChris Lattner 
18430fdc8d8SChris Lattner SBBreakpointLocation
18530fdc8d8SChris Lattner SBBreakpoint::FindLocationByID (break_id_t bp_loc_id)
18630fdc8d8SChris Lattner {
18730fdc8d8SChris Lattner     SBBreakpointLocation sb_bp_location;
18830fdc8d8SChris Lattner 
1896611103cSGreg Clayton     if (m_opaque_sp)
190af67cecdSGreg Clayton     {
191af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
1926611103cSGreg Clayton         sb_bp_location.SetLocation (m_opaque_sp->FindLocationByID (bp_loc_id));
193af67cecdSGreg Clayton     }
19430fdc8d8SChris Lattner 
19530fdc8d8SChris Lattner     return sb_bp_location;
19630fdc8d8SChris Lattner }
19730fdc8d8SChris Lattner 
19830fdc8d8SChris Lattner SBBreakpointLocation
19930fdc8d8SChris Lattner SBBreakpoint::GetLocationAtIndex (uint32_t index)
20030fdc8d8SChris Lattner {
20130fdc8d8SChris Lattner     SBBreakpointLocation sb_bp_location;
20230fdc8d8SChris Lattner 
2036611103cSGreg Clayton     if (m_opaque_sp)
204af67cecdSGreg Clayton     {
205af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
2066611103cSGreg Clayton         sb_bp_location.SetLocation (m_opaque_sp->GetLocationAtIndex (index));
207af67cecdSGreg Clayton     }
20830fdc8d8SChris Lattner 
20930fdc8d8SChris Lattner     return sb_bp_location;
21030fdc8d8SChris Lattner }
21130fdc8d8SChris Lattner 
21230fdc8d8SChris Lattner void
21330fdc8d8SChris Lattner SBBreakpoint::SetEnabled (bool enable)
21430fdc8d8SChris Lattner {
2152d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
216ceb6b139SCaroline Tice 
217ceb6b139SCaroline Tice     if (log)
2184838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::SetEnabled (enabled=%i)", m_opaque_sp.get(), enable);
219ceb6b139SCaroline Tice 
2206611103cSGreg Clayton     if (m_opaque_sp)
221af67cecdSGreg Clayton     {
222af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
2236611103cSGreg Clayton         m_opaque_sp->SetEnabled (enable);
22430fdc8d8SChris Lattner     }
225af67cecdSGreg Clayton }
22630fdc8d8SChris Lattner 
22730fdc8d8SChris Lattner bool
22830fdc8d8SChris Lattner SBBreakpoint::IsEnabled ()
22930fdc8d8SChris Lattner {
2306611103cSGreg Clayton     if (m_opaque_sp)
231af67cecdSGreg Clayton     {
232af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
2336611103cSGreg Clayton         return m_opaque_sp->IsEnabled();
234af67cecdSGreg Clayton     }
23530fdc8d8SChris Lattner     else
23630fdc8d8SChris Lattner         return false;
23730fdc8d8SChris Lattner }
23830fdc8d8SChris Lattner 
23930fdc8d8SChris Lattner void
240c982c768SGreg Clayton SBBreakpoint::SetIgnoreCount (uint32_t count)
24130fdc8d8SChris Lattner {
2422d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
243ceb6b139SCaroline Tice 
244ceb6b139SCaroline Tice     if (log)
2454838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::SetIgnoreCount (count=%u)", m_opaque_sp.get(), count);
246ceb6b139SCaroline Tice 
2476611103cSGreg Clayton     if (m_opaque_sp)
248af67cecdSGreg Clayton     {
249af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
2506611103cSGreg Clayton         m_opaque_sp->SetIgnoreCount (count);
25130fdc8d8SChris Lattner     }
252af67cecdSGreg Clayton }
25330fdc8d8SChris Lattner 
254041a12fcSJim Ingham void
255041a12fcSJim Ingham SBBreakpoint::SetCondition (const char *condition)
256041a12fcSJim Ingham {
257af67cecdSGreg Clayton     if (m_opaque_sp)
258af67cecdSGreg Clayton     {
259af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
260041a12fcSJim Ingham         m_opaque_sp->SetCondition (condition);
261041a12fcSJim Ingham     }
262af67cecdSGreg Clayton }
263041a12fcSJim Ingham 
264041a12fcSJim Ingham const char *
265041a12fcSJim Ingham SBBreakpoint::GetCondition ()
266041a12fcSJim Ingham {
267af67cecdSGreg Clayton     if (m_opaque_sp)
268af67cecdSGreg Clayton     {
269af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
270041a12fcSJim Ingham         return m_opaque_sp->GetConditionText ();
271041a12fcSJim Ingham     }
272af67cecdSGreg Clayton     return NULL;
273af67cecdSGreg Clayton }
274041a12fcSJim Ingham 
275c982c768SGreg Clayton uint32_t
2769fed0d85SGreg Clayton SBBreakpoint::GetHitCount () const
2779fed0d85SGreg Clayton {
2784838131bSGreg Clayton     uint32_t count = 0;
2799fed0d85SGreg Clayton     if (m_opaque_sp)
280af67cecdSGreg Clayton     {
281af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
2824838131bSGreg Clayton         count = m_opaque_sp->GetHitCount();
283af67cecdSGreg Clayton     }
2844838131bSGreg Clayton 
2852d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
286ceb6b139SCaroline Tice     if (log)
2874838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::GetHitCount () => %u", m_opaque_sp.get(), count);
2884838131bSGreg Clayton 
2894838131bSGreg Clayton     return count;
290ceb6b139SCaroline Tice }
2919fed0d85SGreg Clayton 
2929fed0d85SGreg Clayton uint32_t
29330fdc8d8SChris Lattner SBBreakpoint::GetIgnoreCount () const
29430fdc8d8SChris Lattner {
2954838131bSGreg Clayton     uint32_t count = 0;
2966611103cSGreg Clayton     if (m_opaque_sp)
297af67cecdSGreg Clayton     {
298af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
2994838131bSGreg Clayton         count = m_opaque_sp->GetIgnoreCount();
300af67cecdSGreg Clayton     }
3014838131bSGreg Clayton 
3022d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3034838131bSGreg Clayton     if (log)
3044838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::GetIgnoreCount () => %u", m_opaque_sp.get(), count);
3054838131bSGreg Clayton 
3064838131bSGreg Clayton     return count;
30730fdc8d8SChris Lattner }
30830fdc8d8SChris Lattner 
30930fdc8d8SChris Lattner void
3104838131bSGreg Clayton SBBreakpoint::SetThreadID (tid_t tid)
31130fdc8d8SChris Lattner {
3126611103cSGreg Clayton     if (m_opaque_sp)
313af67cecdSGreg Clayton     {
314af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
3154838131bSGreg Clayton         m_opaque_sp->SetThreadID (tid);
316af67cecdSGreg Clayton     }
3172d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3184838131bSGreg Clayton     if (log)
31961e7a58cSGreg Clayton         log->Printf ("SBBreakpoint(%p)::SetThreadID (tid=0x%4.4llx)", m_opaque_sp.get(), tid);
3204838131bSGreg Clayton 
32130fdc8d8SChris Lattner }
32230fdc8d8SChris Lattner 
32330fdc8d8SChris Lattner tid_t
32430fdc8d8SChris Lattner SBBreakpoint::GetThreadID ()
32530fdc8d8SChris Lattner {
3264838131bSGreg Clayton     tid_t tid = LLDB_INVALID_THREAD_ID;
3276611103cSGreg Clayton     if (m_opaque_sp)
328af67cecdSGreg Clayton     {
329af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
3304838131bSGreg Clayton         tid = m_opaque_sp->GetThreadID();
331af67cecdSGreg Clayton     }
33230fdc8d8SChris Lattner 
3332d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3344838131bSGreg Clayton     if (log)
33561e7a58cSGreg Clayton         log->Printf ("SBBreakpoint(%p)::GetThreadID () => 0x%4.4llx", m_opaque_sp.get(), tid);
3364838131bSGreg Clayton     return tid;
33730fdc8d8SChris Lattner }
33830fdc8d8SChris Lattner 
33962b02c61SJim Ingham void
34062b02c61SJim Ingham SBBreakpoint::SetThreadIndex (uint32_t index)
34162b02c61SJim Ingham {
3422d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3434838131bSGreg Clayton     if (log)
3444838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::SetThreadIndex (%u)", m_opaque_sp.get(), index);
3456611103cSGreg Clayton     if (m_opaque_sp)
346af67cecdSGreg Clayton     {
347af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
3486611103cSGreg Clayton         m_opaque_sp->GetOptions()->GetThreadSpec()->SetIndex (index);
34962b02c61SJim Ingham     }
350af67cecdSGreg Clayton }
35162b02c61SJim Ingham 
35262b02c61SJim Ingham uint32_t
35362b02c61SJim Ingham SBBreakpoint::GetThreadIndex() const
35462b02c61SJim Ingham {
355bdf4c6acSGreg Clayton     uint32_t thread_idx = UINT32_MAX;
3566611103cSGreg Clayton     if (m_opaque_sp)
35762b02c61SJim Ingham     {
358af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
359af67cecdSGreg Clayton         const ThreadSpec *thread_spec = m_opaque_sp->GetOptions()->GetThreadSpecNoCreate();
360763d1a17SJohnny Chen         if (thread_spec != NULL)
3614838131bSGreg Clayton             thread_idx = thread_spec->GetIndex();
36262b02c61SJim Ingham     }
3632d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3644838131bSGreg Clayton     if (log)
365bdf4c6acSGreg Clayton         log->Printf ("SBBreakpoint(%p)::GetThreadIndex () => %u", m_opaque_sp.get(), thread_idx);
3664838131bSGreg Clayton 
367763d1a17SJohnny Chen     return thread_idx;
36862b02c61SJim Ingham }
36962b02c61SJim Ingham 
37062b02c61SJim Ingham 
37162b02c61SJim Ingham void
37262b02c61SJim Ingham SBBreakpoint::SetThreadName (const char *thread_name)
37362b02c61SJim Ingham {
3742d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3754838131bSGreg Clayton     if (log)
3764838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::SetThreadName (%s)", m_opaque_sp.get(), thread_name);
3774838131bSGreg Clayton 
3786611103cSGreg Clayton     if (m_opaque_sp)
379af67cecdSGreg Clayton     {
380af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
3816611103cSGreg Clayton         m_opaque_sp->GetOptions()->GetThreadSpec()->SetName (thread_name);
38262b02c61SJim Ingham     }
383af67cecdSGreg Clayton }
38462b02c61SJim Ingham 
38562b02c61SJim Ingham const char *
38662b02c61SJim Ingham SBBreakpoint::GetThreadName () const
38762b02c61SJim Ingham {
3884838131bSGreg Clayton     const char *name = NULL;
3896611103cSGreg Clayton     if (m_opaque_sp)
39062b02c61SJim Ingham     {
391af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
392af67cecdSGreg Clayton         const ThreadSpec *thread_spec = m_opaque_sp->GetOptions()->GetThreadSpecNoCreate();
393763d1a17SJohnny Chen         if (thread_spec != NULL)
3944838131bSGreg Clayton             name = thread_spec->GetName();
39562b02c61SJim Ingham     }
3962d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3974838131bSGreg Clayton     if (log)
3984838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::GetThreadName () => %s", m_opaque_sp.get(), name);
3994838131bSGreg Clayton 
4004838131bSGreg Clayton     return name;
40162b02c61SJim Ingham }
40262b02c61SJim Ingham 
40362b02c61SJim Ingham void
40462b02c61SJim Ingham SBBreakpoint::SetQueueName (const char *queue_name)
40562b02c61SJim Ingham {
4062d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4074838131bSGreg Clayton     if (log)
4084838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::SetQueueName (%s)", m_opaque_sp.get(), queue_name);
4096611103cSGreg Clayton     if (m_opaque_sp)
410af67cecdSGreg Clayton     {
411af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
4126611103cSGreg Clayton         m_opaque_sp->GetOptions()->GetThreadSpec()->SetQueueName (queue_name);
41362b02c61SJim Ingham     }
414af67cecdSGreg Clayton }
41562b02c61SJim Ingham 
41662b02c61SJim Ingham const char *
41762b02c61SJim Ingham SBBreakpoint::GetQueueName () const
41862b02c61SJim Ingham {
4194838131bSGreg Clayton     const char *name = NULL;
4206611103cSGreg Clayton     if (m_opaque_sp)
42162b02c61SJim Ingham     {
422af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
423af67cecdSGreg Clayton         const ThreadSpec *thread_spec = m_opaque_sp->GetOptions()->GetThreadSpecNoCreate();
424af67cecdSGreg Clayton         if (thread_spec)
4254838131bSGreg Clayton             name = thread_spec->GetQueueName();
42662b02c61SJim Ingham     }
4272d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4284838131bSGreg Clayton     if (log)
4294838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::GetQueueName () => %s", m_opaque_sp.get(), name);
4304838131bSGreg Clayton 
4314838131bSGreg Clayton     return name;
43262b02c61SJim Ingham }
43362b02c61SJim Ingham 
43430fdc8d8SChris Lattner size_t
43530fdc8d8SChris Lattner SBBreakpoint::GetNumResolvedLocations() const
43630fdc8d8SChris Lattner {
4374838131bSGreg Clayton     size_t num_resolved = 0;
4386611103cSGreg Clayton     if (m_opaque_sp)
439af67cecdSGreg Clayton     {
440af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
4414838131bSGreg Clayton         num_resolved = m_opaque_sp->GetNumResolvedLocations();
442af67cecdSGreg Clayton     }
4432d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4444838131bSGreg Clayton     if (log)
4454838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::GetNumResolvedLocations () => %zu", m_opaque_sp.get(), num_resolved);
4464838131bSGreg Clayton     return num_resolved;
44730fdc8d8SChris Lattner }
44830fdc8d8SChris Lattner 
44930fdc8d8SChris Lattner size_t
45030fdc8d8SChris Lattner SBBreakpoint::GetNumLocations() const
45130fdc8d8SChris Lattner {
4524838131bSGreg Clayton     size_t num_locs = 0;
4536611103cSGreg Clayton     if (m_opaque_sp)
454af67cecdSGreg Clayton     {
455af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
4564838131bSGreg Clayton         num_locs = m_opaque_sp->GetNumLocations();
457af67cecdSGreg Clayton     }
4582d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4594838131bSGreg Clayton     if (log)
4604838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::GetNumLocations () => %zu", m_opaque_sp.get(), num_locs);
4614838131bSGreg Clayton     return num_locs;
46230fdc8d8SChris Lattner }
46330fdc8d8SChris Lattner 
464dde9cff3SCaroline Tice bool
46505faeb71SGreg Clayton SBBreakpoint::GetDescription (SBStream &s)
46630fdc8d8SChris Lattner {
4676611103cSGreg Clayton     if (m_opaque_sp)
46830fdc8d8SChris Lattner     {
469af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
47005faeb71SGreg Clayton         s.Printf("SBBreakpoint: id = %i, ", m_opaque_sp->GetID());
47105faeb71SGreg Clayton         m_opaque_sp->GetResolverDescription (s.get());
47205faeb71SGreg Clayton         m_opaque_sp->GetFilterDescription (s.get());
47305faeb71SGreg Clayton         const size_t num_locations = m_opaque_sp->GetNumLocations ();
47405faeb71SGreg Clayton         s.Printf(", locations = %zu", num_locations);
475dde9cff3SCaroline Tice         return true;
476dde9cff3SCaroline Tice     }
47705faeb71SGreg Clayton     s.Printf ("No value");
47805faeb71SGreg Clayton     return false;
47905faeb71SGreg Clayton }
480dde9cff3SCaroline Tice 
48130fdc8d8SChris Lattner bool
48230fdc8d8SChris Lattner SBBreakpoint::PrivateBreakpointHitCallback
48330fdc8d8SChris Lattner (
48430fdc8d8SChris Lattner     void *baton,
48530fdc8d8SChris Lattner     StoppointCallbackContext *ctx,
48630fdc8d8SChris Lattner     lldb::user_id_t break_id,
48730fdc8d8SChris Lattner     lldb::user_id_t break_loc_id
48830fdc8d8SChris Lattner )
48930fdc8d8SChris Lattner {
490c14ee32dSGreg Clayton     BreakpointSP bp_sp(ctx->exe_ctx.GetTargetRef().GetBreakpointList().FindBreakpointByID(break_id));
49130fdc8d8SChris Lattner     if (baton && bp_sp)
49230fdc8d8SChris Lattner     {
49330fdc8d8SChris Lattner         CallbackData *data = (CallbackData *)baton;
49430fdc8d8SChris Lattner         lldb_private::Breakpoint *bp = bp_sp.get();
49530fdc8d8SChris Lattner         if (bp && data->callback)
49630fdc8d8SChris Lattner         {
497c14ee32dSGreg Clayton             Process *process = ctx->exe_ctx.GetProcessPtr();
498c14ee32dSGreg Clayton             if (process)
49930fdc8d8SChris Lattner             {
500*e1cd1be6SGreg Clayton                 SBProcess sb_process (process->shared_from_this());
50130fdc8d8SChris Lattner                 SBThread sb_thread;
50230fdc8d8SChris Lattner                 SBBreakpointLocation sb_location;
50330fdc8d8SChris Lattner                 assert (bp_sp);
50430fdc8d8SChris Lattner                 sb_location.SetLocation (bp_sp->FindLocationByID (break_loc_id));
505c14ee32dSGreg Clayton                 Thread *thread = ctx->exe_ctx.GetThreadPtr();
506c14ee32dSGreg Clayton                 if (thread)
507*e1cd1be6SGreg Clayton                     sb_thread.SetThread(thread->shared_from_this());
50830fdc8d8SChris Lattner 
50930fdc8d8SChris Lattner                 return data->callback (data->callback_baton,
51030fdc8d8SChris Lattner                                           sb_process,
51130fdc8d8SChris Lattner                                           sb_thread,
51230fdc8d8SChris Lattner                                           sb_location);
51330fdc8d8SChris Lattner             }
51430fdc8d8SChris Lattner         }
51530fdc8d8SChris Lattner     }
51630fdc8d8SChris Lattner     return true;    // Return true if we should stop at this breakpoint
51730fdc8d8SChris Lattner }
51830fdc8d8SChris Lattner 
51930fdc8d8SChris Lattner void
52030fdc8d8SChris Lattner SBBreakpoint::SetCallback (BreakpointHitCallback callback, void *baton)
52130fdc8d8SChris Lattner {
5222d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
523ceb6b139SCaroline Tice 
524ceb6b139SCaroline Tice     if (log)
5254838131bSGreg Clayton         log->Printf ("SBBreakpoint(%p)::SetCallback (callback=%p, baton=%p)", m_opaque_sp.get(), callback, baton);
526ceb6b139SCaroline Tice 
527c14ee32dSGreg Clayton     if (m_opaque_sp)
52830fdc8d8SChris Lattner     {
529af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
53030fdc8d8SChris Lattner         BatonSP baton_sp(new SBBreakpointCallbackBaton (callback, baton));
5316611103cSGreg Clayton         m_opaque_sp->SetCallback (SBBreakpoint::PrivateBreakpointHitCallback, baton_sp, false);
53230fdc8d8SChris Lattner     }
53330fdc8d8SChris Lattner }
53430fdc8d8SChris Lattner 
53530fdc8d8SChris Lattner 
53630fdc8d8SChris Lattner lldb_private::Breakpoint *
53730fdc8d8SChris Lattner SBBreakpoint::operator->() const
53830fdc8d8SChris Lattner {
5396611103cSGreg Clayton     return m_opaque_sp.get();
54030fdc8d8SChris Lattner }
54130fdc8d8SChris Lattner 
54230fdc8d8SChris Lattner lldb_private::Breakpoint *
54330fdc8d8SChris Lattner SBBreakpoint::get() const
54430fdc8d8SChris Lattner {
5456611103cSGreg Clayton     return m_opaque_sp.get();
54630fdc8d8SChris Lattner }
54730fdc8d8SChris Lattner 
54830fdc8d8SChris Lattner lldb::BreakpointSP &
54930fdc8d8SChris Lattner SBBreakpoint::operator *()
55030fdc8d8SChris Lattner {
5516611103cSGreg Clayton     return m_opaque_sp;
55230fdc8d8SChris Lattner }
55330fdc8d8SChris Lattner 
55430fdc8d8SChris Lattner const lldb::BreakpointSP &
55530fdc8d8SChris Lattner SBBreakpoint::operator *() const
55630fdc8d8SChris Lattner {
5576611103cSGreg Clayton     return m_opaque_sp;
55830fdc8d8SChris Lattner }
55930fdc8d8SChris Lattner 
5609fed0d85SGreg Clayton BreakpointEventType
5619fed0d85SGreg Clayton SBBreakpoint::GetBreakpointEventTypeFromEvent (const SBEvent& event)
5629fed0d85SGreg Clayton {
5639fed0d85SGreg Clayton     if (event.IsValid())
5649fed0d85SGreg Clayton         return Breakpoint::BreakpointEventData::GetBreakpointEventTypeFromEvent (event.GetSP());
5659fed0d85SGreg Clayton     return eBreakpointEventTypeInvalidType;
5669fed0d85SGreg Clayton }
5679fed0d85SGreg Clayton 
5689fed0d85SGreg Clayton SBBreakpoint
5699fed0d85SGreg Clayton SBBreakpoint::GetBreakpointFromEvent (const lldb::SBEvent& event)
5709fed0d85SGreg Clayton {
5719fed0d85SGreg Clayton     SBBreakpoint sb_breakpoint;
5729fed0d85SGreg Clayton     if (event.IsValid())
5739fed0d85SGreg Clayton         sb_breakpoint.m_opaque_sp = Breakpoint::BreakpointEventData::GetBreakpointFromEvent (event.GetSP());
5749fed0d85SGreg Clayton     return sb_breakpoint;
5759fed0d85SGreg Clayton }
5769fed0d85SGreg Clayton 
5779fed0d85SGreg Clayton SBBreakpointLocation
5789fed0d85SGreg Clayton SBBreakpoint::GetBreakpointLocationAtIndexFromEvent (const lldb::SBEvent& event, uint32_t loc_idx)
5799fed0d85SGreg Clayton {
5809fed0d85SGreg Clayton     SBBreakpointLocation sb_breakpoint_loc;
5819fed0d85SGreg Clayton     if (event.IsValid())
5829fed0d85SGreg Clayton         sb_breakpoint_loc.SetLocation (Breakpoint::BreakpointEventData::GetBreakpointLocationAtIndexFromEvent (event.GetSP(), loc_idx));
5839fed0d85SGreg Clayton     return sb_breakpoint_loc;
5849fed0d85SGreg Clayton }
5859fed0d85SGreg Clayton 
5869fed0d85SGreg Clayton 
587