https://github.com/HamzaHassanain updated https://github.com/llvm/llvm-project/pull/173473
>From 264da9b931ac90c078a81557bbd0e2f50638a9d7 Mon Sep 17 00:00:00 2001 From: Hamza Hassanain <[email protected]> Date: Wed, 24 Dec 2025 12:37:09 +0200 Subject: [PATCH 1/6] [lldb] Swig python extensions tests for SBTargetExtention --- .../python_api/sbtarget_extensions/Makefile | 3 + .../TestSBTargetExtensions.py | 137 ++++++++++++++++++ .../API/python_api/sbtarget_extensions/main.c | 7 + 3 files changed, 147 insertions(+) create mode 100644 lldb/test/API/python_api/sbtarget_extensions/Makefile create mode 100644 lldb/test/API/python_api/sbtarget_extensions/TestSBTargetExtensions.py create mode 100644 lldb/test/API/python_api/sbtarget_extensions/main.c diff --git a/lldb/test/API/python_api/sbtarget_extensions/Makefile b/lldb/test/API/python_api/sbtarget_extensions/Makefile new file mode 100644 index 0000000000000..10495940055b6 --- /dev/null +++ b/lldb/test/API/python_api/sbtarget_extensions/Makefile @@ -0,0 +1,3 @@ +C_SOURCES := main.c + +include Makefile.rules diff --git a/lldb/test/API/python_api/sbtarget_extensions/TestSBTargetExtensions.py b/lldb/test/API/python_api/sbtarget_extensions/TestSBTargetExtensions.py new file mode 100644 index 0000000000000..d1b7ba1eabd0e --- /dev/null +++ b/lldb/test/API/python_api/sbtarget_extensions/TestSBTargetExtensions.py @@ -0,0 +1,137 @@ +import re +import uuid + +import lldb +from lldbsuite.test.decorators import * +from lldbsuite.test.lldbtest import * + + +class SBTargetExtensionsTestCase(TestBase): + + def test_equality(self): + """Test the equality operator for SBTarget.""" + self.build() + exe = self.getBuildArtifact("a.out") + target = self.dbg.CreateTarget(exe) + self.assertTrue(target.IsValid()) + + self.assertEqual(target, target) + self.assertNotEqual(target, lldb.SBTarget()) + + def test_module_access(self): + """Test the module access extension properties and methods.""" + self.build() + exe = self.getBuildArtifact("a.out") + target = self.dbg.CreateTarget(exe) + self.assertTrue(target.IsValid()) + + self.assertTrue(len(target.modules) > 0) + module = target.module[0] + self.assertTrue(module.IsValid()) + + self.assertEqual(target.module["a.out"], module) + self.assertEqual(target.module[module.file.fullpath], module) + + # UUID strings on Linux might not be standard UUIDs (they are Build IDs). + # We try to convert, but if it fails, we skip the UUID object check. + uuid_str = module.GetUUIDString() + if uuid_str: + try: + uuid_obj = uuid.UUID(uuid_str) + self.assertEqual(target.module[uuid_obj], module) + except ValueError: + # The UUID string wasn't a standard UUID format, which is fine on Linux. + pass + + self.assertEqual(len(target.module[re.compile("a.out")]), 1) + self.assertEqual(target.module[re.compile("a.out")][0], module) + + def test_process_creation(self): + """Test process creation via extensions.""" + self.build() + exe = self.getBuildArtifact("a.out") + target = self.dbg.CreateTarget(exe) + self.assertTrue(target.IsValid()) + + self.assertFalse(target.process.IsValid()) + + process = target.LaunchSimple(None, None, self.get_process_working_directory()) + self.assertTrue(process.IsValid()) + + # SBProcess objects don't support direct equality (==), compare IDs. + self.assertEqual(target.process.GetProcessID(), process.GetProcessID()) + + def test_breakpoints(self): + """Test breakpoint access via extensions.""" + self.build() + exe = self.getBuildArtifact("a.out") + target = self.dbg.CreateTarget(exe) + self.assertTrue(target.IsValid()) + + breakpoint = target.BreakpointCreateBySourceRegex("Set breakpoint here", lldb.SBFileSpec("main.c")) + self.assertTrue(breakpoint.IsValid()) + + self.assertEqual(target.num_breakpoints, 1) + self.assertEqual(len(target.breakpoints), 1) + + # target.breakpoint[i] uses INDEX, not ID. + self.assertEqual(target.breakpoint[0].GetID(), target.breakpoints[0].GetID()) + + # To verify ID lookup works via the standard API: + self.assertEqual(target.FindBreakpointByID(breakpoint.GetID()).GetID(), breakpoint.GetID()) + + def test_watchpoints(self): + """Test watchpoint access via extensions.""" + self.build() + exe = self.getBuildArtifact("a.out") + target = self.dbg.CreateTarget(exe) + self.assertTrue(target.IsValid()) + + # 1. Set a breakpoint so the process stops and stays alive. + breakpoint = target.BreakpointCreateBySourceRegex("Set breakpoint here", lldb.SBFileSpec("main.c")) + self.assertTrue(breakpoint.IsValid()) + + # 2. Launch the process. + process = target.LaunchSimple(None, None, self.get_process_working_directory()) + self.assertTrue(process.IsValid()) + + # 3. Ensure we are stopped. + self.assertEqual(process.GetState(), lldb.eStateStopped) + + variables = target.FindGlobalVariables("g_var", 1) + self.assertTrue(variables.GetSize() > 0) + + global_variable = variables.GetValueAtIndex(0) + error = lldb.SBError() + + # 4. Now we can set the watchpoint. + watchpoint = target.WatchAddress(global_variable.GetLoadAddress(), 4, False, True, error) + self.assertTrue(error.Success(), f"Watchpoint failed: {error.GetCString()}") + + self.assertTrue(target.num_watchpoints > 0) + self.assertEqual(len(target.watchpoints), target.num_watchpoints) + + self.assertEqual(target.watchpoint[0].GetID(), target.watchpoints[0].GetID()) + self.assertEqual(target.watchpoint[0].GetID(), watchpoint.GetID()) + + def test_other_properties(self): + """Test miscellaneous properties of SBTarget.""" + self.build() + exe = self.getBuildArtifact("a.out") + target = self.dbg.CreateTarget(exe) + self.assertTrue(target.IsValid()) + + self.assertTrue(target.executable.IsValid()) + + self.assertEqual(target.debugger.GetID(), self.dbg.GetID()) + + self.assertTrue(target.broadcaster.IsValid()) + self.assertIn(target.byte_order, [lldb.eByteOrderLittle, lldb.eByteOrderBig, lldb.eByteOrderInvalid]) + self.assertTrue(target.addr_size > 0) + self.assertIsNotNone(target.triple) + self.assertIsNotNone(target.arch_name) + + self.assertTrue(target.data_byte_size > 0) + self.assertTrue(target.code_byte_size > 0) + + self.assertTrue(target.platform.IsValid()) \ No newline at end of file diff --git a/lldb/test/API/python_api/sbtarget_extensions/main.c b/lldb/test/API/python_api/sbtarget_extensions/main.c new file mode 100644 index 0000000000000..6ef2ce65d0ae9 --- /dev/null +++ b/lldb/test/API/python_api/sbtarget_extensions/main.c @@ -0,0 +1,7 @@ +#include <stdio.h> + +int g_var = 10; + +int main() { + return g_var; // Set breakpoint here +} >From 0d7ceba7be2bfa63c15bf23df9a27a8aea9441af Mon Sep 17 00:00:00 2001 From: Hamza Hassanain <[email protected]> Date: Wed, 24 Dec 2025 12:57:30 +0200 Subject: [PATCH 2/6] [lldb][formatting] fixed the formatter complians --- .../TestSBTargetExtensions.py | 22 ++++++++++++++----- .../API/python_api/sbtarget_extensions/main.c | 2 +- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/lldb/test/API/python_api/sbtarget_extensions/TestSBTargetExtensions.py b/lldb/test/API/python_api/sbtarget_extensions/TestSBTargetExtensions.py index d1b7ba1eabd0e..4f3ff30390ddf 100644 --- a/lldb/test/API/python_api/sbtarget_extensions/TestSBTargetExtensions.py +++ b/lldb/test/API/python_api/sbtarget_extensions/TestSBTargetExtensions.py @@ -7,7 +7,6 @@ class SBTargetExtensionsTestCase(TestBase): - def test_equality(self): """Test the equality operator for SBTarget.""" self.build() @@ -68,7 +67,9 @@ def test_breakpoints(self): target = self.dbg.CreateTarget(exe) self.assertTrue(target.IsValid()) - breakpoint = target.BreakpointCreateBySourceRegex("Set breakpoint here", lldb.SBFileSpec("main.c")) + breakpoint = target.BreakpointCreateBySourceRegex( + "Set breakpoint here", lldb.SBFileSpec("main.c") + ) self.assertTrue(breakpoint.IsValid()) self.assertEqual(target.num_breakpoints, 1) @@ -78,7 +79,9 @@ def test_breakpoints(self): self.assertEqual(target.breakpoint[0].GetID(), target.breakpoints[0].GetID()) # To verify ID lookup works via the standard API: - self.assertEqual(target.FindBreakpointByID(breakpoint.GetID()).GetID(), breakpoint.GetID()) + self.assertEqual( + target.FindBreakpointByID(breakpoint.GetID()).GetID(), breakpoint.GetID() + ) def test_watchpoints(self): """Test watchpoint access via extensions.""" @@ -88,7 +91,9 @@ def test_watchpoints(self): self.assertTrue(target.IsValid()) # 1. Set a breakpoint so the process stops and stays alive. - breakpoint = target.BreakpointCreateBySourceRegex("Set breakpoint here", lldb.SBFileSpec("main.c")) + breakpoint = target.BreakpointCreateBySourceRegex( + "Set breakpoint here", lldb.SBFileSpec("main.c") + ) self.assertTrue(breakpoint.IsValid()) # 2. Launch the process. @@ -105,7 +110,9 @@ def test_watchpoints(self): error = lldb.SBError() # 4. Now we can set the watchpoint. - watchpoint = target.WatchAddress(global_variable.GetLoadAddress(), 4, False, True, error) + watchpoint = target.WatchAddress( + global_variable.GetLoadAddress(), 4, False, True, error + ) self.assertTrue(error.Success(), f"Watchpoint failed: {error.GetCString()}") self.assertTrue(target.num_watchpoints > 0) @@ -126,7 +133,10 @@ def test_other_properties(self): self.assertEqual(target.debugger.GetID(), self.dbg.GetID()) self.assertTrue(target.broadcaster.IsValid()) - self.assertIn(target.byte_order, [lldb.eByteOrderLittle, lldb.eByteOrderBig, lldb.eByteOrderInvalid]) + self.assertIn( + target.byte_order, + [lldb.eByteOrderLittle, lldb.eByteOrderBig, lldb.eByteOrderInvalid], + ) self.assertTrue(target.addr_size > 0) self.assertIsNotNone(target.triple) self.assertIsNotNone(target.arch_name) diff --git a/lldb/test/API/python_api/sbtarget_extensions/main.c b/lldb/test/API/python_api/sbtarget_extensions/main.c index 6ef2ce65d0ae9..e3dcbd11e66d3 100644 --- a/lldb/test/API/python_api/sbtarget_extensions/main.c +++ b/lldb/test/API/python_api/sbtarget_extensions/main.c @@ -3,5 +3,5 @@ int g_var = 10; int main() { - return g_var; // Set breakpoint here + return g_var; // Set breakpoint here } >From 6df49d3f9581e2472d8f19c83fa998c68563f157 Mon Sep 17 00:00:00 2001 From: Hamza Hassanain <[email protected]> Date: Sun, 4 Jan 2026 21:47:17 +0200 Subject: [PATCH 3/6] Apply suggestion from @JDevlieghere Co-authored-by: Jonas Devlieghere <[email protected]> --- .../python_api/sbtarget_extensions/TestSBTargetExtensions.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lldb/test/API/python_api/sbtarget_extensions/TestSBTargetExtensions.py b/lldb/test/API/python_api/sbtarget_extensions/TestSBTargetExtensions.py index 4f3ff30390ddf..f34069b7a35ed 100644 --- a/lldb/test/API/python_api/sbtarget_extensions/TestSBTargetExtensions.py +++ b/lldb/test/API/python_api/sbtarget_extensions/TestSBTargetExtensions.py @@ -142,6 +142,7 @@ def test_other_properties(self): self.assertIsNotNone(target.arch_name) self.assertTrue(target.data_byte_size > 0) - self.assertTrue(target.code_byte_size > 0) + self.assertGreater(target.data_byte_size > 0) + self.assertGreater(target.code_byte_size > 0) self.assertTrue(target.platform.IsValid()) \ No newline at end of file >From e82ad86c0495525e8f9ea9e8fd655fc43c5e5e24 Mon Sep 17 00:00:00 2001 From: Hamza Hassanain <[email protected]> Date: Sun, 4 Jan 2026 21:51:37 +0200 Subject: [PATCH 4/6] [lldb][format] removed unnessary comments --- .../sbtarget_extensions/TestSBTargetExtensions.py | 12 +----------- lldb/test/API/python_api/sbtarget_extensions/main.c | 2 +- 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/lldb/test/API/python_api/sbtarget_extensions/TestSBTargetExtensions.py b/lldb/test/API/python_api/sbtarget_extensions/TestSBTargetExtensions.py index f34069b7a35ed..aaaf0513f8a0f 100644 --- a/lldb/test/API/python_api/sbtarget_extensions/TestSBTargetExtensions.py +++ b/lldb/test/API/python_api/sbtarget_extensions/TestSBTargetExtensions.py @@ -31,15 +31,12 @@ def test_module_access(self): self.assertEqual(target.module["a.out"], module) self.assertEqual(target.module[module.file.fullpath], module) - # UUID strings on Linux might not be standard UUIDs (they are Build IDs). - # We try to convert, but if it fails, we skip the UUID object check. uuid_str = module.GetUUIDString() if uuid_str: try: uuid_obj = uuid.UUID(uuid_str) self.assertEqual(target.module[uuid_obj], module) except ValueError: - # The UUID string wasn't a standard UUID format, which is fine on Linux. pass self.assertEqual(len(target.module[re.compile("a.out")]), 1) @@ -57,7 +54,6 @@ def test_process_creation(self): process = target.LaunchSimple(None, None, self.get_process_working_directory()) self.assertTrue(process.IsValid()) - # SBProcess objects don't support direct equality (==), compare IDs. self.assertEqual(target.process.GetProcessID(), process.GetProcessID()) def test_breakpoints(self): @@ -75,10 +71,8 @@ def test_breakpoints(self): self.assertEqual(target.num_breakpoints, 1) self.assertEqual(len(target.breakpoints), 1) - # target.breakpoint[i] uses INDEX, not ID. self.assertEqual(target.breakpoint[0].GetID(), target.breakpoints[0].GetID()) - # To verify ID lookup works via the standard API: self.assertEqual( target.FindBreakpointByID(breakpoint.GetID()).GetID(), breakpoint.GetID() ) @@ -90,17 +84,14 @@ def test_watchpoints(self): target = self.dbg.CreateTarget(exe) self.assertTrue(target.IsValid()) - # 1. Set a breakpoint so the process stops and stays alive. breakpoint = target.BreakpointCreateBySourceRegex( "Set breakpoint here", lldb.SBFileSpec("main.c") ) self.assertTrue(breakpoint.IsValid()) - # 2. Launch the process. process = target.LaunchSimple(None, None, self.get_process_working_directory()) self.assertTrue(process.IsValid()) - # 3. Ensure we are stopped. self.assertEqual(process.GetState(), lldb.eStateStopped) variables = target.FindGlobalVariables("g_var", 1) @@ -109,7 +100,6 @@ def test_watchpoints(self): global_variable = variables.GetValueAtIndex(0) error = lldb.SBError() - # 4. Now we can set the watchpoint. watchpoint = target.WatchAddress( global_variable.GetLoadAddress(), 4, False, True, error ) @@ -145,4 +135,4 @@ def test_other_properties(self): self.assertGreater(target.data_byte_size > 0) self.assertGreater(target.code_byte_size > 0) - self.assertTrue(target.platform.IsValid()) \ No newline at end of file + self.assertTrue(target.platform.IsValid()) diff --git a/lldb/test/API/python_api/sbtarget_extensions/main.c b/lldb/test/API/python_api/sbtarget_extensions/main.c index e3dcbd11e66d3..3e20517b5c76e 100644 --- a/lldb/test/API/python_api/sbtarget_extensions/main.c +++ b/lldb/test/API/python_api/sbtarget_extensions/main.c @@ -3,5 +3,5 @@ int g_var = 10; int main() { - return g_var; // Set breakpoint here + return g_var; } >From a8010f49841b59db74f24a29b52085055751f76e Mon Sep 17 00:00:00 2001 From: Hamza Hassanain <[email protected]> Date: Sun, 4 Jan 2026 21:58:45 +0200 Subject: [PATCH 5/6] [lldb][format] fix the clang format complain --- lldb/test/API/python_api/sbtarget_extensions/main.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lldb/test/API/python_api/sbtarget_extensions/main.c b/lldb/test/API/python_api/sbtarget_extensions/main.c index 3e20517b5c76e..da3b74c0de400 100644 --- a/lldb/test/API/python_api/sbtarget_extensions/main.c +++ b/lldb/test/API/python_api/sbtarget_extensions/main.c @@ -2,6 +2,4 @@ int g_var = 10; -int main() { - return g_var; -} +int main() { return g_var; } >From 74f6342fa508b5fa55bb22c81ccac6bb5f2d4094 Mon Sep 17 00:00:00 2001 From: Hamza Hassanain <[email protected]> Date: Sun, 4 Jan 2026 22:19:26 +0200 Subject: [PATCH 6/6] [lldb] fix the crash duo to set break point, and miss use of assert --- .../python_api/sbtarget_extensions/TestSBTargetExtensions.py | 4 ++-- lldb/test/API/python_api/sbtarget_extensions/main.c | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/lldb/test/API/python_api/sbtarget_extensions/TestSBTargetExtensions.py b/lldb/test/API/python_api/sbtarget_extensions/TestSBTargetExtensions.py index aaaf0513f8a0f..74ef9c4c49dd3 100644 --- a/lldb/test/API/python_api/sbtarget_extensions/TestSBTargetExtensions.py +++ b/lldb/test/API/python_api/sbtarget_extensions/TestSBTargetExtensions.py @@ -132,7 +132,7 @@ def test_other_properties(self): self.assertIsNotNone(target.arch_name) self.assertTrue(target.data_byte_size > 0) - self.assertGreater(target.data_byte_size > 0) - self.assertGreater(target.code_byte_size > 0) + self.assertGreater(target.data_byte_size, 0) + self.assertGreater(target.code_byte_size, 0) self.assertTrue(target.platform.IsValid()) diff --git a/lldb/test/API/python_api/sbtarget_extensions/main.c b/lldb/test/API/python_api/sbtarget_extensions/main.c index da3b74c0de400..6ef2ce65d0ae9 100644 --- a/lldb/test/API/python_api/sbtarget_extensions/main.c +++ b/lldb/test/API/python_api/sbtarget_extensions/main.c @@ -2,4 +2,6 @@ int g_var = 10; -int main() { return g_var; } +int main() { + return g_var; // Set breakpoint here +} _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
