[Lldb-commits] [lldb] b0af8a1 - Revert "[lldb] [mostly NFC] Large WP foundation: WatchpointResources (#68845)"
David Spickett via lldb-commits
lldb-commits at lists.llvm.org
Tue Nov 28 01:47:21 PST 2023
Author: David Spickett
Date: 2023-11-28T09:39:37Z
New Revision: b0af8a1ede89e87f737f2a31b6a2e2491e38ac04
URL: https://github.com/llvm/llvm-project/commit/b0af8a1ede89e87f737f2a31b6a2e2491e38ac04
DIFF: https://github.com/llvm/llvm-project/commit/b0af8a1ede89e87f737f2a31b6a2e2491e38ac04.diff
LOG: Revert "[lldb] [mostly NFC] Large WP foundation: WatchpointResources (#68845)"
...and follow ups.
As it has caused test failures on Linux Arm and AArch64:
https://lab.llvm.org/buildbot/#/builders/96/builds/49126
https://lab.llvm.org/buildbot/#/builders/17/builds/45824
```
lldb-shell :: Subprocess/clone-follow-child-wp.test
lldb-shell :: Subprocess/fork-follow-child-wp.test
lldb-shell :: Subprocess/vfork-follow-child-wp.test
```
This reverts commit a6c62bf1a4717accc852463b664cd1012237d334,
commit a0a1ff3ab40e347589b4e27d8fd350c600526735 and commit
fc6b72523f3d73b921690a713e97a433c96066c6.
Added:
lldb/include/lldb/Breakpoint/BreakpointSiteList.h
lldb/source/Breakpoint/BreakpointSiteList.cpp
Modified:
lldb/include/lldb/Breakpoint/BreakpointSite.h
lldb/include/lldb/Breakpoint/Watchpoint.h
lldb/include/lldb/Interpreter/OptionGroupWatchpoint.h
lldb/include/lldb/Target/Process.h
lldb/include/lldb/lldb-defines.h
lldb/include/lldb/lldb-forward.h
lldb/include/lldb/lldb-types.h
lldb/source/API/SBThread.cpp
lldb/source/API/SBWatchpoint.cpp
lldb/source/Breakpoint/BreakpointLocation.cpp
lldb/source/Breakpoint/BreakpointSite.cpp
lldb/source/Breakpoint/CMakeLists.txt
lldb/source/Breakpoint/Watchpoint.cpp
lldb/source/Commands/CommandObjectProcess.cpp
lldb/source/Commands/CommandObjectWatchpoint.cpp
lldb/source/Interpreter/OptionGroupWatchpoint.cpp
lldb/source/Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.cpp
lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntime.cpp
lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleThreadPlanStepThroughObjCTrampoline.cpp
lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp
lldb/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp
lldb/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.h
lldb/source/Plugins/Process/Utility/StopInfoMachException.cpp
lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp
lldb/source/Plugins/Process/Windows/Common/ProcessWindows.h
lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h
lldb/source/Target/Platform.cpp
lldb/source/Target/Process.cpp
lldb/source/Target/StackFrameList.cpp
lldb/source/Target/StopInfo.cpp
lldb/source/Target/Target.cpp
lldb/source/Target/ThreadPlanCallFunction.cpp
lldb/source/Target/ThreadPlanStepOut.cpp
lldb/source/Target/ThreadPlanStepRange.cpp
lldb/source/Target/ThreadPlanStepUntil.cpp
lldb/test/API/python_api/watchpoint/watchlocation/TestTargetWatchAddress.py
lldb/test/Shell/Watchpoint/Inputs/val.c
lldb/test/Shell/Watchpoint/LocalVariableWatchpointDisabler.test
lldb/test/Shell/Watchpoint/SetErrorCases.test
Removed:
lldb/include/lldb/Breakpoint/StopPointSiteList.h
lldb/include/lldb/Breakpoint/WatchpointResource.h
lldb/include/lldb/Breakpoint/WatchpointResourceList.h
lldb/source/Breakpoint/StopPointSiteList.cpp
lldb/source/Breakpoint/WatchpointResource.cpp
lldb/source/Breakpoint/WatchpointResourceList.cpp
################################################################################
diff --git a/lldb/include/lldb/Breakpoint/BreakpointSite.h b/lldb/include/lldb/Breakpoint/BreakpointSite.h
index 17b76d51c1ae53a..e4c850206fd8976 100644
--- a/lldb/include/lldb/Breakpoint/BreakpointSite.h
+++ b/lldb/include/lldb/Breakpoint/BreakpointSite.h
@@ -45,9 +45,6 @@ class BreakpointSite : public std::enable_shared_from_this<BreakpointSite>,
// display any breakpoint opcodes.
};
- typedef lldb::break_id_t SiteID;
- typedef lldb::break_id_t ConstituentID;
-
~BreakpointSite() override;
// This section manages the breakpoint traps
@@ -80,8 +77,8 @@ class BreakpointSite : public std::enable_shared_from_this<BreakpointSite>,
/// Tells whether the current breakpoint site is enabled or not
///
/// This is a low-level enable bit for the breakpoint sites. If a
- /// breakpoint site has no enabled constituents, it should just get removed.
- /// This enable/disable is for the low-level target code to enable and disable
+ /// breakpoint site has no enabled owners, it should just get removed. This
+ /// enable/disable is for the low-level target code to enable and disable
/// breakpoint sites when single stepping, etc.
bool IsEnabled() const;
@@ -104,46 +101,44 @@ class BreakpointSite : public std::enable_shared_from_this<BreakpointSite>,
/// Standard Dump method
void Dump(Stream *s) const override;
- /// The "Constituents" are the breakpoint locations that share this breakpoint
- /// site. The method adds the \a constituent to this breakpoint site's
- /// constituent list.
+ /// The "Owners" are the breakpoint locations that share this breakpoint
+ /// site. The method adds the \a owner to this breakpoint site's owner list.
///
- /// \param[in] constituent
- /// \a constituent is the Breakpoint Location to add.
- void AddConstituent(const lldb::BreakpointLocationSP &constituent);
+ /// \param[in] owner
+ /// \a owner is the Breakpoint Location to add.
+ void AddOwner(const lldb::BreakpointLocationSP &owner);
/// This method returns the number of breakpoint locations currently located
/// at this breakpoint site.
///
/// \return
- /// The number of constituents.
- size_t GetNumberOfConstituents();
+ /// The number of owners.
+ size_t GetNumberOfOwners();
/// This method returns the breakpoint location at index \a index located at
- /// this breakpoint site. The constituents are listed ordinally from 0 to
- /// GetNumberOfConstituents() - 1 so you can use this method to iterate over
- /// the constituents
+ /// this breakpoint site. The owners are listed ordinally from 0 to
+ /// GetNumberOfOwners() - 1 so you can use this method to iterate over the
+ /// owners
///
/// \param[in] idx
- /// The index in the list of constituents for which you wish the
- /// constituent location.
+ /// The index in the list of owners for which you wish the owner location.
///
/// \return
/// A shared pointer to the breakpoint location at that index.
- lldb::BreakpointLocationSP GetConstituentAtIndex(size_t idx);
+ lldb::BreakpointLocationSP GetOwnerAtIndex(size_t idx);
- /// This method copies the breakpoint site's constituents into a new
- /// collection. It does this while the constituents mutex is locked.
+ /// This method copies the breakpoint site's owners into a new collection.
+ /// It does this while the owners mutex is locked.
///
/// \param[out] out_collection
- /// The BreakpointLocationCollection into which to put the constituents
+ /// The BreakpointLocationCollection into which to put the owners
/// of this breakpoint site.
///
/// \return
/// The number of elements copied into out_collection.
- size_t CopyConstituentsList(BreakpointLocationCollection &out_collection);
+ size_t CopyOwnersList(BreakpointLocationCollection &out_collection);
- /// Check whether the constituents of this breakpoint site have any thread
+ /// Check whether the owners of this breakpoint site have any thread
/// specifiers, and if yes, is \a thread contained in any of these
/// specifiers.
///
@@ -156,7 +151,7 @@ class BreakpointSite : public std::enable_shared_from_this<BreakpointSite>,
bool ValidForThisThread(Thread &thread);
/// Print a description of this breakpoint site to the stream \a s.
- /// GetDescription tells you about the breakpoint site's constituents. Use
+ /// GetDescription tells you about the breakpoint site's owners. Use
/// BreakpointSite::Dump(Stream *) to get information about the breakpoint
/// site itself.
///
@@ -208,10 +203,9 @@ class BreakpointSite : public std::enable_shared_from_this<BreakpointSite>,
void BumpHitCounts();
- /// The method removes the constituent at \a break_loc_id from this breakpoint
+ /// The method removes the owner at \a break_loc_id from this breakpoint
/// list.
- size_t RemoveConstituent(lldb::break_id_t break_id,
- lldb::break_id_t break_loc_id);
+ size_t RemoveOwner(lldb::break_id_t break_id, lldb::break_id_t break_loc_id);
BreakpointSite::Type m_type; ///< The type of this breakpoint site.
uint8_t m_saved_opcode[8]; ///< The saved opcode bytes if this breakpoint site
@@ -221,20 +215,20 @@ class BreakpointSite : public std::enable_shared_from_this<BreakpointSite>,
bool
m_enabled; ///< Boolean indicating if this breakpoint site enabled or not.
- // Consider adding an optimization where if there is only one constituent, we
- // don't store a list. The usual case will be only one constituent...
- BreakpointLocationCollection
- m_constituents; ///< This has the BreakpointLocations
- /// that share this breakpoint site.
- std::recursive_mutex m_constituents_mutex; ///< This mutex protects the
- ///< constituents collection.
+ // Consider adding an optimization where if there is only one owner, we don't
+ // store a list. The usual case will be only one owner...
+ BreakpointLocationCollection m_owners; ///< This has the BreakpointLocations
+ ///that share this breakpoint site.
+ std::recursive_mutex
+ m_owners_mutex; ///< This mutex protects the owners collection.
static lldb::break_id_t GetNextID();
// Only the Process can create breakpoint sites in
// Process::CreateBreakpointSite (lldb::BreakpointLocationSP &, bool).
- BreakpointSite(const lldb::BreakpointLocationSP &constituent,
- lldb::addr_t m_addr, bool use_hardware);
+ BreakpointSite(BreakpointSiteList *list,
+ const lldb::BreakpointLocationSP &owner, lldb::addr_t m_addr,
+ bool use_hardware);
BreakpointSite(const BreakpointSite &) = delete;
const BreakpointSite &operator=(const BreakpointSite &) = delete;
diff --git a/lldb/include/lldb/Breakpoint/BreakpointSiteList.h b/lldb/include/lldb/Breakpoint/BreakpointSiteList.h
new file mode 100644
index 000000000000000..98091bbaeb052dd
--- /dev/null
+++ b/lldb/include/lldb/Breakpoint/BreakpointSiteList.h
@@ -0,0 +1,173 @@
+//===-- BreakpointSiteList.h ------------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLDB_BREAKPOINT_BREAKPOINTSITELIST_H
+#define LLDB_BREAKPOINT_BREAKPOINTSITELIST_H
+
+#include <functional>
+#include <map>
+#include <mutex>
+
+#include "lldb/Breakpoint/BreakpointSite.h"
+
+namespace lldb_private {
+
+/// \class BreakpointSiteList BreakpointSiteList.h
+/// "lldb/Breakpoint/BreakpointSiteList.h" Class that manages lists of
+/// BreakpointSite shared pointers.
+class BreakpointSiteList {
+ // At present Process directly accesses the map of BreakpointSites so it can
+ // do quick lookups into the map (using GetMap).
+ // FIXME: Find a better interface for this.
+ friend class Process;
+
+public:
+ /// Default constructor makes an empty list.
+ BreakpointSiteList();
+
+ /// Destructor, currently does nothing.
+ ~BreakpointSiteList();
+
+ /// Add a BreakpointSite to the list.
+ ///
+ /// \param[in] bp_site_sp
+ /// A shared pointer to a breakpoint site being added to the list.
+ ///
+ /// \return
+ /// The ID of the BreakpointSite in the list.
+ lldb::break_id_t Add(const lldb::BreakpointSiteSP &bp_site_sp);
+
+ /// Standard Dump routine, doesn't do anything at present. \param[in] s
+ /// Stream into which to dump the description.
+ void Dump(Stream *s) const;
+
+ /// Returns a shared pointer to the breakpoint site at address \a addr.
+ ///
+ /// \param[in] addr
+ /// The address to look for.
+ ///
+ /// \result
+ /// A shared pointer to the breakpoint site. May contain a NULL
+ /// pointer if no breakpoint site exists with a matching address.
+ lldb::BreakpointSiteSP FindByAddress(lldb::addr_t addr);
+
+ /// Returns a shared pointer to the breakpoint site with id \a breakID.
+ ///
+ /// \param[in] breakID
+ /// The breakpoint site ID to seek for.
+ ///
+ /// \result
+ /// A shared pointer to the breakpoint site. May contain a NULL pointer if
+ /// the
+ /// breakpoint doesn't exist.
+ lldb::BreakpointSiteSP FindByID(lldb::break_id_t breakID);
+
+ /// Returns a shared pointer to the breakpoint site with id \a breakID -
+ /// const version.
+ ///
+ /// \param[in] breakID
+ /// The breakpoint site ID to seek for.
+ ///
+ /// \result
+ /// A shared pointer to the breakpoint site. May contain a NULL pointer if
+ /// the
+ /// breakpoint doesn't exist.
+ const lldb::BreakpointSiteSP FindByID(lldb::break_id_t breakID) const;
+
+ /// Returns the breakpoint site id to the breakpoint site at address \a
+ /// addr.
+ ///
+ /// \param[in] addr
+ /// The address to match.
+ ///
+ /// \result
+ /// The ID of the breakpoint site, or LLDB_INVALID_BREAK_ID.
+ lldb::break_id_t FindIDByAddress(lldb::addr_t addr);
+
+ /// Returns whether the breakpoint site \a bp_site_id has \a bp_id
+ // as one of its owners.
+ ///
+ /// \param[in] bp_site_id
+ /// The breakpoint site id to query.
+ ///
+ /// \param[in] bp_id
+ /// The breakpoint id to look for in \a bp_site_id.
+ ///
+ /// \result
+ /// True if \a bp_site_id exists in the site list AND \a bp_id is one of the
+ /// owners of that site.
+ bool BreakpointSiteContainsBreakpoint(lldb::break_id_t bp_site_id,
+ lldb::break_id_t bp_id);
+
+ void ForEach(std::function<void(BreakpointSite *)> const &callback);
+
+ /// Removes the breakpoint site given by \b breakID from this list.
+ ///
+ /// \param[in] breakID
+ /// The breakpoint site index to remove.
+ ///
+ /// \result
+ /// \b true if the breakpoint site \a breakID was in the list.
+ bool Remove(lldb::break_id_t breakID);
+
+ /// Removes the breakpoint site at address \a addr from this list.
+ ///
+ /// \param[in] addr
+ /// The address from which to remove a breakpoint site.
+ ///
+ /// \result
+ /// \b true if \a addr had a breakpoint site to remove from the list.
+ bool RemoveByAddress(lldb::addr_t addr);
+
+ bool FindInRange(lldb::addr_t lower_bound, lldb::addr_t upper_bound,
+ BreakpointSiteList &bp_site_list) const;
+
+ typedef void (*BreakpointSiteSPMapFunc)(lldb::BreakpointSiteSP &bp,
+ void *baton);
+
+ /// Enquires of the breakpoint site on in this list with ID \a breakID
+ /// whether we should stop for the breakpoint or not.
+ ///
+ /// \param[in] context
+ /// This contains the information about this stop.
+ ///
+ /// \param[in] breakID
+ /// This break ID that we hit.
+ ///
+ /// \return
+ /// \b true if we should stop, \b false otherwise.
+ bool ShouldStop(StoppointCallbackContext *context, lldb::break_id_t breakID);
+
+ /// Returns the number of elements in the list.
+ ///
+ /// \result
+ /// The number of elements.
+ size_t GetSize() const {
+ std::lock_guard<std::recursive_mutex> guard(m_mutex);
+ return m_bp_site_list.size();
+ }
+
+ bool IsEmpty() const {
+ std::lock_guard<std::recursive_mutex> guard(m_mutex);
+ return m_bp_site_list.empty();
+ }
+
+protected:
+ typedef std::map<lldb::addr_t, lldb::BreakpointSiteSP> collection;
+
+ collection::iterator GetIDIterator(lldb::break_id_t breakID);
+
+ collection::const_iterator GetIDConstIterator(lldb::break_id_t breakID) const;
+
+ mutable std::recursive_mutex m_mutex;
+ collection m_bp_site_list; // The breakpoint site list.
+};
+
+} // namespace lldb_private
+
+#endif // LLDB_BREAKPOINT_BREAKPOINTSITELIST_H
diff --git a/lldb/include/lldb/Breakpoint/StopPointSiteList.h b/lldb/include/lldb/Breakpoint/StopPointSiteList.h
deleted file mode 100644
index 9ff151fd01b69ac..000000000000000
--- a/lldb/include/lldb/Breakpoint/StopPointSiteList.h
+++ /dev/null
@@ -1,310 +0,0 @@
-//===-- StopPointSiteList.h -------------------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLDB_BREAKPOINT_STOPPOINTSITELIST_H
-#define LLDB_BREAKPOINT_STOPPOINTSITELIST_H
-
-#include <functional>
-#include <map>
-#include <mutex>
-
-#include <lldb/Breakpoint/BreakpointSite.h>
-#include <lldb/Utility/Iterable.h>
-#include <lldb/Utility/Stream.h>
-
-namespace lldb_private {
-
-template <typename StopPointSite> class StopPointSiteList {
- // At present Process directly accesses the map of StopPointSites so it can
- // do quick lookups into the map (using GetMap).
- // FIXME: Find a better interface for this.
- friend class Process;
-
-public:
- using StopPointSiteSP = std::shared_ptr<StopPointSite>;
-
- /// Add a site to the list.
- ///
- /// \param[in] site_sp
- /// A shared pointer to a site being added to the list.
- ///
- /// \return
- /// The ID of the site in the list.
- typename StopPointSite::SiteID Add(const StopPointSiteSP &site_sp) {
- lldb::addr_t site_load_addr = site_sp->GetLoadAddress();
- std::lock_guard<std::recursive_mutex> guard(m_mutex);
- typename collection::iterator iter = m_site_list.find(site_load_addr);
-
- // Add site to the list. However, if the element already exists in
- // the list, then we don't add it, and return InvalidSiteID.
- if (iter == m_site_list.end()) {
- m_site_list[site_load_addr] = site_sp;
- return site_sp->GetID();
- } else {
- return UINT32_MAX;
- }
- }
-
- /// Standard Dump routine, doesn't do anything at present.
- /// \param[in] s
- /// Stream into which to dump the description.
- void Dump(Stream *s) const {
- s->Printf("%p: ", static_cast<const void *>(this));
- s->Printf("StopPointSiteList with %u ConstituentSites:\n",
- (uint32_t)m_site_list.size());
- s->IndentMore();
- typename collection::const_iterator pos;
- typename collection::const_iterator end = m_site_list.end();
- for (pos = m_site_list.begin(); pos != end; ++pos)
- pos->second->Dump(s);
- s->IndentLess();
- }
-
- /// Returns a shared pointer to the site at address \a addr.
- ///
- /// \param[in] addr
- /// The address to look for.
- ///
- /// \result
- /// A shared pointer to the site. Nullptr if no site contains
- /// the address.
- StopPointSiteSP FindByAddress(lldb::addr_t addr) {
- StopPointSiteSP found_sp;
- std::lock_guard<std::recursive_mutex> guard(m_mutex);
- typename collection::iterator iter = m_site_list.find(addr);
- if (iter != m_site_list.end())
- found_sp = iter->second;
- return found_sp;
- }
-
- /// Returns a shared pointer to the site with id \a site_id.
- ///
- /// \param[in] site_id
- /// The site ID to seek for.
- ///
- /// \result
- /// A shared pointer to the site. Nullptr if no matching site.
- StopPointSiteSP FindByID(typename StopPointSite::SiteID site_id) {
- std::lock_guard<std::recursive_mutex> guard(m_mutex);
- StopPointSiteSP stop_sp;
- typename collection::iterator pos = GetIDIterator(site_id);
- if (pos != m_site_list.end())
- stop_sp = pos->second;
-
- return stop_sp;
- }
-
- /// Returns a shared pointer to the site with id \a site_id -
- /// const version.
- ///
- /// \param[in] site_id
- /// The site ID to seek for.
- ///
- /// \result
- /// A shared pointer to the site. Nullptr if no matching site.
- const StopPointSiteSP FindByID(typename StopPointSite::SiteID site_id) const {
- std::lock_guard<std::recursive_mutex> guard(m_mutex);
- StopPointSiteSP stop_sp;
- typename collection::const_iterator pos = GetIDConstIterator(site_id);
- if (pos != m_site_list.end())
- stop_sp = pos->second;
-
- return stop_sp;
- }
-
- /// Returns the site id to the site at address \a addr.
- ///
- /// \param[in] addr
- /// The address to match.
- ///
- /// \result
- /// The ID of the site, or LLDB_INVALID_SITE_ID.
- typename StopPointSite::SiteID FindIDByAddress(lldb::addr_t addr) {
- if (StopPointSiteSP site = FindByAddress(addr))
- return site->GetID();
- return UINT32_MAX;
- }
-
- /// Returns whether the BreakpointSite \a site_id has a BreakpointLocation
- /// that is part of Breakpoint \a bp_id.
- ///
- /// NB this is only defined when StopPointSiteList is specialized for
- /// BreakpointSite's.
- ///
- /// \param[in] site_id
- /// The site id to query.
- ///
- /// \param[in] bp_id
- /// The breakpoint id to look for in \a site_id's BreakpointLocations.
- ///
- /// \result
- /// True if \a site_id exists in the site list AND \a bp_id
- /// is the breakpoint for one of the BreakpointLocations.
- bool StopPointSiteContainsBreakpoint(typename StopPointSite::SiteID,
- lldb::break_id_t bp_id);
-
- void ForEach(std::function<void(StopPointSite *)> const &callback) {
- std::lock_guard<std::recursive_mutex> guard(m_mutex);
- for (auto pair : m_site_list)
- callback(pair.second.get());
- }
-
- /// Removes the site given by \a site_id from this list.
- ///
- /// \param[in] site_id
- /// The site ID to remove.
- ///
- /// \result
- /// \b true if the site \a site_id was in the list.
- bool Remove(typename StopPointSite::SiteID site_id) {
- std::lock_guard<std::recursive_mutex> guard(m_mutex);
- typename collection::iterator pos = GetIDIterator(site_id); // Predicate
- if (pos != m_site_list.end()) {
- m_site_list.erase(pos);
- return true;
- }
- return false;
- }
-
- /// Removes the site at address \a addr from this list.
- ///
- /// \param[in] addr
- /// The address from which to remove a site.
- ///
- /// \result
- /// \b true if \a addr had a site to remove from the list.
- bool RemoveByAddress(lldb::addr_t addr) {
- std::lock_guard<std::recursive_mutex> guard(m_mutex);
- typename collection::iterator pos = m_site_list.find(addr);
- if (pos != m_site_list.end()) {
- m_site_list.erase(pos);
- return true;
- }
- return false;
- }
-
- bool FindInRange(lldb::addr_t lower_bound, lldb::addr_t upper_bound,
- StopPointSiteList &bp_site_list) const {
- if (lower_bound > upper_bound)
- return false;
-
- std::lock_guard<std::recursive_mutex> guard(m_mutex);
- typename collection::const_iterator lower, upper, pos;
- lower = m_site_list.lower_bound(lower_bound);
- if (lower == m_site_list.end() || (*lower).first >= upper_bound)
- return false;
-
- // This is one tricky bit. The site might overlap the bottom end of
- // the range. So we grab the site prior to the lower bound, and check
- // that that + its byte size isn't in our range.
- if (lower != m_site_list.begin()) {
- typename collection::const_iterator prev_pos = lower;
- prev_pos--;
- const StopPointSiteSP &prev_site = (*prev_pos).second;
- if (prev_site->GetLoadAddress() + prev_site->GetByteSize() > lower_bound)
- bp_site_list.Add(prev_site);
- }
-
- upper = m_site_list.upper_bound(upper_bound);
-
- for (pos = lower; pos != upper; pos++)
- bp_site_list.Add((*pos).second);
- return true;
- }
-
- typedef void (*StopPointSiteSPMapFunc)(StopPointSite &site, void *baton);
-
- /// Enquires of the site on in this list with ID \a site_id
- /// whether we should stop for the constituent or not.
- ///
- /// \param[in] context
- /// This contains the information about this stop.
- ///
- /// \param[in] site_id
- /// This site ID that we hit.
- ///
- /// \return
- /// \b true if we should stop, \b false otherwise.
- bool ShouldStop(StoppointCallbackContext *context,
- typename StopPointSite::SiteID site_id) {
- if (StopPointSiteSP site_sp = FindByID(site_id)) {
- // Let the site decide if it should stop here (could not have
- // reached it's target hit count yet, or it could have a callback that
- // decided it shouldn't stop (shared library loads/unloads).
- return site_sp->ShouldStop(context);
- }
- // We should stop here since this site isn't valid anymore or it
- // doesn't exist.
- return true;
- }
-
- /// Returns the number of elements in the list.
- ///
- /// \result
- /// The number of elements.
- size_t GetSize() const {
- std::lock_guard<std::recursive_mutex> guard(m_mutex);
- return m_site_list.size();
- }
-
- bool IsEmpty() const {
- std::lock_guard<std::recursive_mutex> guard(m_mutex);
- return m_site_list.empty();
- }
-
- std::vector<StopPointSiteSP> Sites() {
- std::vector<StopPointSiteSP> sites;
- std::lock_guard<std::recursive_mutex> guard(m_mutex);
- typename collection::iterator iter = m_site_list.begin();
- while (iter != m_site_list.end()) {
- sites.push_back(iter->second);
- ++iter;
- }
-
- return sites;
- }
-
- void Clear() {
- std::lock_guard<std::recursive_mutex> guard(m_mutex);
- m_site_list.clear();
- }
-
-protected:
- typedef std::map<lldb::addr_t, StopPointSiteSP> collection;
-
- typename collection::iterator
- GetIDIterator(typename StopPointSite::SiteID site_id) {
- std::lock_guard<std::recursive_mutex> guard(m_mutex);
- auto id_matches =
- [site_id](const std::pair<lldb::addr_t, StopPointSiteSP> s) {
- return site_id == s.second->GetID();
- };
- return std::find_if(m_site_list.begin(),
- m_site_list.end(), // Search full range
- id_matches);
- }
-
- typename collection::const_iterator
- GetIDConstIterator(typename StopPointSite::SiteID site_id) const {
- std::lock_guard<std::recursive_mutex> guard(m_mutex);
- auto id_matches =
- [site_id](const std::pair<lldb::addr_t, StopPointSiteSP> s) {
- return site_id == s.second->GetID();
- };
- return std::find_if(m_site_list.begin(),
- m_site_list.end(), // Search full range
- id_matches);
- }
-
- mutable std::recursive_mutex m_mutex;
- collection m_site_list; // The site list.
-};
-
-} // namespace lldb_private
-
-#endif // LLDB_BREAKPOINT_STOPPOINTSITELIST_H
diff --git a/lldb/include/lldb/Breakpoint/Watchpoint.h b/lldb/include/lldb/Breakpoint/Watchpoint.h
index 851162af24c74e0..c86d66663c7f8c0 100644
--- a/lldb/include/lldb/Breakpoint/Watchpoint.h
+++ b/lldb/include/lldb/Breakpoint/Watchpoint.h
@@ -126,7 +126,7 @@ class Watchpoint : public std::enable_shared_from_this<Watchpoint>,
void GetDescription(Stream *s, lldb::DescriptionLevel level);
void Dump(Stream *s) const override;
- bool DumpSnapshots(Stream *s, const char *prefix = nullptr) const;
+ void DumpSnapshots(Stream *s, const char *prefix = nullptr) const;
void DumpWithLevel(Stream *s, lldb::DescriptionLevel description_level) const;
Target &GetTarget() { return m_target; }
const Status &GetError() { return m_error; }
diff --git a/lldb/include/lldb/Breakpoint/WatchpointResource.h b/lldb/include/lldb/Breakpoint/WatchpointResource.h
deleted file mode 100644
index 4b1d733850f1bbf..000000000000000
--- a/lldb/include/lldb/Breakpoint/WatchpointResource.h
+++ /dev/null
@@ -1,169 +0,0 @@
-//===-- WatchpointResource.h ------------------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLDB_BREAKPOINT_WATCHPOINTRESOURCE_H
-#define LLDB_BREAKPOINT_WATCHPOINTRESOURCE_H
-
-#include "lldb/Utility/Iterable.h"
-#include "lldb/lldb-public.h"
-
-#include <mutex>
-#include <vector>
-
-namespace lldb_private {
-
-class WatchpointResource
- : public std::enable_shared_from_this<WatchpointResource> {
-
-public:
- WatchpointResource(lldb::addr_t addr, size_t size, bool read, bool write);
-
- ~WatchpointResource();
-
- typedef lldb::wp_resource_id_t SiteID;
- typedef lldb::watch_id_t ConstituentID;
-
- lldb::addr_t GetLoadAddress() const;
-
- size_t GetByteSize() const;
-
- bool WatchpointResourceRead() const;
-
- bool WatchpointResourceWrite() const;
-
- void SetType(bool read, bool write);
-
- typedef std::vector<lldb::WatchpointSP> WatchpointCollection;
- typedef LockingAdaptedIterable<WatchpointCollection, lldb::WatchpointSP,
- vector_adapter, std::mutex>
- WatchpointIterable;
-
- /// Iterate over the watchpoint constituents for this resource
- ///
- /// \return
- /// An Iterable object which can be used to loop over the watchpoints
- /// that are constituents of this resource.
- WatchpointIterable Constituents() {
- return WatchpointIterable(m_constituents, m_constituents_mutex);
- }
-
- /// Enquires of the atchpoints that produced this watchpoint resource
- /// whether we should stop at this location.
- ///
- /// \param[in] context
- /// This contains the information about this stop.
- ///
- /// \return
- /// \b true if we should stop, \b false otherwise.
- bool ShouldStop(StoppointCallbackContext *context);
-
- /// Standard Dump method
- void Dump(Stream *s) const;
-
- /// The "Constituents" are the watchpoints that share this resource.
- /// The method adds the \a constituent to this resource's constituent list.
- ///
- /// \param[in] constituent
- /// \a constituent is the Wachpoint to add.
- void AddConstituent(const lldb::WatchpointSP &constituent);
-
- /// The method removes the constituent at \a constituent from this watchpoint
- /// resource.
- void RemoveConstituent(lldb::WatchpointSP &constituent);
-
- /// This method returns the number of Watchpoints currently using
- /// watchpoint resource.
- ///
- /// \return
- /// The number of constituents.
- size_t GetNumberOfConstituents();
-
- /// This method returns the Watchpoint at index \a index using this
- /// Resource. The constituents are listed ordinally from 0 to
- /// GetNumberOfConstituents() - 1 so you can use this method to iterate over
- /// the constituents.
- ///
- /// \param[in] idx
- /// The index in the list of constituents for which you wish the
- /// constituent location.
- ///
- /// \return
- /// The Watchpoint at that index.
- lldb::WatchpointSP GetConstituentAtIndex(size_t idx);
-
- /// Check if the constituents includes a watchpoint.
- ///
- /// \param[in] wp_sp
- /// The WatchpointSP to search for.
- ///
- /// \result
- /// true if this resource's constituents includes the watchpoint.
- bool ConstituentsContains(const lldb::WatchpointSP &wp_sp);
-
- /// Check if the constituents includes a watchpoint.
- ///
- /// \param[in] wp
- /// The Watchpoint to search for.
- ///
- /// \result
- /// true if this resource's constituents includes the watchpoint.
- bool ConstituentsContains(const lldb_private::Watchpoint *wp);
-
- /// This method copies the watchpoint resource's constituents into a new
- /// collection. It does this while the constituents mutex is locked.
- ///
- /// \return
- /// A copy of the Watchpoints which own this resource.
- WatchpointCollection CopyConstituentsList();
-
- // The ID of the WatchpointResource is set by the WatchpointResourceList
- // when the Resource has been set in the inferior and is being added
- // to the List, in an attempt to match the hardware watchpoint register
- // ordering. If a Process can correctly identify the hardware watchpoint
- // register index when it has created the Resource, it may initialize it
- // before it is inserted in the WatchpointResourceList.
- void SetID(lldb::wp_resource_id_t);
-
- lldb::wp_resource_id_t GetID() const;
-
- bool Contains(lldb::addr_t addr);
-
-protected:
- // The StopInfoWatchpoint knows when it is processing a hit for a thread for
- // a site, so let it be the one to manage setting the location hit count once
- // and only once.
- friend class StopInfoWatchpoint;
-
- void BumpHitCounts();
-
-private:
- static lldb::wp_resource_id_t GetNextID();
-
- lldb::wp_resource_id_t m_id;
-
- // Start address & size aligned & expanded to be a valid watchpoint
- // memory granule on this target.
- lldb::addr_t m_addr;
- size_t m_size;
-
- bool m_watch_read;
- bool m_watch_write;
-
- /// The Watchpoints which own this resource.
- WatchpointCollection m_constituents;
-
- /// This mutex protects the constituents collection.
- std::mutex m_constituents_mutex;
-
- WatchpointResource(const WatchpointResource &) = delete;
- const WatchpointResource &operator=(const WatchpointResource &) = delete;
-};
-
-} // namespace lldb_private
-
-#endif // LLDB_BREAKPOINT_WATCHPOINTRESOURCE_H
diff --git a/lldb/include/lldb/Breakpoint/WatchpointResourceList.h b/lldb/include/lldb/Breakpoint/WatchpointResourceList.h
deleted file mode 100644
index 0e6c5fab877895c..000000000000000
--- a/lldb/include/lldb/Breakpoint/WatchpointResourceList.h
+++ /dev/null
@@ -1,145 +0,0 @@
-//===-- WatchpointResourceList.h --------------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLDB_BREAKPOINT_WATCHPOINTRESOURCELIST_H
-#define LLDB_BREAKPOINT_WATCHPOINTRESOURCELIST_H
-
-#include "lldb/Utility/Iterable.h"
-#include "lldb/lldb-private.h"
-#include "lldb/lldb-public.h"
-
-#include <mutex>
-#include <vector>
-
-namespace lldb_private {
-
-class WatchpointResourceList {
-
-public:
- WatchpointResourceList();
-
- ~WatchpointResourceList();
-
- /// Add a WatchpointResource to the list.
- ///
- /// \param[in] wp_res_sp
- /// A shared pointer to a breakpoint site being added to the list.
- ///
- /// \return
- /// The ID of the BreakpointSite in the list.
- lldb::wp_resource_id_t Add(const lldb::WatchpointResourceSP &wp_res_sp);
-
- /// Removes the watchpoint resource given by \a id from this list.
- ///
- /// \param[in] id
- /// The watchpoint resource to remove.
- ///
- /// \result
- /// \b true if the watchpoint resource \a id was in the list.
- bool Remove(lldb::wp_resource_id_t id);
-
- /// Removes the watchpoint resource containing address \a addr from this list.
- ///
- /// \param[in] addr
- /// The address from which to remove a watchpoint resource.
- ///
- /// \result
- /// \b true if \a addr had a watchpoint resource to remove from the list.
- bool RemoveByAddress(lldb::addr_t addr);
-
- /// Returns a shared pointer to the watchpoint resource which contains
- /// \a addr.
- ///
- /// \param[in] addr
- /// The address to look for.
- ///
- /// \result
- /// A shared pointer to the watchpoint resource. May contain a nullptr
- /// pointer if no watchpoint site exists with a matching address.
- lldb::WatchpointResourceSP FindByAddress(lldb::addr_t addr);
-
- /// Returns a shared pointer to the watchpoint resource which is owned
- /// by \a wp_sp.
- ///
- /// \param[in] wp_sp
- /// The WatchpointSP to look for.
- ///
- /// \result
- /// A shared pointer to the watchpoint resource. May contain a nullptr
- /// pointer if no watchpoint site exists
- lldb::WatchpointResourceSP FindByWatchpointSP(lldb::WatchpointSP &wp_sp);
-
- /// Returns a shared pointer to the watchpoint resource which is owned
- /// by \a wp.
- ///
- /// \param[in] wp
- /// The Watchpoint to look for.
- ///
- /// \result
- /// A shared pointer to the watchpoint resource. May contain a nullptr
- /// pointer if no watchpoint site exists
- lldb::WatchpointResourceSP
- FindByWatchpoint(const lldb_private::Watchpoint *wp);
-
- /// Returns a shared pointer to the watchpoint resource which has hardware
- /// index \a id. Some Process plugins may not have access to the actual
- /// hardware watchpoint register number used for a WatchpointResource, so
- /// the wp_resource_id_t may not be correctly tracking the target's wp
- /// register target.
- ///
- /// \param[in] id
- /// The hardware resource index to search for.
- ///
- /// \result
- /// A shared pointer to the watchpoint resource. May contain a nullptr
- /// pointer if no watchpoint site exists with a matching id.
- lldb::WatchpointResourceSP FindByID(lldb::wp_resource_id_t id);
-
- ///
- /// Get the number of WatchpointResources that are available.
- ///
- /// \return
- /// The number of WatchpointResources that are stored in the
- /// WatchpointResourceList.
- uint32_t GetSize();
-
- /// Get the WatchpointResource at a given index.
- ///
- /// \param [in] idx
- /// The index of the resource.
- /// \return
- /// The WatchpointResource at that index number.
- lldb::WatchpointResourceSP GetResourceAtIndex(uint32_t idx);
-
- typedef std::vector<lldb::WatchpointResourceSP> collection;
- typedef LockingAdaptedIterable<collection, lldb::WatchpointResourceSP,
- vector_adapter, std::mutex>
- WatchpointResourceIterable;
-
- /// Iterate over the list of WatchpointResources.
- ///
- /// \return
- /// An Iterable object which can be used to loop over the resources
- /// that exist.
- WatchpointResourceIterable Resources() {
- return WatchpointResourceIterable(m_resources, m_mutex);
- }
-
- /// Clear out the list of resources from the WatchpointResourceList
- void Clear();
-
- std::mutex &GetMutex();
-
-private:
- collection m_resources;
- std::mutex m_mutex;
-};
-
-} // namespace lldb_private
-
-#endif // LLDB_BREAKPOINT_WATCHPOINTRESOURCELIST_H
diff --git a/lldb/include/lldb/Interpreter/OptionGroupWatchpoint.h b/lldb/include/lldb/Interpreter/OptionGroupWatchpoint.h
index 527a2612b189bd3..f009fa145f30344 100644
--- a/lldb/include/lldb/Interpreter/OptionGroupWatchpoint.h
+++ b/lldb/include/lldb/Interpreter/OptionGroupWatchpoint.h
@@ -9,7 +9,6 @@
#ifndef LLDB_INTERPRETER_OPTIONGROUPWATCHPOINT_H
#define LLDB_INTERPRETER_OPTIONGROUPWATCHPOINT_H
-#include "lldb/Interpreter/OptionValueUInt64.h"
#include "lldb/Interpreter/Options.h"
namespace lldb_private {
@@ -22,6 +21,8 @@ class OptionGroupWatchpoint : public OptionGroup {
~OptionGroupWatchpoint() override = default;
+ static bool IsWatchSizeSupported(uint32_t watch_size);
+
llvm::ArrayRef<OptionDefinition> GetDefinitions() override;
Status SetOptionValue(uint32_t option_idx, llvm::StringRef option_value,
@@ -42,7 +43,7 @@ class OptionGroupWatchpoint : public OptionGroup {
};
WatchType watch_type;
- OptionValueUInt64 watch_size;
+ uint32_t watch_size;
bool watch_type_specified;
lldb::LanguageType language_type;
diff --git a/lldb/include/lldb/Target/Process.h b/lldb/include/lldb/Target/Process.h
index 4646e3070cf141f..08e3c60f7c324e6 100644
--- a/lldb/include/lldb/Target/Process.h
+++ b/lldb/include/lldb/Target/Process.h
@@ -22,9 +22,7 @@
#include <unordered_set>
#include <vector>
-#include "lldb/Breakpoint/BreakpointSite.h"
-#include "lldb/Breakpoint/StopPointSiteList.h"
-#include "lldb/Breakpoint/WatchpointResource.h"
+#include "lldb/Breakpoint/BreakpointSiteList.h"
#include "lldb/Core/LoadedModuleInfoList.h"
#include "lldb/Core/PluginInterface.h"
#include "lldb/Core/SourceManager.h"
@@ -2141,10 +2139,9 @@ class Process : public std::enable_shared_from_this<Process>,
// doesn't work for a specific process plug-in.
virtual Status DisableSoftwareBreakpoint(BreakpointSite *bp_site);
- StopPointSiteList<lldb_private::BreakpointSite> &GetBreakpointSiteList();
+ BreakpointSiteList &GetBreakpointSiteList();
- const StopPointSiteList<lldb_private::BreakpointSite> &
- GetBreakpointSiteList() const;
+ const BreakpointSiteList &GetBreakpointSiteList() const;
void DisableAllBreakpointSites();
@@ -2157,17 +2154,16 @@ class Process : public std::enable_shared_from_this<Process>,
Status EnableBreakpointSiteByID(lldb::user_id_t break_id);
- // BreakpointLocations use RemoveConstituentFromBreakpointSite to remove
- // themselves from the constituent's list of this breakpoint sites.
- void RemoveConstituentFromBreakpointSite(lldb::user_id_t site_id,
- lldb::user_id_t constituent_id,
- lldb::BreakpointSiteSP &bp_site_sp);
+ // BreakpointLocations use RemoveOwnerFromBreakpointSite to remove themselves
+ // from the owner's list of this breakpoint sites.
+ void RemoveOwnerFromBreakpointSite(lldb::user_id_t owner_id,
+ lldb::user_id_t owner_loc_id,
+ lldb::BreakpointSiteSP &bp_site_sp);
// Process Watchpoints (optional)
- virtual Status EnableWatchpoint(lldb::WatchpointSP wp_sp, bool notify = true);
+ virtual Status EnableWatchpoint(Watchpoint *wp, bool notify = true);
- virtual Status DisableWatchpoint(lldb::WatchpointSP wp_sp,
- bool notify = true);
+ virtual Status DisableWatchpoint(Watchpoint *wp, bool notify = true);
// Thread Queries
@@ -2186,11 +2182,6 @@ class Process : public std::enable_shared_from_this<Process>,
ThreadList &GetThreadList() { return m_thread_list; }
- StopPointSiteList<lldb_private::WatchpointResource> &
- GetWatchpointResourceList() {
- return m_watchpoint_resource_list;
- }
-
// When ExtendedBacktraces are requested, the HistoryThreads that are created
// need an owner -- they're saved here in the Process. The threads in this
// list are not iterated over - driver programs need to request the extended
@@ -3018,24 +3009,20 @@ void PruneThreadPlans();
/// threads in m_thread_list, as well as
/// threads we knew existed, but haven't
/// determined that they have died yet.
- ThreadList
- m_extended_thread_list; ///< Constituent for extended threads that may be
- /// generated, cleared on natural stops
+ ThreadList m_extended_thread_list; ///< Owner for extended threads that may be
+ ///generated, cleared on natural stops
uint32_t m_extended_thread_stop_id; ///< The natural stop id when
///extended_thread_list was last updated
QueueList
m_queue_list; ///< The list of libdispatch queues at a given stop point
uint32_t m_queue_list_stop_id; ///< The natural stop id when queue list was
///last fetched
- StopPointSiteList<lldb_private::WatchpointResource>
- m_watchpoint_resource_list; ///< Watchpoint resources currently in use.
std::vector<Notifications> m_notifications; ///< The list of notifications
///that this process can deliver.
std::vector<lldb::addr_t> m_image_tokens;
- StopPointSiteList<lldb_private::BreakpointSite>
- m_breakpoint_site_list; ///< This is the list of breakpoint
- /// locations we intend to insert in
- /// the target.
+ BreakpointSiteList m_breakpoint_site_list; ///< This is the list of breakpoint
+ ///locations we intend to insert in
+ ///the target.
lldb::DynamicLoaderUP m_dyld_up;
lldb::JITLoaderListUP m_jit_loaders_up;
lldb::DynamicCheckerFunctionsUP m_dynamic_checkers_up; ///< The functions used
diff --git a/lldb/include/lldb/lldb-defines.h b/lldb/include/lldb/lldb-defines.h
index 469be92eabecf31..6950a4f3a496acf 100644
--- a/lldb/include/lldb/lldb-defines.h
+++ b/lldb/include/lldb/lldb-defines.h
@@ -49,9 +49,6 @@
((type & LLDB_WATCH_TYPE_READ) || (type & LLDB_WATCH_TYPE_WRITE) || \
(type & LLDB_WATCH_TYPE_MODIFY))
-// StopPointSites
-#define LLDB_INVALID_SITE_ID UINT32_MAX
-
// Generic Register Numbers
#define LLDB_REGNUM_GENERIC_PC 0 // Program Counter
#define LLDB_REGNUM_GENERIC_SP 1 // Stack Pointer
@@ -95,7 +92,6 @@
#define LLDB_INVALID_COLUMN_NUMBER 0
#define LLDB_INVALID_QUEUE_ID 0
#define LLDB_INVALID_CPU_ID UINT32_MAX
-#define LLDB_INVALID_WATCHPOINT_RESOURCE_ID UINT32_MAX
/// CPU Type definitions
#define LLDB_ARCH_DEFAULT "systemArch"
diff --git a/lldb/include/lldb/lldb-forward.h b/lldb/include/lldb/lldb-forward.h
index 068fce4976ed265..d38985f5c1f9238 100644
--- a/lldb/include/lldb/lldb-forward.h
+++ b/lldb/include/lldb/lldb-forward.h
@@ -39,6 +39,7 @@ class BreakpointOptions;
class BreakpointPrecondition;
class BreakpointResolver;
class BreakpointSite;
+class BreakpointSiteList;
class BroadcastEventSpec;
class Broadcaster;
class BroadcasterManager;
@@ -288,8 +289,6 @@ class VariableList;
class Watchpoint;
class WatchpointList;
class WatchpointOptions;
-class WatchpointResource;
-class WatchpointResourceCollection;
class WatchpointSetOptions;
struct CompilerContext;
struct LineEntry;
@@ -470,7 +469,6 @@ typedef std::shared_ptr<lldb_private::Variable> VariableSP;
typedef std::shared_ptr<lldb_private::VariableList> VariableListSP;
typedef std::shared_ptr<lldb_private::ValueObjectList> ValueObjectListSP;
typedef std::shared_ptr<lldb_private::Watchpoint> WatchpointSP;
-typedef std::shared_ptr<lldb_private::WatchpointResource> WatchpointResourceSP;
} // namespace lldb
diff --git a/lldb/include/lldb/lldb-types.h b/lldb/include/lldb/lldb-types.h
index d60686e33142ac3..d9c2a21c2daa062 100644
--- a/lldb/include/lldb/lldb-types.h
+++ b/lldb/include/lldb/lldb-types.h
@@ -83,7 +83,6 @@ typedef uint64_t tid_t;
typedef uint64_t offset_t;
typedef int32_t break_id_t;
typedef int32_t watch_id_t;
-typedef uint32_t wp_resource_id_t;
typedef void *opaque_compiler_type_t;
typedef uint64_t queue_id_t;
typedef uint32_t cpu_id_t; // CPU core id
diff --git a/lldb/source/API/SBThread.cpp b/lldb/source/API/SBThread.cpp
index fa4c80e59d973fa..18c086bb04c682f 100644
--- a/lldb/source/API/SBThread.cpp
+++ b/lldb/source/API/SBThread.cpp
@@ -181,7 +181,7 @@ size_t SBThread::GetStopReasonDataCount() {
exe_ctx.GetProcessPtr()->GetBreakpointSiteList().FindByID(
site_id));
if (bp_site_sp)
- return bp_site_sp->GetNumberOfConstituents() * 2;
+ return bp_site_sp->GetNumberOfOwners() * 2;
else
return 0; // Breakpoint must have cleared itself...
} break;
@@ -241,7 +241,7 @@ uint64_t SBThread::GetStopReasonDataAtIndex(uint32_t idx) {
if (bp_site_sp) {
uint32_t bp_index = idx / 2;
BreakpointLocationSP bp_loc_sp(
- bp_site_sp->GetConstituentAtIndex(bp_index));
+ bp_site_sp->GetOwnerAtIndex(bp_index));
if (bp_loc_sp) {
if (idx & 1) {
// Odd idx, return the breakpoint location ID
diff --git a/lldb/source/API/SBWatchpoint.cpp b/lldb/source/API/SBWatchpoint.cpp
index 9664bbe618600cb..8e60e6d5bb73ee1 100644
--- a/lldb/source/API/SBWatchpoint.cpp
+++ b/lldb/source/API/SBWatchpoint.cpp
@@ -142,9 +142,9 @@ void SBWatchpoint::SetEnabled(bool enabled) {
const bool notify = true;
if (process_sp) {
if (enabled)
- process_sp->EnableWatchpoint(watchpoint_sp, notify);
+ process_sp->EnableWatchpoint(watchpoint_sp.get(), notify);
else
- process_sp->DisableWatchpoint(watchpoint_sp, notify);
+ process_sp->DisableWatchpoint(watchpoint_sp.get(), notify);
} else {
watchpoint_sp->SetEnabled(enabled, notify);
}
diff --git a/lldb/source/Breakpoint/BreakpointLocation.cpp b/lldb/source/Breakpoint/BreakpointLocation.cpp
index 99f94d04bb31843..931e1ad4b2d9339 100644
--- a/lldb/source/Breakpoint/BreakpointLocation.cpp
+++ b/lldb/source/Breakpoint/BreakpointLocation.cpp
@@ -473,10 +473,10 @@ bool BreakpointLocation::ClearBreakpointSite() {
// physical implementation of the breakpoint as well if there are no more
// owners. Otherwise just remove this owner.
if (process_sp)
- process_sp->RemoveConstituentFromBreakpointSite(GetBreakpoint().GetID(),
- GetID(), m_bp_site_sp);
+ process_sp->RemoveOwnerFromBreakpointSite(GetBreakpoint().GetID(),
+ GetID(), m_bp_site_sp);
else
- m_bp_site_sp->RemoveConstituent(GetBreakpoint().GetID(), GetID());
+ m_bp_site_sp->RemoveOwner(GetBreakpoint().GetID(), GetID());
m_bp_site_sp.reset();
return true;
diff --git a/lldb/source/Breakpoint/BreakpointSite.cpp b/lldb/source/Breakpoint/BreakpointSite.cpp
index 3ca93f908e30b8b..5187bc560ba26ca 100644
--- a/lldb/source/Breakpoint/BreakpointSite.cpp
+++ b/lldb/source/Breakpoint/BreakpointSite.cpp
@@ -12,12 +12,14 @@
#include "lldb/Breakpoint/Breakpoint.h"
#include "lldb/Breakpoint/BreakpointLocation.h"
+#include "lldb/Breakpoint/BreakpointSiteList.h"
#include "lldb/Utility/Stream.h"
using namespace lldb;
using namespace lldb_private;
-BreakpointSite::BreakpointSite(const BreakpointLocationSP &constituent,
+BreakpointSite::BreakpointSite(BreakpointSiteList *list,
+ const BreakpointLocationSP &owner,
lldb::addr_t addr, bool use_hardware)
: StoppointSite(GetNextID(), addr, 0, use_hardware),
m_type(eSoftware), // Process subclasses need to set this correctly using
@@ -26,14 +28,14 @@ BreakpointSite::BreakpointSite(const BreakpointLocationSP &constituent,
m_enabled(false) // Need to create it disabled, so the first enable turns
// it on.
{
- m_constituents.Add(constituent);
+ m_owners.Add(owner);
}
BreakpointSite::~BreakpointSite() {
BreakpointLocationSP bp_loc_sp;
- const size_t constituent_count = m_constituents.GetSize();
- for (size_t i = 0; i < constituent_count; i++) {
- m_constituents.GetByIndex(i)->ClearBreakpointSite();
+ const size_t owner_count = m_owners.GetSize();
+ for (size_t i = 0; i < owner_count; i++) {
+ m_owners.GetByIndex(i)->ClearBreakpointSite();
}
}
@@ -48,22 +50,22 @@ break_id_t BreakpointSite::GetNextID() {
bool BreakpointSite::ShouldStop(StoppointCallbackContext *context) {
m_hit_counter.Increment();
// ShouldStop can do a lot of work, and might even come back and hit
- // this breakpoint site again. So don't hold the m_constituents_mutex the
- // whole while. Instead make a local copy of the collection and call
- // ShouldStop on the copy.
- BreakpointLocationCollection constituents_copy;
+ // this breakpoint site again. So don't hold the m_owners_mutex the whole
+ // while. Instead make a local copy of the collection and call ShouldStop on
+ // the copy.
+ BreakpointLocationCollection owners_copy;
{
- std::lock_guard<std::recursive_mutex> guard(m_constituents_mutex);
- constituents_copy = m_constituents;
+ std::lock_guard<std::recursive_mutex> guard(m_owners_mutex);
+ owners_copy = m_owners;
}
- return constituents_copy.ShouldStop(context);
+ return owners_copy.ShouldStop(context);
}
bool BreakpointSite::IsBreakpointAtThisSite(lldb::break_id_t bp_id) {
- std::lock_guard<std::recursive_mutex> guard(m_constituents_mutex);
- const size_t constituent_count = m_constituents.GetSize();
- for (size_t i = 0; i < constituent_count; i++) {
- if (m_constituents.GetByIndex(i)->GetBreakpoint().GetID() == bp_id)
+ std::lock_guard<std::recursive_mutex> guard(m_owners_mutex);
+ const size_t owner_count = m_owners.GetSize();
+ for (size_t i = 0; i < owner_count; i++) {
+ if (m_owners.GetByIndex(i)->GetBreakpoint().GetID() == bp_id)
return true;
}
return false;
@@ -80,14 +82,14 @@ void BreakpointSite::Dump(Stream *s) const {
}
void BreakpointSite::GetDescription(Stream *s, lldb::DescriptionLevel level) {
- std::lock_guard<std::recursive_mutex> guard(m_constituents_mutex);
+ std::lock_guard<std::recursive_mutex> guard(m_owners_mutex);
if (level != lldb::eDescriptionLevelBrief)
s->Printf("breakpoint site: %d at 0x%8.8" PRIx64, GetID(),
GetLoadAddress());
- m_constituents.GetDescription(s, level);
+ m_owners.GetDescription(s, level);
}
-bool BreakpointSite::IsInternal() const { return m_constituents.IsInternal(); }
+bool BreakpointSite::IsInternal() const { return m_owners.IsInternal(); }
uint8_t *BreakpointSite::GetTrapOpcodeBytes() { return &m_trap_opcode[0]; }
@@ -120,36 +122,36 @@ bool BreakpointSite::IsEnabled() const { return m_enabled; }
void BreakpointSite::SetEnabled(bool enabled) { m_enabled = enabled; }
-void BreakpointSite::AddConstituent(const BreakpointLocationSP &constituent) {
- std::lock_guard<std::recursive_mutex> guard(m_constituents_mutex);
- m_constituents.Add(constituent);
+void BreakpointSite::AddOwner(const BreakpointLocationSP &owner) {
+ std::lock_guard<std::recursive_mutex> guard(m_owners_mutex);
+ m_owners.Add(owner);
}
-size_t BreakpointSite::RemoveConstituent(lldb::break_id_t break_id,
- lldb::break_id_t break_loc_id) {
- std::lock_guard<std::recursive_mutex> guard(m_constituents_mutex);
- m_constituents.Remove(break_id, break_loc_id);
- return m_constituents.GetSize();
+size_t BreakpointSite::RemoveOwner(lldb::break_id_t break_id,
+ lldb::break_id_t break_loc_id) {
+ std::lock_guard<std::recursive_mutex> guard(m_owners_mutex);
+ m_owners.Remove(break_id, break_loc_id);
+ return m_owners.GetSize();
}
-size_t BreakpointSite::GetNumberOfConstituents() {
- std::lock_guard<std::recursive_mutex> guard(m_constituents_mutex);
- return m_constituents.GetSize();
+size_t BreakpointSite::GetNumberOfOwners() {
+ std::lock_guard<std::recursive_mutex> guard(m_owners_mutex);
+ return m_owners.GetSize();
}
-BreakpointLocationSP BreakpointSite::GetConstituentAtIndex(size_t index) {
- std::lock_guard<std::recursive_mutex> guard(m_constituents_mutex);
- return m_constituents.GetByIndex(index);
+BreakpointLocationSP BreakpointSite::GetOwnerAtIndex(size_t index) {
+ std::lock_guard<std::recursive_mutex> guard(m_owners_mutex);
+ return m_owners.GetByIndex(index);
}
bool BreakpointSite::ValidForThisThread(Thread &thread) {
- std::lock_guard<std::recursive_mutex> guard(m_constituents_mutex);
- return m_constituents.ValidForThisThread(thread);
+ std::lock_guard<std::recursive_mutex> guard(m_owners_mutex);
+ return m_owners.ValidForThisThread(thread);
}
void BreakpointSite::BumpHitCounts() {
- std::lock_guard<std::recursive_mutex> guard(m_constituents_mutex);
- for (BreakpointLocationSP loc_sp : m_constituents.BreakpointLocations()) {
+ std::lock_guard<std::recursive_mutex> guard(m_owners_mutex);
+ for (BreakpointLocationSP loc_sp : m_owners.BreakpointLocations()) {
loc_sp->BumpHitCount();
}
}
@@ -196,10 +198,10 @@ bool BreakpointSite::IntersectsRange(lldb::addr_t addr, size_t size,
return true;
}
-size_t BreakpointSite::CopyConstituentsList(
- BreakpointLocationCollection &out_collection) {
- std::lock_guard<std::recursive_mutex> guard(m_constituents_mutex);
- for (BreakpointLocationSP loc_sp : m_constituents.BreakpointLocations()) {
+size_t
+BreakpointSite::CopyOwnersList(BreakpointLocationCollection &out_collection) {
+ std::lock_guard<std::recursive_mutex> guard(m_owners_mutex);
+ for (BreakpointLocationSP loc_sp : m_owners.BreakpointLocations()) {
out_collection.Add(loc_sp);
}
return out_collection.GetSize();
diff --git a/lldb/source/Breakpoint/BreakpointSiteList.cpp b/lldb/source/Breakpoint/BreakpointSiteList.cpp
new file mode 100644
index 000000000000000..ab15da82ea4509c
--- /dev/null
+++ b/lldb/source/Breakpoint/BreakpointSiteList.cpp
@@ -0,0 +1,193 @@
+//===-- BreakpointSiteList.cpp --------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "lldb/Breakpoint/BreakpointSiteList.h"
+
+#include "lldb/Utility/Stream.h"
+#include <algorithm>
+
+using namespace lldb;
+using namespace lldb_private;
+
+BreakpointSiteList::BreakpointSiteList() = default;
+
+BreakpointSiteList::~BreakpointSiteList() = default;
+
+// Add breakpoint site to the list. However, if the element already exists in
+// the list, then we don't add it, and return LLDB_INVALID_BREAK_ID.
+
+lldb::break_id_t BreakpointSiteList::Add(const BreakpointSiteSP &bp) {
+ lldb::addr_t bp_site_load_addr = bp->GetLoadAddress();
+ std::lock_guard<std::recursive_mutex> guard(m_mutex);
+ collection::iterator iter = m_bp_site_list.find(bp_site_load_addr);
+
+ if (iter == m_bp_site_list.end()) {
+ m_bp_site_list.insert(iter, collection::value_type(bp_site_load_addr, bp));
+ return bp->GetID();
+ } else {
+ return LLDB_INVALID_BREAK_ID;
+ }
+}
+
+bool BreakpointSiteList::ShouldStop(StoppointCallbackContext *context,
+ lldb::break_id_t site_id) {
+ BreakpointSiteSP site_sp(FindByID(site_id));
+ if (site_sp) {
+ // Let the BreakpointSite decide if it should stop here (could not have
+ // reached it's target hit count yet, or it could have a callback that
+ // decided it shouldn't stop (shared library loads/unloads).
+ return site_sp->ShouldStop(context);
+ }
+ // We should stop here since this BreakpointSite isn't valid anymore or it
+ // doesn't exist.
+ return true;
+}
+lldb::break_id_t BreakpointSiteList::FindIDByAddress(lldb::addr_t addr) {
+ if (BreakpointSiteSP bp = FindByAddress(addr))
+ return bp.get()->GetID();
+ return LLDB_INVALID_BREAK_ID;
+}
+
+bool BreakpointSiteList::Remove(lldb::break_id_t break_id) {
+ std::lock_guard<std::recursive_mutex> guard(m_mutex);
+ collection::iterator pos = GetIDIterator(break_id); // Predicate
+ if (pos != m_bp_site_list.end()) {
+ m_bp_site_list.erase(pos);
+ return true;
+ }
+ return false;
+}
+
+bool BreakpointSiteList::RemoveByAddress(lldb::addr_t address) {
+ std::lock_guard<std::recursive_mutex> guard(m_mutex);
+ collection::iterator pos = m_bp_site_list.find(address);
+ if (pos != m_bp_site_list.end()) {
+ m_bp_site_list.erase(pos);
+ return true;
+ }
+ return false;
+}
+
+class BreakpointSiteIDMatches {
+public:
+ BreakpointSiteIDMatches(lldb::break_id_t break_id) : m_break_id(break_id) {}
+
+ bool operator()(std::pair<lldb::addr_t, BreakpointSiteSP> val_pair) const {
+ return m_break_id == val_pair.second->GetID();
+ }
+
+private:
+ const lldb::break_id_t m_break_id;
+};
+
+BreakpointSiteList::collection::iterator
+BreakpointSiteList::GetIDIterator(lldb::break_id_t break_id) {
+ std::lock_guard<std::recursive_mutex> guard(m_mutex);
+ return std::find_if(m_bp_site_list.begin(),
+ m_bp_site_list.end(), // Search full range
+ BreakpointSiteIDMatches(break_id)); // Predicate
+}
+
+BreakpointSiteList::collection::const_iterator
+BreakpointSiteList::GetIDConstIterator(lldb::break_id_t break_id) const {
+ std::lock_guard<std::recursive_mutex> guard(m_mutex);
+ return std::find_if(m_bp_site_list.begin(),
+ m_bp_site_list.end(), // Search full range
+ BreakpointSiteIDMatches(break_id)); // Predicate
+}
+
+BreakpointSiteSP BreakpointSiteList::FindByID(lldb::break_id_t break_id) {
+ std::lock_guard<std::recursive_mutex> guard(m_mutex);
+ BreakpointSiteSP stop_sp;
+ collection::iterator pos = GetIDIterator(break_id);
+ if (pos != m_bp_site_list.end())
+ stop_sp = pos->second;
+
+ return stop_sp;
+}
+
+const BreakpointSiteSP
+BreakpointSiteList::FindByID(lldb::break_id_t break_id) const {
+ std::lock_guard<std::recursive_mutex> guard(m_mutex);
+ BreakpointSiteSP stop_sp;
+ collection::const_iterator pos = GetIDConstIterator(break_id);
+ if (pos != m_bp_site_list.end())
+ stop_sp = pos->second;
+
+ return stop_sp;
+}
+
+BreakpointSiteSP BreakpointSiteList::FindByAddress(lldb::addr_t addr) {
+ BreakpointSiteSP found_sp;
+ std::lock_guard<std::recursive_mutex> guard(m_mutex);
+ collection::iterator iter = m_bp_site_list.find(addr);
+ if (iter != m_bp_site_list.end())
+ found_sp = iter->second;
+ return found_sp;
+}
+
+bool BreakpointSiteList::BreakpointSiteContainsBreakpoint(
+ lldb::break_id_t bp_site_id, lldb::break_id_t bp_id) {
+ std::lock_guard<std::recursive_mutex> guard(m_mutex);
+ collection::const_iterator pos = GetIDConstIterator(bp_site_id);
+ if (pos != m_bp_site_list.end())
+ return pos->second->IsBreakpointAtThisSite(bp_id);
+
+ return false;
+}
+
+void BreakpointSiteList::Dump(Stream *s) const {
+ s->Printf("%p: ", static_cast<const void *>(this));
+ // s->Indent();
+ s->Printf("BreakpointSiteList with %u BreakpointSites:\n",
+ (uint32_t)m_bp_site_list.size());
+ s->IndentMore();
+ collection::const_iterator pos;
+ collection::const_iterator end = m_bp_site_list.end();
+ for (pos = m_bp_site_list.begin(); pos != end; ++pos)
+ pos->second->Dump(s);
+ s->IndentLess();
+}
+
+void BreakpointSiteList::ForEach(
+ std::function<void(BreakpointSite *)> const &callback) {
+ std::lock_guard<std::recursive_mutex> guard(m_mutex);
+ for (auto pair : m_bp_site_list)
+ callback(pair.second.get());
+}
+
+bool BreakpointSiteList::FindInRange(lldb::addr_t lower_bound,
+ lldb::addr_t upper_bound,
+ BreakpointSiteList &bp_site_list) const {
+ if (lower_bound > upper_bound)
+ return false;
+
+ std::lock_guard<std::recursive_mutex> guard(m_mutex);
+ collection::const_iterator lower, upper, pos;
+ lower = m_bp_site_list.lower_bound(lower_bound);
+ if (lower == m_bp_site_list.end() || (*lower).first >= upper_bound)
+ return false;
+
+ // This is one tricky bit. The breakpoint might overlap the bottom end of
+ // the range. So we grab the breakpoint prior to the lower bound, and check
+ // that that + its byte size isn't in our range.
+ if (lower != m_bp_site_list.begin()) {
+ collection::const_iterator prev_pos = lower;
+ prev_pos--;
+ const BreakpointSiteSP &prev_bp = (*prev_pos).second;
+ if (prev_bp->GetLoadAddress() + prev_bp->GetByteSize() > lower_bound)
+ bp_site_list.Add(prev_bp);
+ }
+
+ upper = m_bp_site_list.upper_bound(upper_bound);
+
+ for (pos = lower; pos != upper; pos++) {
+ bp_site_list.Add((*pos).second);
+ }
+ return true;
+}
diff --git a/lldb/source/Breakpoint/CMakeLists.txt b/lldb/source/Breakpoint/CMakeLists.txt
index 42ac338c315b4ff..5c2802322ed52c1 100644
--- a/lldb/source/Breakpoint/CMakeLists.txt
+++ b/lldb/source/Breakpoint/CMakeLists.txt
@@ -16,15 +16,13 @@ add_lldb_library(lldbBreakpoint NO_PLUGIN_DEPENDENCIES
BreakpointResolverName.cpp
BreakpointResolverScripted.cpp
BreakpointSite.cpp
+ BreakpointSiteList.cpp
Stoppoint.cpp
StoppointCallbackContext.cpp
StoppointSite.cpp
- StopPointSiteList.cpp
Watchpoint.cpp
WatchpointList.cpp
WatchpointOptions.cpp
- WatchpointResource.cpp
- WatchpointResourceList.cpp
LINK_LIBS
lldbCore
diff --git a/lldb/source/Breakpoint/StopPointSiteList.cpp b/lldb/source/Breakpoint/StopPointSiteList.cpp
deleted file mode 100644
index 275d0fbf265a653..000000000000000
--- a/lldb/source/Breakpoint/StopPointSiteList.cpp
+++ /dev/null
@@ -1,37 +0,0 @@
-//===-- StopPointSiteList.cpp ---------------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "lldb/Breakpoint/StopPointSiteList.h"
-#include "lldb/Breakpoint/BreakpointSite.h"
-#include "lldb/Breakpoint/WatchpointResource.h"
-
-#include "lldb/Utility/Stream.h"
-#include <algorithm>
-
-using namespace lldb;
-using namespace lldb_private;
-
-// This method is only defined when we're specializing for
-// BreakpointSite / BreakpointLocation / Breakpoint.
-// Watchpoints don't have a similar structure, they are
-// WatchpointResource / Watchpoint
-
-template <>
-bool StopPointSiteList<BreakpointSite>::StopPointSiteContainsBreakpoint(
- typename BreakpointSite::SiteID site_id, lldb::break_id_t bp_id) {
- std::lock_guard<std::recursive_mutex> guard(m_mutex);
- typename collection::const_iterator pos = GetIDConstIterator(site_id);
- if (pos != m_site_list.end())
- return pos->second->IsBreakpointAtThisSite(bp_id);
-
- return false;
-}
-
-namespace lldb_private {
-template class StopPointSiteList<BreakpointSite>;
-} // namespace lldb_private
diff --git a/lldb/source/Breakpoint/Watchpoint.cpp b/lldb/source/Breakpoint/Watchpoint.cpp
index 4602ce4213b9cda..b58455f73030c9b 100644
--- a/lldb/source/Breakpoint/Watchpoint.cpp
+++ b/lldb/source/Breakpoint/Watchpoint.cpp
@@ -9,11 +9,9 @@
#include "lldb/Breakpoint/Watchpoint.h"
#include "lldb/Breakpoint/StoppointCallbackContext.h"
-#include "lldb/Breakpoint/WatchpointResource.h"
#include "lldb/Core/Value.h"
#include "lldb/Core/ValueObject.h"
#include "lldb/Core/ValueObjectMemory.h"
-#include "lldb/DataFormatters/DumpValueObjectOptions.h"
#include "lldb/Expression/UserExpression.h"
#include "lldb/Symbol/TypeSystem.h"
#include "lldb/Target/Process.h"
@@ -163,7 +161,7 @@ bool Watchpoint::VariableWatchpointDisabler(void *baton,
"callback for watchpoint %" PRId32
" matched internal breakpoint execution context",
watch_sp->GetID());
- process_sp->DisableWatchpoint(watch_sp);
+ process_sp->DisableWatchpoint(watch_sp.get());
return false;
}
LLDB_LOGF(log,
@@ -268,69 +266,33 @@ void Watchpoint::Dump(Stream *s) const {
// If prefix is nullptr, we display the watch id and ignore the prefix
// altogether.
-bool Watchpoint::DumpSnapshots(Stream *s, const char *prefix) const {
- bool printed_anything = false;
-
- // For read watchpoints, don't display any before/after value changes.
- if (m_watch_read && !m_watch_modify && !m_watch_write)
- return printed_anything;
-
- s->Printf("\n");
- s->Printf("Watchpoint %u hit:\n", GetID());
-
- StreamString values_ss;
- if (prefix)
- values_ss.Indent(prefix);
+void Watchpoint::DumpSnapshots(Stream *s, const char *prefix) const {
+ if (!prefix) {
+ s->Printf("\nWatchpoint %u hit:", GetID());
+ prefix = "";
+ }
if (m_old_value_sp) {
- if (auto *old_value_cstr = m_old_value_sp->GetValueAsCString()) {
- values_ss.Printf("old value: %s", old_value_cstr);
- } else {
- if (auto *old_summary_cstr = m_old_value_sp->GetSummaryAsCString())
- values_ss.Printf("old value: %s", old_summary_cstr);
- else {
- StreamString strm;
- DumpValueObjectOptions options;
- options.SetUseDynamicType(eNoDynamicValues)
- .SetHideRootType(true)
- .SetHideRootName(true)
- .SetHideName(true);
- m_old_value_sp->Dump(strm, options);
- if (strm.GetData())
- values_ss.Printf("old value: %s", strm.GetData());
- }
+ const char *old_value_cstr = m_old_value_sp->GetValueAsCString();
+ if (old_value_cstr && old_value_cstr[0])
+ s->Printf("\n%sold value: %s", prefix, old_value_cstr);
+ else {
+ const char *old_summary_cstr = m_old_value_sp->GetSummaryAsCString();
+ if (old_summary_cstr && old_summary_cstr[0])
+ s->Printf("\n%sold value: %s", prefix, old_summary_cstr);
}
}
if (m_new_value_sp) {
- if (values_ss.GetSize())
- values_ss.Printf("\n");
-
- if (auto *new_value_cstr = m_new_value_sp->GetValueAsCString())
- values_ss.Printf("new value: %s", new_value_cstr);
+ const char *new_value_cstr = m_new_value_sp->GetValueAsCString();
+ if (new_value_cstr && new_value_cstr[0])
+ s->Printf("\n%snew value: %s", prefix, new_value_cstr);
else {
- if (auto *new_summary_cstr = m_new_value_sp->GetSummaryAsCString())
- values_ss.Printf("new value: %s", new_summary_cstr);
- else {
- StreamString strm;
- DumpValueObjectOptions options;
- options.SetUseDynamicType(eNoDynamicValues)
- .SetHideRootType(true)
- .SetHideRootName(true)
- .SetHideName(true);
- m_new_value_sp->Dump(strm, options);
- if (strm.GetData())
- values_ss.Printf("new value: %s", strm.GetData());
- }
+ const char *new_summary_cstr = m_new_value_sp->GetSummaryAsCString();
+ if (new_summary_cstr && new_summary_cstr[0])
+ s->Printf("\n%snew value: %s", prefix, new_summary_cstr);
}
}
-
- if (values_ss.GetSize()) {
- s->Printf("%s", values_ss.GetData());
- printed_anything = true;
- }
-
- return printed_anything;
}
void Watchpoint::DumpWithLevel(Stream *s,
diff --git a/lldb/source/Breakpoint/WatchpointResource.cpp b/lldb/source/Breakpoint/WatchpointResource.cpp
deleted file mode 100644
index d0f8dc346f3c024..000000000000000
--- a/lldb/source/Breakpoint/WatchpointResource.cpp
+++ /dev/null
@@ -1,124 +0,0 @@
-//===-- WatchpointResource.cpp --------------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include <assert.h>
-
-#include "lldb/Breakpoint/WatchpointResource.h"
-
-#include <algorithm>
-
-using namespace lldb;
-using namespace lldb_private;
-
-WatchpointResource::WatchpointResource(lldb::addr_t addr, size_t size,
- bool read, bool write)
- : m_id(GetNextID()), m_addr(addr), m_size(size),
- m_watch_read(read), m_watch_write(write) {}
-
-WatchpointResource::~WatchpointResource() {
- std::lock_guard<std::mutex> guard(m_constituents_mutex);
- m_constituents.clear();
-}
-
-addr_t WatchpointResource::GetLoadAddress() const { return m_addr; }
-
-size_t WatchpointResource::GetByteSize() const { return m_size; }
-
-bool WatchpointResource::WatchpointResourceRead() const { return m_watch_read; }
-
-bool WatchpointResource::WatchpointResourceWrite() const {
- return m_watch_write;
-}
-
-void WatchpointResource::SetType(bool read, bool write) {
- m_watch_read = read;
- m_watch_write = write;
-}
-
-wp_resource_id_t WatchpointResource::GetID() const { return m_id; }
-
-void WatchpointResource::SetID(wp_resource_id_t id) { m_id = id; }
-
-bool WatchpointResource::Contains(addr_t addr) {
- if (addr >= m_addr && addr < m_addr + m_size)
- return true;
- return false;
-}
-
-void WatchpointResource::AddConstituent(const WatchpointSP &wp_sp) {
- std::lock_guard<std::mutex> guard(m_constituents_mutex);
- m_constituents.push_back(wp_sp);
-}
-
-void WatchpointResource::RemoveConstituent(WatchpointSP &wp_sp) {
- std::lock_guard<std::mutex> guard(m_constituents_mutex);
- const auto &it =
- std::find(m_constituents.begin(), m_constituents.end(), wp_sp);
- if (it != m_constituents.end())
- m_constituents.erase(it);
-}
-
-size_t WatchpointResource::GetNumberOfConstituents() {
- std::lock_guard<std::mutex> guard(m_constituents_mutex);
- return m_constituents.size();
-}
-
-bool WatchpointResource::ConstituentsContains(const WatchpointSP &wp_sp) {
- return ConstituentsContains(wp_sp.get());
-}
-
-bool WatchpointResource::ConstituentsContains(const Watchpoint *wp) {
- std::lock_guard<std::mutex> guard(m_constituents_mutex);
- WatchpointCollection::const_iterator match =
- std::find_if(m_constituents.begin(), m_constituents.end(),
- [&wp](const WatchpointSP &x) { return x.get() == wp; });
- return match != m_constituents.end();
-}
-
-WatchpointSP WatchpointResource::GetConstituentAtIndex(size_t idx) {
- std::lock_guard<std::mutex> guard(m_constituents_mutex);
- assert(idx < m_constituents.size());
- if (idx >= m_constituents.size())
- return {};
-
- return m_constituents[idx];
-}
-
-WatchpointResource::WatchpointCollection
-WatchpointResource::CopyConstituentsList() {
- std::lock_guard<std::mutex> guard(m_constituents_mutex);
- return m_constituents;
-}
-
-bool WatchpointResource::ShouldStop(StoppointCallbackContext *context) {
- // LWP_TODO: Need to poll all Watchpoint constituents and see if
- // we should stop, like BreakpointSites do.
-#if 0
- m_hit_counter.Increment();
- // ShouldStop can do a lot of work, and might even come back and hit
- // this breakpoint site again. So don't hold the m_constituents_mutex the
- // whole while. Instead make a local copy of the collection and call
- // ShouldStop on the copy.
- WatchpointResourceCollection constituents_copy;
- {
- std::lock_guard<std::recursive_mutex> guard(m_constituents_mutex);
- constituents_copy = m_constituents;
- }
- return constituents_copy.ShouldStop(context);
-#endif
- return true;
-}
-
-void WatchpointResource::Dump(Stream *s) const {
- return; // LWP_TODO
-}
-
-wp_resource_id_t WatchpointResource::GetNextID() {
- static wp_resource_id_t g_next_id = 0;
- return ++g_next_id;
-}
diff --git a/lldb/source/Breakpoint/WatchpointResourceList.cpp b/lldb/source/Breakpoint/WatchpointResourceList.cpp
deleted file mode 100644
index d1d364832098f4e..000000000000000
--- a/lldb/source/Breakpoint/WatchpointResourceList.cpp
+++ /dev/null
@@ -1,114 +0,0 @@
-//===-- WatchpointResourceList.cpp ----------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "lldb/Breakpoint/WatchpointResourceList.h"
-#include "lldb/Breakpoint/WatchpointResource.h"
-#include "lldb/Utility/LLDBLog.h"
-#include "lldb/Utility/Log.h"
-
-using namespace lldb;
-using namespace lldb_private;
-
-WatchpointResourceList::WatchpointResourceList() : m_resources(), m_mutex() {}
-
-WatchpointResourceList::~WatchpointResourceList() { Clear(); }
-
-wp_resource_id_t
-WatchpointResourceList::Add(const WatchpointResourceSP &wp_res_sp) {
- Log *log = GetLog(LLDBLog::Watchpoints);
- std::lock_guard<std::mutex> guard(m_mutex);
- LLDB_LOGF(log, "WatchpointResourceList::Add(addr 0x%" PRIx64 " size %zu)",
- wp_res_sp->GetLoadAddress(), wp_res_sp->GetByteSize());
-
- m_resources.push_back(wp_res_sp);
- return wp_res_sp->GetID();
-}
-
-bool WatchpointResourceList::Remove(wp_resource_id_t id) {
- std::lock_guard<std::mutex> guard(m_mutex);
- Log *log = GetLog(LLDBLog::Watchpoints);
- for (collection::iterator pos = m_resources.begin(); pos != m_resources.end();
- ++pos) {
- if ((*pos)->GetID() == id) {
- LLDB_LOGF(log,
- "WatchpointResourceList::Remove(addr 0x%" PRIx64 " size %zu)",
- (*pos)->GetLoadAddress(), (*pos)->GetByteSize());
- m_resources.erase(pos);
- return true;
- }
- }
- return false;
-}
-
-bool WatchpointResourceList::RemoveByAddress(addr_t addr) {
- std::lock_guard<std::mutex> guard(m_mutex);
- Log *log = GetLog(LLDBLog::Watchpoints);
- for (collection::iterator pos = m_resources.begin(); pos != m_resources.end();
- ++pos) {
- if ((*pos)->Contains(addr)) {
- LLDB_LOGF(log,
- "WatchpointResourceList::RemoveByAddress(addr 0x%" PRIx64
- " size %zu)",
- (*pos)->GetLoadAddress(), (*pos)->GetByteSize());
- m_resources.erase(pos);
- return true;
- }
- }
- return false;
-}
-
-WatchpointResourceSP WatchpointResourceList::FindByAddress(addr_t addr) {
- std::lock_guard<std::mutex> guard(m_mutex);
- for (WatchpointResourceSP wp_res_sp : m_resources)
- if (wp_res_sp->Contains(addr))
- return wp_res_sp;
- return {};
-}
-
-WatchpointResourceSP
-WatchpointResourceList::FindByWatchpointSP(WatchpointSP &wp_sp) {
- return FindByWatchpoint(wp_sp.get());
-}
-
-WatchpointResourceSP
-WatchpointResourceList::FindByWatchpoint(const Watchpoint *wp) {
- std::lock_guard<std::mutex> guard(m_mutex);
- for (WatchpointResourceSP wp_res_sp : m_resources)
- if (wp_res_sp->ConstituentsContains(wp))
- return wp_res_sp;
- return {};
-}
-
-WatchpointResourceSP WatchpointResourceList::FindByID(wp_resource_id_t id) {
- std::lock_guard<std::mutex> guard(m_mutex);
- for (WatchpointResourceSP wp_res_sp : m_resources)
- if (wp_res_sp->GetID() == id)
- return wp_res_sp;
- return {};
-}
-
-uint32_t WatchpointResourceList::GetSize() {
- std::lock_guard<std::mutex> guard(m_mutex);
- return m_resources.size();
-}
-
-lldb::WatchpointResourceSP
-WatchpointResourceList::GetResourceAtIndex(uint32_t idx) {
- std::lock_guard<std::mutex> guard(m_mutex);
- if (idx < m_resources.size())
- return m_resources[idx];
-
- return {};
-}
-
-void WatchpointResourceList::Clear() {
- std::lock_guard<std::mutex> guard(m_mutex);
- m_resources.clear();
-}
-
-std::mutex &WatchpointResourceList::GetMutex() { return m_mutex; }
diff --git a/lldb/source/Commands/CommandObjectProcess.cpp b/lldb/source/Commands/CommandObjectProcess.cpp
index 6dc7648f872df8f..e42d637535eba47 100644
--- a/lldb/source/Commands/CommandObjectProcess.cpp
+++ b/lldb/source/Commands/CommandObjectProcess.cpp
@@ -519,10 +519,10 @@ class CommandObjectProcessContinue : public CommandObjectParsed {
BreakpointSiteSP bp_site_sp(
process->GetBreakpointSiteList().FindByID(bp_site_id));
if (bp_site_sp) {
- const size_t num_owners = bp_site_sp->GetNumberOfConstituents();
+ const size_t num_owners = bp_site_sp->GetNumberOfOwners();
for (size_t i = 0; i < num_owners; i++) {
Breakpoint &bp_ref =
- bp_site_sp->GetConstituentAtIndex(i)->GetBreakpoint();
+ bp_site_sp->GetOwnerAtIndex(i)->GetBreakpoint();
if (!bp_ref.IsInternal()) {
bp_ref.SetIgnoreCount(m_options.m_ignore);
}
diff --git a/lldb/source/Commands/CommandObjectWatchpoint.cpp b/lldb/source/Commands/CommandObjectWatchpoint.cpp
index c80868d33905e92..cd1d226988f243e 100644
--- a/lldb/source/Commands/CommandObjectWatchpoint.cpp
+++ b/lldb/source/Commands/CommandObjectWatchpoint.cpp
@@ -918,9 +918,9 @@ corresponding to the byte size of the data type.");
if (addr_type == eAddressTypeLoad) {
// We're in business.
// Find out the size of this variable.
- size = m_option_watchpoint.watch_size.GetCurrentValue() == 0
+ size = m_option_watchpoint.watch_size == 0
? valobj_sp->GetByteSize().value_or(0)
- : m_option_watchpoint.watch_size.GetCurrentValue();
+ : m_option_watchpoint.watch_size;
}
compiler_type = valobj_sp->GetCompilerType();
} else {
@@ -1113,8 +1113,8 @@ class CommandObjectWatchpointSetExpression : public CommandObjectRaw {
return;
}
- if (m_option_watchpoint.watch_size.GetCurrentValue() != 0)
- size = m_option_watchpoint.watch_size.GetCurrentValue();
+ if (m_option_watchpoint.watch_size != 0)
+ size = m_option_watchpoint.watch_size;
else
size = target->GetArchitecture().GetAddressByteSize();
diff --git a/lldb/source/Interpreter/OptionGroupWatchpoint.cpp b/lldb/source/Interpreter/OptionGroupWatchpoint.cpp
index d1ae916cd74b1c0..c3708e7a1e80fd2 100644
--- a/lldb/source/Interpreter/OptionGroupWatchpoint.cpp
+++ b/lldb/source/Interpreter/OptionGroupWatchpoint.cpp
@@ -39,12 +39,35 @@ static constexpr OptionEnumValueElement g_watch_type[] = {
},
};
+static constexpr OptionEnumValueElement g_watch_size[] = {
+ {
+ 1,
+ "1",
+ "Watch for byte size of 1",
+ },
+ {
+ 2,
+ "2",
+ "Watch for byte size of 2",
+ },
+ {
+ 4,
+ "4",
+ "Watch for byte size of 4",
+ },
+ {
+ 8,
+ "8",
+ "Watch for byte size of 8",
+ },
+};
+
static constexpr OptionDefinition g_option_table[] = {
{LLDB_OPT_SET_1, false, "watch", 'w', OptionParser::eRequiredArgument,
nullptr, OptionEnumValues(g_watch_type), 0, eArgTypeWatchType,
"Specify the type of watching to perform."},
{LLDB_OPT_SET_1, false, "size", 's', OptionParser::eRequiredArgument,
- nullptr, {}, 0, eArgTypeByteSize,
+ nullptr, OptionEnumValues(g_watch_size), 0, eArgTypeByteSize,
"Number of bytes to use to watch a region."},
{LLDB_OPT_SET_2,
false,
@@ -57,6 +80,16 @@ static constexpr OptionDefinition g_option_table[] = {
eArgTypeLanguage,
"Language of expression to run"}};
+bool OptionGroupWatchpoint::IsWatchSizeSupported(uint32_t watch_size) {
+ for (const auto& size : g_watch_size) {
+ if (0 == size.value)
+ break;
+ if (watch_size == size.value)
+ return true;
+ }
+ return false;
+}
+
Status
OptionGroupWatchpoint::SetOptionValue(uint32_t option_idx,
llvm::StringRef option_arg,
@@ -87,10 +120,8 @@ OptionGroupWatchpoint::SetOptionValue(uint32_t option_idx,
break;
}
case 's':
- error = watch_size.SetValueFromString(option_arg);
- if (watch_size.GetCurrentValue() == 0)
- error.SetErrorStringWithFormat("invalid --size option value '%s'",
- option_arg.str().c_str());
+ watch_size = (uint32_t)OptionArgParser::ToOptionEnum(
+ option_arg, g_option_table[option_idx].enum_values, 0, error);
break;
default:
@@ -104,7 +135,7 @@ void OptionGroupWatchpoint::OptionParsingStarting(
ExecutionContext *execution_context) {
watch_type_specified = false;
watch_type = eWatchInvalid;
- watch_size.Clear();
+ watch_size = 0;
language_type = eLanguageTypeUnknown;
}
diff --git a/lldb/source/Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.cpp b/lldb/source/Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.cpp
index a5c9ead55f4cd72..6c763ea1558feb1 100644
--- a/lldb/source/Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.cpp
+++ b/lldb/source/Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.cpp
@@ -607,7 +607,7 @@ bool ItaniumABILanguageRuntime::ExceptionBreakpointsExplainStop(
return false;
uint64_t break_site_id = stop_reason->GetValue();
- return m_process->GetBreakpointSiteList().StopPointSiteContainsBreakpoint(
+ return m_process->GetBreakpointSiteList().BreakpointSiteContainsBreakpoint(
break_site_id, m_cxx_exception_bp_sp->GetID());
}
diff --git a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntime.cpp b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntime.cpp
index f08f9f0f815d0cc..80c7bd071d6bf55 100644
--- a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntime.cpp
+++ b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntime.cpp
@@ -445,7 +445,7 @@ bool AppleObjCRuntime::ExceptionBreakpointsExplainStop(
return false;
uint64_t break_site_id = stop_reason->GetValue();
- return m_process->GetBreakpointSiteList().StopPointSiteContainsBreakpoint(
+ return m_process->GetBreakpointSiteList().BreakpointSiteContainsBreakpoint(
break_site_id, m_objc_exception_bp_sp->GetID());
}
diff --git a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleThreadPlanStepThroughObjCTrampoline.cpp b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleThreadPlanStepThroughObjCTrampoline.cpp
index 4093cbdd955f759..547a1f6db97619d 100644
--- a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleThreadPlanStepThroughObjCTrampoline.cpp
+++ b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleThreadPlanStepThroughObjCTrampoline.cpp
@@ -333,7 +333,7 @@ AppleThreadPlanStepThroughDirectDispatch::DoPlanExplainsStop(Event *event_ptr) {
if (site_sp->IsBreakpointAtThisSite(break_sp->GetID())) {
// If we aren't the only one with a breakpoint on this site, then we
// should just stop and return control to the user.
- if (site_sp->GetNumberOfConstituents() > 1) {
+ if (site_sp->GetNumberOfOwners() > 1) {
SetPlanComplete(true);
return false;
}
diff --git a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp
index ca7ff5a99f9060b..ae36d3f9730bbf3 100644
--- a/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp
+++ b/lldb/source/Plugins/Platform/MacOSX/PlatformDarwin.cpp
@@ -432,7 +432,7 @@ PlatformDarwin::GetSoftwareBreakpointTrapOpcode(Target &target,
// Auto detect arm/thumb if it wasn't explicitly specified
if (!bp_is_thumb) {
- lldb::BreakpointLocationSP bp_loc_sp(bp_site->GetConstituentAtIndex(0));
+ lldb::BreakpointLocationSP bp_loc_sp(bp_site->GetOwnerAtIndex(0));
if (bp_loc_sp)
bp_is_thumb = bp_loc_sp->GetAddress().GetAddressClass() ==
AddressClass::eCodeAlternateISA;
diff --git a/lldb/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp b/lldb/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp
index 70bb9aa7a833c08..e0956b49ae1f151 100644
--- a/lldb/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp
+++ b/lldb/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.cpp
@@ -671,6 +671,20 @@ Status ProcessKDP::DisableBreakpointSite(BreakpointSite *bp_site) {
return DisableSoftwareBreakpoint(bp_site);
}
+Status ProcessKDP::EnableWatchpoint(Watchpoint *wp, bool notify) {
+ Status error;
+ error.SetErrorString(
+ "watchpoints are not supported in kdp remote debugging");
+ return error;
+}
+
+Status ProcessKDP::DisableWatchpoint(Watchpoint *wp, bool notify) {
+ Status error;
+ error.SetErrorString(
+ "watchpoints are not supported in kdp remote debugging");
+ return error;
+}
+
void ProcessKDP::Clear() { m_thread_list.Clear(); }
Status ProcessKDP::DoSignal(int signo) {
diff --git a/lldb/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.h b/lldb/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.h
index e5ec5914f9600d0..3c12fd4074499a9 100644
--- a/lldb/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.h
+++ b/lldb/source/Plugins/Process/MacOSX-Kernel/ProcessKDP.h
@@ -124,6 +124,13 @@ class ProcessKDP : public lldb_private::Process {
lldb_private::Status
DisableBreakpointSite(lldb_private::BreakpointSite *bp_site) override;
+ // Process Watchpoints
+ lldb_private::Status EnableWatchpoint(lldb_private::Watchpoint *wp,
+ bool notify = true) override;
+
+ lldb_private::Status DisableWatchpoint(lldb_private::Watchpoint *wp,
+ bool notify = true) override;
+
CommunicationKDP &GetCommunication() { return m_comm; }
protected:
diff --git a/lldb/source/Plugins/Process/Utility/StopInfoMachException.cpp b/lldb/source/Plugins/Process/Utility/StopInfoMachException.cpp
index 565941d3168f1fa..5c947bbc8d9cb95 100644
--- a/lldb/source/Plugins/Process/Utility/StopInfoMachException.cpp
+++ b/lldb/source/Plugins/Process/Utility/StopInfoMachException.cpp
@@ -491,9 +491,6 @@ static StopInfoSP GetStopInfoForHardwareBP(Thread &thread, Target *target,
uint64_t exc_sub_sub_code) {
// Try hardware watchpoint.
if (target) {
- // LWP_TODO: We need to find the WatchpointResource that matches
- // the address, and evaluate its Watchpoints.
-
// The exc_sub_code indicates the data break address.
lldb::WatchpointSP wp_sp =
target->GetWatchpointList().FindByAddress((lldb::addr_t)exc_sub_code);
@@ -669,9 +666,6 @@ StopInfoSP StopInfoMachException::CreateStopReasonWithMachException(
case llvm::Triple::thumb:
if (exc_code == 0x102) // EXC_ARM_DA_DEBUG
{
- // LWP_TODO: We need to find the WatchpointResource that matches
- // the address, and evaluate its Watchpoints.
-
// It's a watchpoint, then, if the exc_sub_code indicates a
// known/enabled data break address from our watchpoint list.
lldb::WatchpointSP wp_sp;
@@ -748,9 +742,6 @@ StopInfoSP StopInfoMachException::CreateStopReasonWithMachException(
}
if (exc_code == 0x102) // EXC_ARM_DA_DEBUG
{
- // LWP_TODO: We need to find the WatchpointResource that matches
- // the address, and evaluate its Watchpoints.
-
// It's a watchpoint, then, if the exc_sub_code indicates a
// known/enabled data break address from our watchpoint list.
lldb::WatchpointSP wp_sp;
diff --git a/lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp b/lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp
index eb0834b1159f645..91b3216a57c34c1 100644
--- a/lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp
+++ b/lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp
@@ -835,11 +835,11 @@ std::optional<uint32_t> ProcessWindows::GetWatchpointSlotCount() {
return RegisterContextWindows::GetNumHardwareBreakpointSlots();
}
-Status ProcessWindows::EnableWatchpoint(WatchpointSP wp_sp, bool notify) {
+Status ProcessWindows::EnableWatchpoint(Watchpoint *wp, bool notify) {
Status error;
- if (wp_sp->IsEnabled()) {
- wp_sp->SetEnabled(true, notify);
+ if (wp->IsEnabled()) {
+ wp->SetEnabled(true, notify);
return error;
}
@@ -851,13 +851,13 @@ Status ProcessWindows::EnableWatchpoint(WatchpointSP wp_sp, bool notify) {
break;
if (info.slot_id == RegisterContextWindows::GetNumHardwareBreakpointSlots()) {
error.SetErrorStringWithFormat("Can't find free slot for watchpoint %i",
- wp_sp->GetID());
+ wp->GetID());
return error;
}
- info.address = wp_sp->GetLoadAddress();
- info.size = wp_sp->GetByteSize();
- info.read = wp_sp->WatchpointRead();
- info.write = wp_sp->WatchpointWrite();
+ info.address = wp->GetLoadAddress();
+ info.size = wp->GetByteSize();
+ info.read = wp->WatchpointRead();
+ info.write = wp->WatchpointWrite();
for (unsigned i = 0U; i < m_thread_list.GetSize(); i++) {
Thread *thread = m_thread_list.GetThreadAtIndex(i).get();
@@ -866,7 +866,7 @@ Status ProcessWindows::EnableWatchpoint(WatchpointSP wp_sp, bool notify) {
if (!reg_ctx->AddHardwareBreakpoint(info.slot_id, info.address, info.size,
info.read, info.write)) {
error.SetErrorStringWithFormat(
- "Can't enable watchpoint %i on thread 0x%llx", wp_sp->GetID(),
+ "Can't enable watchpoint %i on thread 0x%llx", wp->GetID(),
thread->GetID());
break;
}
@@ -881,26 +881,26 @@ Status ProcessWindows::EnableWatchpoint(WatchpointSP wp_sp, bool notify) {
return error;
}
- m_watchpoints[wp_sp->GetID()] = info;
- m_watchpoint_ids[info.slot_id] = wp_sp->GetID();
+ m_watchpoints[wp->GetID()] = info;
+ m_watchpoint_ids[info.slot_id] = wp->GetID();
- wp_sp->SetEnabled(true, notify);
+ wp->SetEnabled(true, notify);
return error;
}
-Status ProcessWindows::DisableWatchpoint(WatchpointSP wp_sp, bool notify) {
+Status ProcessWindows::DisableWatchpoint(Watchpoint *wp, bool notify) {
Status error;
- if (!wp_sp->IsEnabled()) {
- wp_sp->SetEnabled(false, notify);
+ if (!wp->IsEnabled()) {
+ wp->SetEnabled(false, notify);
return error;
}
- auto it = m_watchpoints.find(wp_sp->GetID());
+ auto it = m_watchpoints.find(wp->GetID());
if (it == m_watchpoints.end()) {
error.SetErrorStringWithFormat("Info about watchpoint %i is not found",
- wp_sp->GetID());
+ wp->GetID());
return error;
}
@@ -910,7 +910,7 @@ Status ProcessWindows::DisableWatchpoint(WatchpointSP wp_sp, bool notify) {
thread->GetRegisterContext().get());
if (!reg_ctx->RemoveHardwareBreakpoint(it->second.slot_id)) {
error.SetErrorStringWithFormat(
- "Can't disable watchpoint %i on thread 0x%llx", wp_sp->GetID(),
+ "Can't disable watchpoint %i on thread 0x%llx", wp->GetID(),
thread->GetID());
break;
}
@@ -921,7 +921,7 @@ Status ProcessWindows::DisableWatchpoint(WatchpointSP wp_sp, bool notify) {
m_watchpoint_ids[it->second.slot_id] = LLDB_INVALID_BREAK_ID;
m_watchpoints.erase(it);
- wp_sp->SetEnabled(false, notify);
+ wp->SetEnabled(false, notify);
return error;
}
diff --git a/lldb/source/Plugins/Process/Windows/Common/ProcessWindows.h b/lldb/source/Plugins/Process/Windows/Common/ProcessWindows.h
index e97cfb790248be4..ed083b9e78b4bb9 100644
--- a/lldb/source/Plugins/Process/Windows/Common/ProcessWindows.h
+++ b/lldb/source/Plugins/Process/Windows/Common/ProcessWindows.h
@@ -96,10 +96,8 @@ class ProcessWindows : public Process, public ProcessDebugger {
void OnDebuggerError(const Status &error, uint32_t type) override;
std::optional<uint32_t> GetWatchpointSlotCount() override;
- Status EnableWatchpoint(lldb::WatchpointSP wp_sp,
- bool notify = true) override;
- Status DisableWatchpoint(lldb::WatchpointSP wp_sp,
- bool notify = true) override;
+ Status EnableWatchpoint(Watchpoint *wp, bool notify = true) override;
+ Status DisableWatchpoint(Watchpoint *wp, bool notify = true) override;
protected:
ProcessWindows(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp);
diff --git a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
index e075aca278cc716..e653ef5d8ac54e4 100644
--- a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
+++ b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
@@ -24,7 +24,6 @@
#include <sys/types.h>
#include "lldb/Breakpoint/Watchpoint.h"
-#include "lldb/Breakpoint/WatchpointResource.h"
#include "lldb/Core/Debugger.h"
#include "lldb/Core/Module.h"
#include "lldb/Core/ModuleSpec.h"
@@ -1799,29 +1798,24 @@ ThreadSP ProcessGDBRemote::SetThreadStopInfo(
addr_t wp_hit_addr = desc_extractor.GetU64(LLDB_INVALID_ADDRESS);
watch_id_t watch_id = LLDB_INVALID_WATCH_ID;
bool silently_continue = false;
- WatchpointResourceSP wp_resource_sp;
+ WatchpointSP wp_sp;
if (wp_hit_addr != LLDB_INVALID_ADDRESS) {
- wp_resource_sp =
- m_watchpoint_resource_list.FindByAddress(wp_hit_addr);
+ wp_sp = GetTarget().GetWatchpointList().FindByAddress(wp_hit_addr);
// On MIPS, \a wp_hit_addr outside the range of a watched
// region means we should silently continue, it is a false hit.
ArchSpec::Core core = GetTarget().GetArchitecture().GetCore();
- if (!wp_resource_sp && core >= ArchSpec::kCore_mips_first &&
+ if (!wp_sp && core >= ArchSpec::kCore_mips_first &&
core <= ArchSpec::kCore_mips_last)
silently_continue = true;
}
- if (!wp_resource_sp && wp_addr != LLDB_INVALID_ADDRESS)
- wp_resource_sp = m_watchpoint_resource_list.FindByAddress(wp_addr);
- if (!wp_resource_sp) {
+ if (!wp_sp && wp_addr != LLDB_INVALID_ADDRESS)
+ wp_sp = GetTarget().GetWatchpointList().FindByAddress(wp_addr);
+ if (wp_sp) {
+ watch_id = wp_sp->GetID();
+ }
+ if (watch_id == LLDB_INVALID_WATCH_ID) {
Log *log(GetLog(GDBRLog::Watchpoints));
LLDB_LOGF(log, "failed to find watchpoint");
- watch_id = LLDB_INVALID_SITE_ID;
- } else {
- // LWP_TODO: This is hardcoding a single Watchpoint in a
- // Resource, need to add
- // StopInfo::CreateStopReasonWithWatchpointResource which
- // represents all watchpoints that were tripped at this stop.
- watch_id = wp_resource_sp->GetConstituentAtIndex(0)->GetID();
}
thread_sp->SetStopInfo(StopInfo::CreateStopReasonWithWatchpointID(
*thread_sp, watch_id, silently_continue));
@@ -2245,8 +2239,8 @@ StateType ProcessGDBRemote::SetThreadStopInfo(StringExtractor &stop_packet) {
lldb::addr_t wp_addr = LLDB_INVALID_ADDRESS;
value.getAsInteger(16, wp_addr);
- WatchpointResourceSP wp_resource_sp =
- m_watchpoint_resource_list.FindByAddress(wp_addr);
+ WatchpointSP wp_sp =
+ GetTarget().GetWatchpointList().FindByAddress(wp_addr);
// Rewrite gdb standard watch/rwatch/awatch to
// "reason:watchpoint" + "description:ADDR",
@@ -3113,182 +3107,102 @@ Status ProcessGDBRemote::DisableBreakpointSite(BreakpointSite *bp_site) {
}
// Pre-requisite: wp != NULL.
-static GDBStoppointType
-GetGDBStoppointType(const WatchpointResourceSP &wp_res_sp) {
- assert(wp_res_sp);
- bool read = wp_res_sp->WatchpointResourceRead();
- bool write = wp_res_sp->WatchpointResourceWrite();
-
- assert((read || write) &&
- "WatchpointResource type is neither read nor write");
- if (read && write)
+static GDBStoppointType GetGDBStoppointType(Watchpoint *wp) {
+ assert(wp);
+ bool watch_read = wp->WatchpointRead();
+ bool watch_write = wp->WatchpointWrite();
+ bool watch_modify = wp->WatchpointModify();
+
+ // watch_read, watch_write, watch_modify cannot all be false.
+ assert((watch_read || watch_write || watch_modify) &&
+ "watch_read, watch_write, watch_modify cannot all be false.");
+ if (watch_read && (watch_write || watch_modify))
return eWatchpointReadWrite;
- else if (read)
+ else if (watch_read)
return eWatchpointRead;
- else
+ else // Must be watch_write or watch_modify, then.
return eWatchpointWrite;
}
-Status ProcessGDBRemote::EnableWatchpoint(WatchpointSP wp_sp, bool notify) {
+Status ProcessGDBRemote::EnableWatchpoint(Watchpoint *wp, bool notify) {
Status error;
- if (!wp_sp) {
- error.SetErrorString("No watchpoint specified");
- return error;
- }
- user_id_t watchID = wp_sp->GetID();
- addr_t addr = wp_sp->GetLoadAddress();
- Log *log(GetLog(GDBRLog::Watchpoints));
- LLDB_LOGF(log, "ProcessGDBRemote::EnableWatchpoint(watchID = %" PRIu64 ")",
- watchID);
- if (wp_sp->IsEnabled()) {
- LLDB_LOGF(log,
- "ProcessGDBRemote::EnableWatchpoint(watchID = %" PRIu64
- ") addr = 0x%8.8" PRIx64 ": watchpoint already enabled.",
- watchID, (uint64_t)addr);
- return error;
- }
-
- bool read = wp_sp->WatchpointRead();
- bool write = wp_sp->WatchpointWrite() || wp_sp->WatchpointModify();
- size_t size = wp_sp->GetByteSize();
-
- // New WatchpointResources needed to implement this Watchpoint.
- std::vector<WatchpointResourceSP> resources;
-
- // LWP_TODO: Break up the user's request into pieces that can be watched
- // given the capabilities of the target cpu / stub software.
- // As a default, breaking the watched region up into target-pointer-sized,
- // aligned, groups.
- //
- // Beyond the default, a stub can / should inform us of its capabilities,
- // e.g. a stub that can do AArch64 power-of-2 MASK watchpoints.
- //
- // And the cpu may have unique capabilities. AArch64 BAS watchpoints
- // can watch any sequential bytes in a doubleword, but Intel watchpoints
- // can only watch 1, 2, 4, 8 bytes within a doubleword.
- WatchpointResourceSP wp_res_sp =
- std::make_shared<WatchpointResource>(addr, size, read, write);
- resources.push_back(wp_res_sp);
-
- // LWP_TODO: Now that we know the WP Resources needed to implement this
- // Watchpoint, we need to look at currently allocated Resources in the
- // Process and if they match, or are within the same memory granule, or
- // overlapping memory ranges, then we need to combine them. e.g. one
- // Watchpoint watching 1 byte at 0x1002 and a second watchpoint watching 1
- // byte at 0x1003, they must use the same hardware watchpoint register
- // (Resource) to watch them.
-
- // This may mean that an existing resource changes its type (read to
- // read+write) or address range it is watching, in which case the old
- // watchpoint needs to be disabled and the new Resource addr/size/type
- // watchpoint enabled.
-
- // If we modify a shared Resource to accomodate this newly added Watchpoint,
- // and we are unable to set all of the Resources for it in the inferior, we
- // will return an error for this Watchpoint and the shared Resource should
- // be restored. e.g. this Watchpoint requires three Resources, one which
- // is shared with another Watchpoint. We extend the shared Resouce to
- // handle both Watchpoints and we try to set two new ones. But if we don't
- // have sufficient watchpoint register for all 3, we need to show an error
- // for creating this Watchpoint and we should reset the shared Resource to
- // its original configuration because it is no longer shared.
-
- bool set_all_resources = true;
- std::vector<WatchpointResourceSP> succesfully_set_resources;
- for (const auto &wp_res_sp : resources) {
- addr_t addr = wp_res_sp->GetLoadAddress();
- size_t size = wp_res_sp->GetByteSize();
- GDBStoppointType type = GetGDBStoppointType(wp_res_sp);
- if (!m_gdb_comm.SupportsGDBStoppointPacket(type) ||
- m_gdb_comm.SendGDBStoppointTypePacket(type, true, addr, size,
- GetInterruptTimeout())) {
- set_all_resources = false;
- break;
- } else {
- succesfully_set_resources.push_back(wp_res_sp);
- }
- }
- if (set_all_resources) {
- wp_sp->SetEnabled(true, notify);
- for (const auto &wp_res_sp : resources) {
- // LWP_TODO: If we expanded/reused an existing Resource,
- // it's already in the WatchpointResourceList.
- wp_res_sp->AddConstituent(wp_sp);
- m_watchpoint_resource_list.Add(wp_res_sp);
+ if (wp) {
+ user_id_t watchID = wp->GetID();
+ addr_t addr = wp->GetLoadAddress();
+ Log *log(GetLog(GDBRLog::Watchpoints));
+ LLDB_LOGF(log, "ProcessGDBRemote::EnableWatchpoint(watchID = %" PRIu64 ")",
+ watchID);
+ if (wp->IsEnabled()) {
+ LLDB_LOGF(log,
+ "ProcessGDBRemote::EnableWatchpoint(watchID = %" PRIu64
+ ") addr = 0x%8.8" PRIx64 ": watchpoint already enabled.",
+ watchID, (uint64_t)addr);
+ return error;
}
- return error;
+
+ GDBStoppointType type = GetGDBStoppointType(wp);
+ // Pass down an appropriate z/Z packet...
+ if (m_gdb_comm.SupportsGDBStoppointPacket(type)) {
+ if (m_gdb_comm.SendGDBStoppointTypePacket(type, true, addr,
+ wp->GetByteSize(),
+ GetInterruptTimeout()) == 0) {
+ wp->SetEnabled(true, notify);
+ return error;
+ } else
+ error.SetErrorString("sending gdb watchpoint packet failed");
+ } else
+ error.SetErrorString("watchpoints not supported");
} else {
- // We failed to allocate one of the resources. Unset all
- // of the new resources we did successfully set in the
- // process.
- for (const auto &wp_res_sp : succesfully_set_resources) {
- addr_t addr = wp_res_sp->GetLoadAddress();
- size_t size = wp_res_sp->GetByteSize();
- GDBStoppointType type = GetGDBStoppointType(wp_res_sp);
- m_gdb_comm.SendGDBStoppointTypePacket(type, false, addr, size,
- GetInterruptTimeout());
- }
- error.SetErrorString("Setting one of the watchpoint resources failed");
+ error.SetErrorString("Watchpoint argument was NULL.");
}
+ if (error.Success())
+ error.SetErrorToGenericError();
return error;
}
-Status ProcessGDBRemote::DisableWatchpoint(WatchpointSP wp_sp, bool notify) {
+Status ProcessGDBRemote::DisableWatchpoint(Watchpoint *wp, bool notify) {
Status error;
- if (!wp_sp) {
- error.SetErrorString("Watchpoint argument was NULL.");
- return error;
- }
-
- user_id_t watchID = wp_sp->GetID();
+ if (wp) {
+ user_id_t watchID = wp->GetID();
- Log *log(GetLog(GDBRLog::Watchpoints));
+ Log *log(GetLog(GDBRLog::Watchpoints));
- addr_t addr = wp_sp->GetLoadAddress();
-
- LLDB_LOGF(log,
- "ProcessGDBRemote::DisableWatchpoint (watchID = %" PRIu64
- ") addr = 0x%8.8" PRIx64,
- watchID, (uint64_t)addr);
+ addr_t addr = wp->GetLoadAddress();
- if (!wp_sp->IsEnabled()) {
LLDB_LOGF(log,
"ProcessGDBRemote::DisableWatchpoint (watchID = %" PRIu64
- ") addr = 0x%8.8" PRIx64 " -- SUCCESS (already disabled)",
+ ") addr = 0x%8.8" PRIx64,
watchID, (uint64_t)addr);
- // See also 'class WatchpointSentry' within StopInfo.cpp. This disabling
- // attempt might come from the user-supplied actions, we'll route it in
- // order for the watchpoint object to intelligently process this action.
- wp_sp->SetEnabled(false, notify);
- return error;
- }
- if (wp_sp->IsHardware()) {
- bool disabled_all = true;
-
- std::vector<WatchpointResourceSP> unused_resources;
- for (const auto &wp_res_sp : m_watchpoint_resource_list.Sites()) {
- if (wp_res_sp->ConstituentsContains(wp_sp)) {
- GDBStoppointType type = GetGDBStoppointType(wp_res_sp);
- addr_t addr = wp_res_sp->GetLoadAddress();
- size_t size = wp_res_sp->GetByteSize();
- if (m_gdb_comm.SendGDBStoppointTypePacket(type, false, addr, size,
- GetInterruptTimeout())) {
- disabled_all = false;
- } else {
- wp_res_sp->RemoveConstituent(wp_sp);
- if (wp_res_sp->GetNumberOfConstituents() == 0)
- unused_resources.push_back(wp_res_sp);
- }
- }
+ if (!wp->IsEnabled()) {
+ LLDB_LOGF(log,
+ "ProcessGDBRemote::DisableWatchpoint (watchID = %" PRIu64
+ ") addr = 0x%8.8" PRIx64 " -- SUCCESS (already disabled)",
+ watchID, (uint64_t)addr);
+ // See also 'class WatchpointSentry' within StopInfo.cpp. This disabling
+ // attempt might come from the user-supplied actions, we'll route it in
+ // order for the watchpoint object to intelligently process this action.
+ wp->SetEnabled(false, notify);
+ return error;
}
- for (auto &wp_res_sp : unused_resources)
- m_watchpoint_resource_list.Remove(wp_res_sp->GetID());
- wp_sp->SetEnabled(false, notify);
- if (!disabled_all)
- error.SetErrorString("Failure disabling one of the watchpoint locations");
+ if (wp->IsHardware()) {
+ GDBStoppointType type = GetGDBStoppointType(wp);
+ // Pass down an appropriate z/Z packet...
+ if (m_gdb_comm.SendGDBStoppointTypePacket(type, false, addr,
+ wp->GetByteSize(),
+ GetInterruptTimeout()) == 0) {
+ wp->SetEnabled(false, notify);
+ return error;
+ } else
+ error.SetErrorString("sending gdb watchpoint packet failed");
+ }
+ // TODO: clear software watchpoints if we implement them
+ } else {
+ error.SetErrorString("Watchpoint argument was NULL.");
}
+ if (error.Success())
+ error.SetErrorToGenericError();
return error;
}
@@ -5540,12 +5454,16 @@ void ProcessGDBRemote::DidForkSwitchHardwareTraps(bool enable) {
});
}
- for (const auto &wp_res_sp : m_watchpoint_resource_list.Sites()) {
- addr_t addr = wp_res_sp->GetLoadAddress();
- size_t size = wp_res_sp->GetByteSize();
- GDBStoppointType type = GetGDBStoppointType(wp_res_sp);
- m_gdb_comm.SendGDBStoppointTypePacket(type, true, addr, size,
- GetInterruptTimeout());
+ WatchpointList &wps = GetTarget().GetWatchpointList();
+ size_t wp_count = wps.GetSize();
+ for (size_t i = 0; i < wp_count; ++i) {
+ WatchpointSP wp = wps.GetByIndex(i);
+ if (wp->IsEnabled()) {
+ GDBStoppointType type = GetGDBStoppointType(wp.get());
+ m_gdb_comm.SendGDBStoppointTypePacket(type, enable, wp->GetLoadAddress(),
+ wp->GetByteSize(),
+ GetInterruptTimeout());
+ }
}
}
diff --git a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h
index c1ea1cc79055879..f3787e7169047e2 100644
--- a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h
+++ b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h
@@ -158,11 +158,9 @@ class ProcessGDBRemote : public Process,
Status DisableBreakpointSite(BreakpointSite *bp_site) override;
// Process Watchpoints
- Status EnableWatchpoint(lldb::WatchpointSP wp_sp,
- bool notify = true) override;
+ Status EnableWatchpoint(Watchpoint *wp, bool notify = true) override;
- Status DisableWatchpoint(lldb::WatchpointSP wp_sp,
- bool notify = true) override;
+ Status DisableWatchpoint(Watchpoint *wp, bool notify = true) override;
std::optional<uint32_t> GetWatchpointSlotCount() override;
diff --git a/lldb/source/Target/Platform.cpp b/lldb/source/Target/Platform.cpp
index 4ce290dfbe035fe..c345e33136070f2 100644
--- a/lldb/source/Target/Platform.cpp
+++ b/lldb/source/Target/Platform.cpp
@@ -2014,7 +2014,7 @@ size_t Platform::GetSoftwareBreakpointTrapOpcode(Target &target,
static const uint8_t g_arm_breakpoint_opcode[] = {0xf0, 0x01, 0xf0, 0xe7};
static const uint8_t g_thumb_breakpoint_opcode[] = {0x01, 0xde};
- lldb::BreakpointLocationSP bp_loc_sp(bp_site->GetConstituentAtIndex(0));
+ lldb::BreakpointLocationSP bp_loc_sp(bp_site->GetOwnerAtIndex(0));
AddressClass addr_class = AddressClass::eUnknown;
if (bp_loc_sp) {
diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp
index aaf3000dcac7615..21b80b8240ab64b 100644
--- a/lldb/source/Target/Process.cpp
+++ b/lldb/source/Target/Process.cpp
@@ -436,7 +436,7 @@ Process::Process(lldb::TargetSP target_sp, ListenerSP listener_sp,
m_exit_status_mutex(), m_thread_mutex(), m_thread_list_real(this),
m_thread_list(this), m_thread_plans(*this), m_extended_thread_list(this),
m_extended_thread_stop_id(0), m_queue_list(this), m_queue_list_stop_id(0),
- m_watchpoint_resource_list(), m_notifications(), m_image_tokens(),
+ m_notifications(), m_image_tokens(),
m_breakpoint_site_list(), m_dynamic_checkers_up(),
m_unix_signals_sp(unix_signals_sp), m_abi_sp(), m_process_input_reader(),
m_stdio_communication("process.stdio"), m_stdio_communication_mutex(),
@@ -547,7 +547,6 @@ void Process::Finalize() {
m_extended_thread_list.Destroy();
m_queue_list.Clear();
m_queue_list_stop_id = 0;
- m_watchpoint_resource_list.Clear();
std::vector<Notifications> empty_notifications;
m_notifications.swap(empty_notifications);
m_image_tokens.clear();
@@ -1564,12 +1563,11 @@ void Process::SetDynamicCheckers(DynamicCheckerFunctions *dynamic_checkers) {
m_dynamic_checkers_up.reset(dynamic_checkers);
}
-StopPointSiteList<BreakpointSite> &Process::GetBreakpointSiteList() {
+BreakpointSiteList &Process::GetBreakpointSiteList() {
return m_breakpoint_site_list;
}
-const StopPointSiteList<BreakpointSite> &
-Process::GetBreakpointSiteList() const {
+const BreakpointSiteList &Process::GetBreakpointSiteList() const {
return m_breakpoint_site_list;
}
@@ -1617,7 +1615,7 @@ Status Process::EnableBreakpointSiteByID(lldb::user_id_t break_id) {
}
lldb::break_id_t
-Process::CreateBreakpointSite(const BreakpointLocationSP &constituent,
+Process::CreateBreakpointSite(const BreakpointLocationSP &owner,
bool use_hardware) {
addr_t load_addr = LLDB_INVALID_ADDRESS;
@@ -1644,10 +1642,10 @@ Process::CreateBreakpointSite(const BreakpointLocationSP &constituent,
// Reset the IsIndirect flag here, in case the location changes from pointing
// to a indirect symbol to a regular symbol.
- constituent->SetIsIndirect(false);
+ owner->SetIsIndirect(false);
- if (constituent->ShouldResolveIndirectFunctions()) {
- Symbol *symbol = constituent->GetAddress().CalculateSymbolContextSymbol();
+ if (owner->ShouldResolveIndirectFunctions()) {
+ Symbol *symbol = owner->GetAddress().CalculateSymbolContextSymbol();
if (symbol && symbol->IsIndirect()) {
Status error;
Address symbol_address = symbol->GetAddress();
@@ -1657,37 +1655,37 @@ Process::CreateBreakpointSite(const BreakpointLocationSP &constituent,
"warning: failed to resolve indirect function at 0x%" PRIx64
" for breakpoint %i.%i: %s\n",
symbol->GetLoadAddress(&GetTarget()),
- constituent->GetBreakpoint().GetID(), constituent->GetID(),
+ owner->GetBreakpoint().GetID(), owner->GetID(),
error.AsCString() ? error.AsCString() : "unknown error");
return LLDB_INVALID_BREAK_ID;
}
Address resolved_address(load_addr);
load_addr = resolved_address.GetOpcodeLoadAddress(&GetTarget());
- constituent->SetIsIndirect(true);
+ owner->SetIsIndirect(true);
} else
- load_addr = constituent->GetAddress().GetOpcodeLoadAddress(&GetTarget());
+ load_addr = owner->GetAddress().GetOpcodeLoadAddress(&GetTarget());
} else
- load_addr = constituent->GetAddress().GetOpcodeLoadAddress(&GetTarget());
+ load_addr = owner->GetAddress().GetOpcodeLoadAddress(&GetTarget());
if (load_addr != LLDB_INVALID_ADDRESS) {
BreakpointSiteSP bp_site_sp;
- // Look up this breakpoint site. If it exists, then add this new
- // constituent, otherwise create a new breakpoint site and add it.
+ // Look up this breakpoint site. If it exists, then add this new owner,
+ // otherwise create a new breakpoint site and add it.
bp_site_sp = m_breakpoint_site_list.FindByAddress(load_addr);
if (bp_site_sp) {
- bp_site_sp->AddConstituent(constituent);
- constituent->SetBreakpointSite(bp_site_sp);
+ bp_site_sp->AddOwner(owner);
+ owner->SetBreakpointSite(bp_site_sp);
return bp_site_sp->GetID();
} else {
- bp_site_sp.reset(
- new BreakpointSite(constituent, load_addr, use_hardware));
+ bp_site_sp.reset(new BreakpointSite(&m_breakpoint_site_list, owner,
+ load_addr, use_hardware));
if (bp_site_sp) {
Status error = EnableBreakpointSite(bp_site_sp.get());
if (error.Success()) {
- constituent->SetBreakpointSite(bp_site_sp);
+ owner->SetBreakpointSite(bp_site_sp);
return m_breakpoint_site_list.Add(bp_site_sp);
} else {
if (show_error || use_hardware) {
@@ -1695,8 +1693,7 @@ Process::CreateBreakpointSite(const BreakpointLocationSP &constituent,
GetTarget().GetDebugger().GetErrorStream().Printf(
"warning: failed to set breakpoint site at 0x%" PRIx64
" for breakpoint %i.%i: %s\n",
- load_addr, constituent->GetBreakpoint().GetID(),
- constituent->GetID(),
+ load_addr, owner->GetBreakpoint().GetID(), owner->GetID(),
error.AsCString() ? error.AsCString() : "unknown error");
}
}
@@ -1707,12 +1704,11 @@ Process::CreateBreakpointSite(const BreakpointLocationSP &constituent,
return LLDB_INVALID_BREAK_ID;
}
-void Process::RemoveConstituentFromBreakpointSite(
- lldb::user_id_t constituent_id, lldb::user_id_t constituent_loc_id,
- BreakpointSiteSP &bp_site_sp) {
- uint32_t num_constituents =
- bp_site_sp->RemoveConstituent(constituent_id, constituent_loc_id);
- if (num_constituents == 0) {
+void Process::RemoveOwnerFromBreakpointSite(lldb::user_id_t owner_id,
+ lldb::user_id_t owner_loc_id,
+ BreakpointSiteSP &bp_site_sp) {
+ uint32_t num_owners = bp_site_sp->RemoveOwner(owner_id, owner_loc_id);
+ if (num_owners == 0) {
// Don't try to disable the site if we don't have a live process anymore.
if (IsAlive())
DisableBreakpointSite(bp_site_sp.get());
@@ -1723,7 +1719,7 @@ void Process::RemoveConstituentFromBreakpointSite(
size_t Process::RemoveBreakpointOpcodesFromBuffer(addr_t bp_addr, size_t size,
uint8_t *buf) const {
size_t bytes_removed = 0;
- StopPointSiteList<BreakpointSite> bp_sites_in_range;
+ BreakpointSiteList bp_sites_in_range;
if (m_breakpoint_site_list.FindInRange(bp_addr, bp_addr + size,
bp_sites_in_range)) {
@@ -2144,7 +2140,7 @@ size_t Process::WriteMemory(addr_t addr, const void *buf, size_t size,
// (enabled software breakpoints) any software traps (breakpoints) that we
// may have placed in our tasks memory.
- StopPointSiteList<BreakpointSite> bp_sites_in_range;
+ BreakpointSiteList bp_sites_in_range;
if (!m_breakpoint_site_list.FindInRange(addr, addr + size, bp_sites_in_range))
return WriteMemoryPrivate(addr, buf, size, error);
@@ -2412,13 +2408,13 @@ bool Process::GetLoadAddressPermissions(lldb::addr_t load_addr,
return true;
}
-Status Process::EnableWatchpoint(WatchpointSP wp_sp, bool notify) {
+Status Process::EnableWatchpoint(Watchpoint *watchpoint, bool notify) {
Status error;
error.SetErrorString("watchpoints are not supported");
return error;
}
-Status Process::DisableWatchpoint(WatchpointSP wp_sp, bool notify) {
+Status Process::DisableWatchpoint(Watchpoint *watchpoint, bool notify) {
Status error;
error.SetErrorString("watchpoints are not supported");
return error;
diff --git a/lldb/source/Target/StackFrameList.cpp b/lldb/source/Target/StackFrameList.cpp
index 2273e52e2e04819..88cc518d0ea0eb2 100644
--- a/lldb/source/Target/StackFrameList.cpp
+++ b/lldb/source/Target/StackFrameList.cpp
@@ -156,10 +156,9 @@ void StackFrameList::ResetCurrentInlinedDepth() {
m_thread.GetProcess()->GetBreakpointSiteList().FindByID(bp_site_id));
bool all_internal = true;
if (bp_site_sp) {
- uint32_t num_owners = bp_site_sp->GetNumberOfConstituents();
+ uint32_t num_owners = bp_site_sp->GetNumberOfOwners();
for (uint32_t i = 0; i < num_owners; i++) {
- Breakpoint &bp_ref =
- bp_site_sp->GetConstituentAtIndex(i)->GetBreakpoint();
+ Breakpoint &bp_ref = bp_site_sp->GetOwnerAtIndex(i)->GetBreakpoint();
if (!bp_ref.IsInternal()) {
all_internal = false;
}
diff --git a/lldb/source/Target/StopInfo.cpp b/lldb/source/Target/StopInfo.cpp
index 3b65d661c1abd04..0b858454782bc11 100644
--- a/lldb/source/Target/StopInfo.cpp
+++ b/lldb/source/Target/StopInfo.cpp
@@ -12,7 +12,6 @@
#include "lldb/Breakpoint/BreakpointLocation.h"
#include "lldb/Breakpoint/StoppointCallbackContext.h"
#include "lldb/Breakpoint/Watchpoint.h"
-#include "lldb/Breakpoint/WatchpointResource.h"
#include "lldb/Core/Debugger.h"
#include "lldb/Core/ValueObject.h"
#include "lldb/Expression/UserExpression.h"
@@ -110,9 +109,9 @@ class StopInfoBreakpoint : public StopInfo {
BreakpointSiteSP bp_site_sp(
thread_sp->GetProcess()->GetBreakpointSiteList().FindByID(m_value));
if (bp_site_sp) {
- uint32_t num_constituents = bp_site_sp->GetNumberOfConstituents();
- if (num_constituents == 1) {
- BreakpointLocationSP bp_loc_sp = bp_site_sp->GetConstituentAtIndex(0);
+ uint32_t num_owners = bp_site_sp->GetNumberOfOwners();
+ if (num_owners == 1) {
+ BreakpointLocationSP bp_loc_sp = bp_site_sp->GetOwnerAtIndex(0);
if (bp_loc_sp) {
Breakpoint & bkpt = bp_loc_sp->GetBreakpoint();
m_break_id = bkpt.GetID();
@@ -121,10 +120,8 @@ class StopInfoBreakpoint : public StopInfo {
}
} else {
m_was_all_internal = true;
- for (uint32_t i = 0; i < num_constituents; i++) {
- if (!bp_site_sp->GetConstituentAtIndex(i)
- ->GetBreakpoint()
- .IsInternal()) {
+ for (uint32_t i = 0; i < num_owners; i++) {
+ if (!bp_site_sp->GetOwnerAtIndex(i)->GetBreakpoint().IsInternal()) {
m_was_all_internal = false;
break;
}
@@ -192,9 +189,9 @@ class StopInfoBreakpoint : public StopInfo {
// If we have just hit an internal breakpoint, and it has a kind
// description, print that instead of the full breakpoint printing:
if (bp_site_sp->IsInternal()) {
- size_t num_constituents = bp_site_sp->GetNumberOfConstituents();
- for (size_t idx = 0; idx < num_constituents; idx++) {
- const char *kind = bp_site_sp->GetConstituentAtIndex(idx)
+ size_t num_owners = bp_site_sp->GetNumberOfOwners();
+ for (size_t idx = 0; idx < num_owners; idx++) {
+ const char *kind = bp_site_sp->GetOwnerAtIndex(idx)
->GetBreakpoint()
.GetBreakpointKind();
if (kind != nullptr) {
@@ -287,14 +284,13 @@ class StopInfoBreakpoint : public StopInfo {
// Use this variable to tell us if that is true.
bool actually_hit_any_locations = false;
if (bp_site_sp) {
- // Let's copy the constituents list out of the site and store them in a
- // local list. That way if one of the breakpoint actions changes the
- // site, then we won't be operating on a bad list.
+ // Let's copy the owners list out of the site and store them in a local
+ // list. That way if one of the breakpoint actions changes the site,
+ // then we won't be operating on a bad list.
BreakpointLocationCollection site_locations;
- size_t num_constituents =
- bp_site_sp->CopyConstituentsList(site_locations);
+ size_t num_owners = bp_site_sp->CopyOwnersList(site_locations);
- if (num_constituents == 0) {
+ if (num_owners == 0) {
m_should_stop = true;
actually_hit_any_locations = true; // We're going to stop, don't
// change the stop info.
@@ -386,21 +382,20 @@ class StopInfoBreakpoint : public StopInfo {
StoppointCallbackContext context(event_ptr, exe_ctx, false);
// For safety's sake let's also grab an extra reference to the
- // breakpoint constituents of the locations we're going to examine,
- // since the locations are going to have to get back to their
- // breakpoints, and the locations don't keep their constituents alive.
- // I'm just sticking the BreakpointSP's in a vector since I'm only
- // using it to locally increment their retain counts.
+ // breakpoint owners of the locations we're going to examine, since
+ // the locations are going to have to get back to their breakpoints,
+ // and the locations don't keep their owners alive. I'm just
+ // sticking the BreakpointSP's in a vector since I'm only using it to
+ // locally increment their retain counts.
- std::vector<lldb::BreakpointSP> location_constituents;
+ std::vector<lldb::BreakpointSP> location_owners;
- for (size_t j = 0; j < num_constituents; j++) {
+ for (size_t j = 0; j < num_owners; j++) {
BreakpointLocationSP loc(site_locations.GetByIndex(j));
- location_constituents.push_back(
- loc->GetBreakpoint().shared_from_this());
+ location_owners.push_back(loc->GetBreakpoint().shared_from_this());
}
- for (size_t j = 0; j < num_constituents; j++) {
+ for (size_t j = 0; j < num_owners; j++) {
lldb::BreakpointLocationSP bp_loc_sp = site_locations.GetByIndex(j);
StreamString loc_desc;
if (log) {
@@ -636,7 +631,7 @@ class StopInfoWatchpoint : public StopInfo {
if (process_sp && watchpoint_sp) {
const bool notify = false;
watchpoint_sp->TurnOnEphemeralMode();
- process_sp->DisableWatchpoint(watchpoint_sp, notify);
+ process_sp->DisableWatchpoint(watchpoint_sp.get(), notify);
process_sp->AddPreResumeAction(SentryPreResumeAction, this);
}
}
@@ -647,9 +642,9 @@ class StopInfoWatchpoint : public StopInfo {
watchpoint_sp->TurnOffEphemeralMode();
const bool notify = false;
if (was_disabled) {
- process_sp->DisableWatchpoint(watchpoint_sp, notify);
+ process_sp->DisableWatchpoint(watchpoint_sp.get(), notify);
} else {
- process_sp->EnableWatchpoint(watchpoint_sp, notify);
+ process_sp->EnableWatchpoint(watchpoint_sp.get(), notify);
}
}
}
@@ -712,7 +707,7 @@ class StopInfoWatchpoint : public StopInfo {
return true;
if (!m_did_disable_wp) {
- GetThread().GetProcess()->DisableWatchpoint(m_watch_sp, false);
+ GetThread().GetProcess()->DisableWatchpoint(m_watch_sp.get(), false);
m_did_disable_wp = true;
}
return true;
@@ -756,7 +751,7 @@ class StopInfoWatchpoint : public StopInfo {
if (!m_did_disable_wp)
return;
m_did_disable_wp = true;
- GetThread().GetProcess()->EnableWatchpoint(m_watch_sp, true);
+ GetThread().GetProcess()->EnableWatchpoint(m_watch_sp.get(), true);
}
private:
@@ -996,10 +991,9 @@ class StopInfoWatchpoint : public StopInfo {
Debugger &debugger = exe_ctx.GetTargetRef().GetDebugger();
StreamSP output_sp = debugger.GetAsyncOutputStream();
- if (wp_sp->DumpSnapshots(output_sp.get())) {
- output_sp->EOL();
- output_sp->Flush();
- }
+ wp_sp->DumpSnapshots(output_sp.get());
+ output_sp->EOL();
+ output_sp->Flush();
}
} else {
@@ -1372,8 +1366,6 @@ StopInfoSP StopInfo::CreateStopReasonWithBreakpointSiteID(Thread &thread,
return StopInfoSP(new StopInfoBreakpoint(thread, break_id, should_stop));
}
-// LWP_TODO: We'll need a CreateStopReasonWithWatchpointResourceID akin
-// to CreateStopReasonWithBreakpointSiteID
StopInfoSP StopInfo::CreateStopReasonWithWatchpointID(Thread &thread,
break_id_t watch_id,
bool silently_continue) {
diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp
index 2e8d1dfdaa1769a..a6d7148c84e20be 100644
--- a/lldb/source/Target/Target.cpp
+++ b/lldb/source/Target/Target.cpp
@@ -892,18 +892,6 @@ WatchpointSP Target::CreateWatchpoint(lldb::addr_t addr, size_t size,
if (ABISP abi = m_process_sp->GetABI())
addr = abi->FixDataAddress(addr);
- // LWP_TODO this sequence is looking for an existing watchpoint
- // at the exact same user-specified address, disables the new one
- // if addr/size/type match. If type/size
diff er, disable old one.
- // This isn't correct, we need both watchpoints to use a shared
- // WatchpointResource in the target, and expand the WatchpointResource
- // to handle the needs of both Watchpoints.
- // Also, even if the addresses don't match, they may need to be
- // supported by the same WatchpointResource, e.g. a watchpoint
- // watching 1 byte at 0x102 and a watchpoint watching 1 byte at 0x103.
- // They're in the same word and must be watched by a single hardware
- // watchpoint register.
-
std::unique_lock<std::recursive_mutex> lock;
this->GetWatchpointList().GetListMutex(lock);
WatchpointSP matched_sp = m_watchpoint_list.FindByAddress(addr);
@@ -919,7 +907,7 @@ WatchpointSP Target::CreateWatchpoint(lldb::addr_t addr, size_t size,
wp_sp->SetEnabled(false, notify);
} else {
// Nil the matched watchpoint; we will be creating a new one.
- m_process_sp->DisableWatchpoint(matched_sp, notify);
+ m_process_sp->DisableWatchpoint(matched_sp.get(), notify);
m_watchpoint_list.Remove(matched_sp->GetID(), true);
}
}
@@ -930,7 +918,7 @@ WatchpointSP Target::CreateWatchpoint(lldb::addr_t addr, size_t size,
m_watchpoint_list.Add(wp_sp, true);
}
- error = m_process_sp->EnableWatchpoint(wp_sp, notify);
+ error = m_process_sp->EnableWatchpoint(wp_sp.get(), notify);
LLDB_LOGF(log, "Target::%s (creation of watchpoint %s with id = %u)\n",
__FUNCTION__, error.Success() ? "succeeded" : "failed",
wp_sp->GetID());
@@ -939,6 +927,11 @@ WatchpointSP Target::CreateWatchpoint(lldb::addr_t addr, size_t size,
// Enabling the watchpoint on the device side failed. Remove the said
// watchpoint from the list maintained by the target instance.
m_watchpoint_list.Remove(wp_sp->GetID(), true);
+ // See if we could provide more helpful error message.
+ if (!OptionGroupWatchpoint::IsWatchSizeSupported(size))
+ error.SetErrorStringWithFormat(
+ "watch size of %" PRIu64 " is not supported", (uint64_t)size);
+
wp_sp.reset();
} else
m_last_created_watchpoint = wp_sp;
@@ -1238,7 +1231,7 @@ bool Target::RemoveAllWatchpoints(bool end_to_end) {
if (!wp_sp)
return false;
- Status rc = m_process_sp->DisableWatchpoint(wp_sp);
+ Status rc = m_process_sp->DisableWatchpoint(wp_sp.get());
if (rc.Fail())
return false;
}
@@ -1267,7 +1260,7 @@ bool Target::DisableAllWatchpoints(bool end_to_end) {
if (!wp_sp)
return false;
- Status rc = m_process_sp->DisableWatchpoint(wp_sp);
+ Status rc = m_process_sp->DisableWatchpoint(wp_sp.get());
if (rc.Fail())
return false;
}
@@ -1294,7 +1287,7 @@ bool Target::EnableAllWatchpoints(bool end_to_end) {
if (!wp_sp)
return false;
- Status rc = m_process_sp->EnableWatchpoint(wp_sp);
+ Status rc = m_process_sp->EnableWatchpoint(wp_sp.get());
if (rc.Fail())
return false;
}
@@ -1357,7 +1350,7 @@ bool Target::DisableWatchpointByID(lldb::watch_id_t watch_id) {
WatchpointSP wp_sp = m_watchpoint_list.FindByID(watch_id);
if (wp_sp) {
- Status rc = m_process_sp->DisableWatchpoint(wp_sp);
+ Status rc = m_process_sp->DisableWatchpoint(wp_sp.get());
if (rc.Success())
return true;
@@ -1376,7 +1369,7 @@ bool Target::EnableWatchpointByID(lldb::watch_id_t watch_id) {
WatchpointSP wp_sp = m_watchpoint_list.FindByID(watch_id);
if (wp_sp) {
- Status rc = m_process_sp->EnableWatchpoint(wp_sp);
+ Status rc = m_process_sp->EnableWatchpoint(wp_sp.get());
if (rc.Success())
return true;
diff --git a/lldb/source/Target/ThreadPlanCallFunction.cpp b/lldb/source/Target/ThreadPlanCallFunction.cpp
index 50dcb66b9719fe8..31027cd9e0115db 100644
--- a/lldb/source/Target/ThreadPlanCallFunction.cpp
+++ b/lldb/source/Target/ThreadPlanCallFunction.cpp
@@ -291,10 +291,10 @@ bool ThreadPlanCallFunction::DoPlanExplainsStop(Event *event_ptr) {
BreakpointSiteSP bp_site_sp;
bp_site_sp = m_process.GetBreakpointSiteList().FindByID(break_site_id);
if (bp_site_sp) {
- uint32_t num_owners = bp_site_sp->GetNumberOfConstituents();
+ uint32_t num_owners = bp_site_sp->GetNumberOfOwners();
bool is_internal = true;
for (uint32_t i = 0; i < num_owners; i++) {
- Breakpoint &bp = bp_site_sp->GetConstituentAtIndex(i)->GetBreakpoint();
+ Breakpoint &bp = bp_site_sp->GetOwnerAtIndex(i)->GetBreakpoint();
LLDB_LOGF(log,
"ThreadPlanCallFunction::PlanExplainsStop: hit "
"breakpoint %d while calling function",
diff --git a/lldb/source/Target/ThreadPlanStepOut.cpp b/lldb/source/Target/ThreadPlanStepOut.cpp
index 0a1e2ae605efcf8..7bf1d2a8b579c1b 100644
--- a/lldb/source/Target/ThreadPlanStepOut.cpp
+++ b/lldb/source/Target/ThreadPlanStepOut.cpp
@@ -322,7 +322,7 @@ bool ThreadPlanStepOut::DoPlanExplainsStop(Event *event_ptr) {
// important to report the user breakpoint than the step out
// completion.
- if (site_sp->GetNumberOfConstituents() == 1)
+ if (site_sp->GetNumberOfOwners() == 1)
return true;
}
return false;
diff --git a/lldb/source/Target/ThreadPlanStepRange.cpp b/lldb/source/Target/ThreadPlanStepRange.cpp
index bb92adcae78b715..0d5144d7a46b5f3 100644
--- a/lldb/source/Target/ThreadPlanStepRange.cpp
+++ b/lldb/source/Target/ThreadPlanStepRange.cpp
@@ -400,14 +400,14 @@ bool ThreadPlanStepRange::NextRangeBreakpointExplainsStop(
return false;
else {
// If we've hit the next branch breakpoint, then clear it.
- size_t num_constituents = bp_site_sp->GetNumberOfConstituents();
+ size_t num_owners = bp_site_sp->GetNumberOfOwners();
bool explains_stop = true;
- // If all the constituents are internal, then we are probably just stepping
- // over this range from multiple threads, or multiple frames, so we want to
+ // If all the owners are internal, then we are probably just stepping over
+ // this range from multiple threads, or multiple frames, so we want to
// continue. If one is not internal, then we should not explain the stop,
// and let the user breakpoint handle the stop.
- for (size_t i = 0; i < num_constituents; i++) {
- if (!bp_site_sp->GetConstituentAtIndex(i)->GetBreakpoint().IsInternal()) {
+ for (size_t i = 0; i < num_owners; i++) {
+ if (!bp_site_sp->GetOwnerAtIndex(i)->GetBreakpoint().IsInternal()) {
explains_stop = false;
break;
}
@@ -415,8 +415,8 @@ bool ThreadPlanStepRange::NextRangeBreakpointExplainsStop(
LLDB_LOGF(log,
"ThreadPlanStepRange::NextRangeBreakpointExplainsStop - Hit "
"next range breakpoint which has %" PRIu64
- " constituents - explains stop: %u.",
- (uint64_t)num_constituents, explains_stop);
+ " owners - explains stop: %u.",
+ (uint64_t)num_owners, explains_stop);
ClearNextBranchBreakpoint();
return explains_stop;
}
diff --git a/lldb/source/Target/ThreadPlanStepUntil.cpp b/lldb/source/Target/ThreadPlanStepUntil.cpp
index ee0f803510e684c..f63e97d3c402965 100644
--- a/lldb/source/Target/ThreadPlanStepUntil.cpp
+++ b/lldb/source/Target/ThreadPlanStepUntil.cpp
@@ -182,7 +182,7 @@ void ThreadPlanStepUntil::AnalyzeStop() {
} else
m_should_stop = false;
- if (this_site->GetNumberOfConstituents() == 1)
+ if (this_site->GetNumberOfOwners() == 1)
m_explains_stop = true;
else
m_explains_stop = false;
@@ -228,7 +228,7 @@ void ThreadPlanStepUntil::AnalyzeStop() {
// only breakpoint here, then we do explain the stop, and we'll
// continue. If not then we should let higher plans handle this
// stop.
- if (this_site->GetNumberOfConstituents() == 1)
+ if (this_site->GetNumberOfOwners() == 1)
m_explains_stop = true;
else {
m_should_stop = true;
diff --git a/lldb/test/API/python_api/watchpoint/watchlocation/TestTargetWatchAddress.py b/lldb/test/API/python_api/watchpoint/watchlocation/TestTargetWatchAddress.py
index cbab3c6382e431d..bf31819d4070de6 100644
--- a/lldb/test/API/python_api/watchpoint/watchlocation/TestTargetWatchAddress.py
+++ b/lldb/test/API/python_api/watchpoint/watchlocation/TestTargetWatchAddress.py
@@ -135,5 +135,5 @@ def test_watch_address_with_invalid_watch_size(self):
self.expect(
error.GetCString(),
exe=False,
- substrs=["Setting one of the watchpoint resources failed"],
+ substrs=["watch size of %d is not supported" % 365],
)
diff --git a/lldb/test/Shell/Watchpoint/Inputs/val.c b/lldb/test/Shell/Watchpoint/Inputs/val.c
index 4a23ae5b1aa9628..5c70375c9d0faa5 100644
--- a/lldb/test/Shell/Watchpoint/Inputs/val.c
+++ b/lldb/test/Shell/Watchpoint/Inputs/val.c
@@ -1,9 +1,6 @@
int main() {
int val = 0;
// Break here
- val = 5;
- val = 10;
- val = 1;
val++;
val++;
return 0;
diff --git a/lldb/test/Shell/Watchpoint/LocalVariableWatchpointDisabler.test b/lldb/test/Shell/Watchpoint/LocalVariableWatchpointDisabler.test
index 396b4a922fd87fe..dc2b6687964f608 100644
--- a/lldb/test/Shell/Watchpoint/LocalVariableWatchpointDisabler.test
+++ b/lldb/test/Shell/Watchpoint/LocalVariableWatchpointDisabler.test
@@ -1,10 +1,3 @@
# REQUIRES: system-darwin
-# TODO: This test is breaking with my output
-# reformatting done for Large Watchpoint support,
-# but the lines being output by lldb are identical,
-# by visual inspection.
-# FileCheck is seeing some
diff erence between them,
-# which I need to get to the bottom of.
-# UNSUPPORTED: system-darwin
# RUN: %clang_host -x c %S/Inputs/val.c -g -o %t
# RUN: %lldb -b -s %S/Inputs/watchpoint.in %t 2>&1 | FileCheck %S/Inputs/watchpoint.in
diff --git a/lldb/test/Shell/Watchpoint/SetErrorCases.test b/lldb/test/Shell/Watchpoint/SetErrorCases.test
index 6020186b9e3f516..cc67d0adfc3feb6 100644
--- a/lldb/test/Shell/Watchpoint/SetErrorCases.test
+++ b/lldb/test/Shell/Watchpoint/SetErrorCases.test
@@ -25,4 +25,4 @@ watchpoint set expression MyAggregateDataType
# CHECK: error: expression did not evaluate to an address
watchpoint set variable -s -128
-# CHECK: error: invalid --size option value
+# CHECK: error: invalid enumeration value
More information about the lldb-commits
mailing list