| import lldb | |
| import json | |
| import os | |
| from lldbsuite.test.decorators import * | |
| from lldbsuite.test.lldbtest import * | |
| from lldbsuite.test import lldbutil | |
| # On AArch64 systems, unused top bits of pointers can be used for other things. | |
| @skipIf(archs=no_match(["aarch64", "arm64", "arm64e"])) | |
| # Only run this test on systems where Top Byte Ignore is known to be enabled | |
| # and widely available (FreeBSD has support but only since recently). | |
| @skipUnlessPlatform(["linux"] + lldbplatformutil.getDarwinOSTriples()) | |
| class TestArmPointerMetadataStripping(TestBase): | |
| # Use extra_symbols.json as a template to add a new symbol whose address | |
| # contains non-zero high order bits set. | |
| def create_symbols_file(self): | |
| template_path = os.path.join(self.getSourceDir(), "extra_symbols.json") | |
| with open(template_path, "r") as f: | |
| symbols_data = json.load(f) | |
| target = self.dbg.GetSelectedTarget() | |
| symbols_data["triple"] = target.GetTriple() | |
| module = target.GetModuleAtIndex(0) | |
| symbols_data["uuid"] = module.GetUUIDString() | |
| json_filename = self.getBuildArtifact("extra_symbols.json") | |
| with open(json_filename, "w") as file: | |
| json.dump(symbols_data, file, indent=4) | |
| return json_filename | |
| def test(self): | |
| self.build() | |
| src = lldb.SBFileSpec("main.c") | |
| target, process, thread, bkpt = lldbutil.run_to_source_breakpoint( | |
| self, "break here", src | |
| ) | |
| symbols_file = self.create_symbols_file() | |
| self.runCmd(f"target module add {symbols_file}") | |
| # The high order bits should be stripped. | |
| self.expect_expr("get_high_bits(&myglobal_json)", result_value="0") | |
| # Mark all bits as used for addresses and ensure bits are no longer stripped. | |
| self.runCmd("settings set target.process.virtual-addressable-bits 64") | |
| self.expect_expr( | |
| "get_high_bits(&myglobal_json)", result_value=str(0x1200000000000000) | |
| ) |