| """Test that lldb on Darwin ignores metadata in the top byte of addresses, both corefile and live.""" |
| |
| import lldb |
| from lldbsuite.test.decorators import * |
| from lldbsuite.test.lldbtest import * |
| from lldbsuite.test import lldbutil |
| |
| |
| class TestTBIHonored(TestBase): |
| NO_DEBUG_INFO_TESTCASE = True |
| |
| def do_variable_access_tests(self, frame): |
| self.assertEqual( |
| frame.variables["pb"][0] |
| .GetChildMemberWithName("p") |
| .Dereference() |
| .GetValueAsUnsigned(), |
| 15, |
| ) |
| addr = frame.variables["pb"][0].GetChildMemberWithName("p").GetValueAsUnsigned() |
| # Confirm that there is metadata in the top byte of our pointer |
| self.assertEqual((addr >> 56) & 0xFF, 0xFE) |
| self.expect("expr -- *pb.p", substrs=["15"]) |
| self.expect("frame variable *pb.p", substrs=["15"]) |
| self.expect("expr -- *(int*)0x%x" % addr, substrs=["15"]) |
| |
| # This test is valid on AArch64 systems with TBI mode enabled, |
| # and an address mask that clears the top byte before reading |
| # from memory. |
| @skipUnlessDarwin |
| @skipIf(archs=no_match(["arm64", "arm64e"])) |
| @skipIfRemote |
| def test(self): |
| corefile = self.getBuildArtifact("process.core") |
| self.build() |
| (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint( |
| self, "// break here", lldb.SBFileSpec("main.c") |
| ) |
| |
| # Test that we can dereference a pointer with TBI data |
| # in a live process. |
| self.do_variable_access_tests(thread.GetFrameAtIndex(0)) |
| |
| # Create a corefile, delete this process |
| self.runCmd("process save-core -s stack " + corefile) |
| process.Destroy() |
| self.dbg.DeleteTarget(target) |
| |
| # Now load the corefile |
| target = self.dbg.CreateTarget("") |
| process = target.LoadCore(corefile) |
| thread = process.GetSelectedThread() |
| self.assertTrue(process.GetSelectedThread().IsValid()) |
| |
| # Test that we can dereference a pointer with TBI data |
| # in a corefile process. |
| self.do_variable_access_tests(thread.GetFrameAtIndex(0)) |