130fdc8d8SChris Lattner //===-- SBBreakpointLocation.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/SBBreakpointLocation.h"
1130fdc8d8SChris Lattner #include "lldb/API/SBDefines.h"
1230fdc8d8SChris Lattner #include "lldb/API/SBDebugger.h"
13dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
1430fdc8d8SChris Lattner 
1530fdc8d8SChris Lattner #include "lldb/lldb-types.h"
1630fdc8d8SChris Lattner #include "lldb/lldb-defines.h"
174e78f606SGreg Clayton #include "lldb/Breakpoint/Breakpoint.h"
1830fdc8d8SChris Lattner #include "lldb/Breakpoint/BreakpointLocation.h"
191b54c88cSJim Ingham #include "lldb/Target/ThreadSpec.h"
20ceb6b139SCaroline Tice #include "lldb/Core/Log.h"
2130fdc8d8SChris Lattner #include "lldb/Core/Stream.h"
2230fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
23*af67cecdSGreg Clayton #include "lldb/Target/Target.h"
2462b02c61SJim Ingham #include "lldb/Target/ThreadSpec.h"
2530fdc8d8SChris Lattner 
2630fdc8d8SChris Lattner using namespace lldb;
2730fdc8d8SChris Lattner using namespace lldb_private;
2830fdc8d8SChris Lattner 
2930fdc8d8SChris Lattner 
30efabb123SGreg Clayton SBBreakpointLocation::SBBreakpointLocation () :
31efabb123SGreg Clayton     m_opaque_sp ()
3230fdc8d8SChris Lattner {
3330fdc8d8SChris Lattner }
3430fdc8d8SChris Lattner 
3530fdc8d8SChris Lattner SBBreakpointLocation::SBBreakpointLocation (const lldb::BreakpointLocationSP &break_loc_sp) :
366611103cSGreg Clayton     m_opaque_sp (break_loc_sp)
3730fdc8d8SChris Lattner {
382d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
39ceb6b139SCaroline Tice 
40ceb6b139SCaroline Tice     if (log)
41ceb6b139SCaroline Tice     {
42ceb6b139SCaroline Tice         SBStream sstr;
43ceb6b139SCaroline Tice         GetDescription (lldb::eDescriptionLevelBrief, sstr);
44750cd175SCaroline Tice         log->Printf ("SBBreakpointLocation::SBBreakpointLocaiton (const lldb::BreakpointLocationsSP &break_loc_sp"
45750cd175SCaroline Tice                      "=%p)  => this.sp = %p (%s)", break_loc_sp.get(), m_opaque_sp.get(), sstr.GetData());
46ceb6b139SCaroline Tice     }
4730fdc8d8SChris Lattner }
4830fdc8d8SChris Lattner 
49efabb123SGreg Clayton SBBreakpointLocation::SBBreakpointLocation(const SBBreakpointLocation &rhs) :
50efabb123SGreg Clayton     m_opaque_sp (rhs.m_opaque_sp)
51efabb123SGreg Clayton {
52efabb123SGreg Clayton }
53efabb123SGreg Clayton 
54efabb123SGreg Clayton const SBBreakpointLocation &
55efabb123SGreg Clayton SBBreakpointLocation::operator = (const SBBreakpointLocation &rhs)
56efabb123SGreg Clayton {
57efabb123SGreg Clayton     if (this != &rhs)
58efabb123SGreg Clayton         m_opaque_sp = rhs.m_opaque_sp;
59efabb123SGreg Clayton     return *this;
60efabb123SGreg Clayton }
61efabb123SGreg Clayton 
62efabb123SGreg Clayton 
6330fdc8d8SChris Lattner SBBreakpointLocation::~SBBreakpointLocation ()
6430fdc8d8SChris Lattner {
6530fdc8d8SChris Lattner }
6630fdc8d8SChris Lattner 
6730fdc8d8SChris Lattner bool
6830fdc8d8SChris Lattner SBBreakpointLocation::IsValid() const
6930fdc8d8SChris Lattner {
706611103cSGreg Clayton     return m_opaque_sp.get() != NULL;
7130fdc8d8SChris Lattner }
7230fdc8d8SChris Lattner 
7330fdc8d8SChris Lattner addr_t
7430fdc8d8SChris Lattner SBBreakpointLocation::GetLoadAddress ()
7530fdc8d8SChris Lattner {
7630fdc8d8SChris Lattner     addr_t ret_addr = LLDB_INVALID_ADDRESS;
7730fdc8d8SChris Lattner 
786611103cSGreg Clayton     if (m_opaque_sp)
7930fdc8d8SChris Lattner     {
80*af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
816611103cSGreg Clayton         ret_addr = m_opaque_sp->GetLoadAddress();
8230fdc8d8SChris Lattner     }
8330fdc8d8SChris Lattner 
8430fdc8d8SChris Lattner     return ret_addr;
8530fdc8d8SChris Lattner }
8630fdc8d8SChris Lattner 
8730fdc8d8SChris Lattner void
8830fdc8d8SChris Lattner SBBreakpointLocation::SetEnabled (bool enabled)
8930fdc8d8SChris Lattner {
906611103cSGreg Clayton     if (m_opaque_sp)
9130fdc8d8SChris Lattner     {
92*af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
936611103cSGreg Clayton         m_opaque_sp->SetEnabled (enabled);
9430fdc8d8SChris Lattner     }
9530fdc8d8SChris Lattner }
9630fdc8d8SChris Lattner 
9730fdc8d8SChris Lattner bool
9830fdc8d8SChris Lattner SBBreakpointLocation::IsEnabled ()
9930fdc8d8SChris Lattner {
1006611103cSGreg Clayton     if (m_opaque_sp)
101*af67cecdSGreg Clayton     {
102*af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
1036611103cSGreg Clayton         return m_opaque_sp->IsEnabled();
104*af67cecdSGreg Clayton     }
10530fdc8d8SChris Lattner     else
10630fdc8d8SChris Lattner         return false;
10730fdc8d8SChris Lattner }
10830fdc8d8SChris Lattner 
109c982c768SGreg Clayton uint32_t
11030fdc8d8SChris Lattner SBBreakpointLocation::GetIgnoreCount ()
11130fdc8d8SChris Lattner {
1126611103cSGreg Clayton     if (m_opaque_sp)
113*af67cecdSGreg Clayton     {
114*af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
1156611103cSGreg Clayton         return m_opaque_sp->GetIgnoreCount();
116*af67cecdSGreg Clayton     }
11730fdc8d8SChris Lattner     else
11830fdc8d8SChris Lattner         return 0;
11930fdc8d8SChris Lattner }
12030fdc8d8SChris Lattner 
12130fdc8d8SChris Lattner void
122c982c768SGreg Clayton SBBreakpointLocation::SetIgnoreCount (uint32_t n)
12330fdc8d8SChris Lattner {
1246611103cSGreg Clayton     if (m_opaque_sp)
125*af67cecdSGreg Clayton     {
126*af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
1276611103cSGreg Clayton         m_opaque_sp->SetIgnoreCount (n);
12830fdc8d8SChris Lattner     }
129*af67cecdSGreg Clayton }
13030fdc8d8SChris Lattner 
13130fdc8d8SChris Lattner void
132041a12fcSJim Ingham SBBreakpointLocation::SetCondition (const char *condition)
133041a12fcSJim Ingham {
134*af67cecdSGreg Clayton     if (m_opaque_sp)
135*af67cecdSGreg Clayton     {
136*af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
137041a12fcSJim Ingham         m_opaque_sp->SetCondition (condition);
138041a12fcSJim Ingham     }
139*af67cecdSGreg Clayton }
140041a12fcSJim Ingham 
141041a12fcSJim Ingham const char *
142041a12fcSJim Ingham SBBreakpointLocation::GetCondition ()
143041a12fcSJim Ingham {
144*af67cecdSGreg Clayton     if (m_opaque_sp)
145*af67cecdSGreg Clayton     {
146*af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
147041a12fcSJim Ingham         return m_opaque_sp->GetConditionText ();
148041a12fcSJim Ingham     }
149*af67cecdSGreg Clayton     return NULL;
150*af67cecdSGreg Clayton }
151041a12fcSJim Ingham 
152041a12fcSJim Ingham void
15330fdc8d8SChris Lattner SBBreakpointLocation::SetThreadID (tid_t thread_id)
15430fdc8d8SChris Lattner {
1556611103cSGreg Clayton     if (m_opaque_sp)
156*af67cecdSGreg Clayton     {
157*af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
1586611103cSGreg Clayton         m_opaque_sp->SetThreadID (thread_id);
15930fdc8d8SChris Lattner     }
160*af67cecdSGreg Clayton }
16130fdc8d8SChris Lattner 
16230fdc8d8SChris Lattner tid_t
16330fdc8d8SChris Lattner SBBreakpointLocation::GetThreadID ()
16430fdc8d8SChris Lattner {
165*af67cecdSGreg Clayton     tid_t tid = LLDB_INVALID_THREAD_ID;
1666611103cSGreg Clayton     if (m_opaque_sp)
167*af67cecdSGreg Clayton     {
168*af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
169*af67cecdSGreg Clayton         const ThreadSpec *thread_spec = m_opaque_sp->GetLocationOptions()->GetThreadSpecNoCreate();
170*af67cecdSGreg Clayton         if (thread_spec)
171*af67cecdSGreg Clayton             tid = thread_spec->GetTID();
172*af67cecdSGreg Clayton     }
173*af67cecdSGreg Clayton     return tid;
17430fdc8d8SChris Lattner }
17530fdc8d8SChris Lattner 
17662b02c61SJim Ingham void
17762b02c61SJim Ingham SBBreakpointLocation::SetThreadIndex (uint32_t index)
17862b02c61SJim Ingham {
1796611103cSGreg Clayton     if (m_opaque_sp)
180*af67cecdSGreg Clayton     {
181*af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
1826611103cSGreg Clayton         m_opaque_sp->GetLocationOptions()->GetThreadSpec()->SetIndex (index);
18362b02c61SJim Ingham     }
184*af67cecdSGreg Clayton }
18562b02c61SJim Ingham 
18662b02c61SJim Ingham uint32_t
18762b02c61SJim Ingham SBBreakpointLocation::GetThreadIndex() const
18862b02c61SJim Ingham {
189*af67cecdSGreg Clayton     uint32_t thread_idx = UINT32_MAX;
1906611103cSGreg Clayton     if (m_opaque_sp)
19162b02c61SJim Ingham     {
192*af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
1936611103cSGreg Clayton         const ThreadSpec *thread_spec = m_opaque_sp->GetOptionsNoCreate()->GetThreadSpecNoCreate();
194*af67cecdSGreg Clayton         if (thread_spec)
195*af67cecdSGreg Clayton             thread_idx = thread_spec->GetIndex();
19662b02c61SJim Ingham     }
197*af67cecdSGreg Clayton     return thread_idx;
19862b02c61SJim Ingham }
19962b02c61SJim Ingham 
20062b02c61SJim Ingham 
20162b02c61SJim Ingham void
20262b02c61SJim Ingham SBBreakpointLocation::SetThreadName (const char *thread_name)
20362b02c61SJim Ingham {
2046611103cSGreg Clayton     if (m_opaque_sp)
205*af67cecdSGreg Clayton     {
206*af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
2076611103cSGreg Clayton         m_opaque_sp->GetLocationOptions()->GetThreadSpec()->SetName (thread_name);
20862b02c61SJim Ingham     }
209*af67cecdSGreg Clayton }
21062b02c61SJim Ingham 
21162b02c61SJim Ingham const char *
21262b02c61SJim Ingham SBBreakpointLocation::GetThreadName () const
21362b02c61SJim Ingham {
2146611103cSGreg Clayton     if (m_opaque_sp)
21562b02c61SJim Ingham     {
216*af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
2176611103cSGreg Clayton         const ThreadSpec *thread_spec = m_opaque_sp->GetOptionsNoCreate()->GetThreadSpecNoCreate();
218*af67cecdSGreg Clayton         if (thread_spec)
21962b02c61SJim Ingham             return thread_spec->GetName();
22062b02c61SJim Ingham     }
22162b02c61SJim Ingham     return NULL;
22262b02c61SJim Ingham }
22362b02c61SJim Ingham 
22462b02c61SJim Ingham void
22562b02c61SJim Ingham SBBreakpointLocation::SetQueueName (const char *queue_name)
22662b02c61SJim Ingham {
2276611103cSGreg Clayton     if (m_opaque_sp)
228*af67cecdSGreg Clayton     {
229*af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
2306611103cSGreg Clayton         m_opaque_sp->GetLocationOptions()->GetThreadSpec()->SetQueueName (queue_name);
23162b02c61SJim Ingham     }
232*af67cecdSGreg Clayton }
23362b02c61SJim Ingham 
23462b02c61SJim Ingham const char *
23562b02c61SJim Ingham SBBreakpointLocation::GetQueueName () const
23662b02c61SJim Ingham {
2376611103cSGreg Clayton     if (m_opaque_sp)
23862b02c61SJim Ingham     {
239*af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
2406611103cSGreg Clayton         const ThreadSpec *thread_spec = m_opaque_sp->GetOptionsNoCreate()->GetThreadSpecNoCreate();
241*af67cecdSGreg Clayton         if (thread_spec)
24262b02c61SJim Ingham             return thread_spec->GetQueueName();
24362b02c61SJim Ingham     }
24462b02c61SJim Ingham     return NULL;
24562b02c61SJim Ingham }
24662b02c61SJim Ingham 
24730fdc8d8SChris Lattner bool
24830fdc8d8SChris Lattner SBBreakpointLocation::IsResolved ()
24930fdc8d8SChris Lattner {
2506611103cSGreg Clayton     if (m_opaque_sp)
251*af67cecdSGreg Clayton     {
252*af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
2536611103cSGreg Clayton         return m_opaque_sp->IsResolved();
254*af67cecdSGreg Clayton     }
25530fdc8d8SChris Lattner     return false;
25630fdc8d8SChris Lattner }
25730fdc8d8SChris Lattner 
25830fdc8d8SChris Lattner void
25930fdc8d8SChris Lattner SBBreakpointLocation::SetLocation (const lldb::BreakpointLocationSP &break_loc_sp)
26030fdc8d8SChris Lattner {
26130fdc8d8SChris Lattner     // Uninstall the callbacks?
2626611103cSGreg Clayton     m_opaque_sp = break_loc_sp;
26330fdc8d8SChris Lattner }
26430fdc8d8SChris Lattner 
265dde9cff3SCaroline Tice bool
266ceb6b139SCaroline Tice SBBreakpointLocation::GetDescription (DescriptionLevel level, SBStream &description)
26730fdc8d8SChris Lattner {
2686611103cSGreg Clayton     if (m_opaque_sp)
26930fdc8d8SChris Lattner     {
270*af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
271dac97f31SCaroline Tice         description.ref();
272dde9cff3SCaroline Tice         m_opaque_sp->GetDescription (description.get(), level);
273dde9cff3SCaroline Tice         description.get()->EOL();
27430fdc8d8SChris Lattner     }
275dde9cff3SCaroline Tice     else
276dde9cff3SCaroline Tice         description.Printf ("No value");
277dde9cff3SCaroline Tice 
278dde9cff3SCaroline Tice     return true;
279dde9cff3SCaroline Tice }
280dde9cff3SCaroline Tice 
28130fdc8d8SChris Lattner SBBreakpoint
28230fdc8d8SChris Lattner SBBreakpointLocation::GetBreakpoint ()
28330fdc8d8SChris Lattner {
2842d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
285ceb6b139SCaroline Tice 
286750cd175SCaroline Tice     //if (log)
287750cd175SCaroline Tice     //    log->Printf ("SBBreakpointLocation::GetBreakpoint ()");
288ceb6b139SCaroline Tice 
28930fdc8d8SChris Lattner     SBBreakpoint sb_bp;
2906611103cSGreg Clayton     if (m_opaque_sp)
291*af67cecdSGreg Clayton     {
292*af67cecdSGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
2936611103cSGreg Clayton         *sb_bp = m_opaque_sp->GetBreakpoint ().GetSP();
294*af67cecdSGreg Clayton     }
295ceb6b139SCaroline Tice 
296ceb6b139SCaroline Tice     if (log)
297ceb6b139SCaroline Tice     {
298ceb6b139SCaroline Tice         SBStream sstr;
299ceb6b139SCaroline Tice         sb_bp.GetDescription (sstr);
300cfd1acedSGreg Clayton         log->Printf ("SBBreakpointLocation(%p)::GetBreakpoint () => SBBreakpoint(%p) %s",
301750cd175SCaroline Tice                      m_opaque_sp.get(), sb_bp.get(), sstr.GetData());
302ceb6b139SCaroline Tice     }
30330fdc8d8SChris Lattner     return sb_bp;
30430fdc8d8SChris Lattner }
30530fdc8d8SChris Lattner 
306