https://github.com/medismailben updated 
https://github.com/llvm/llvm-project/pull/209311

>From 3abc9fc2d602a46fa5bd1af0e9812ca5824b57bb Mon Sep 17 00:00:00 2001
From: Med Ismail Bennani <[email protected]>
Date: Mon, 13 Jul 2026 16:01:01 -0700
Subject: [PATCH] [lldb/script] Add missing scripted extension base-class
 templates

This patch adds the missing Python base-class templates for
`ScriptedBreakpoint`, `ScriptedStopHook` and `ScriptedHook`, and wires
them into the Python bindings and docs CMake so every scriptable
extension kind has a template that the docs and future tooling can
introspect.

Signed-off-by: Med Ismail Bennani <[email protected]>
---
 lldb/bindings/python/CMakeLists.txt           |   3 +
 lldb/docs/CMakeLists.txt                      |   3 +
 .../python/templates/scripted_breakpoint.py   | 105 ++++++++++++++++++
 .../python/templates/scripted_hook.py         |  59 ++++++++++
 .../python/templates/scripted_stop_hook.py    |  38 +++++++
 5 files changed, 208 insertions(+)
 create mode 100644 lldb/examples/python/templates/scripted_breakpoint.py
 create mode 100644 lldb/examples/python/templates/scripted_hook.py
 create mode 100644 lldb/examples/python/templates/scripted_stop_hook.py

diff --git a/lldb/bindings/python/CMakeLists.txt 
b/lldb/bindings/python/CMakeLists.txt
index 4cf216728ede8..34a048ca16b43 100644
--- a/lldb/bindings/python/CMakeLists.txt
+++ b/lldb/bindings/python/CMakeLists.txt
@@ -117,6 +117,9 @@ function(finish_swig_python swig_target 
lldb_python_bindings_dir lldb_python_tar
     "${LLDB_SOURCE_DIR}/examples/python/templates/scripted_platform.py"
     "${LLDB_SOURCE_DIR}/examples/python/templates/operating_system.py"
     "${LLDB_SOURCE_DIR}/examples/python/templates/scripted_thread_plan.py"
+    "${LLDB_SOURCE_DIR}/examples/python/templates/scripted_breakpoint.py"
+    "${LLDB_SOURCE_DIR}/examples/python/templates/scripted_stop_hook.py"
+    "${LLDB_SOURCE_DIR}/examples/python/templates/scripted_hook.py"
     )
 
   if(APPLE)
diff --git a/lldb/docs/CMakeLists.txt b/lldb/docs/CMakeLists.txt
index ccdcb4df1c60e..24cbddc5d6e73 100644
--- a/lldb/docs/CMakeLists.txt
+++ b/lldb/docs/CMakeLists.txt
@@ -30,6 +30,9 @@ if (LLDB_ENABLE_PYTHON AND SPHINX_FOUND)
       COMMAND "${CMAKE_COMMAND}" -E copy 
"${LLDB_SOURCE_DIR}/examples/python/templates/scripted_platform.py" 
"${CMAKE_CURRENT_BINARY_DIR}/lldb/plugins/"
       COMMAND "${CMAKE_COMMAND}" -E copy 
"${LLDB_SOURCE_DIR}/examples/python/templates/operating_system.py" 
"${CMAKE_CURRENT_BINARY_DIR}/lldb/plugins/"
       COMMAND "${CMAKE_COMMAND}" -E copy 
"${LLDB_SOURCE_DIR}/examples/python/templates/scripted_thread_plan.py" 
"${CMAKE_CURRENT_BINARY_DIR}/lldb/plugins/"
+      COMMAND "${CMAKE_COMMAND}" -E copy 
"${LLDB_SOURCE_DIR}/examples/python/templates/scripted_breakpoint.py" 
"${CMAKE_CURRENT_BINARY_DIR}/lldb/plugins/"
+      COMMAND "${CMAKE_COMMAND}" -E copy 
"${LLDB_SOURCE_DIR}/examples/python/templates/scripted_stop_hook.py" 
"${CMAKE_CURRENT_BINARY_DIR}/lldb/plugins/"
+      COMMAND "${CMAKE_COMMAND}" -E copy 
"${LLDB_SOURCE_DIR}/examples/python/templates/scripted_hook.py" 
"${CMAKE_CURRENT_BINARY_DIR}/lldb/plugins/"
       COMMENT "Copying lldb.py to pretend its a Python package.")
 
     add_dependencies(lldb-python-doc-package swig_wrapper_python)
