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"
1730fdc8d8SChris Lattner #include "lldb/Breakpoint/BreakpointLocation.h"
181b54c88cSJim Ingham #include "lldb/Target/ThreadSpec.h"
19ceb6b139SCaroline Tice #include "lldb/Core/Log.h"
2030fdc8d8SChris Lattner #include "lldb/Core/Stream.h"
2130fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
2262b02c61SJim Ingham #include "lldb/Target/ThreadSpec.h"
2330fdc8d8SChris Lattner 
2430fdc8d8SChris Lattner using namespace lldb;
2530fdc8d8SChris Lattner using namespace lldb_private;
2630fdc8d8SChris Lattner 
2730fdc8d8SChris Lattner 
28efabb123SGreg Clayton SBBreakpointLocation::SBBreakpointLocation () :
29efabb123SGreg Clayton     m_opaque_sp ()
3030fdc8d8SChris Lattner {
3130fdc8d8SChris Lattner }
3230fdc8d8SChris Lattner 
3330fdc8d8SChris Lattner SBBreakpointLocation::SBBreakpointLocation (const lldb::BreakpointLocationSP &break_loc_sp) :
346611103cSGreg Clayton     m_opaque_sp (break_loc_sp)
3530fdc8d8SChris Lattner {
36*2d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
37ceb6b139SCaroline Tice 
38ceb6b139SCaroline Tice     if (log)
39ceb6b139SCaroline Tice     {
40ceb6b139SCaroline Tice         SBStream sstr;
41ceb6b139SCaroline Tice         GetDescription (lldb::eDescriptionLevelBrief, sstr);
42750cd175SCaroline Tice         log->Printf ("SBBreakpointLocation::SBBreakpointLocaiton (const lldb::BreakpointLocationsSP &break_loc_sp"
43750cd175SCaroline Tice                      "=%p)  => this.sp = %p (%s)", break_loc_sp.get(), m_opaque_sp.get(), sstr.GetData());
44ceb6b139SCaroline Tice     }
4530fdc8d8SChris Lattner }
4630fdc8d8SChris Lattner 
47efabb123SGreg Clayton SBBreakpointLocation::SBBreakpointLocation(const SBBreakpointLocation &rhs) :
48efabb123SGreg Clayton     m_opaque_sp (rhs.m_opaque_sp)
49efabb123SGreg Clayton {
50efabb123SGreg Clayton }
51efabb123SGreg Clayton 
52efabb123SGreg Clayton const SBBreakpointLocation &
53efabb123SGreg Clayton SBBreakpointLocation::operator = (const SBBreakpointLocation &rhs)
54efabb123SGreg Clayton {
55efabb123SGreg Clayton     if (this != &rhs)
56efabb123SGreg Clayton         m_opaque_sp = rhs.m_opaque_sp;
57efabb123SGreg Clayton     return *this;
58efabb123SGreg Clayton }
59efabb123SGreg Clayton 
60efabb123SGreg Clayton 
6130fdc8d8SChris Lattner SBBreakpointLocation::~SBBreakpointLocation ()
6230fdc8d8SChris Lattner {
6330fdc8d8SChris Lattner }
6430fdc8d8SChris Lattner 
6530fdc8d8SChris Lattner bool
6630fdc8d8SChris Lattner SBBreakpointLocation::IsValid() const
6730fdc8d8SChris Lattner {
686611103cSGreg Clayton     return m_opaque_sp.get() != NULL;
6930fdc8d8SChris Lattner }
7030fdc8d8SChris Lattner 
7130fdc8d8SChris Lattner addr_t
7230fdc8d8SChris Lattner SBBreakpointLocation::GetLoadAddress ()
7330fdc8d8SChris Lattner {
7430fdc8d8SChris Lattner     addr_t ret_addr = LLDB_INVALID_ADDRESS;
7530fdc8d8SChris Lattner 
766611103cSGreg Clayton     if (m_opaque_sp)
7730fdc8d8SChris Lattner     {
786611103cSGreg Clayton         ret_addr = m_opaque_sp->GetLoadAddress();
7930fdc8d8SChris Lattner     }
8030fdc8d8SChris Lattner 
8130fdc8d8SChris Lattner     return ret_addr;
8230fdc8d8SChris Lattner }
8330fdc8d8SChris Lattner 
8430fdc8d8SChris Lattner void
8530fdc8d8SChris Lattner SBBreakpointLocation::SetEnabled (bool enabled)
8630fdc8d8SChris Lattner {
876611103cSGreg Clayton     if (m_opaque_sp)
8830fdc8d8SChris Lattner     {
896611103cSGreg Clayton         m_opaque_sp->SetEnabled (enabled);
9030fdc8d8SChris Lattner     }
9130fdc8d8SChris Lattner }
9230fdc8d8SChris Lattner 
9330fdc8d8SChris Lattner bool
9430fdc8d8SChris Lattner SBBreakpointLocation::IsEnabled ()
9530fdc8d8SChris Lattner {
966611103cSGreg Clayton     if (m_opaque_sp)
976611103cSGreg Clayton         return m_opaque_sp->IsEnabled();
9830fdc8d8SChris Lattner     else
9930fdc8d8SChris Lattner         return false;
10030fdc8d8SChris Lattner }
10130fdc8d8SChris Lattner 
102c982c768SGreg Clayton uint32_t
10330fdc8d8SChris Lattner SBBreakpointLocation::GetIgnoreCount ()
10430fdc8d8SChris Lattner {
1056611103cSGreg Clayton     if (m_opaque_sp)
1066611103cSGreg Clayton         return m_opaque_sp->GetIgnoreCount();
10730fdc8d8SChris Lattner     else
10830fdc8d8SChris Lattner         return 0;
10930fdc8d8SChris Lattner }
11030fdc8d8SChris Lattner 
11130fdc8d8SChris Lattner void
112c982c768SGreg Clayton SBBreakpointLocation::SetIgnoreCount (uint32_t n)
11330fdc8d8SChris Lattner {
1146611103cSGreg Clayton     if (m_opaque_sp)
1156611103cSGreg Clayton         m_opaque_sp->SetIgnoreCount (n);
11630fdc8d8SChris Lattner }
11730fdc8d8SChris Lattner 
11830fdc8d8SChris Lattner void
119041a12fcSJim Ingham SBBreakpointLocation::SetCondition (const char *condition)
120041a12fcSJim Ingham {
121041a12fcSJim Ingham     m_opaque_sp->SetCondition (condition);
122041a12fcSJim Ingham }
123041a12fcSJim Ingham 
124041a12fcSJim Ingham const char *
125041a12fcSJim Ingham SBBreakpointLocation::GetCondition ()
126041a12fcSJim Ingham {
127041a12fcSJim Ingham     return m_opaque_sp->GetConditionText ();
128041a12fcSJim Ingham }
129041a12fcSJim Ingham 
130041a12fcSJim Ingham void
13130fdc8d8SChris Lattner SBBreakpointLocation::SetThreadID (tid_t thread_id)
13230fdc8d8SChris Lattner {
1336611103cSGreg Clayton     if (m_opaque_sp)
1346611103cSGreg Clayton         m_opaque_sp->SetThreadID (thread_id);
13530fdc8d8SChris Lattner }
13630fdc8d8SChris Lattner 
13730fdc8d8SChris Lattner tid_t
13830fdc8d8SChris Lattner SBBreakpointLocation::GetThreadID ()
13930fdc8d8SChris Lattner {
14030fdc8d8SChris Lattner     tid_t sb_thread_id = (lldb::tid_t) LLDB_INVALID_THREAD_ID;
1416611103cSGreg Clayton     if (m_opaque_sp)
1426611103cSGreg Clayton         sb_thread_id = m_opaque_sp->GetLocationOptions()->GetThreadSpecNoCreate()->GetTID();
14330fdc8d8SChris Lattner     return sb_thread_id;
14430fdc8d8SChris Lattner }
14530fdc8d8SChris Lattner 
14662b02c61SJim Ingham void
14762b02c61SJim Ingham SBBreakpointLocation::SetThreadIndex (uint32_t index)
14862b02c61SJim Ingham {
1496611103cSGreg Clayton     if (m_opaque_sp)
1506611103cSGreg Clayton         m_opaque_sp->GetLocationOptions()->GetThreadSpec()->SetIndex (index);
15162b02c61SJim Ingham }
15262b02c61SJim Ingham 
15362b02c61SJim Ingham uint32_t
15462b02c61SJim Ingham SBBreakpointLocation::GetThreadIndex() const
15562b02c61SJim Ingham {
1566611103cSGreg Clayton     if (m_opaque_sp)
15762b02c61SJim Ingham     {
1586611103cSGreg Clayton         const ThreadSpec *thread_spec = m_opaque_sp->GetOptionsNoCreate()->GetThreadSpecNoCreate();
15962b02c61SJim Ingham         if (thread_spec == NULL)
16062b02c61SJim Ingham             return 0;
16162b02c61SJim Ingham         else
16262b02c61SJim Ingham             return thread_spec->GetIndex();
16362b02c61SJim Ingham     }
16462b02c61SJim Ingham     return 0;
16562b02c61SJim Ingham }
16662b02c61SJim Ingham 
16762b02c61SJim Ingham 
16862b02c61SJim Ingham void
16962b02c61SJim Ingham SBBreakpointLocation::SetThreadName (const char *thread_name)
17062b02c61SJim Ingham {
1716611103cSGreg Clayton     if (m_opaque_sp)
1726611103cSGreg Clayton         m_opaque_sp->GetLocationOptions()->GetThreadSpec()->SetName (thread_name);
17362b02c61SJim Ingham }
17462b02c61SJim Ingham 
17562b02c61SJim Ingham const char *
17662b02c61SJim Ingham SBBreakpointLocation::GetThreadName () const
17762b02c61SJim Ingham {
1786611103cSGreg Clayton     if (m_opaque_sp)
17962b02c61SJim Ingham     {
1806611103cSGreg Clayton         const ThreadSpec *thread_spec = m_opaque_sp->GetOptionsNoCreate()->GetThreadSpecNoCreate();
18162b02c61SJim Ingham         if (thread_spec == NULL)
18262b02c61SJim Ingham             return NULL;
18362b02c61SJim Ingham         else
18462b02c61SJim Ingham             return thread_spec->GetName();
18562b02c61SJim Ingham     }
18662b02c61SJim Ingham     return NULL;
18762b02c61SJim Ingham }
18862b02c61SJim Ingham 
18962b02c61SJim Ingham void
19062b02c61SJim Ingham SBBreakpointLocation::SetQueueName (const char *queue_name)
19162b02c61SJim Ingham {
1926611103cSGreg Clayton     if (m_opaque_sp)
1936611103cSGreg Clayton         m_opaque_sp->GetLocationOptions()->GetThreadSpec()->SetQueueName (queue_name);
19462b02c61SJim Ingham }
19562b02c61SJim Ingham 
19662b02c61SJim Ingham const char *
19762b02c61SJim Ingham SBBreakpointLocation::GetQueueName () const
19862b02c61SJim Ingham {
1996611103cSGreg Clayton     if (m_opaque_sp)
20062b02c61SJim Ingham     {
2016611103cSGreg Clayton         const ThreadSpec *thread_spec = m_opaque_sp->GetOptionsNoCreate()->GetThreadSpecNoCreate();
20262b02c61SJim Ingham         if (thread_spec == NULL)
20362b02c61SJim Ingham             return NULL;
20462b02c61SJim Ingham         else
20562b02c61SJim Ingham             return thread_spec->GetQueueName();
20662b02c61SJim Ingham     }
20762b02c61SJim Ingham     return NULL;
20862b02c61SJim Ingham }
20962b02c61SJim Ingham 
21030fdc8d8SChris Lattner bool
21130fdc8d8SChris Lattner SBBreakpointLocation::IsResolved ()
21230fdc8d8SChris Lattner {
2136611103cSGreg Clayton     if (m_opaque_sp)
2146611103cSGreg Clayton         return m_opaque_sp->IsResolved();
21530fdc8d8SChris Lattner     else
21630fdc8d8SChris Lattner         return false;
21730fdc8d8SChris Lattner }
21830fdc8d8SChris Lattner 
21930fdc8d8SChris Lattner void
22030fdc8d8SChris Lattner SBBreakpointLocation::SetLocation (const lldb::BreakpointLocationSP &break_loc_sp)
22130fdc8d8SChris Lattner {
2226611103cSGreg Clayton     if (m_opaque_sp)
22330fdc8d8SChris Lattner     {
22430fdc8d8SChris Lattner         // Uninstall the callbacks?
22530fdc8d8SChris Lattner     }
2266611103cSGreg Clayton     m_opaque_sp = break_loc_sp;
22730fdc8d8SChris Lattner }
22830fdc8d8SChris Lattner 
229dde9cff3SCaroline Tice bool
230ceb6b139SCaroline Tice SBBreakpointLocation::GetDescription (DescriptionLevel level, SBStream &description)
23130fdc8d8SChris Lattner {
2326611103cSGreg Clayton     if (m_opaque_sp)
23330fdc8d8SChris Lattner     {
234dac97f31SCaroline Tice         description.ref();
235dde9cff3SCaroline Tice         m_opaque_sp->GetDescription (description.get(), level);
236dde9cff3SCaroline Tice         description.get()->EOL();
23730fdc8d8SChris Lattner     }
238dde9cff3SCaroline Tice     else
239dde9cff3SCaroline Tice         description.Printf ("No value");
240dde9cff3SCaroline Tice 
241dde9cff3SCaroline Tice     return true;
242dde9cff3SCaroline Tice }
243dde9cff3SCaroline Tice 
24430fdc8d8SChris Lattner SBBreakpoint
24530fdc8d8SChris Lattner SBBreakpointLocation::GetBreakpoint ()
24630fdc8d8SChris Lattner {
247*2d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
248ceb6b139SCaroline Tice 
249750cd175SCaroline Tice     //if (log)
250750cd175SCaroline Tice     //    log->Printf ("SBBreakpointLocation::GetBreakpoint ()");
251ceb6b139SCaroline Tice 
25230fdc8d8SChris Lattner     SBBreakpoint sb_bp;
2536611103cSGreg Clayton     if (m_opaque_sp)
2546611103cSGreg Clayton         *sb_bp = m_opaque_sp->GetBreakpoint ().GetSP();
255ceb6b139SCaroline Tice 
256ceb6b139SCaroline Tice     if (log)
257ceb6b139SCaroline Tice     {
258ceb6b139SCaroline Tice         SBStream sstr;
259ceb6b139SCaroline Tice         sb_bp.GetDescription (sstr);
260cfd1acedSGreg Clayton         log->Printf ("SBBreakpointLocation(%p)::GetBreakpoint () => SBBreakpoint(%p) %s",
261750cd175SCaroline Tice                      m_opaque_sp.get(), sb_bp.get(), sstr.GetData());
262ceb6b139SCaroline Tice     }
26330fdc8d8SChris Lattner     return sb_bp;
26430fdc8d8SChris Lattner }
26530fdc8d8SChris Lattner 
266