xref: /llvm-project/lldb/test/API/macosx/tbi-honored/TestTBIHonored.py (revision 52557bce73f64df5da13d42dd97b57fbd4ab1b12)
1"""Test that lldb on Darwin ignores metadata in the top byte of addresses, both corefile and live."""
2
3import lldb
4from lldbsuite.test.decorators import *
5from lldbsuite.test.lldbtest import *
6from lldbsuite.test import lldbutil
7
8
9class TestTBIHonored(TestBase):
10    NO_DEBUG_INFO_TESTCASE = True
11
12    def do_variable_access_tests(self, frame):
13        self.assertEqual(
14            frame.variables["pb"][0]
15            .GetChildMemberWithName("p")
16            .Dereference()
17            .GetValueAsUnsigned(),
18            15,
19        )
20        addr = frame.variables["pb"][0].GetChildMemberWithName("p").GetValueAsUnsigned()
21        # Confirm that there is metadata in the top byte of our pointer
22        self.assertEqual((addr >> 56) & 0xFF, 0xFE)
23        self.expect("expr -- *pb.p", substrs=["15"])
24        self.expect("frame variable *pb.p", substrs=["15"])
25        self.expect("expr -- *(int*)0x%x" % addr, substrs=["15"])
26
27    # This test is valid on AArch64 systems with TBI mode enabled,
28    # and an address mask that clears the top byte before reading
29    # from memory.
30    @skipUnlessDarwin
31    @skipIf(archs=no_match(["arm64", "arm64e"]))
32    @skipIfRemote
33    def test(self):
34        corefile = self.getBuildArtifact("process.core")
35        self.build()
36        (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(
37            self, "// break here", lldb.SBFileSpec("main.c")
38        )
39
40        # Test that we can dereference a pointer with TBI data
41        # in a live process.
42        self.do_variable_access_tests(thread.GetFrameAtIndex(0))
43
44        # Create a corefile, delete this process
45        self.runCmd("process save-core -s stack " + corefile)
46        process.Destroy()
47        self.dbg.DeleteTarget(target)
48
49        # Now load the corefile
50        target = self.dbg.CreateTarget("")
51        process = target.LoadCore(corefile)
52        thread = process.GetSelectedThread()
53        self.assertTrue(process.GetSelectedThread().IsValid())
54
55        # Test that we can dereference a pointer with TBI data
56        # in a corefile process.
57        self.do_variable_access_tests(thread.GetFrameAtIndex(0))
58