diff --git a/lldb/examples/python/templates/scripted_breakpoint.py 
b/lldb/examples/python/templates/scripted_breakpoint.py
new file mode 100644
index 0000000000000..b46ffade34743
--- /dev/null
+++ b/lldb/examples/python/templates/scripted_breakpoint.py
@@ -0,0 +1,105 @@
+from abc import ABCMeta, abstractmethod
+
+import lldb
+
+
+class ScriptedBreakpointResolver(metaclass=ABCMeta):
+    """
+    The base class for a scripted breakpoint resolver.
+    """
+
+    @abstractmethod
+    def __init__(self, bkpt, args):
+        """Construct a scripted breakpoint resolver.
+
+        Args:
+            bkpt (lldb.SBBreakpoint): The breakpoint owning this resolver.
+            args (lldb.SBStructuredData): A Dictionary holding arbitrary
+                key/value pairs used by the scripted breakpoint.
+        """
+        self.bkpt = bkpt
+        self.args = args
+
+    def overrides_resolver(self, resolver_data):
+        """Decide, from the incoming resolver options, whether this
+        breakpoint should have its resolver replaced by this class. When
+        `True`, this class's `__callback__` picks locations for this
+        breakpoint instead of the original resolver's. Search depth is
+        unaffected either way and still comes from `__get_depth__`.
+
+        Args:
+            resolver_data (lldb.SBStructuredData): The resolver options
+                passed in when the breakpoint was created.
+
+        Returns:
+            bool: `True` if this class's `__callback__` should be used in
+            place of the original resolver's, `False` to leave the
+            original resolver in charge.
+        """
+        return False
+
+    def set_breakpoint(self, bkpt):
+        """Called once the underlying breakpoint has been fully created and
+        associated to this resolver.
+
+        Args:
+            bkpt (lldb.SBBreakpoint): The breakpoint owning this resolver.
+        """
+        pass
+
+    @abstractmethod
+    def __callback__(self, sym_ctx):
+        """Called once per symbol context matched by the search depth
+        returned by `__get_depth__`. Set breakpoint locations here by calling
+        `AddLocation` on the resolver's breakpoint.
+
+        Args:
+            sym_ctx (lldb.SBSymbolContext): The symbol context to inspect.
+        """
+        pass
+
+    def __get_depth__(self):
+        """The search depth at which `__callback__` will be called.
+
+        Returns:
+            lldb.SBSearchDepth: One of the `lldb.eSearchDepth*` values.
+            Defaults to `lldb.eSearchDepthModule`.
+        """
+        return lldb.eSearchDepthModule
+
+    def get_short_help(self):
+        """A one-line description of this resolver, shown by `breakpoint list`.
+
+        Returns:
+            str: The short help string.
+        """
+        pass
+
+    def was_hit(self, frame, bp_loc):
+        """Called when a location owned by this resolver is hit, to allow
+        overriding which location is reported as hit.
+
+        Args:
+            frame (lldb.SBFrame): The frame where the breakpoint was hit.
+            bp_loc (lldb.SBBreakpointLocation): The breakpoint location that
+                was hit.
+
+        Returns:
+            lldb.SBBreakpointLocation: The location to report as hit.
+            Defaults to `bp_loc`.
+        """
+        return bp_loc
+
+    def get_location_description(self, bp_loc, level):
+        """Customize the description used when printing a breakpoint location
+        owned by this resolver.
+
+        Args:
+            bp_loc (lldb.SBBreakpointLocation): The breakpoint location to
+                describe.
+            level (lldb.DescriptionLevel): The level of detail requested.
+
+        Returns:
+            str: The description for the location.
+        """
+        pass
diff --git a/lldb/examples/python/templates/scripted_hook.py 
b/lldb/examples/python/templates/scripted_hook.py
new file mode 100644
index 0000000000000..81e900db4dec9
--- /dev/null
+++ b/lldb/examples/python/templates/scripted_hook.py
@@ -0,0 +1,59 @@
+from abc import ABCMeta, abstractmethod
+
+import lldb
+
+
+class ScriptedHook(metaclass=ABCMeta):
+    """
+    The base class for a scripted target hook.
+
+    A scripted hook can react to multiple target lifecycle events (module
+    load, module unload, process stop) through a single class. Override
+    only the methods for the events you care about.
+    """
+
+    @abstractmethod
+    def __init__(self, target, args):
+        """Construct a scripted hook.
+
+        Args:
+            target (lldb.SBTarget): The target owning this hook.
+            args (lldb.SBStructuredData): A Dictionary holding arbitrary
+                key/value pairs used by the scripted hook.
+        """
+        self.target = target
+        self.args = args
+
+    def handle_module_loaded(self, stream):
+        """Called whenever a module is loaded into the target.
+
+        Args:
+            stream (lldb.SBStream): The stream to which the hook can write
+                output that will be reported to the user.
+        """
+        pass
+
+    def handle_module_unloaded(self, stream):
+        """Called whenever a module is unloaded from the target.
+
+        Args:
+            stream (lldb.SBStream): The stream to which the hook can write
+                output that will be reported to the user.
+        """
+        pass
+
+    def handle_stop(self, exe_ctx, stream):
+        """Called whenever the process stops, before control is returned to
+        the user.
+
+        Args:
+            exe_ctx (lldb.SBExecutionContext): The execution context at the
+                point of the stop.
+            stream (lldb.SBStream): The stream to which the hook can write
+                output that will be reported to the user.
+
+        Returns:
+            bool: `True` if the process should stop and control should be
+            returned to the user, `False` if the process should keep running.
+        """
+        pass
diff --git a/lldb/examples/python/templates/scripted_stop_hook.py 
b/lldb/examples/python/templates/scripted_stop_hook.py
new file mode 100644
index 0000000000000..de0d3794e2b24
--- /dev/null
+++ b/lldb/examples/python/templates/scripted_stop_hook.py
@@ -0,0 +1,38 @@
+from abc import ABCMeta, abstractmethod
+
+import lldb
+
+
+class ScriptedStopHook(metaclass=ABCMeta):
+    """
+    The base class for a scripted stop-hook.
+    """
+
+    @abstractmethod
+    def __init__(self, target, args):
+        """Construct a scripted stop-hook.
+
+        Args:
+            target (lldb.SBTarget): The target owning this stop-hook.
+            args (lldb.SBStructuredData): A Dictionary holding arbitrary
+                key/value pairs used by the scripted stop-hook.
+        """
+        self.target = target
+        self.args = args
+
+    @abstractmethod
+    def handle_stop(self, exe_ctx, stream):
+        """Called whenever the process stops, before control is returned to
+        the user.
+
+        Args:
+            exe_ctx (lldb.SBExecutionContext): The execution context at the
+                point of the stop.
+            stream (lldb.SBStream): The stream to which the stop-hook can
+                write output that will be reported to the user.
+
+        Returns:
+            bool: `True` if the process should stop and control should be
+            returned to the user, `False` if the process should keep running.
+        """
+        pass

_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to