[Lldb-commits] [lldb] Refactor LLDB Breakpoint Event Notifications to centralize and eliminate code duplication (PR #164739)

Piyush Jaiswal via lldb-commits lldb-commits at lists.llvm.org
Thu Oct 23 13:11:44 PDT 2025


https://github.com/piyushjaiswal98 updated https://github.com/llvm/llvm-project/pull/164739

>From e04bbb2579b91a08a99fd208739a17313de969ab Mon Sep 17 00:00:00 2001
From: Piyush Jaiswal <piyushjais at meta.com>
Date: Wed, 22 Oct 2025 17:37:29 -0700
Subject: [PATCH 1/2] Refactor Breakpoint event notification

---
 lldb/include/lldb/Target/Target.h             | 15 +++++++++++++++
 lldb/source/Breakpoint/Breakpoint.cpp         | 11 ++++-------
 lldb/source/Breakpoint/BreakpointList.cpp     |  7 +------
 lldb/source/Breakpoint/BreakpointLocation.cpp |  6 ++----
 lldb/source/Target/Target.cpp                 | 17 +++++++++++++++++
 5 files changed, 39 insertions(+), 17 deletions(-)

diff --git a/lldb/include/lldb/Target/Target.h b/lldb/include/lldb/Target/Target.h
index f4a09237ce897..88267c3ab74f8 100644
--- a/lldb/include/lldb/Target/Target.h
+++ b/lldb/include/lldb/Target/Target.h
@@ -1346,6 +1346,21 @@ class Target : public std::enable_shared_from_this<Target>,
                                const lldb_private::RegisterFlags &flags,
                                uint32_t byte_size);
 
+  /// Sends a breakpoint notification event if any listener is registered.
+  /// \param[in] bp
+  ///     The breakpoint that was hit.
+  /// \param[in] eventKind
+  ///     The kind of event that occurred.
+  void NotifyBreakpointChanged(Breakpoint &bp,
+                               lldb::BreakpointEventType eventKind);
+  /// Sends a breakpoint notification event if any listener is registered.
+  /// \param[in] bp
+  ///     The breakpoint that was hit.
+  /// \param[in] data
+  ///     The data associated with the event.
+  void NotifyBreakpointChanged(Breakpoint &bp,
+                               const lldb::EventDataSP &breakpoint_data_sp);
+
   llvm::Expected<lldb::DisassemblerSP>
   ReadInstructions(const Address &start_addr, uint32_t count,
                    const char *flavor_string = nullptr);
