[Lldb-commits] [lldb] [lldb] Add a reason for all requireNot* decorators. (PR #214701)

Ebuka Ezike via lldb-commits lldb-commits at lists.llvm.org
Fri Aug 7 04:03:14 PDT 2026


https://github.com/da-viper created https://github.com/llvm/llvm-project/pull/214701

Previously, tests using the @requireNot* decorators documented by the test was skipped using a trailing comment that never made it to the test report.

Change the decorator to take a required `reason` parameter, as the test should have a reason why it is not required.

>From 782dc5167b12f412a2567c01cd38c8760e99e462 Mon Sep 17 00:00:00 2001
From: Ebuka Ezike <yerimyah1 at gmail.com>
Date: Fri, 7 Aug 2026 11:39:31 +0100
Subject: [PATCH] [lldb] Add a reason for all requireNot* decorators.

Previously, tests using the @requireNot* decorators documented by
the test was skipped using a trailing comment that never made it
into the test report.

Change the decorator to take a required `reason` parameter. as
the test should have a reason why it is not required.
---
 .../Python/lldbsuite/test/decorators.py       | 27 +++++++++++--------
 .../API/driver/batch_mode/TestBatchMode.py    |  2 +-
 lldb/test/API/macosx/mte/TestDarwinMTE.py     |  2 +-
 .../TestExprPathRegisters.py                  |  2 +-
 .../TestGlobalModuleCache.py                  |  2 +-
 .../python_api/hello_world/TestHelloWorld.py  |  4 +--
 .../process/address-masks/TestAddressMasks.py |  2 +-
 .../read-mem-cstring/TestReadMemCString.py    |  2 +-
 .../sbenvironment/TestSBEnvironment.py        |  2 +-
 .../python_api/sbplatform/TestSBPlatform.py   |  2 +-
 lldb/test/API/qemu/TestQemuLaunch.py          |  2 +-
 .../lldb-server/TestGdbRemoteAuxvSupport.py   | 10 +++----
 .../tools/lldb-server/TestLldbGdbServer.py    |  2 +-
 .../test/API/tools/lldb-server/TestNonStop.py |  2 +-
 .../inferior-crash/TestGdbRemoteAbort.py      |  2 +-
 .../inferior-crash/TestGdbRemoteSegFault.py   |  2 +-
 .../TestGdbRemote_QPassSignals.py             |  2 +-
 .../lldb-server/vCont-threads/TestSignal.py   | 16 +++++------
 18 files changed, 45 insertions(+), 40 deletions(-)

diff --git a/lldb/packages/Python/lldbsuite/test/decorators.py b/lldb/packages/Python/lldbsuite/test/decorators.py
index 6524d73e4a349..378724d4ac524 100644
--- a/lldb/packages/Python/lldbsuite/test/decorators.py
+++ b/lldb/packages/Python/lldbsuite/test/decorators.py
@@ -5,6 +5,7 @@
 
 from collections.abc import Callable
 from functools import wraps
+from typing import Optional
 from packaging import version
 import contextlib
 import ctypes
@@ -1153,15 +1154,19 @@ def requirePlatform(oslist):
     )
 
 
-def requireNotPlatform(oslist):
+def requireNotPlatform(oslist, reason: Optional[str] = None):
     """Mark the item as inherently inapplicable to the listed target platforms.
 
     Unlike `skipIfPlatform`, the listed platforms are reported as UNSUPPORTED
     rather than SKIPPED.
     """
+    assert isinstance(
+        reason, (str, type(None))
+    ), f"expects 'str' or 'None' got {type(reason).__name__!r}"
+
     return unittest.skipIf(
         lldbplatformutil.getPlatform() in oslist,
-        UnsupportedReason("unsupported on %s" % (", ".join(oslist))),
+        reason or UnsupportedReason("unsupported on %s" % (", ".join(oslist))),
     )
 
 
@@ -1171,9 +1176,9 @@ def requireDarwin(func):
     return requirePlatform(lldbplatform.translate(lldbplatform.darwin_all))(func)
 
 
