[Lldb-commits] [lldb] [lldb] convert jit-loader_rtdyld_elf.test to an API test (PR #170333)
Charles Zablit via lldb-commits
lldb-commits at lists.llvm.org
Tue Dec 9 09:11:11 PST 2025
https://github.com/charles-zablit updated https://github.com/llvm/llvm-project/pull/170333
>From 07ecfc8d5d143ef0ea6011a91eb5f19c79582957 Mon Sep 17 00:00:00 2001
From: Charles Zablit <c_zablit at apple.com>
Date: Wed, 3 Dec 2025 13:06:20 +0000
Subject: [PATCH 1/4] [lldb] convert TestJitBreakpoint to API test
---
.../breakpoint/jit_loader_rtdyld_elf/Makefile | 12 ++++
.../TestJitBreakPoint.py | 55 +++++++++++++++++++
.../jit_loader_rtdyld_elf/jitbp.cpp | 2 +
.../Breakpoint/jit-loader_rtdyld_elf.test | 22 --------
4 files changed, 69 insertions(+), 22 deletions(-)
create mode 100644 lldb/test/API/functionalities/breakpoint/jit_loader_rtdyld_elf/Makefile
create mode 100644 lldb/test/API/functionalities/breakpoint/jit_loader_rtdyld_elf/TestJitBreakPoint.py
create mode 100644 lldb/test/API/functionalities/breakpoint/jit_loader_rtdyld_elf/jitbp.cpp
delete mode 100644 lldb/test/Shell/Breakpoint/jit-loader_rtdyld_elf.test
diff --git a/lldb/test/API/functionalities/breakpoint/jit_loader_rtdyld_elf/Makefile b/lldb/test/API/functionalities/breakpoint/jit_loader_rtdyld_elf/Makefile
new file mode 100644
index 0000000000000..1981a7a3264cb
--- /dev/null
+++ b/lldb/test/API/functionalities/breakpoint/jit_loader_rtdyld_elf/Makefile
@@ -0,0 +1,12 @@
+CXX_SOURCES := jitbp.cpp
+
+include Makefile.rules
+
+jitbp.ll: jitbp.cpp
+ $(CXX) -g -S -emit-llvm --target=x86_64-unknown-unknown-elf \
+ -o $@ $<
+
+all: jitbp.ll
+
+clean::
+ rm -f jitbp.ll
diff --git a/lldb/test/API/functionalities/breakpoint/jit_loader_rtdyld_elf/TestJitBreakPoint.py b/lldb/test/API/functionalities/breakpoint/jit_loader_rtdyld_elf/TestJitBreakPoint.py
new file mode 100644
index 0000000000000..78f1d6e9d3c4c
--- /dev/null
+++ b/lldb/test/API/functionalities/breakpoint/jit_loader_rtdyld_elf/TestJitBreakPoint.py
@@ -0,0 +1,55 @@
+"""
+Test that pending breakpoints resolve for JITted code with mcjit and rtdyld.
+"""
+
+import lldb
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+
+import shutil
+
+
+class TestJitBreakpoint(TestBase):
+ def setUp(self):
+ TestBase.setUp(self)
+ self.ll = self.getBuildArtifact("jitbp.ll")
+
+ @skipUnlessArch("x86_64")
+ @expectedFailureAll(oslist=["windows"])
+ def test_jit_breakpoints(self):
+ self.build()
+ self.do_test("--jit-kind=mcjit")
+ self.do_test("--jit-linker=rtdyld")
+
+ def do_test(self, jit_flag: str):
+ self.dbg.SetAsync(False)
+
+ self.dbg.HandleCommand("settings set plugin.jit-loader.gdb.enable on")
+
+ lldb_dir = os.path.dirname(lldbtest_config.lldbExec)
+ lli_path = shutil.which("lli", path=lldb_dir)
+ self.assertTrue(os.path.exists(lli_path), "lli not found")
+ target = self.dbg.CreateTarget(lli_path)
+ self.assertTrue(target.IsValid())
+
+ bp = target.BreakpointCreateByName("jitbp")
+ self.assertTrue(bp.IsValid())
+ self.assertEqual(bp.GetNumLocations(), 0, "Expected a pending breakpoint")
+
+ launch_info = target.GetLaunchInfo()
+ launch_info.SetArguments([jit_flag, self.ll], True)
+
+ error = lldb.SBError()
+ process = target.Launch(launch_info, error)
+ self.assertTrue(process.IsValid())
+ self.assertTrue(error.Success(), error.GetCString())
+
+ self.assertEqual(process.GetState(), lldb.eStateStopped)
+
+ thread = process.GetSelectedThread()
+ frame = thread.GetSelectedFrame()
+ self.assertIn("jitbp", frame.GetFunctionName())
+
+ self.assertGreaterEqual(
+ bp.GetNumLocations(), 1, "Breakpoint must be resolved after JIT loads code"
+ )
diff --git a/lldb/test/API/functionalities/breakpoint/jit_loader_rtdyld_elf/jitbp.cpp b/lldb/test/API/functionalities/breakpoint/jit_loader_rtdyld_elf/jitbp.cpp
new file mode 100644
index 0000000000000..447d9d66df848
--- /dev/null
+++ b/lldb/test/API/functionalities/breakpoint/jit_loader_rtdyld_elf/jitbp.cpp
@@ -0,0 +1,2 @@
+int jitbp() { return 0; }
+int main() { return jitbp(); }
diff --git a/lldb/test/Shell/Breakpoint/jit-loader_rtdyld_elf.test b/lldb/test/Shell/Breakpoint/jit-loader_rtdyld_elf.test
deleted file mode 100644
index ae9402a519494..0000000000000
--- a/lldb/test/Shell/Breakpoint/jit-loader_rtdyld_elf.test
+++ /dev/null
@@ -1,22 +0,0 @@
-# REQUIRES: target-x86_64
-# XFAIL: system-windows
-
-# RuntimeDyld can be used to link and load emitted code for both, MCJIT and Orc.
-#
-# RUN: %clangxx -g -S -emit-llvm --target=x86_64-unknown-unknown-elf \
-# RUN: -o %t.ll %p/Inputs/jitbp.cpp
-#
-# RUN: %lldb -b -o 'settings set plugin.jit-loader.gdb.enable on' -o 'b jitbp' \
-# RUN: -o 'run --jit-kind=mcjit %t.ll' lli | FileCheck %s
-#
-# RUN: %lldb -b -o 'settings set plugin.jit-loader.gdb.enable on' -o 'b jitbp' \
-# RUN: -o 'run --jit-linker=rtdyld %t.ll' lli | FileCheck %s
-
-# CHECK: Breakpoint 1: no locations (pending).
-# CHECK: (lldb) run {{.*}}
-# CHECK: Process {{.*}} launched: {{.*}}
-# CHECK: Process {{.*}} stopped
-# CHECK: JIT(0x{{.*}})`jitbp() at jitbp.cpp:1:15
-# CHECK: -> 1 int jitbp() { return 0; }
-# CHECK: ^
-# CHECK: 2 int main() { return jitbp(); }
>From 887a09df4a2786798b8ac19a74569a3ede786ea7 Mon Sep 17 00:00:00 2001
From: Charles Zablit <c_zablit at apple.com>
Date: Tue, 9 Dec 2025 16:39:29 +0000
Subject: [PATCH 2/4] fixup! [lldb] convert TestJitBreakpoint to API test
---
.../Python/lldbsuite/test/decorators.py | 11 ++++
.../TestJitBreakPoint.py | 53 ++++++++-----------
2 files changed, 32 insertions(+), 32 deletions(-)
diff --git a/lldb/packages/Python/lldbsuite/test/decorators.py b/lldb/packages/Python/lldbsuite/test/decorators.py
index 7311b17f97e01..af6c9fb1a0624 100644
--- a/lldb/packages/Python/lldbsuite/test/decorators.py
+++ b/lldb/packages/Python/lldbsuite/test/decorators.py
@@ -952,6 +952,17 @@ def is_compiler_clang_with_call_site_info():
return skipTestIfFn(is_compiler_clang_with_call_site_info)(func)
+def skipUnlessCompilerIsClang(func):
+ """Decorate the item to skip test unless the compiler is clang."""
+
+ def is_compiler_clang():
+ compiler_path = lldbplatformutil.getCompiler()
+ compiler = os.path.basename(compiler_path)
+ if not compiler.startswith("clang"):
+ return "Test requires clang as compiler"
+ return None
+
+ return skipTestIfFn(is_compiler_clang)(func)
def skipUnlessThreadSanitizer(func):
"""Decorate the item to skip test unless Clang -fsanitize=thread is supported."""
diff --git a/lldb/test/API/functionalities/breakpoint/jit_loader_rtdyld_elf/TestJitBreakPoint.py b/lldb/test/API/functionalities/breakpoint/jit_loader_rtdyld_elf/TestJitBreakPoint.py
index 78f1d6e9d3c4c..7b4dd49d7498e 100644
--- a/lldb/test/API/functionalities/breakpoint/jit_loader_rtdyld_elf/TestJitBreakPoint.py
+++ b/lldb/test/API/functionalities/breakpoint/jit_loader_rtdyld_elf/TestJitBreakPoint.py
@@ -6,50 +6,39 @@
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
-import shutil
-
class TestJitBreakpoint(TestBase):
- def setUp(self):
- TestBase.setUp(self)
- self.ll = self.getBuildArtifact("jitbp.ll")
-
@skipUnlessArch("x86_64")
+ @skipUnlessCompilerIsClang
@expectedFailureAll(oslist=["windows"])
def test_jit_breakpoints(self):
self.build()
+ self.ll = self.getBuildArtifact("jitbp.ll")
self.do_test("--jit-kind=mcjit")
self.do_test("--jit-linker=rtdyld")
def do_test(self, jit_flag: str):
- self.dbg.SetAsync(False)
-
- self.dbg.HandleCommand("settings set plugin.jit-loader.gdb.enable on")
+ import shutil
- lldb_dir = os.path.dirname(lldbtest_config.lldbExec)
- lli_path = shutil.which("lli", path=lldb_dir)
- self.assertTrue(os.path.exists(lli_path), "lli not found")
- target = self.dbg.CreateTarget(lli_path)
- self.assertTrue(target.IsValid())
+ self.runCmd("settings set plugin.jit-loader.gdb.enable on")
- bp = target.BreakpointCreateByName("jitbp")
- self.assertTrue(bp.IsValid())
- self.assertEqual(bp.GetNumLocations(), 0, "Expected a pending breakpoint")
+ self.runCmd("target create lli", CURRENT_EXECUTABLE_SET)
- launch_info = target.GetLaunchInfo()
- launch_info.SetArguments([jit_flag, self.ll], True)
-
- error = lldb.SBError()
- process = target.Launch(launch_info, error)
- self.assertTrue(process.IsValid())
- self.assertTrue(error.Success(), error.GetCString())
-
- self.assertEqual(process.GetState(), lldb.eStateStopped)
-
- thread = process.GetSelectedThread()
- frame = thread.GetSelectedFrame()
- self.assertIn("jitbp", frame.GetFunctionName())
+ line = line_number("jitbp.cpp", "int jitbp()")
+ lldbutil.run_break_set_by_file_and_line(
+ self, "jitbp.cpp", line, num_expected_locations=0
+ )
- self.assertGreaterEqual(
- bp.GetNumLocations(), 1, "Breakpoint must be resolved after JIT loads code"
+ self.runCmd(f"run {jit_flag} {self.ll}", RUN_SUCCEEDED)
+
+ # The stop reason of the thread should be breakpoint.
+ # And it should break at jitbp.cpp:1.
+ self.expect(
+ "thread list",
+ STOPPED_DUE_TO_BREAKPOINT,
+ substrs=[
+ "stopped",
+ "jitbp.cpp:%d" % line,
+ "stop reason = breakpoint",
+ ],
)
>From 28b3a57f4930c28deeaa525511d8034fe936c647 Mon Sep 17 00:00:00 2001
From: Charles Zablit <c_zablit at apple.com>
Date: Tue, 9 Dec 2025 16:43:02 +0000
Subject: [PATCH 3/4] fix formatting
---
lldb/packages/Python/lldbsuite/test/decorators.py | 2 ++
1 file changed, 2 insertions(+)
diff --git a/lldb/packages/Python/lldbsuite/test/decorators.py b/lldb/packages/Python/lldbsuite/test/decorators.py
index af6c9fb1a0624..150f5bbd3868b 100644
--- a/lldb/packages/Python/lldbsuite/test/decorators.py
+++ b/lldb/packages/Python/lldbsuite/test/decorators.py
@@ -952,6 +952,7 @@ def is_compiler_clang_with_call_site_info():
return skipTestIfFn(is_compiler_clang_with_call_site_info)(func)
+
def skipUnlessCompilerIsClang(func):
"""Decorate the item to skip test unless the compiler is clang."""
@@ -964,6 +965,7 @@ def is_compiler_clang():
return skipTestIfFn(is_compiler_clang)(func)
+
def skipUnlessThreadSanitizer(func):
"""Decorate the item to skip test unless Clang -fsanitize=thread is supported."""
>From 9074baabd972f8079ef30110a569aff2984b4bc1 Mon Sep 17 00:00:00 2001
From: Charles Zablit <c_zablit at apple.com>
Date: Tue, 9 Dec 2025 17:10:55 +0000
Subject: [PATCH 4/4] refactor lli finding logic
---
.../breakpoint/jit_loader_rtdyld_elf/TestJitBreakPoint.py | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/lldb/test/API/functionalities/breakpoint/jit_loader_rtdyld_elf/TestJitBreakPoint.py b/lldb/test/API/functionalities/breakpoint/jit_loader_rtdyld_elf/TestJitBreakPoint.py
index 7b4dd49d7498e..c1c55fbcc8d80 100644
--- a/lldb/test/API/functionalities/breakpoint/jit_loader_rtdyld_elf/TestJitBreakPoint.py
+++ b/lldb/test/API/functionalities/breakpoint/jit_loader_rtdyld_elf/TestJitBreakPoint.py
@@ -18,11 +18,13 @@ def test_jit_breakpoints(self):
self.do_test("--jit-linker=rtdyld")
def do_test(self, jit_flag: str):
- import shutil
-
self.runCmd("settings set plugin.jit-loader.gdb.enable on")
- self.runCmd("target create lli", CURRENT_EXECUTABLE_SET)
+ clang_path = self.findBuiltClang()
+ self.assertIs(clang_path, "built clang could not be found")
+ lli_path = os.path.join(os.path.dirname(clang_path), "lli")
+ self.assertIs(lldbutil.is_exe(lli_path), f"'{lli_path}' is not an executable")
+ self.runCmd(f"target create {lli_path}", CURRENT_EXECUTABLE_SET)
line = line_number("jitbp.cpp", "int jitbp()")
lldbutil.run_break_set_by_file_and_line(
More information about the lldb-commits
mailing list