xref: /llvm-project/lldb/test/API/functionalities/jitloader_gdb/TestJITLoaderGDB.py (revision 2238dcc39358353cac21df75c3c3286ab20b8f53)
1"""Test for the JITLoaderGDB interface"""
2
3
4import os
5import lldb
6from lldbsuite.test import lldbutil
7from lldbsuite.test.decorators import *
8from lldbsuite.test.lldbtest import *
9
10
11class JITLoaderGDBTestCase(TestBase):
12    @skipTestIfFn(
13        lambda: "Skipped because the test crashes the test runner",
14        bugnumber="llvm.org/pr24702",
15    )
16    @expectedFailure("llvm.org/pr24702")
17    def test_bogus_values(self):
18        """Test that we handle inferior misusing the GDB JIT interface"""
19        self.build()
20        exe = self.getBuildArtifact("a.out")
21
22        # Create a target by the debugger.
23        target = self.dbg.CreateTarget(exe)
24        self.assertTrue(target, VALID_TARGET)
25
26        # Launch the process, do not stop at entry point.
27        process = target.LaunchSimple(None, None, self.get_process_working_directory())
28        self.assertTrue(process, PROCESS_IS_VALID)
29
30        # The inferior will now pass bogus values over the interface. Make sure
31        # we don't crash.
32        self.assertState(process.GetState(), lldb.eStateExited)
33        self.assertEqual(process.GetExitStatus(), 0)
34
35    def gen_log_file(self):
36        logfile = self.getBuildArtifact(
37            "jitintgdb-{}.txt".format(self.getArchitecture())
38        )
39
40        def cleanup():
41            if os.path.exists(logfile):
42                os.unlink(logfile)
43
44        self.addTearDownHook(cleanup)
45        return logfile
46
47    def test_jit_int_default(self):
48        self.expect(
49            "settings show plugin.jit-loader.gdb.enable",
50            substrs=["plugin.jit-loader.gdb.enable (enum) = default"],
51        )
52
53    @skipIfWindows  # This test fails on Windows during C code build
54    def test_jit_int_on(self):
55        """Tests interface with 'enable' settings 'on'"""
56        self.build()
57        exe = self.getBuildArtifact("simple")
58
59        logfile = self.gen_log_file()
60        self.runCmd("log enable -f %s lldb jit" % (logfile))
61        self.runCmd("settings set plugin.jit-loader.gdb.enable on")
62
63        def cleanup():
64            self.runCmd("log disable lldb")
65            self.runCmd("settings set plugin.jit-loader.gdb.enable default")
66
67        self.addTearDownHook(cleanup)
68
69        # Launch the process.
70        target = self.dbg.CreateTarget(exe)
71        self.assertTrue(target, VALID_TARGET)
72        process = target.LaunchSimple(None, None, self.get_process_working_directory())
73        self.assertTrue(process, PROCESS_IS_VALID)
74
75        self.assertState(process.GetState(), lldb.eStateExited)
76        self.assertEqual(process.GetExitStatus(), 0)
77
78        self.assertTrue(os.path.exists(logfile))
79        logcontent = open(logfile).read()
80        self.assertIn("SetJITBreakpoint setting JIT breakpoint", logcontent)
81
82    @skipIfWindows  # This test fails on Windows during C code build
83    def test_jit_int_off(self):
84        """Tests interface with 'enable' settings 'off'"""
85        self.build()
86        exe = self.getBuildArtifact("simple")
87
88        logfile = self.gen_log_file()
89        self.runCmd("log enable -f %s lldb jit" % (logfile))
90        self.runCmd("settings set plugin.jit-loader.gdb.enable off")
91
92        def cleanup():
93            self.runCmd("log disable lldb")
94            self.runCmd("settings set plugin.jit-loader.gdb.enable default")
95
96        self.addTearDownHook(cleanup)
97
98        # Launch the process.
99        target = self.dbg.CreateTarget(exe)
100        self.assertTrue(target, VALID_TARGET)
101        process = target.LaunchSimple(None, None, self.get_process_working_directory())
102        self.assertTrue(process, PROCESS_IS_VALID)
103
104        self.assertState(process.GetState(), lldb.eStateExited)
105        self.assertEqual(process.GetExitStatus(), 0)
106
107        self.assertTrue(os.path.exists(logfile))
108        logcontent = open(logfile).read()
109        self.assertNotIn("SetJITBreakpoint setting JIT breakpoint", logcontent)
110