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(); }