diff --git a/lldb/source/Breakpoint/Breakpoint.cpp b/lldb/source/Breakpoint/Breakpoint.cpp
index b23d1143d60c4..9306335888d77 100644
--- a/lldb/source/Breakpoint/Breakpoint.cpp
+++ b/lldb/source/Breakpoint/Breakpoint.cpp
@@ -1099,12 +1099,11 @@ bool Breakpoint::EvaluatePrecondition(StoppointCallbackContext &context) {
 
 void Breakpoint::SendBreakpointChangedEvent(
     lldb::BreakpointEventType eventKind) {
-  if (!IsInternal() && GetTarget().EventTypeHasListeners(
-                           Target::eBroadcastBitBreakpointChanged)) {
+  if (!IsInternal()) {
     std::shared_ptr<BreakpointEventData> data =
         std::make_shared<BreakpointEventData>(eventKind, shared_from_this());
 
-    GetTarget().BroadcastEvent(Target::eBroadcastBitBreakpointChanged, data);
+    GetTarget().NotifyBreakpointChanged(*this, eventKind);
   }
 }
 
@@ -1113,10 +1112,8 @@ void Breakpoint::SendBreakpointChangedEvent(
   if (!breakpoint_data_sp)
     return;
 
-  if (!IsInternal() &&
-      GetTarget().EventTypeHasListeners(Target::eBroadcastBitBreakpointChanged))
-    GetTarget().BroadcastEvent(Target::eBroadcastBitBreakpointChanged,
-                               breakpoint_data_sp);
+  if (!IsInternal())
+    GetTarget().NotifyBreakpointChanged(*this, breakpoint_data_sp);
 }
 
 const char *Breakpoint::BreakpointEventTypeAsCString(BreakpointEventType type) {
diff --git a/lldb/source/Breakpoint/BreakpointList.cpp b/lldb/source/Breakpoint/BreakpointList.cpp
index 779490ae0316a..8fb01e97c40ca 100644
--- a/lldb/source/Breakpoint/BreakpointList.cpp
+++ b/lldb/source/Breakpoint/BreakpointList.cpp
@@ -17,12 +17,7 @@ using namespace lldb_private;
 
 static void NotifyChange(const BreakpointSP &bp, BreakpointEventType event) {
   Target &target = bp->GetTarget();
-  if (target.EventTypeHasListeners(Target::eBroadcastBitBreakpointChanged)) {
-    auto event_data_sp =
-        std::make_shared<Breakpoint::BreakpointEventData>(event, bp);
-    target.BroadcastEvent(Target::eBroadcastBitBreakpointChanged,
-                          event_data_sp);
-  }
+  target.NotifyBreakpointChanged(*bp, event);
 }
 
 BreakpointList::BreakpointList(bool is_internal)
diff --git a/lldb/source/Breakpoint/BreakpointLocation.cpp b/lldb/source/Breakpoint/BreakpointLocation.cpp
index 22c98acda8c59..f25209c15e007 100644
--- a/lldb/source/Breakpoint/BreakpointLocation.cpp
+++ b/lldb/source/Breakpoint/BreakpointLocation.cpp
@@ -749,13 +749,11 @@ void BreakpointLocation::Dump(Stream *s) const {
 
 void BreakpointLocation::SendBreakpointLocationChangedEvent(
     lldb::BreakpointEventType eventKind) {
-  if (!m_owner.IsInternal() && m_owner.GetTarget().EventTypeHasListeners(
-                                   Target::eBroadcastBitBreakpointChanged)) {
+  if (!m_owner.IsInternal()) {
     auto data_sp = std::make_shared<Breakpoint::BreakpointEventData>(
         eventKind, m_owner.shared_from_this());
     data_sp->GetBreakpointLocationCollection().Add(shared_from_this());
-    m_owner.GetTarget().BroadcastEvent(Target::eBroadcastBitBreakpointChanged,
-                                       data_sp);
+    m_owner.GetTarget().NotifyBreakpointChanged(m_owner, data_sp);
   }
 }
 
diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp
index e224a12e33463..0b408a9521eb9 100644
--- a/lldb/source/Target/Target.cpp
+++ b/lldb/source/Target/Target.cpp
@@ -7,6 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "lldb/Target/Target.h"
+#include "lldb/Breakpoint/Breakpoint.h"
 #include "lldb/Breakpoint/BreakpointIDList.h"
 #include "lldb/Breakpoint/BreakpointPrecondition.h"
 #include "lldb/Breakpoint/BreakpointResolver.h"
@@ -5244,3 +5245,19 @@ void Target::ClearSectionLoadList() { GetSectionLoadList().Clear(); }
 void Target::DumpSectionLoadList(Stream &s) {
   GetSectionLoadList().Dump(s, this);
 }
+
+void Target::NotifyBreakpointChanged(Breakpoint &bp,
+                                     lldb::BreakpointEventType eventKind) {
+  if (EventTypeHasListeners(Target::eBroadcastBitBreakpointChanged)) {
+    std::shared_ptr<Breakpoint::BreakpointEventData> data =
+        std::make_shared<Breakpoint::BreakpointEventData>(
+            eventKind, bp.shared_from_this());
+    BroadcastEvent(Target::eBroadcastBitBreakpointChanged, data);
+  }
+}
+
+void Target::NotifyBreakpointChanged(
+    Breakpoint &bp, const lldb::EventDataSP &breakpoint_data_sp) {
+  if (EventTypeHasListeners(Target::eBroadcastBitBreakpointChanged))
+    BroadcastEvent(Target::eBroadcastBitBreakpointChanged, breakpoint_data_sp);
+}

>From 487b285cea66fa3881c8f38df995b65d0025654c Mon Sep 17 00:00:00 2001
From: Piyush Jaiswal <piyushjais at meta.com>
Date: Thu, 23 Oct 2025 13:08:45 -0700
Subject: [PATCH 2/2] Remove redundant lines of code and  update comments

---
 lldb/include/lldb/Target/Target.h         | 4 ++--
 lldb/source/Breakpoint/Breakpoint.cpp     | 3 ---
 lldb/source/Breakpoint/BreakpointList.cpp | 3 +--
 lldb/source/Target/Target.cpp             | 4 ++--
 4 files changed, 5 insertions(+), 9 deletions(-)

diff --git a/lldb/include/lldb/Target/Target.h b/lldb/include/lldb/Target/Target.h
index 88267c3ab74f8..4d4355212a70b 100644
--- a/lldb/include/lldb/Target/Target.h
+++ b/lldb/include/lldb/Target/Target.h
@@ -1348,14 +1348,14 @@ class Target : public std::enable_shared_from_this<Target>,
 
   /// Sends a breakpoint notification event if any listener is registered.
   /// \param[in] bp
-  ///     The breakpoint that was hit.
+  ///     The breakpoint to send a nofication for.
   /// \param[in] eventKind
   ///     The kind of event that occurred.
   void NotifyBreakpointChanged(Breakpoint &bp,
                                lldb::BreakpointEventType eventKind);
   /// Sends a breakpoint notification event if any listener is registered.
   /// \param[in] bp
-  ///     The breakpoint that was hit.
+  ///     The breakpoint that has changed.
   /// \param[in] data
   ///     The data associated with the event.
   void NotifyBreakpointChanged(Breakpoint &bp,
diff --git a/lldb/source/Breakpoint/Breakpoint.cpp b/lldb/source/Breakpoint/Breakpoint.cpp
index 9306335888d77..63604bfb406e5 100644
--- a/lldb/source/Breakpoint/Breakpoint.cpp
+++ b/lldb/source/Breakpoint/Breakpoint.cpp
@@ -1100,9 +1100,6 @@ bool Breakpoint::EvaluatePrecondition(StoppointCallbackContext &context) {
 void Breakpoint::SendBreakpointChangedEvent(
     lldb::BreakpointEventType eventKind) {
   if (!IsInternal()) {
-    std::shared_ptr<BreakpointEventData> data =
-        std::make_shared<BreakpointEventData>(eventKind, shared_from_this());
-
     GetTarget().NotifyBreakpointChanged(*this, eventKind);
   }
 }
diff --git a/lldb/source/Breakpoint/BreakpointList.cpp b/lldb/source/Breakpoint/BreakpointList.cpp
index 8fb01e97c40ca..e3dd62bfa329d 100644
--- a/lldb/source/Breakpoint/BreakpointList.cpp
+++ b/lldb/source/Breakpoint/BreakpointList.cpp
@@ -16,8 +16,7 @@ using namespace lldb;
 using namespace lldb_private;
 
 static void NotifyChange(const BreakpointSP &bp, BreakpointEventType event) {
-  Target &target = bp->GetTarget();
-  target.NotifyBreakpointChanged(*bp, event);
+  bp->GetTarget().NotifyBreakpointChanged(*bp, event);
 }
 
 BreakpointList::BreakpointList(bool is_internal)
diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp
index 0b408a9521eb9..8780d46afb331 100644
--- a/lldb/source/Target/Target.cpp
+++ b/lldb/source/Target/Target.cpp
@@ -5249,10 +5249,10 @@ void Target::DumpSectionLoadList(Stream &s) {
 void Target::NotifyBreakpointChanged(Breakpoint &bp,
                                      lldb::BreakpointEventType eventKind) {
   if (EventTypeHasListeners(Target::eBroadcastBitBreakpointChanged)) {
-    std::shared_ptr<Breakpoint::BreakpointEventData> data =
+    std::shared_ptr<Breakpoint::BreakpointEventData> data_sp =
         std::make_shared<Breakpoint::BreakpointEventData>(
             eventKind, bp.shared_from_this());
-    BroadcastEvent(Target::eBroadcastBitBreakpointChanged, data);
+    BroadcastEvent(Target::eBroadcastBitBreakpointChanged, data_sp);
   }
 }
 



More information about the lldb-commits mailing list