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"
2430fdc8d8SChris Lattner #include "lldb/Core/Stream.h"
2530fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
2662b02c61SJim Ingham #include "lldb/Target/ThreadSpec.h"
2730fdc8d8SChris Lattner 
2830fdc8d8SChris Lattner using namespace lldb;
2930fdc8d8SChris Lattner using namespace lldb_private;
3030fdc8d8SChris Lattner 
3130fdc8d8SChris Lattner 
3230fdc8d8SChris Lattner 
3330fdc8d8SChris Lattner //class SBBreakpointLocation
3430fdc8d8SChris Lattner 
3530fdc8d8SChris Lattner SBBreakpointLocation::SBBreakpointLocation ()
3630fdc8d8SChris Lattner {
3730fdc8d8SChris Lattner }
3830fdc8d8SChris Lattner 
3930fdc8d8SChris Lattner SBBreakpointLocation::SBBreakpointLocation (const lldb::BreakpointLocationSP &break_loc_sp) :
406611103cSGreg Clayton     m_opaque_sp (break_loc_sp)
4130fdc8d8SChris Lattner {
4230fdc8d8SChris Lattner }
4330fdc8d8SChris Lattner 
4430fdc8d8SChris Lattner SBBreakpointLocation::~SBBreakpointLocation ()
4530fdc8d8SChris Lattner {
4630fdc8d8SChris Lattner }
4730fdc8d8SChris Lattner 
4830fdc8d8SChris Lattner bool
4930fdc8d8SChris Lattner SBBreakpointLocation::IsValid() const
5030fdc8d8SChris Lattner {
516611103cSGreg Clayton     return m_opaque_sp.get() != NULL;
5230fdc8d8SChris Lattner }
5330fdc8d8SChris Lattner 
5430fdc8d8SChris Lattner addr_t
5530fdc8d8SChris Lattner SBBreakpointLocation::GetLoadAddress ()
5630fdc8d8SChris Lattner {
5730fdc8d8SChris Lattner     addr_t ret_addr = LLDB_INVALID_ADDRESS;
5830fdc8d8SChris Lattner 
596611103cSGreg Clayton     if (m_opaque_sp)
6030fdc8d8SChris Lattner     {
616611103cSGreg Clayton         ret_addr = m_opaque_sp->GetLoadAddress();
6230fdc8d8SChris Lattner     }
6330fdc8d8SChris Lattner 
6430fdc8d8SChris Lattner     return ret_addr;
6530fdc8d8SChris Lattner }
6630fdc8d8SChris Lattner 
6730fdc8d8SChris Lattner void
6830fdc8d8SChris Lattner SBBreakpointLocation::SetEnabled (bool enabled)
6930fdc8d8SChris Lattner {
706611103cSGreg Clayton     if (m_opaque_sp)
7130fdc8d8SChris Lattner     {
726611103cSGreg Clayton         m_opaque_sp->SetEnabled (enabled);
7330fdc8d8SChris Lattner     }
7430fdc8d8SChris Lattner }
7530fdc8d8SChris Lattner 
7630fdc8d8SChris Lattner bool
7730fdc8d8SChris Lattner SBBreakpointLocation::IsEnabled ()
7830fdc8d8SChris Lattner {
796611103cSGreg Clayton     if (m_opaque_sp)
806611103cSGreg Clayton         return m_opaque_sp->IsEnabled();
8130fdc8d8SChris Lattner     else
8230fdc8d8SChris Lattner         return false;
8330fdc8d8SChris Lattner }
8430fdc8d8SChris Lattner 
85c982c768SGreg Clayton uint32_t
8630fdc8d8SChris Lattner SBBreakpointLocation::GetIgnoreCount ()
8730fdc8d8SChris Lattner {
886611103cSGreg Clayton     if (m_opaque_sp)
896611103cSGreg Clayton         return m_opaque_sp->GetIgnoreCount();
9030fdc8d8SChris Lattner     else
9130fdc8d8SChris Lattner         return 0;
9230fdc8d8SChris Lattner }
9330fdc8d8SChris Lattner 
9430fdc8d8SChris Lattner void
95c982c768SGreg Clayton SBBreakpointLocation::SetIgnoreCount (uint32_t n)
9630fdc8d8SChris Lattner {
976611103cSGreg Clayton     if (m_opaque_sp)
986611103cSGreg Clayton         m_opaque_sp->SetIgnoreCount (n);
9930fdc8d8SChris Lattner }
10030fdc8d8SChris Lattner 
10130fdc8d8SChris Lattner void
10230fdc8d8SChris Lattner SBBreakpointLocation::SetThreadID (tid_t thread_id)
10330fdc8d8SChris Lattner {
1046611103cSGreg Clayton     if (m_opaque_sp)
1056611103cSGreg Clayton         m_opaque_sp->SetThreadID (thread_id);
10630fdc8d8SChris Lattner }
10730fdc8d8SChris Lattner 
10830fdc8d8SChris Lattner tid_t
10930fdc8d8SChris Lattner SBBreakpointLocation::GetThreadID ()
11030fdc8d8SChris Lattner {
11130fdc8d8SChris Lattner     tid_t sb_thread_id = (lldb::tid_t) LLDB_INVALID_THREAD_ID;
1126611103cSGreg Clayton     if (m_opaque_sp)
1136611103cSGreg Clayton         sb_thread_id = m_opaque_sp->GetLocationOptions()->GetThreadSpecNoCreate()->GetTID();
11430fdc8d8SChris Lattner     return sb_thread_id;
11530fdc8d8SChris Lattner }
11630fdc8d8SChris Lattner 
11762b02c61SJim Ingham void
11862b02c61SJim Ingham SBBreakpointLocation::SetThreadIndex (uint32_t index)
11962b02c61SJim Ingham {
1206611103cSGreg Clayton     if (m_opaque_sp)
1216611103cSGreg Clayton         m_opaque_sp->GetLocationOptions()->GetThreadSpec()->SetIndex (index);
12262b02c61SJim Ingham }
12362b02c61SJim Ingham 
12462b02c61SJim Ingham uint32_t
12562b02c61SJim Ingham SBBreakpointLocation::GetThreadIndex() const
12662b02c61SJim Ingham {
1276611103cSGreg Clayton     if (m_opaque_sp)
12862b02c61SJim Ingham     {
1296611103cSGreg Clayton         const ThreadSpec *thread_spec = m_opaque_sp->GetOptionsNoCreate()->GetThreadSpecNoCreate();
13062b02c61SJim Ingham         if (thread_spec == NULL)
13162b02c61SJim Ingham             return 0;
13262b02c61SJim Ingham         else
13362b02c61SJim Ingham             return thread_spec->GetIndex();
13462b02c61SJim Ingham     }
13562b02c61SJim Ingham     return 0;
13662b02c61SJim Ingham }
13762b02c61SJim Ingham 
13862b02c61SJim Ingham 
13962b02c61SJim Ingham void
14062b02c61SJim Ingham SBBreakpointLocation::SetThreadName (const char *thread_name)
14162b02c61SJim Ingham {
1426611103cSGreg Clayton     if (m_opaque_sp)
1436611103cSGreg Clayton         m_opaque_sp->GetLocationOptions()->GetThreadSpec()->SetName (thread_name);
14462b02c61SJim Ingham }
14562b02c61SJim Ingham 
14662b02c61SJim Ingham const char *
14762b02c61SJim Ingham SBBreakpointLocation::GetThreadName () const
14862b02c61SJim Ingham {
1496611103cSGreg Clayton     if (m_opaque_sp)
15062b02c61SJim Ingham     {
1516611103cSGreg Clayton         const ThreadSpec *thread_spec = m_opaque_sp->GetOptionsNoCreate()->GetThreadSpecNoCreate();
15262b02c61SJim Ingham         if (thread_spec == NULL)
15362b02c61SJim Ingham             return NULL;
15462b02c61SJim Ingham         else
15562b02c61SJim Ingham             return thread_spec->GetName();
15662b02c61SJim Ingham     }
15762b02c61SJim Ingham     return NULL;
15862b02c61SJim Ingham }
15962b02c61SJim Ingham 
16062b02c61SJim Ingham void
16162b02c61SJim Ingham SBBreakpointLocation::SetQueueName (const char *queue_name)
16262b02c61SJim Ingham {
1636611103cSGreg Clayton     if (m_opaque_sp)
1646611103cSGreg Clayton         m_opaque_sp->GetLocationOptions()->GetThreadSpec()->SetQueueName (queue_name);
16562b02c61SJim Ingham }
16662b02c61SJim Ingham 
16762b02c61SJim Ingham const char *
16862b02c61SJim Ingham SBBreakpointLocation::GetQueueName () const
16962b02c61SJim Ingham {
1706611103cSGreg Clayton     if (m_opaque_sp)
17162b02c61SJim Ingham     {
1726611103cSGreg Clayton         const ThreadSpec *thread_spec = m_opaque_sp->GetOptionsNoCreate()->GetThreadSpecNoCreate();
17362b02c61SJim Ingham         if (thread_spec == NULL)
17462b02c61SJim Ingham             return NULL;
17562b02c61SJim Ingham         else
17662b02c61SJim Ingham             return thread_spec->GetQueueName();
17762b02c61SJim Ingham     }
17862b02c61SJim Ingham     return NULL;
17962b02c61SJim Ingham }
18062b02c61SJim Ingham 
18130fdc8d8SChris Lattner bool
18230fdc8d8SChris Lattner SBBreakpointLocation::IsResolved ()
18330fdc8d8SChris Lattner {
1846611103cSGreg Clayton     if (m_opaque_sp)
1856611103cSGreg Clayton         return m_opaque_sp->IsResolved();
18630fdc8d8SChris Lattner     else
18730fdc8d8SChris Lattner         return false;
18830fdc8d8SChris Lattner }
18930fdc8d8SChris Lattner 
19030fdc8d8SChris Lattner void
19130fdc8d8SChris Lattner SBBreakpointLocation::SetLocation (const lldb::BreakpointLocationSP &break_loc_sp)
19230fdc8d8SChris Lattner {
1936611103cSGreg Clayton     if (m_opaque_sp)
19430fdc8d8SChris Lattner     {
19530fdc8d8SChris Lattner         // Uninstall the callbacks?
19630fdc8d8SChris Lattner     }
1976611103cSGreg Clayton     m_opaque_sp = break_loc_sp;
19830fdc8d8SChris Lattner }
19930fdc8d8SChris Lattner 
200dde9cff3SCaroline Tice bool
201dde9cff3SCaroline Tice SBBreakpointLocation::GetDescription (const char *description_level, SBStream &description)
20230fdc8d8SChris Lattner {
2036611103cSGreg Clayton     if (m_opaque_sp)
20430fdc8d8SChris Lattner     {
20530fdc8d8SChris Lattner         DescriptionLevel level;
20630fdc8d8SChris Lattner         if (strcmp (description_level, "brief") == 0)
20730fdc8d8SChris Lattner             level = eDescriptionLevelBrief;
20830fdc8d8SChris Lattner         else if (strcmp (description_level, "full") == 0)
20930fdc8d8SChris Lattner             level = eDescriptionLevelFull;
21030fdc8d8SChris Lattner         else if (strcmp (description_level, "verbose") == 0)
21130fdc8d8SChris Lattner             level = eDescriptionLevelVerbose;
21230fdc8d8SChris Lattner         else
21330fdc8d8SChris Lattner             level = eDescriptionLevelBrief;
21430fdc8d8SChris Lattner 
215*dac97f31SCaroline Tice         description.ref();
216dde9cff3SCaroline Tice         m_opaque_sp->GetDescription (description.get(), level);
217dde9cff3SCaroline Tice         description.get()->EOL();
21830fdc8d8SChris Lattner     }
219dde9cff3SCaroline Tice     else
220dde9cff3SCaroline Tice         description.Printf ("No value");
221dde9cff3SCaroline Tice 
222dde9cff3SCaroline Tice     return true;
223dde9cff3SCaroline Tice }
224dde9cff3SCaroline Tice 
22530fdc8d8SChris Lattner SBBreakpoint
22630fdc8d8SChris Lattner SBBreakpointLocation::GetBreakpoint ()
22730fdc8d8SChris Lattner {
22830fdc8d8SChris Lattner     SBBreakpoint sb_bp;
2296611103cSGreg Clayton     if (m_opaque_sp)
2306611103cSGreg Clayton         *sb_bp = m_opaque_sp->GetBreakpoint ().GetSP();
23130fdc8d8SChris Lattner     return sb_bp;
23230fdc8d8SChris Lattner }
23330fdc8d8SChris Lattner 
234