-def requireNotDarwin(func):
+def requireNotDarwin(reason: str):
     """Mark the item as inherently inapplicable to Darwin targets."""
-    return requireNotPlatform(lldbplatform.translate(lldbplatform.darwin_all))(func)
+    return requireNotPlatform(lldbplatform.translate(lldbplatform.darwin_all), reason=reason)
 
 
 def requireLinux(func):
@@ -1182,9 +1187,9 @@ def requireLinux(func):
     return requirePlatform(["linux"])(func)
 
 
-def requireNotLinux(func):
+def requireNotLinux(reason: str):
     """Mark the item as inherently inapplicable to Linux targets."""
-    return requireNotPlatform(["linux"])(func)
+    return requireNotPlatform(["linux"], reason=reason)
 
 
 def requireWindows(func):
@@ -1193,13 +1198,13 @@ def requireWindows(func):
     return requirePlatform(["windows"])(func)
 
 
-def requireNotWindows(func):
+def requireNotWindows(reason: str):
     """Mark the item as inherently inapplicable to Windows targets.
 
     Use this for tests built on POSIX-only concepts: fork/exec semantics,
     POSIX signals, ptrace, ELF/Mach-O specifics, shell pipelines, and so on.
     """
-    return requireNotPlatform(["windows"])(func)
+    return requireNotPlatform(["windows"], reason=reason)
 
 
 def requirePOSIX(func):
