199451b44SJordan Rupprecht"""
299451b44SJordan RupprechtTest that LLDB can emit JIT objects when the appropriate setting is enabled
399451b44SJordan Rupprecht"""
499451b44SJordan Rupprecht
599451b44SJordan Rupprecht
699451b44SJordan Rupprechtimport os
799451b44SJordan Rupprechtimport lldb
899451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
999451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
1099451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
1199451b44SJordan Rupprecht
1299451b44SJordan Rupprechtclass SaveJITObjectsTestCase(TestBase):
1399451b44SJordan Rupprecht
1499451b44SJordan Rupprecht    def enumerateJITFiles(self):
1599451b44SJordan Rupprecht        return [f for f in os.listdir(self.getBuildDir()) if f.startswith("jit")]
1699451b44SJordan Rupprecht
1799451b44SJordan Rupprecht    def countJITFiles(self):
1899451b44SJordan Rupprecht        return len(self.enumerateJITFiles())
1999451b44SJordan Rupprecht
2099451b44SJordan Rupprecht    def cleanJITFiles(self):
2199451b44SJordan Rupprecht        for j in self.enumerateJITFiles():
2299451b44SJordan Rupprecht            os.remove(j)
2399451b44SJordan Rupprecht        return
2499451b44SJordan Rupprecht
2599451b44SJordan Rupprecht    @expectedFailureAll(oslist=["windows"])
2699451b44SJordan Rupprecht    def test_save_jit_objects(self):
2799451b44SJordan Rupprecht        self.build()
2899451b44SJordan Rupprecht        os.chdir(self.getBuildDir())
2999451b44SJordan Rupprecht        src_file = "main.c"
3099451b44SJordan Rupprecht        src_file_spec = lldb.SBFileSpec(src_file)
3199451b44SJordan Rupprecht
3299451b44SJordan Rupprecht        (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(
3399451b44SJordan Rupprecht            self, "break", src_file_spec)
3499451b44SJordan Rupprecht
3599451b44SJordan Rupprecht        frame = thread.frames[0]
3699451b44SJordan Rupprecht
3799451b44SJordan Rupprecht        self.cleanJITFiles()
3899451b44SJordan Rupprecht        frame.EvaluateExpression("(void*)malloc(0x1)")
39b3a0c4d7SRaphael Isemann        self.assertEquals(self.countJITFiles(), 0,
40*94ec0b6cSJim Ingham                          "No files emitted with save-jit-objects-dir empty")
4199451b44SJordan Rupprecht
42*94ec0b6cSJim Ingham        self.runCmd("settings set target.save-jit-objects-dir {0}".format(self.getBuildDir()))
4399451b44SJordan Rupprecht        frame.EvaluateExpression("(void*)malloc(0x1)")
4499451b44SJordan Rupprecht        jit_files_count = self.countJITFiles()
4599451b44SJordan Rupprecht        self.cleanJITFiles()
46b3a0c4d7SRaphael Isemann        self.assertNotEqual(jit_files_count, 0,
47*94ec0b6cSJim Ingham                            "At least one file emitted with save-jit-objects-dir set to the build dir")
4899451b44SJordan Rupprecht
4999451b44SJordan Rupprecht        process.Kill()
5099451b44SJordan Rupprecht        os.chdir(self.getSourceDir())
51