xref: /llvm-project/lldb/test/API/functionalities/jitloader_gdb/TestJITLoaderGDB.py (revision 5b386158aacac4b41126983a5379d36ed413d0ea)
199451b44SJordan Rupprecht"""Test for the JITLoaderGDB interface"""
299451b44SJordan Rupprecht
399451b44SJordan Rupprecht
4*5b386158SJordan Rupprechtimport unittest
599451b44SJordan Rupprechtimport os
699451b44SJordan Rupprechtimport lldb
799451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
899451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
999451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
1099451b44SJordan Rupprecht
1199451b44SJordan Rupprecht
1299451b44SJordan Rupprechtclass JITLoaderGDBTestCase(TestBase):
1399451b44SJordan Rupprecht    @skipTestIfFn(
1499451b44SJordan Rupprecht        lambda: "Skipped because the test crashes the test runner",
152238dcc3SJonas Devlieghere        bugnumber="llvm.org/pr24702",
162238dcc3SJonas Devlieghere    )
17*5b386158SJordan Rupprecht    @unittest.expectedFailure  # llvm.org/pr24702
1899451b44SJordan Rupprecht    def test_bogus_values(self):
1999451b44SJordan Rupprecht        """Test that we handle inferior misusing the GDB JIT interface"""
2099451b44SJordan Rupprecht        self.build()
2199451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
2299451b44SJordan Rupprecht
2399451b44SJordan Rupprecht        # Create a target by the debugger.
2499451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
2599451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
2699451b44SJordan Rupprecht
27c1512305SJonas Devlieghere        # Launch the process, do not stop at entry point.
282238dcc3SJonas Devlieghere        process = target.LaunchSimple(None, None, self.get_process_working_directory())
2999451b44SJordan Rupprecht        self.assertTrue(process, PROCESS_IS_VALID)
3099451b44SJordan Rupprecht
3199451b44SJordan Rupprecht        # The inferior will now pass bogus values over the interface. Make sure
3299451b44SJordan Rupprecht        # we don't crash.
331b8c7352SJonas Devlieghere        self.assertState(process.GetState(), lldb.eStateExited)
3499451b44SJordan Rupprecht        self.assertEqual(process.GetExitStatus(), 0)
3599451b44SJordan Rupprecht
3699451b44SJordan Rupprecht    def gen_log_file(self):
372238dcc3SJonas Devlieghere        logfile = self.getBuildArtifact(
382238dcc3SJonas Devlieghere            "jitintgdb-{}.txt".format(self.getArchitecture())
392238dcc3SJonas Devlieghere        )
402238dcc3SJonas Devlieghere
4199451b44SJordan Rupprecht        def cleanup():
4299451b44SJordan Rupprecht            if os.path.exists(logfile):
4399451b44SJordan Rupprecht                os.unlink(logfile)
442238dcc3SJonas Devlieghere
4599451b44SJordan Rupprecht        self.addTearDownHook(cleanup)
4699451b44SJordan Rupprecht        return logfile
4799451b44SJordan Rupprecht
4899451b44SJordan Rupprecht    def test_jit_int_default(self):
492238dcc3SJonas Devlieghere        self.expect(
502238dcc3SJonas Devlieghere            "settings show plugin.jit-loader.gdb.enable",
512238dcc3SJonas Devlieghere            substrs=["plugin.jit-loader.gdb.enable (enum) = default"],
522238dcc3SJonas Devlieghere        )
5399451b44SJordan Rupprecht
5499451b44SJordan Rupprecht    @skipIfWindows  # This test fails on Windows during C code build
5599451b44SJordan Rupprecht    def test_jit_int_on(self):
5699451b44SJordan Rupprecht        """Tests interface with 'enable' settings 'on'"""
5799451b44SJordan Rupprecht        self.build()
5899451b44SJordan Rupprecht        exe = self.getBuildArtifact("simple")
5999451b44SJordan Rupprecht
6099451b44SJordan Rupprecht        logfile = self.gen_log_file()
6199451b44SJordan Rupprecht        self.runCmd("log enable -f %s lldb jit" % (logfile))
6299451b44SJordan Rupprecht        self.runCmd("settings set plugin.jit-loader.gdb.enable on")
632238dcc3SJonas Devlieghere
6499451b44SJordan Rupprecht        def cleanup():
6599451b44SJordan Rupprecht            self.runCmd("log disable lldb")
6699451b44SJordan Rupprecht            self.runCmd("settings set plugin.jit-loader.gdb.enable default")
672238dcc3SJonas Devlieghere
6899451b44SJordan Rupprecht        self.addTearDownHook(cleanup)
6999451b44SJordan Rupprecht
70c1512305SJonas Devlieghere        # Launch the process.
7199451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
7299451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
732238dcc3SJonas Devlieghere        process = target.LaunchSimple(None, None, self.get_process_working_directory())
7499451b44SJordan Rupprecht        self.assertTrue(process, PROCESS_IS_VALID)
7599451b44SJordan Rupprecht
761b8c7352SJonas Devlieghere        self.assertState(process.GetState(), lldb.eStateExited)
7799451b44SJordan Rupprecht        self.assertEqual(process.GetExitStatus(), 0)
7899451b44SJordan Rupprecht
79c1512305SJonas Devlieghere        self.assertTrue(os.path.exists(logfile))
8099451b44SJordan Rupprecht        logcontent = open(logfile).read()
81c1512305SJonas Devlieghere        self.assertIn("SetJITBreakpoint setting JIT breakpoint", logcontent)
8299451b44SJordan Rupprecht
8399451b44SJordan Rupprecht    @skipIfWindows  # This test fails on Windows during C code build
8499451b44SJordan Rupprecht    def test_jit_int_off(self):
8599451b44SJordan Rupprecht        """Tests interface with 'enable' settings 'off'"""
8699451b44SJordan Rupprecht        self.build()
8799451b44SJordan Rupprecht        exe = self.getBuildArtifact("simple")
8899451b44SJordan Rupprecht
8999451b44SJordan Rupprecht        logfile = self.gen_log_file()
9099451b44SJordan Rupprecht        self.runCmd("log enable -f %s lldb jit" % (logfile))
9199451b44SJordan Rupprecht        self.runCmd("settings set plugin.jit-loader.gdb.enable off")
922238dcc3SJonas Devlieghere
9399451b44SJordan Rupprecht        def cleanup():
9499451b44SJordan Rupprecht            self.runCmd("log disable lldb")
9599451b44SJordan Rupprecht            self.runCmd("settings set plugin.jit-loader.gdb.enable default")
962238dcc3SJonas Devlieghere
9799451b44SJordan Rupprecht        self.addTearDownHook(cleanup)
9899451b44SJordan Rupprecht
99c1512305SJonas Devlieghere        # Launch the process.
10099451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
10199451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
1022238dcc3SJonas Devlieghere        process = target.LaunchSimple(None, None, self.get_process_working_directory())
10399451b44SJordan Rupprecht        self.assertTrue(process, PROCESS_IS_VALID)
10499451b44SJordan Rupprecht
1051b8c7352SJonas Devlieghere        self.assertState(process.GetState(), lldb.eStateExited)
10699451b44SJordan Rupprecht        self.assertEqual(process.GetExitStatus(), 0)
10799451b44SJordan Rupprecht
108c1512305SJonas Devlieghere        self.assertTrue(os.path.exists(logfile))
10999451b44SJordan Rupprecht        logcontent = open(logfile).read()
110c1512305SJonas Devlieghere        self.assertNotIn("SetJITBreakpoint setting JIT breakpoint", logcontent)
111