@@ -1209,7 +1214,7 @@ def requirePOSIX(func):
     dependency is POSIX semantics generally rather than anything about
     Windows specifically.
     """
-    return requireNotPlatform(["windows"])(func)
+    return requireNotPlatform(["windows"], reason="uses the posix API.")(func)
 
 
 def requireSignals(func):
@@ -1217,14 +1222,14 @@ def requireSignals(func):
     return requireNotPlatform(["windows", "wasip1", "wasi"])(func)
 
 
-def requireNotWasm(func):
+def requireNotWasm(reason: str):
     """Mark the item as inherently inapplicable to WebAssembly targets.
 
     WebAssembly has no processes, no signals, no shared libraries and no
     ptrace-style debugging, so a large amount of the test suite can never
     apply to it.
     """
-    return requireNotPlatform(["wasip1", "wasi"])(func)
+    return requireNotPlatform(["wasip1", "wasi"], reason=reason)
 
 
 def requireHostPlatform(oslist):
diff --git a/lldb/test/API/driver/batch_mode/TestBatchMode.py b/lldb/test/API/driver/batch_mode/TestBatchMode.py
index 38b0871178395..f0998a7b56dbd 100644
--- a/lldb/test/API/driver/batch_mode/TestBatchMode.py
+++ b/lldb/test/API/driver/batch_mode/TestBatchMode.py
@@ -11,7 +11,7 @@
 from lldbsuite.test.lldbpexpect import PExpectTest
 
 
- at requireNotWasm  # driver cannot launch a Wasm inferior
+ at requireNotWasm("driver cannot launch a Wasm inferior")
 class DriverBatchModeTest(PExpectTest):
     source = "main.c"
 
diff --git a/lldb/test/API/macosx/mte/TestDarwinMTE.py b/lldb/test/API/macosx/mte/TestDarwinMTE.py
index 812d563b88f5c..df627809385c8 100644
--- a/lldb/test/API/macosx/mte/TestDarwinMTE.py
+++ b/lldb/test/API/macosx/mte/TestDarwinMTE.py
@@ -11,7 +11,7 @@
 exe_name = "uaf"  # Must match Makefile
 
 
- at requireNotWasm  # memory tagging is a Darwin AArch64 feature
+ at requireNotWasm("memory tagging is a Darwin AArch64 feature")
 class TestDarwinMTE(TestBase):
     SHARED_BUILD_TESTCASE = False
     NO_DEBUG_INFO_TESTCASE = True
diff --git a/lldb/test/API/python_api/exprpath_register/TestExprPathRegisters.py b/lldb/test/API/python_api/exprpath_register/TestExprPathRegisters.py
index 8cb6851516b3f..aa06f701b560d 100644
--- a/lldb/test/API/python_api/exprpath_register/TestExprPathRegisters.py
+++ b/lldb/test/API/python_api/exprpath_register/TestExprPathRegisters.py
@@ -50,7 +50,7 @@ def test_float_registers(self):
             if reg_value:
                 self.verify_register_path(reg_value)
 
-    @requireNotWasm  # wasm exposes no registers
+    @requireNotWasm("wasm exposes no registers")
     def test_all_registers(self):
         """Test all the registers that is avaiable on the machine"""
         self.build()
diff --git a/lldb/test/API/python_api/global_module_cache/TestGlobalModuleCache.py b/lldb/test/API/python_api/global_module_cache/TestGlobalModuleCache.py
index a39d6fe191315..10bf7a3d2821d 100644
--- a/lldb/test/API/python_api/global_module_cache/TestGlobalModuleCache.py
+++ b/lldb/test/API/python_api/global_module_cache/TestGlobalModuleCache.py
@@ -12,7 +12,7 @@
 import time
 
 
- at requireNotWasm  # modules carry no build ID to cache on
+ at requireNotWasm("modules carry no build ID to cache on")
 class GlobalModuleCacheTestCase(TestBase):
     SHARED_BUILD_TESTCASE = False
     # NO_DEBUG_INFO_TESTCASE = True
diff --git a/lldb/test/API/python_api/hello_world/TestHelloWorld.py b/lldb/test/API/python_api/hello_world/TestHelloWorld.py
index 888f0d8a04b45..8935ec2fdd447 100644
--- a/lldb/test/API/python_api/hello_world/TestHelloWorld.py
+++ b/lldb/test/API/python_api/hello_world/TestHelloWorld.py
@@ -72,7 +72,7 @@ def test_with_process_launch_api(self):
 
     @expectedFailureAll(oslist=["windows"], archs=["aarch64"])
     @skipIfiOSSimulator
-    @requireNotWasm  # attaching requires launching the inferior as a host process
+    @requireNotWasm("attaching requires launching the inferior as a host process")
     def test_with_attach_to_process_with_id_api(self):
         """Create target, spawn a process, and attach to it with process id."""
         exe = "%s_%d" % (self.testMethodName, os.getpid())
@@ -105,7 +105,7 @@ def test_with_attach_to_process_with_id_api(self):
     @expectedFailureAll(oslist=["windows"], archs=["aarch64"])
     @skipIfiOSSimulator
     @skipIfAsan  # FIXME: Hangs indefinitely.
-    @requireNotWasm  # attaching requires launching the inferior as a host process
+    @requireNotWasm("attaching requires launching the inferior as a host process")
     def test_with_attach_to_process_with_name_api(self):
         """Create target, spawn a process, and attach to it with process name."""
         exe = "%s_%d" % (self.testMethodName, os.getpid())
diff --git a/lldb/test/API/python_api/process/address-masks/TestAddressMasks.py b/lldb/test/API/python_api/process/address-masks/TestAddressMasks.py
index 866972de5520d..83a2e294b0542 100644
--- a/lldb/test/API/python_api/process/address-masks/TestAddressMasks.py
+++ b/lldb/test/API/python_api/process/address-masks/TestAddressMasks.py
@@ -7,7 +7,7 @@
 from lldbsuite.test import lldbutil
 
 
- at requireNotWasm  # no ABI plugin, so address masks are never applied
+ at requireNotWasm("no ABI plugin, so address masks are never applied")
 class AddressMasksTestCase(TestBase):
     NO_DEBUG_INFO_TESTCASE = True
 
diff --git a/lldb/test/API/python_api/process/read-mem-cstring/TestReadMemCString.py b/lldb/test/API/python_api/process/read-mem-cstring/TestReadMemCString.py
index 0373c225a60e8..5f094b036b32c 100644
--- a/lldb/test/API/python_api/process/read-mem-cstring/TestReadMemCString.py
+++ b/lldb/test/API/python_api/process/read-mem-cstring/TestReadMemCString.py
@@ -11,7 +11,7 @@
 class TestReadMemCString(TestBase):
     NO_DEBUG_INFO_TESTCASE = True
 
-    @requireNotWasm  # linear memory has no unmapped pages, so a bad in-range pointer still reads
+    @requireNotWasm("linear memory has no unmapped pages, so a bad in-range pointer still reads")
     def test_read_memory_c_string(self):
         """Test corner case behavior of SBProcess::ReadCStringFromMemory"""
         self.build()
diff --git a/lldb/test/API/python_api/sbenvironment/TestSBEnvironment.py b/lldb/test/API/python_api/sbenvironment/TestSBEnvironment.py
index f78b7a681bd68..621abe2b8af1b 100644
--- a/lldb/test/API/python_api/sbenvironment/TestSBEnvironment.py
+++ b/lldb/test/API/python_api/sbenvironment/TestSBEnvironment.py
@@ -8,7 +8,7 @@
 from lldbsuite.test import lldbutil
 
 
- at requireNotWasm  # no remote environment support
+ at requireNotWasm("no remote environment support")
 class SBEnvironmentAPICase(TestBase):
     NO_DEBUG_INFO_TESTCASE = True
 
diff --git a/lldb/test/API/python_api/sbplatform/TestSBPlatform.py b/lldb/test/API/python_api/sbplatform/TestSBPlatform.py
index 2a78f0106e18c..c98178b59dec0 100644
--- a/lldb/test/API/python_api/sbplatform/TestSBPlatform.py
+++ b/lldb/test/API/python_api/sbplatform/TestSBPlatform.py
@@ -10,7 +10,7 @@
 from lldbsuite.test import lldbutil
 
 
- at requireNotWasm  # no remote platform file/process APIs
+ at requireNotWasm("no remote platform file/process APIs")
 class SBPlatformAPICase(TestBase):
     NO_DEBUG_INFO_TESTCASE = True
 
diff --git a/lldb/test/API/qemu/TestQemuLaunch.py b/lldb/test/API/qemu/TestQemuLaunch.py
index ecdb16afc2c12..0967f3c214cb6 100644
--- a/lldb/test/API/qemu/TestQemuLaunch.py
+++ b/lldb/test/API/qemu/TestQemuLaunch.py
@@ -14,7 +14,7 @@
 @skipIfRemote
 @skipIfWindows
 @skipIf(archs=["arm64e"])
- at requireNotWasm  # no qemu-wasm32
+ at requireNotWasm("no qemu-wasm32")
 class TestQemuLaunch(TestBase):
     NO_DEBUG_INFO_TESTCASE = True
 
diff --git a/lldb/test/API/tools/lldb-server/TestGdbRemoteAuxvSupport.py b/lldb/test/API/tools/lldb-server/TestGdbRemoteAuxvSupport.py
index 43eac3ed2fb93..e3981b214c95a 100644
--- a/lldb/test/API/tools/lldb-server/TestGdbRemoteAuxvSupport.py
+++ b/lldb/test/API/tools/lldb-server/TestGdbRemoteAuxvSupport.py
@@ -69,14 +69,14 @@ def get_raw_auxv_data(self):
         self.assertIsNotNone(content_raw)
         return (word_size, self.decode_gdbremote_binary(content_raw))
 
-    @requireNotWindows  # no auxv support.
-    @requireNotDarwin
+    @requireNotWindows("no auxv support.")
+    @requireNotDarwin("no auxv support.")
     def test_supports_auxv(self):
         self.build()
         self.set_inferior_startup_launch()
         self.assertTrue(self.has_auxv_support())
 
-    @requireNotWindows
+    @requireNotWindows("no auxv support.")
     @expectedFailureNetBSD
     def test_auxv_data_is_correct_size(self):
         self.build()
@@ -90,7 +90,7 @@ def test_auxv_data_is_correct_size(self):
         self.assertEqual(len(auxv_data) % (2 * word_size), 0)
         self.trace("auxv contains {} entries".format(len(auxv_data) / (2 * word_size)))
 
-    @requireNotWindows
+    @requireNotWindows("no auxv support.")
     @expectedFailureNetBSD
     def test_auxv_keys_look_valid(self):
         self.build()
@@ -120,7 +120,7 @@ def test_auxv_keys_look_valid(self):
             self.assertGreaterEqual(auxv_key, 1)
             self.assertLessEqual(auxv_key, 2500)
 
-    @requireNotWindows
+    @requireNotWindows("no auxv support.")
     @expectedFailureNetBSD
     def test_auxv_chunked_reads_work(self):
         self.build()
diff --git a/lldb/test/API/tools/lldb-server/TestLldbGdbServer.py b/lldb/test/API/tools/lldb-server/TestLldbGdbServer.py
index 3fe21cd9d53a9..921dff7f0a0a8 100644
--- a/lldb/test/API/tools/lldb-server/TestLldbGdbServer.py
+++ b/lldb/test/API/tools/lldb-server/TestLldbGdbServer.py
@@ -479,7 +479,7 @@ def Hc_then_Csignal_signals_correct_thread(self, segfault_signo):
             self.assertEqual(post_handle_thread_id, print_thread_id)
 
     @expectedFailureDarwin
-    @requireNotWindows  # no SIGSEGV support
+    @requireSignals
     @expectedFailureNetBSD
     def test_Hc_then_Csignal_signals_correct_thread_launch(self):
         self.build()
diff --git a/lldb/test/API/tools/lldb-server/TestNonStop.py b/lldb/test/API/tools/lldb-server/TestNonStop.py
index 71314195ac7f6..6f7dbd11982d7 100644
--- a/lldb/test/API/tools/lldb-server/TestNonStop.py
+++ b/lldb/test/API/tools/lldb-server/TestNonStop.py
@@ -5,7 +5,7 @@
 
 
 class LldbGdbServerTestCase(gdbremote_testcase.GdbRemoteTestCaseBase):
-    @requireNotWindows  # no SIGSEGV support
+    @requireSignals
     @add_test_categories(["llgs"])
     def test_run(self):
         self.build()
diff --git a/lldb/test/API/tools/lldb-server/inferior-crash/TestGdbRemoteAbort.py b/lldb/test/API/tools/lldb-server/inferior-crash/TestGdbRemoteAbort.py
index 9997365f6d738..834da35b9da4e 100644
--- a/lldb/test/API/tools/lldb-server/inferior-crash/TestGdbRemoteAbort.py
+++ b/lldb/test/API/tools/lldb-server/inferior-crash/TestGdbRemoteAbort.py
@@ -5,7 +5,7 @@
 
 
 class TestGdbRemoteAbort(gdbremote_testcase.GdbRemoteTestCaseBase):
-    @requireNotWindows  # No signal is sent on Windows.
+    @requireSignals
     # std::abort() on <= API 16 raises SIGSEGV - b.android.com/179836
     @expectedFailureAndroid(api_levels=list(range(16 + 1)))
     def test_inferior_abort_received_llgs(self):
diff --git a/lldb/test/API/tools/lldb-server/inferior-crash/TestGdbRemoteSegFault.py b/lldb/test/API/tools/lldb-server/inferior-crash/TestGdbRemoteSegFault.py
index be157c6f81e53..bf66e2128f3c0 100644
--- a/lldb/test/API/tools/lldb-server/inferior-crash/TestGdbRemoteSegFault.py
+++ b/lldb/test/API/tools/lldb-server/inferior-crash/TestGdbRemoteSegFault.py
@@ -30,7 +30,7 @@ def inferior_seg_fault_received(self, expected_signo):
         self.assertIsNotNone(hex_exit_code)
         self.assertEqual(int(hex_exit_code, 16), expected_signo)
 
-    @requireNotWindows  # No signal is sent on Windows.
+    @requireSignals
     def test_inferior_seg_fault_received(self):
         self.build()
         if self.platformIsDarwin():
diff --git a/lldb/test/API/tools/lldb-server/signal-filtering/TestGdbRemote_QPassSignals.py b/lldb/test/API/tools/lldb-server/signal-filtering/TestGdbRemote_QPassSignals.py
index f1016a035cf43..2a2ee8d186a04 100644
--- a/lldb/test/API/tools/lldb-server/signal-filtering/TestGdbRemote_QPassSignals.py
+++ b/lldb/test/API/tools/lldb-server/signal-filtering/TestGdbRemote_QPassSignals.py
@@ -87,7 +87,7 @@ def test_change_signals_at_runtime(self):
                 self.ignore_signals(signals_to_ignore)
         self.expect_exit_code(len(signals_to_ignore))
 
-    @requireNotWindows  # no signal support
+    @requireSignals
     @expectedFailureNetBSD
     def test_default_signals_behavior(self):
         self.build()
diff --git a/lldb/test/API/tools/lldb-server/vCont-threads/TestSignal.py b/lldb/test/API/tools/lldb-server/vCont-threads/TestSignal.py
index 667411c58a61e..c39efaad4a42f 100644
--- a/lldb/test/API/tools/lldb-server/vCont-threads/TestSignal.py
+++ b/lldb/test/API/tools/lldb-server/vCont-threads/TestSignal.py
@@ -54,7 +54,7 @@ def get_pid(self):
         procinfo = self.parse_process_info_response(context)
         return int(procinfo["pid"], 16)
 
-    @requireNotWindows
+    @requireSignals
     @skipIfDarwin
     @expectedFailureNetBSD
     @expectedFailureAll(
@@ -85,7 +85,7 @@ def test_signal_one_thread(self):
             "C{0:x}:{1:x};c".format(lldbutil.get_signal_number("SIGUSR1")), threads[:1]
         )
 
-    @requireNotWindows
+    @requireSignals
     @skipIfDarwin
     @expectedFailureNetBSD
     @expectedFailureAll(
@@ -106,7 +106,7 @@ def test_signal_all_threads(self):
             threads,
         )
 
-    @requireNotWindows
+    @requireSignals
     @expectedFailureNetBSD
     @expectedFailureAll(
         oslist=["freebsd"], bugnumber="github.com/llvm/llvm-project/issues/56086"
@@ -126,7 +126,7 @@ def test_signal_process_by_pid(self):
             threads,
         )
 
-    @requireNotWindows
+    @requireSignals
     @expectedFailureNetBSD
     @expectedFailureAll(
         oslist=["freebsd"], bugnumber="github.com/llvm/llvm-project/issues/56086"
@@ -143,7 +143,7 @@ def test_signal_process_minus_one(self):
             "C{0:x}:p-1".format(lldbutil.get_signal_number("SIGUSR1")), threads
         )
 
-    @requireNotWindows
+    @requireSignals
     @expectedFailureNetBSD
     @expectedFailureAll(
         oslist=["freebsd"], bugnumber="github.com/llvm/llvm-project/issues/56086"
@@ -159,7 +159,7 @@ def test_signal_minus_one(self):
             "C{0:x}:-1".format(lldbutil.get_signal_number("SIGUSR1")), threads
         )
 
-    @requireNotWindows
+    @requireSignals
     @expectedFailureNetBSD
     @expectedFailureAll(
         oslist=["freebsd"], bugnumber="github.com/llvm/llvm-project/issues/56086"
@@ -180,7 +180,7 @@ def test_signal_all_threads_by_pid(self):
             threads,
         )
 
-    @requireNotWindows
+    @requireSignals
     @expectedFailureNetBSD
     @expectedFailureAll(
         oslist=["freebsd"], bugnumber="github.com/llvm/llvm-project/issues/56086"
@@ -200,7 +200,7 @@ def test_signal_minus_one_by_pid(self):
             threads,
         )
 
-    @requireNotWindows
+    @requireSignals
     @expectedFailureNetBSD
     @expectedFailureAll(
         oslist=["freebsd"], bugnumber="github.com/llvm/llvm-project/issues/56086"



More information about the lldb-commits mailing list