199451b44SJordan Rupprecht"""Test for the JITLoaderGDB interface"""
299451b44SJordan Rupprecht
399451b44SJordan Rupprecht
499451b44SJordan Rupprechtimport unittest2
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
1499451b44SJordan Rupprecht    @skipTestIfFn(
1599451b44SJordan Rupprecht        lambda: "Skipped because the test crashes the test runner",
1699451b44SJordan Rupprecht        bugnumber="llvm.org/pr24702")
17e9b09940SJonas Devlieghere    @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.
2899451b44SJordan Rupprecht        process = target.LaunchSimple(
2999451b44SJordan Rupprecht            None, None, self.get_process_working_directory())
3099451b44SJordan Rupprecht        self.assertTrue(process, PROCESS_IS_VALID)
3199451b44SJordan Rupprecht
3299451b44SJordan Rupprecht        # The inferior will now pass bogus values over the interface. Make sure
3399451b44SJordan Rupprecht        # we don't crash.
34*1b8c7352SJonas Devlieghere        self.assertState(process.GetState(), lldb.eStateExited)
3599451b44SJordan Rupprecht        self.assertEqual(process.GetExitStatus(), 0)
3699451b44SJordan Rupprecht
3799451b44SJordan Rupprecht    def gen_log_file(self):
38c1512305SJonas Devlieghere        logfile = self.getBuildArtifact("jitintgdb-{}.txt".format(self.getArchitecture()))
3999451b44SJordan Rupprecht        def cleanup():
4099451b44SJordan Rupprecht            if os.path.exists(logfile):
4199451b44SJordan Rupprecht                os.unlink(logfile)
4299451b44SJordan Rupprecht        self.addTearDownHook(cleanup)
4399451b44SJordan Rupprecht        return logfile
4499451b44SJordan Rupprecht
4599451b44SJordan Rupprecht    def test_jit_int_default(self):
4699451b44SJordan Rupprecht        self.expect("settings show plugin.jit-loader.gdb.enable",
4799451b44SJordan Rupprecht                    substrs=["plugin.jit-loader.gdb.enable (enum) = default"])
4899451b44SJordan Rupprecht
4999451b44SJordan Rupprecht    @skipIfWindows # This test fails on Windows during C code build
5099451b44SJordan Rupprecht    def test_jit_int_on(self):
5199451b44SJordan Rupprecht        """Tests interface with 'enable' settings 'on'"""
5299451b44SJordan Rupprecht        self.build()
5399451b44SJordan Rupprecht        exe = self.getBuildArtifact("simple")
5499451b44SJordan Rupprecht
5599451b44SJordan Rupprecht        logfile = self.gen_log_file()
5699451b44SJordan Rupprecht        self.runCmd("log enable -f %s lldb jit" % (logfile))
5799451b44SJordan Rupprecht        self.runCmd("settings set plugin.jit-loader.gdb.enable on")
5899451b44SJordan Rupprecht        def cleanup():
5999451b44SJordan Rupprecht            self.runCmd("log disable lldb")
6099451b44SJordan Rupprecht            self.runCmd("settings set plugin.jit-loader.gdb.enable default")
6199451b44SJordan Rupprecht        self.addTearDownHook(cleanup)
6299451b44SJordan Rupprecht
63c1512305SJonas Devlieghere        # Launch the process.
6499451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
6599451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
6699451b44SJordan Rupprecht        process = target.LaunchSimple(
6799451b44SJordan Rupprecht            None, None, self.get_process_working_directory())
6899451b44SJordan Rupprecht        self.assertTrue(process, PROCESS_IS_VALID)
6999451b44SJordan Rupprecht
70*1b8c7352SJonas Devlieghere        self.assertState(process.GetState(), lldb.eStateExited)
7199451b44SJordan Rupprecht        self.assertEqual(process.GetExitStatus(), 0)
7299451b44SJordan Rupprecht
73c1512305SJonas Devlieghere        self.assertTrue(os.path.exists(logfile))
7499451b44SJordan Rupprecht        logcontent = open(logfile).read()
75c1512305SJonas Devlieghere        self.assertIn("SetJITBreakpoint setting JIT breakpoint", logcontent)
7699451b44SJordan Rupprecht
7799451b44SJordan Rupprecht    @skipIfWindows # This test fails on Windows during C code build
7899451b44SJordan Rupprecht    def test_jit_int_off(self):
7999451b44SJordan Rupprecht        """Tests interface with 'enable' settings 'off'"""
8099451b44SJordan Rupprecht        self.build()
8199451b44SJordan Rupprecht        exe = self.getBuildArtifact("simple")
8299451b44SJordan Rupprecht
8399451b44SJordan Rupprecht        logfile = self.gen_log_file()
8499451b44SJordan Rupprecht        self.runCmd("log enable -f %s lldb jit" % (logfile))
8599451b44SJordan Rupprecht        self.runCmd("settings set plugin.jit-loader.gdb.enable off")
8699451b44SJordan Rupprecht        def cleanup():
8799451b44SJordan Rupprecht            self.runCmd("log disable lldb")
8899451b44SJordan Rupprecht            self.runCmd("settings set plugin.jit-loader.gdb.enable default")
8999451b44SJordan Rupprecht        self.addTearDownHook(cleanup)
9099451b44SJordan Rupprecht
91c1512305SJonas Devlieghere        # Launch the process.
9299451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
9399451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
9499451b44SJordan Rupprecht        process = target.LaunchSimple(
9599451b44SJordan Rupprecht            None, None, self.get_process_working_directory())
9699451b44SJordan Rupprecht        self.assertTrue(process, PROCESS_IS_VALID)
9799451b44SJordan Rupprecht
98*1b8c7352SJonas Devlieghere        self.assertState(process.GetState(), lldb.eStateExited)
9999451b44SJordan Rupprecht        self.assertEqual(process.GetExitStatus(), 0)
10099451b44SJordan Rupprecht
101c1512305SJonas Devlieghere        self.assertTrue(os.path.exists(logfile))
10299451b44SJordan Rupprecht        logcontent = open(logfile).read()
103c1512305SJonas Devlieghere        self.assertNotIn("SetJITBreakpoint setting JIT breakpoint", logcontent)
104