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