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 
10dde9cff3SCaroline Tice // In order to guarantee correct working with Python, Python.h *MUST* be
11dde9cff3SCaroline Tice // the *FIRST* header file included:
12dde9cff3SCaroline Tice 
13dde9cff3SCaroline Tice #include <Python.h>
14dde9cff3SCaroline Tice 
1530fdc8d8SChris Lattner #include "lldb/API/SBBreakpointLocation.h"
1630fdc8d8SChris Lattner #include "lldb/API/SBDefines.h"
1730fdc8d8SChris Lattner #include "lldb/API/SBDebugger.h"
18dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
1930fdc8d8SChris Lattner 
2030fdc8d8SChris Lattner #include "lldb/lldb-types.h"
2130fdc8d8SChris Lattner #include "lldb/lldb-defines.h"
2230fdc8d8SChris Lattner #include "lldb/Breakpoint/BreakpointLocation.h"
231b54c88cSJim Ingham #include "lldb/Target/ThreadSpec.h"
24ceb6b139SCaroline Tice #include "lldb/Core/Log.h"
2530fdc8d8SChris Lattner #include "lldb/Core/Stream.h"
2630fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
2762b02c61SJim Ingham #include "lldb/Target/ThreadSpec.h"
2830fdc8d8SChris Lattner 
2930fdc8d8SChris Lattner using namespace lldb;
3030fdc8d8SChris Lattner using namespace lldb_private;
3130fdc8d8SChris Lattner 
3230fdc8d8SChris Lattner 
3330fdc8d8SChris Lattner SBBreakpointLocation::SBBreakpointLocation ()
3430fdc8d8SChris Lattner {
3530fdc8d8SChris Lattner }
3630fdc8d8SChris Lattner 
3730fdc8d8SChris Lattner SBBreakpointLocation::SBBreakpointLocation (const lldb::BreakpointLocationSP &break_loc_sp) :
386611103cSGreg Clayton     m_opaque_sp (break_loc_sp)
3930fdc8d8SChris Lattner {
40*750cd175SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
41ceb6b139SCaroline Tice 
42ceb6b139SCaroline Tice     if (log)
43ceb6b139SCaroline Tice     {
44ceb6b139SCaroline Tice         SBStream sstr;
45ceb6b139SCaroline Tice         GetDescription (lldb::eDescriptionLevelBrief, sstr);
46*750cd175SCaroline Tice         log->Printf ("SBBreakpointLocation::SBBreakpointLocaiton (const lldb::BreakpointLocationsSP &break_loc_sp"
47*750cd175SCaroline Tice                      "=%p)  => this.sp = %p (%s)", break_loc_sp.get(), m_opaque_sp.get(), sstr.GetData());
48ceb6b139SCaroline Tice     }
4930fdc8d8SChris Lattner }
5030fdc8d8SChris Lattner 
5130fdc8d8SChris Lattner SBBreakpointLocation::~SBBreakpointLocation ()
5230fdc8d8SChris Lattner {
5330fdc8d8SChris Lattner }
5430fdc8d8SChris Lattner 
5530fdc8d8SChris Lattner bool
5630fdc8d8SChris Lattner SBBreakpointLocation::IsValid() const
5730fdc8d8SChris Lattner {
586611103cSGreg Clayton     return m_opaque_sp.get() != NULL;
5930fdc8d8SChris Lattner }
6030fdc8d8SChris Lattner 
6130fdc8d8SChris Lattner addr_t
6230fdc8d8SChris Lattner SBBreakpointLocation::GetLoadAddress ()
6330fdc8d8SChris Lattner {
6430fdc8d8SChris Lattner     addr_t ret_addr = LLDB_INVALID_ADDRESS;
6530fdc8d8SChris Lattner 
666611103cSGreg Clayton     if (m_opaque_sp)
6730fdc8d8SChris Lattner     {
686611103cSGreg Clayton         ret_addr = m_opaque_sp->GetLoadAddress();
6930fdc8d8SChris Lattner     }
7030fdc8d8SChris Lattner 
7130fdc8d8SChris Lattner     return ret_addr;
7230fdc8d8SChris Lattner }
7330fdc8d8SChris Lattner 
7430fdc8d8SChris Lattner void
7530fdc8d8SChris Lattner SBBreakpointLocation::SetEnabled (bool enabled)
7630fdc8d8SChris Lattner {
776611103cSGreg Clayton     if (m_opaque_sp)
7830fdc8d8SChris Lattner     {
796611103cSGreg Clayton         m_opaque_sp->SetEnabled (enabled);
8030fdc8d8SChris Lattner     }
8130fdc8d8SChris Lattner }
8230fdc8d8SChris Lattner 
8330fdc8d8SChris Lattner bool
8430fdc8d8SChris Lattner SBBreakpointLocation::IsEnabled ()
8530fdc8d8SChris Lattner {
866611103cSGreg Clayton     if (m_opaque_sp)
876611103cSGreg Clayton         return m_opaque_sp->IsEnabled();
8830fdc8d8SChris Lattner     else
8930fdc8d8SChris Lattner         return false;
9030fdc8d8SChris Lattner }
9130fdc8d8SChris Lattner 
92c982c768SGreg Clayton uint32_t
9330fdc8d8SChris Lattner SBBreakpointLocation::GetIgnoreCount ()
9430fdc8d8SChris Lattner {
956611103cSGreg Clayton     if (m_opaque_sp)
966611103cSGreg Clayton         return m_opaque_sp->GetIgnoreCount();
9730fdc8d8SChris Lattner     else
9830fdc8d8SChris Lattner         return 0;
9930fdc8d8SChris Lattner }
10030fdc8d8SChris Lattner 
10130fdc8d8SChris Lattner void
102c982c768SGreg Clayton SBBreakpointLocation::SetIgnoreCount (uint32_t n)
10330fdc8d8SChris Lattner {
1046611103cSGreg Clayton     if (m_opaque_sp)
1056611103cSGreg Clayton         m_opaque_sp->SetIgnoreCount (n);
10630fdc8d8SChris Lattner }
10730fdc8d8SChris Lattner 
10830fdc8d8SChris Lattner void
109041a12fcSJim Ingham SBBreakpointLocation::SetCondition (const char *condition)
110041a12fcSJim Ingham {
111041a12fcSJim Ingham     m_opaque_sp->SetCondition (condition);
112041a12fcSJim Ingham }
113041a12fcSJim Ingham 
114041a12fcSJim Ingham const char *
115041a12fcSJim Ingham SBBreakpointLocation::GetCondition ()
116041a12fcSJim Ingham {
117041a12fcSJim Ingham     return m_opaque_sp->GetConditionText ();
118041a12fcSJim Ingham }
119041a12fcSJim Ingham 
120041a12fcSJim Ingham void
12130fdc8d8SChris Lattner SBBreakpointLocation::SetThreadID (tid_t thread_id)
12230fdc8d8SChris Lattner {
1236611103cSGreg Clayton     if (m_opaque_sp)
1246611103cSGreg Clayton         m_opaque_sp->SetThreadID (thread_id);
12530fdc8d8SChris Lattner }
12630fdc8d8SChris Lattner 
12730fdc8d8SChris Lattner tid_t
12830fdc8d8SChris Lattner SBBreakpointLocation::GetThreadID ()
12930fdc8d8SChris Lattner {
13030fdc8d8SChris Lattner     tid_t sb_thread_id = (lldb::tid_t) LLDB_INVALID_THREAD_ID;
1316611103cSGreg Clayton     if (m_opaque_sp)
1326611103cSGreg Clayton         sb_thread_id = m_opaque_sp->GetLocationOptions()->GetThreadSpecNoCreate()->GetTID();
13330fdc8d8SChris Lattner     return sb_thread_id;
13430fdc8d8SChris Lattner }
13530fdc8d8SChris Lattner 
13662b02c61SJim Ingham void
13762b02c61SJim Ingham SBBreakpointLocation::SetThreadIndex (uint32_t index)
13862b02c61SJim Ingham {
1396611103cSGreg Clayton     if (m_opaque_sp)
1406611103cSGreg Clayton         m_opaque_sp->GetLocationOptions()->GetThreadSpec()->SetIndex (index);
14162b02c61SJim Ingham }
14262b02c61SJim Ingham 
14362b02c61SJim Ingham uint32_t
14462b02c61SJim Ingham SBBreakpointLocation::GetThreadIndex() const
14562b02c61SJim Ingham {
1466611103cSGreg Clayton     if (m_opaque_sp)
14762b02c61SJim Ingham     {
1486611103cSGreg Clayton         const ThreadSpec *thread_spec = m_opaque_sp->GetOptionsNoCreate()->GetThreadSpecNoCreate();
14962b02c61SJim Ingham         if (thread_spec == NULL)
15062b02c61SJim Ingham             return 0;
15162b02c61SJim Ingham         else
15262b02c61SJim Ingham             return thread_spec->GetIndex();
15362b02c61SJim Ingham     }
15462b02c61SJim Ingham     return 0;
15562b02c61SJim Ingham }
15662b02c61SJim Ingham 
15762b02c61SJim Ingham 
15862b02c61SJim Ingham void
15962b02c61SJim Ingham SBBreakpointLocation::SetThreadName (const char *thread_name)
16062b02c61SJim Ingham {
1616611103cSGreg Clayton     if (m_opaque_sp)
1626611103cSGreg Clayton         m_opaque_sp->GetLocationOptions()->GetThreadSpec()->SetName (thread_name);
16362b02c61SJim Ingham }
16462b02c61SJim Ingham 
16562b02c61SJim Ingham const char *
16662b02c61SJim Ingham SBBreakpointLocation::GetThreadName () const
16762b02c61SJim Ingham {
1686611103cSGreg Clayton     if (m_opaque_sp)
16962b02c61SJim Ingham     {
1706611103cSGreg Clayton         const ThreadSpec *thread_spec = m_opaque_sp->GetOptionsNoCreate()->GetThreadSpecNoCreate();
17162b02c61SJim Ingham         if (thread_spec == NULL)
17262b02c61SJim Ingham             return NULL;
17362b02c61SJim Ingham         else
17462b02c61SJim Ingham             return thread_spec->GetName();
17562b02c61SJim Ingham     }
17662b02c61SJim Ingham     return NULL;
17762b02c61SJim Ingham }
17862b02c61SJim Ingham 
17962b02c61SJim Ingham void
18062b02c61SJim Ingham SBBreakpointLocation::SetQueueName (const char *queue_name)
18162b02c61SJim Ingham {
1826611103cSGreg Clayton     if (m_opaque_sp)
1836611103cSGreg Clayton         m_opaque_sp->GetLocationOptions()->GetThreadSpec()->SetQueueName (queue_name);
18462b02c61SJim Ingham }
18562b02c61SJim Ingham 
18662b02c61SJim Ingham const char *
18762b02c61SJim Ingham SBBreakpointLocation::GetQueueName () const
18862b02c61SJim Ingham {
1896611103cSGreg Clayton     if (m_opaque_sp)
19062b02c61SJim Ingham     {
1916611103cSGreg Clayton         const ThreadSpec *thread_spec = m_opaque_sp->GetOptionsNoCreate()->GetThreadSpecNoCreate();
19262b02c61SJim Ingham         if (thread_spec == NULL)
19362b02c61SJim Ingham             return NULL;
19462b02c61SJim Ingham         else
19562b02c61SJim Ingham             return thread_spec->GetQueueName();
19662b02c61SJim Ingham     }
19762b02c61SJim Ingham     return NULL;
19862b02c61SJim Ingham }
19962b02c61SJim Ingham 
20030fdc8d8SChris Lattner bool
20130fdc8d8SChris Lattner SBBreakpointLocation::IsResolved ()
20230fdc8d8SChris Lattner {
2036611103cSGreg Clayton     if (m_opaque_sp)
2046611103cSGreg Clayton         return m_opaque_sp->IsResolved();
20530fdc8d8SChris Lattner     else
20630fdc8d8SChris Lattner         return false;
20730fdc8d8SChris Lattner }
20830fdc8d8SChris Lattner 
20930fdc8d8SChris Lattner void
21030fdc8d8SChris Lattner SBBreakpointLocation::SetLocation (const lldb::BreakpointLocationSP &break_loc_sp)
21130fdc8d8SChris Lattner {
2126611103cSGreg Clayton     if (m_opaque_sp)
21330fdc8d8SChris Lattner     {
21430fdc8d8SChris Lattner         // Uninstall the callbacks?
21530fdc8d8SChris Lattner     }
2166611103cSGreg Clayton     m_opaque_sp = break_loc_sp;
21730fdc8d8SChris Lattner }
21830fdc8d8SChris Lattner 
219dde9cff3SCaroline Tice bool
220ceb6b139SCaroline Tice SBBreakpointLocation::GetDescription (DescriptionLevel level, SBStream &description)
22130fdc8d8SChris Lattner {
2226611103cSGreg Clayton     if (m_opaque_sp)
22330fdc8d8SChris Lattner     {
224dac97f31SCaroline Tice         description.ref();
225dde9cff3SCaroline Tice         m_opaque_sp->GetDescription (description.get(), level);
226dde9cff3SCaroline Tice         description.get()->EOL();
22730fdc8d8SChris Lattner     }
228dde9cff3SCaroline Tice     else
229dde9cff3SCaroline Tice         description.Printf ("No value");
230dde9cff3SCaroline Tice 
231dde9cff3SCaroline Tice     return true;
232dde9cff3SCaroline Tice }
233dde9cff3SCaroline Tice 
23430fdc8d8SChris Lattner SBBreakpoint
23530fdc8d8SChris Lattner SBBreakpointLocation::GetBreakpoint ()
23630fdc8d8SChris Lattner {
237ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
238ceb6b139SCaroline Tice 
239*750cd175SCaroline Tice     //if (log)
240*750cd175SCaroline Tice     //    log->Printf ("SBBreakpointLocation::GetBreakpoint ()");
241ceb6b139SCaroline Tice 
24230fdc8d8SChris Lattner     SBBreakpoint sb_bp;
2436611103cSGreg Clayton     if (m_opaque_sp)
2446611103cSGreg Clayton         *sb_bp = m_opaque_sp->GetBreakpoint ().GetSP();
245ceb6b139SCaroline Tice 
246ceb6b139SCaroline Tice     if (log)
247ceb6b139SCaroline Tice     {
248ceb6b139SCaroline Tice         SBStream sstr;
249ceb6b139SCaroline Tice         sb_bp.GetDescription (sstr);
250*750cd175SCaroline Tice         log->Printf ("SBBreakpointLocation::GetBreakpoint (this.sp=%p) => SBBreakpoint: m_opaque_sp=%p, '%s'",
251*750cd175SCaroline Tice                      m_opaque_sp.get(), sb_bp.get(), sstr.GetData());
252ceb6b139SCaroline Tice     }
25330fdc8d8SChris Lattner     return sb_bp;
25430fdc8d8SChris Lattner }
25530fdc8d8SChris Lattner 
256