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