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 
2830fdc8d8SChris Lattner SBBreakpointLocation::SBBreakpointLocation ()
2930fdc8d8SChris Lattner {
3030fdc8d8SChris Lattner }
3130fdc8d8SChris Lattner 
3230fdc8d8SChris Lattner SBBreakpointLocation::SBBreakpointLocation (const lldb::BreakpointLocationSP &break_loc_sp) :
336611103cSGreg Clayton     m_opaque_sp (break_loc_sp)
3430fdc8d8SChris Lattner {
35750cd175SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
36ceb6b139SCaroline Tice 
37ceb6b139SCaroline Tice     if (log)
38ceb6b139SCaroline Tice     {
39ceb6b139SCaroline Tice         SBStream sstr;
40ceb6b139SCaroline Tice         GetDescription (lldb::eDescriptionLevelBrief, sstr);
41750cd175SCaroline Tice         log->Printf ("SBBreakpointLocation::SBBreakpointLocaiton (const lldb::BreakpointLocationsSP &break_loc_sp"
42750cd175SCaroline Tice                      "=%p)  => this.sp = %p (%s)", break_loc_sp.get(), m_opaque_sp.get(), sstr.GetData());
43ceb6b139SCaroline Tice     }
4430fdc8d8SChris Lattner }
4530fdc8d8SChris Lattner 
4630fdc8d8SChris Lattner SBBreakpointLocation::~SBBreakpointLocation ()
4730fdc8d8SChris Lattner {
4830fdc8d8SChris Lattner }
4930fdc8d8SChris Lattner 
5030fdc8d8SChris Lattner bool
5130fdc8d8SChris Lattner SBBreakpointLocation::IsValid() const
5230fdc8d8SChris Lattner {
536611103cSGreg Clayton     return m_opaque_sp.get() != NULL;
5430fdc8d8SChris Lattner }
5530fdc8d8SChris Lattner 
5630fdc8d8SChris Lattner addr_t
5730fdc8d8SChris Lattner SBBreakpointLocation::GetLoadAddress ()
5830fdc8d8SChris Lattner {
5930fdc8d8SChris Lattner     addr_t ret_addr = LLDB_INVALID_ADDRESS;
6030fdc8d8SChris Lattner 
616611103cSGreg Clayton     if (m_opaque_sp)
6230fdc8d8SChris Lattner     {
636611103cSGreg Clayton         ret_addr = m_opaque_sp->GetLoadAddress();
6430fdc8d8SChris Lattner     }
6530fdc8d8SChris Lattner 
6630fdc8d8SChris Lattner     return ret_addr;
6730fdc8d8SChris Lattner }
6830fdc8d8SChris Lattner 
6930fdc8d8SChris Lattner void
7030fdc8d8SChris Lattner SBBreakpointLocation::SetEnabled (bool enabled)
7130fdc8d8SChris Lattner {
726611103cSGreg Clayton     if (m_opaque_sp)
7330fdc8d8SChris Lattner     {
746611103cSGreg Clayton         m_opaque_sp->SetEnabled (enabled);
7530fdc8d8SChris Lattner     }
7630fdc8d8SChris Lattner }
7730fdc8d8SChris Lattner 
7830fdc8d8SChris Lattner bool
7930fdc8d8SChris Lattner SBBreakpointLocation::IsEnabled ()
8030fdc8d8SChris Lattner {
816611103cSGreg Clayton     if (m_opaque_sp)
826611103cSGreg Clayton         return m_opaque_sp->IsEnabled();
8330fdc8d8SChris Lattner     else
8430fdc8d8SChris Lattner         return false;
8530fdc8d8SChris Lattner }
8630fdc8d8SChris Lattner 
87c982c768SGreg Clayton uint32_t
8830fdc8d8SChris Lattner SBBreakpointLocation::GetIgnoreCount ()
8930fdc8d8SChris Lattner {
906611103cSGreg Clayton     if (m_opaque_sp)
916611103cSGreg Clayton         return m_opaque_sp->GetIgnoreCount();
9230fdc8d8SChris Lattner     else
9330fdc8d8SChris Lattner         return 0;
9430fdc8d8SChris Lattner }
9530fdc8d8SChris Lattner 
9630fdc8d8SChris Lattner void
97c982c768SGreg Clayton SBBreakpointLocation::SetIgnoreCount (uint32_t n)
9830fdc8d8SChris Lattner {
996611103cSGreg Clayton     if (m_opaque_sp)
1006611103cSGreg Clayton         m_opaque_sp->SetIgnoreCount (n);
10130fdc8d8SChris Lattner }
10230fdc8d8SChris Lattner 
10330fdc8d8SChris Lattner void
104041a12fcSJim Ingham SBBreakpointLocation::SetCondition (const char *condition)
105041a12fcSJim Ingham {
106041a12fcSJim Ingham     m_opaque_sp->SetCondition (condition);
107041a12fcSJim Ingham }
108041a12fcSJim Ingham 
109041a12fcSJim Ingham const char *
110041a12fcSJim Ingham SBBreakpointLocation::GetCondition ()
111041a12fcSJim Ingham {
112041a12fcSJim Ingham     return m_opaque_sp->GetConditionText ();
113041a12fcSJim Ingham }
114041a12fcSJim Ingham 
115041a12fcSJim Ingham void
11630fdc8d8SChris Lattner SBBreakpointLocation::SetThreadID (tid_t thread_id)
11730fdc8d8SChris Lattner {
1186611103cSGreg Clayton     if (m_opaque_sp)
1196611103cSGreg Clayton         m_opaque_sp->SetThreadID (thread_id);
12030fdc8d8SChris Lattner }
12130fdc8d8SChris Lattner 
12230fdc8d8SChris Lattner tid_t
12330fdc8d8SChris Lattner SBBreakpointLocation::GetThreadID ()
12430fdc8d8SChris Lattner {
12530fdc8d8SChris Lattner     tid_t sb_thread_id = (lldb::tid_t) LLDB_INVALID_THREAD_ID;
1266611103cSGreg Clayton     if (m_opaque_sp)
1276611103cSGreg Clayton         sb_thread_id = m_opaque_sp->GetLocationOptions()->GetThreadSpecNoCreate()->GetTID();
12830fdc8d8SChris Lattner     return sb_thread_id;
12930fdc8d8SChris Lattner }
13030fdc8d8SChris Lattner 
13162b02c61SJim Ingham void
13262b02c61SJim Ingham SBBreakpointLocation::SetThreadIndex (uint32_t index)
13362b02c61SJim Ingham {
1346611103cSGreg Clayton     if (m_opaque_sp)
1356611103cSGreg Clayton         m_opaque_sp->GetLocationOptions()->GetThreadSpec()->SetIndex (index);
13662b02c61SJim Ingham }
13762b02c61SJim Ingham 
13862b02c61SJim Ingham uint32_t
13962b02c61SJim Ingham SBBreakpointLocation::GetThreadIndex() const
14062b02c61SJim Ingham {
1416611103cSGreg Clayton     if (m_opaque_sp)
14262b02c61SJim Ingham     {
1436611103cSGreg Clayton         const ThreadSpec *thread_spec = m_opaque_sp->GetOptionsNoCreate()->GetThreadSpecNoCreate();
14462b02c61SJim Ingham         if (thread_spec == NULL)
14562b02c61SJim Ingham             return 0;
14662b02c61SJim Ingham         else
14762b02c61SJim Ingham             return thread_spec->GetIndex();
14862b02c61SJim Ingham     }
14962b02c61SJim Ingham     return 0;
15062b02c61SJim Ingham }
15162b02c61SJim Ingham 
15262b02c61SJim Ingham 
15362b02c61SJim Ingham void
15462b02c61SJim Ingham SBBreakpointLocation::SetThreadName (const char *thread_name)
15562b02c61SJim Ingham {
1566611103cSGreg Clayton     if (m_opaque_sp)
1576611103cSGreg Clayton         m_opaque_sp->GetLocationOptions()->GetThreadSpec()->SetName (thread_name);
15862b02c61SJim Ingham }
15962b02c61SJim Ingham 
16062b02c61SJim Ingham const char *
16162b02c61SJim Ingham SBBreakpointLocation::GetThreadName () const
16262b02c61SJim Ingham {
1636611103cSGreg Clayton     if (m_opaque_sp)
16462b02c61SJim Ingham     {
1656611103cSGreg Clayton         const ThreadSpec *thread_spec = m_opaque_sp->GetOptionsNoCreate()->GetThreadSpecNoCreate();
16662b02c61SJim Ingham         if (thread_spec == NULL)
16762b02c61SJim Ingham             return NULL;
16862b02c61SJim Ingham         else
16962b02c61SJim Ingham             return thread_spec->GetName();
17062b02c61SJim Ingham     }
17162b02c61SJim Ingham     return NULL;
17262b02c61SJim Ingham }
17362b02c61SJim Ingham 
17462b02c61SJim Ingham void
17562b02c61SJim Ingham SBBreakpointLocation::SetQueueName (const char *queue_name)
17662b02c61SJim Ingham {
1776611103cSGreg Clayton     if (m_opaque_sp)
1786611103cSGreg Clayton         m_opaque_sp->GetLocationOptions()->GetThreadSpec()->SetQueueName (queue_name);
17962b02c61SJim Ingham }
18062b02c61SJim Ingham 
18162b02c61SJim Ingham const char *
18262b02c61SJim Ingham SBBreakpointLocation::GetQueueName () const
18362b02c61SJim Ingham {
1846611103cSGreg Clayton     if (m_opaque_sp)
18562b02c61SJim Ingham     {
1866611103cSGreg Clayton         const ThreadSpec *thread_spec = m_opaque_sp->GetOptionsNoCreate()->GetThreadSpecNoCreate();
18762b02c61SJim Ingham         if (thread_spec == NULL)
18862b02c61SJim Ingham             return NULL;
18962b02c61SJim Ingham         else
19062b02c61SJim Ingham             return thread_spec->GetQueueName();
19162b02c61SJim Ingham     }
19262b02c61SJim Ingham     return NULL;
19362b02c61SJim Ingham }
19462b02c61SJim Ingham 
19530fdc8d8SChris Lattner bool
19630fdc8d8SChris Lattner SBBreakpointLocation::IsResolved ()
19730fdc8d8SChris Lattner {
1986611103cSGreg Clayton     if (m_opaque_sp)
1996611103cSGreg Clayton         return m_opaque_sp->IsResolved();
20030fdc8d8SChris Lattner     else
20130fdc8d8SChris Lattner         return false;
20230fdc8d8SChris Lattner }
20330fdc8d8SChris Lattner 
20430fdc8d8SChris Lattner void
20530fdc8d8SChris Lattner SBBreakpointLocation::SetLocation (const lldb::BreakpointLocationSP &break_loc_sp)
20630fdc8d8SChris Lattner {
2076611103cSGreg Clayton     if (m_opaque_sp)
20830fdc8d8SChris Lattner     {
20930fdc8d8SChris Lattner         // Uninstall the callbacks?
21030fdc8d8SChris Lattner     }
2116611103cSGreg Clayton     m_opaque_sp = break_loc_sp;
21230fdc8d8SChris Lattner }
21330fdc8d8SChris Lattner 
214dde9cff3SCaroline Tice bool
215ceb6b139SCaroline Tice SBBreakpointLocation::GetDescription (DescriptionLevel level, SBStream &description)
21630fdc8d8SChris Lattner {
2176611103cSGreg Clayton     if (m_opaque_sp)
21830fdc8d8SChris Lattner     {
219dac97f31SCaroline Tice         description.ref();
220dde9cff3SCaroline Tice         m_opaque_sp->GetDescription (description.get(), level);
221dde9cff3SCaroline Tice         description.get()->EOL();
22230fdc8d8SChris Lattner     }
223dde9cff3SCaroline Tice     else
224dde9cff3SCaroline Tice         description.Printf ("No value");
225dde9cff3SCaroline Tice 
226dde9cff3SCaroline Tice     return true;
227dde9cff3SCaroline Tice }
228dde9cff3SCaroline Tice 
22930fdc8d8SChris Lattner SBBreakpoint
23030fdc8d8SChris Lattner SBBreakpointLocation::GetBreakpoint ()
23130fdc8d8SChris Lattner {
232ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
233ceb6b139SCaroline Tice 
234750cd175SCaroline Tice     //if (log)
235750cd175SCaroline Tice     //    log->Printf ("SBBreakpointLocation::GetBreakpoint ()");
236ceb6b139SCaroline Tice 
23730fdc8d8SChris Lattner     SBBreakpoint sb_bp;
2386611103cSGreg Clayton     if (m_opaque_sp)
2396611103cSGreg Clayton         *sb_bp = m_opaque_sp->GetBreakpoint ().GetSP();
240ceb6b139SCaroline Tice 
241ceb6b139SCaroline Tice     if (log)
242ceb6b139SCaroline Tice     {
243ceb6b139SCaroline Tice         SBStream sstr;
244ceb6b139SCaroline Tice         sb_bp.GetDescription (sstr);
245*cfd1acedSGreg Clayton         log->Printf ("SBBreakpointLocation(%p)::GetBreakpoint () => SBBreakpoint(%p) %s",
246750cd175SCaroline Tice                      m_opaque_sp.get(), sb_bp.get(), sstr.GetData());
247ceb6b139SCaroline Tice     }
24830fdc8d8SChris Lattner     return sb_bp;
24930fdc8d8SChris Lattner }
25030fdc8d8SChris Lattner 
251