// Tests that MTE tags and values stored in the top byte of a pointer (TBI) are // preserved across FFI boundaries (C <-> Rust). // This test does not require MTE: whilst the test will use MTE if available, if it is not, // arbitrary tag bits are set using TBI. // This test is only valid for AArch64. // The linker must be explicitly specified when cross-compiling, so it is limited to // `aarch64-unknown-linux-gnu`. //@ only-aarch64-unknown-linux-gnu use run_make_support::{cc, dynamic_lib_name, extra_c_flags, run, rustc, target}; fn main() { run_test("int"); run_test("float"); run_test("string"); run_test("function"); } fn run_test(variant: &str) { let flags = { let mut flags = extra_c_flags(); flags.push("-march=armv8.5-a+memtag"); flags }; println!("{variant} test..."); rustc() .input(format!("foo_{variant}.rs")) .target(target()) .linker("aarch64-linux-gnu-gcc") .run(); cc().input(format!("bar_{variant}.c")) .input(dynamic_lib_name("foo")) .out_exe("test") .args(&flags) .run(); run("test"); }