11b282f96SGreg Clayton //===-- SBWatchpoint.cpp --------------------------------*- C++ -*-===//
21b282f96SGreg Clayton //
31b282f96SGreg Clayton //                     The LLVM Compiler Infrastructure
41b282f96SGreg Clayton //
51b282f96SGreg Clayton // This file is distributed under the University of Illinois Open Source
61b282f96SGreg Clayton // License. See LICENSE.TXT for details.
71b282f96SGreg Clayton //
81b282f96SGreg Clayton //===----------------------------------------------------------------------===//
91b282f96SGreg Clayton 
101b282f96SGreg Clayton #include "lldb/API/SBWatchpoint.h"
111b282f96SGreg Clayton #include "lldb/API/SBDefines.h"
121b282f96SGreg Clayton #include "lldb/API/SBAddress.h"
131b282f96SGreg Clayton #include "lldb/API/SBDebugger.h"
141b282f96SGreg Clayton #include "lldb/API/SBStream.h"
151b282f96SGreg Clayton 
161b282f96SGreg Clayton #include "lldb/lldb-types.h"
171b282f96SGreg Clayton #include "lldb/lldb-defines.h"
1801a67860SJohnny Chen #include "lldb/Breakpoint/Watchpoint.h"
1901a67860SJohnny Chen #include "lldb/Breakpoint/WatchpointList.h"
201b282f96SGreg Clayton #include "lldb/Core/Log.h"
211b282f96SGreg Clayton #include "lldb/Core/Stream.h"
221b282f96SGreg Clayton #include "lldb/Core/StreamFile.h"
231b282f96SGreg Clayton #include "lldb/Target/Target.h"
241b282f96SGreg Clayton 
251b282f96SGreg Clayton using namespace lldb;
261b282f96SGreg Clayton using namespace lldb_private;
271b282f96SGreg Clayton 
281b282f96SGreg Clayton 
291b282f96SGreg Clayton SBWatchpoint::SBWatchpoint () :
301b282f96SGreg Clayton     m_opaque_sp ()
311b282f96SGreg Clayton {
321b282f96SGreg Clayton }
331b282f96SGreg Clayton 
3401a67860SJohnny Chen SBWatchpoint::SBWatchpoint (const lldb::WatchpointSP &wp_sp) :
3501a67860SJohnny Chen     m_opaque_sp (wp_sp)
361b282f96SGreg Clayton {
371b282f96SGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
381b282f96SGreg Clayton 
391b282f96SGreg Clayton     if (log)
401b282f96SGreg Clayton     {
411b282f96SGreg Clayton         SBStream sstr;
421b282f96SGreg Clayton         GetDescription (sstr, lldb::eDescriptionLevelBrief);
4301a67860SJohnny Chen         log->Printf ("SBWatchpoint::SBWatchpoint (const lldb::WatchpointSP &wp_sp"
4401a67860SJohnny Chen                      "=%p)  => this.sp = %p (%s)", wp_sp.get(), m_opaque_sp.get(), sstr.GetData());
451b282f96SGreg Clayton     }
461b282f96SGreg Clayton }
471b282f96SGreg Clayton 
481b282f96SGreg Clayton SBWatchpoint::SBWatchpoint(const SBWatchpoint &rhs) :
491b282f96SGreg Clayton     m_opaque_sp (rhs.m_opaque_sp)
501b282f96SGreg Clayton {
511b282f96SGreg Clayton }
521b282f96SGreg Clayton 
531b282f96SGreg Clayton const SBWatchpoint &
541b282f96SGreg Clayton SBWatchpoint::operator = (const SBWatchpoint &rhs)
551b282f96SGreg Clayton {
561b282f96SGreg Clayton     if (this != &rhs)
571b282f96SGreg Clayton         m_opaque_sp = rhs.m_opaque_sp;
581b282f96SGreg Clayton     return *this;
591b282f96SGreg Clayton }
601b282f96SGreg Clayton 
611b282f96SGreg Clayton 
621b282f96SGreg Clayton SBWatchpoint::~SBWatchpoint ()
631b282f96SGreg Clayton {
641b282f96SGreg Clayton }
651b282f96SGreg Clayton 
661b282f96SGreg Clayton watch_id_t
671b282f96SGreg Clayton SBWatchpoint::GetID ()
681b282f96SGreg Clayton {
691b282f96SGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
701b282f96SGreg Clayton 
711b282f96SGreg Clayton     watch_id_t watch_id = LLDB_INVALID_WATCH_ID;
721b282f96SGreg Clayton     if (m_opaque_sp)
731b282f96SGreg Clayton         watch_id = m_opaque_sp->GetID();
741b282f96SGreg Clayton 
751b282f96SGreg Clayton     if (log)
761b282f96SGreg Clayton     {
771b282f96SGreg Clayton         if (watch_id == LLDB_INVALID_WATCH_ID)
781b282f96SGreg Clayton             log->Printf ("SBWatchpoint(%p)::GetID () => LLDB_INVALID_WATCH_ID", m_opaque_sp.get());
791b282f96SGreg Clayton         else
801b282f96SGreg Clayton             log->Printf ("SBWatchpoint(%p)::GetID () => %u", m_opaque_sp.get(), watch_id);
811b282f96SGreg Clayton     }
821b282f96SGreg Clayton 
831b282f96SGreg Clayton     return watch_id;
841b282f96SGreg Clayton }
851b282f96SGreg Clayton 
861b282f96SGreg Clayton bool
871b282f96SGreg Clayton SBWatchpoint::IsValid() const
881b282f96SGreg Clayton {
89*ed456eb0SJohnny Chen     if (m_opaque_sp && m_opaque_sp->GetError().Success())
90*ed456eb0SJohnny Chen         return true;
911b282f96SGreg Clayton     return false;
921b282f96SGreg Clayton }
931b282f96SGreg Clayton 
941b282f96SGreg Clayton SBError
951b282f96SGreg Clayton SBWatchpoint::GetError ()
961b282f96SGreg Clayton {
971b282f96SGreg Clayton     SBError sb_error;
981b282f96SGreg Clayton     if (m_opaque_sp)
991b282f96SGreg Clayton     {
100*ed456eb0SJohnny Chen         sb_error.SetError(m_opaque_sp->GetError());
1011b282f96SGreg Clayton     }
1021b282f96SGreg Clayton     return sb_error;
1031b282f96SGreg Clayton }
1041b282f96SGreg Clayton 
1051b282f96SGreg Clayton int32_t
1061b282f96SGreg Clayton SBWatchpoint::GetHardwareIndex ()
1071b282f96SGreg Clayton {
1081b282f96SGreg Clayton     int32_t hw_index = -1;
1091b282f96SGreg Clayton 
1101b282f96SGreg Clayton     if (m_opaque_sp)
1111b282f96SGreg Clayton     {
1121b282f96SGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
1131b282f96SGreg Clayton         hw_index = m_opaque_sp->GetHardwareIndex();
1141b282f96SGreg Clayton     }
1151b282f96SGreg Clayton 
1161b282f96SGreg Clayton     return hw_index;
1171b282f96SGreg Clayton }
1181b282f96SGreg Clayton 
1191b282f96SGreg Clayton addr_t
1201b282f96SGreg Clayton SBWatchpoint::GetWatchAddress ()
1211b282f96SGreg Clayton {
1221b282f96SGreg Clayton     addr_t ret_addr = LLDB_INVALID_ADDRESS;
1231b282f96SGreg Clayton 
1241b282f96SGreg Clayton     if (m_opaque_sp)
1251b282f96SGreg Clayton     {
1261b282f96SGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
1271b282f96SGreg Clayton         ret_addr = m_opaque_sp->GetLoadAddress();
1281b282f96SGreg Clayton     }
1291b282f96SGreg Clayton 
1301b282f96SGreg Clayton     return ret_addr;
1311b282f96SGreg Clayton }
1321b282f96SGreg Clayton 
1331b282f96SGreg Clayton size_t
1341b282f96SGreg Clayton SBWatchpoint::GetWatchSize ()
1351b282f96SGreg Clayton {
1361b282f96SGreg Clayton     size_t watch_size = 0;
1371b282f96SGreg Clayton 
1381b282f96SGreg Clayton     if (m_opaque_sp)
1391b282f96SGreg Clayton     {
1401b282f96SGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
1411b282f96SGreg Clayton         watch_size = m_opaque_sp->GetByteSize();
1421b282f96SGreg Clayton     }
1431b282f96SGreg Clayton 
1441b282f96SGreg Clayton     return watch_size;
1451b282f96SGreg Clayton }
1461b282f96SGreg Clayton 
1471b282f96SGreg Clayton void
1481b282f96SGreg Clayton SBWatchpoint::SetEnabled (bool enabled)
1491b282f96SGreg Clayton {
1501b282f96SGreg Clayton     if (m_opaque_sp)
1511b282f96SGreg Clayton     {
1521b282f96SGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
15301a67860SJohnny Chen         m_opaque_sp->GetTarget().DisableWatchpointByID(m_opaque_sp->GetID());
1541b282f96SGreg Clayton     }
1551b282f96SGreg Clayton }
1561b282f96SGreg Clayton 
1571b282f96SGreg Clayton bool
1581b282f96SGreg Clayton SBWatchpoint::IsEnabled ()
1591b282f96SGreg Clayton {
1601b282f96SGreg Clayton     if (m_opaque_sp)
1611b282f96SGreg Clayton     {
1621b282f96SGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
1631b282f96SGreg Clayton         return m_opaque_sp->IsEnabled();
1641b282f96SGreg Clayton     }
1651b282f96SGreg Clayton     else
1661b282f96SGreg Clayton         return false;
1671b282f96SGreg Clayton }
1681b282f96SGreg Clayton 
1691b282f96SGreg Clayton uint32_t
1701b282f96SGreg Clayton SBWatchpoint::GetHitCount ()
1711b282f96SGreg Clayton {
1721b282f96SGreg Clayton     uint32_t count = 0;
1731b282f96SGreg Clayton     if (m_opaque_sp)
1741b282f96SGreg Clayton     {
1751b282f96SGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
1761b282f96SGreg Clayton         count = m_opaque_sp->GetHitCount();
1771b282f96SGreg Clayton     }
1781b282f96SGreg Clayton 
1791b282f96SGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1801b282f96SGreg Clayton     if (log)
1811b282f96SGreg Clayton         log->Printf ("SBWatchpoint(%p)::GetHitCount () => %u", m_opaque_sp.get(), count);
1821b282f96SGreg Clayton 
1831b282f96SGreg Clayton     return count;
1841b282f96SGreg Clayton }
1851b282f96SGreg Clayton 
1861b282f96SGreg Clayton uint32_t
1871b282f96SGreg Clayton SBWatchpoint::GetIgnoreCount ()
1881b282f96SGreg Clayton {
1891b282f96SGreg Clayton     if (m_opaque_sp)
1901b282f96SGreg Clayton     {
1911b282f96SGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
1921b282f96SGreg Clayton         return m_opaque_sp->GetIgnoreCount();
1931b282f96SGreg Clayton     }
1941b282f96SGreg Clayton     else
1951b282f96SGreg Clayton         return 0;
1961b282f96SGreg Clayton }
1971b282f96SGreg Clayton 
1981b282f96SGreg Clayton void
1991b282f96SGreg Clayton SBWatchpoint::SetIgnoreCount (uint32_t n)
2001b282f96SGreg Clayton {
2011b282f96SGreg Clayton     if (m_opaque_sp)
2021b282f96SGreg Clayton     {
2031b282f96SGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
2041b282f96SGreg Clayton         m_opaque_sp->SetIgnoreCount (n);
2051b282f96SGreg Clayton     }
2061b282f96SGreg Clayton }
2071b282f96SGreg Clayton 
2081b282f96SGreg Clayton bool
2091b282f96SGreg Clayton SBWatchpoint::GetDescription (SBStream &description, DescriptionLevel level)
2101b282f96SGreg Clayton {
2111b282f96SGreg Clayton     if (m_opaque_sp)
2121b282f96SGreg Clayton     {
2131b282f96SGreg Clayton         Mutex::Locker api_locker (m_opaque_sp->GetTarget().GetAPIMutex());
2141b282f96SGreg Clayton         description.ref();
2151b282f96SGreg Clayton         m_opaque_sp->GetDescription (description.get(), level);
2161b282f96SGreg Clayton         description.get()->EOL();
2171b282f96SGreg Clayton     }
2181b282f96SGreg Clayton     else
2191b282f96SGreg Clayton         description.Printf ("No value");
2201b282f96SGreg Clayton 
2211b282f96SGreg Clayton     return true;
2221b282f96SGreg Clayton }
2231b282f96SGreg Clayton 
22401a67860SJohnny Chen lldb_private::Watchpoint *
2251b282f96SGreg Clayton SBWatchpoint::operator->()
2261b282f96SGreg Clayton {
2271b282f96SGreg Clayton     return m_opaque_sp.get();
2281b282f96SGreg Clayton }
2291b282f96SGreg Clayton 
23001a67860SJohnny Chen lldb_private::Watchpoint *
2311b282f96SGreg Clayton SBWatchpoint::get()
2321b282f96SGreg Clayton {
2331b282f96SGreg Clayton     return m_opaque_sp.get();
2341b282f96SGreg Clayton }
2351b282f96SGreg Clayton 
23601a67860SJohnny Chen lldb::WatchpointSP &
2371b282f96SGreg Clayton SBWatchpoint::operator *()
2381b282f96SGreg Clayton {
2391b282f96SGreg Clayton     return m_opaque_sp;
2401b282f96SGreg Clayton }
241