"""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))