[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