summaryrefslogtreecommitdiff
path: root/lldb/test/API/macosx/arm-pointer-metadata-stripping
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/test/API/macosx/arm-pointer-metadata-stripping')
-rw-r--r--lldb/test/API/macosx/arm-pointer-metadata-stripping/Makefile2
-rw-r--r--lldb/test/API/macosx/arm-pointer-metadata-stripping/TestArmPointerMetadataStripping.py48
-rw-r--r--lldb/test/API/macosx/arm-pointer-metadata-stripping/extra_symbols.json21
-rw-r--r--lldb/test/API/macosx/arm-pointer-metadata-stripping/main.c13
4 files changed, 84 insertions, 0 deletions
diff --git a/lldb/test/API/macosx/arm-pointer-metadata-stripping/Makefile b/lldb/test/API/macosx/arm-pointer-metadata-stripping/Makefile
new file mode 100644
index 000000000000..c9319d6e6888
--- /dev/null
+++ b/lldb/test/API/macosx/arm-pointer-metadata-stripping/Makefile
@@ -0,0 +1,2 @@
+C_SOURCES := main.c
+include Makefile.rules
diff --git a/lldb/test/API/macosx/arm-pointer-metadata-stripping/TestArmPointerMetadataStripping.py b/lldb/test/API/macosx/arm-pointer-metadata-stripping/TestArmPointerMetadataStripping.py
new file mode 100644
index 000000000000..f61945b3eb4c
--- /dev/null
+++ b/lldb/test/API/macosx/arm-pointer-metadata-stripping/TestArmPointerMetadataStripping.py
@@ -0,0 +1,48 @@
+import lldb
+import json
+import os
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+
+@skipUnlessDarwin
+@skipIf(archs=no_match(["arm64", "arm64e"]))
+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)
+ )
diff --git a/lldb/test/API/macosx/arm-pointer-metadata-stripping/extra_symbols.json b/lldb/test/API/macosx/arm-pointer-metadata-stripping/extra_symbols.json
new file mode 100644
index 000000000000..5c2503d508b4
--- /dev/null
+++ b/lldb/test/API/macosx/arm-pointer-metadata-stripping/extra_symbols.json
@@ -0,0 +1,21 @@
+{
+ "triple": "replace me",
+ "uuid": "replace me",
+ "type": "executable",
+ "sections": [
+ {
+ "name": "__DATA",
+ "type": "data",
+ "address": 1297224342667202580,
+ "size": 16
+ }
+ ],
+ "symbols": [
+ {
+ "name": "myglobal_json",
+ "size": 8,
+ "type": "data",
+ "address": 1297224342667202580
+ }
+ ]
+}
diff --git a/lldb/test/API/macosx/arm-pointer-metadata-stripping/main.c b/lldb/test/API/macosx/arm-pointer-metadata-stripping/main.c
new file mode 100644
index 000000000000..05a85133caf7
--- /dev/null
+++ b/lldb/test/API/macosx/arm-pointer-metadata-stripping/main.c
@@ -0,0 +1,13 @@
+#include <stdint.h>
+
+uintptr_t get_high_bits(void *ptr) {
+ uintptr_t address_bits = 56;
+ uintptr_t mask = ~((1ULL << address_bits) - 1);
+ uintptr_t ptrtoint = (uintptr_t)ptr;
+ uintptr_t high_bits = ptrtoint & mask;
+ return high_bits;
+}
+
+int main() {
+ return 0; // break here
+}