| // `-Z branch protection` is an unstable compiler feature which adds pointer-authentication |
| // code (PAC), a useful hashing measure for verifying that pointers have not been modified. |
| // This test checks that compilation and execution is successful when this feature is activated, |
| // with some of its possible extra arguments (bti, pac-ret, leaf) when doing LTO. |
| // See https://github.com/rust-lang/rust/pull/88354 |
| |
| //@ needs-force-clang-based-tests |
| //@ only-aarch64 |
| // Reason: branch protection is not supported on other architectures |
| //@ ignore-cross-compile |
| // Reason: the compiled binary is executed |
| |
| use run_make_support::{clang, env_var, llvm_ar, llvm_objdump, run, rustc, static_lib_name}; |
| |
| static PAUTH_A_KEY_PATTERN: &'static str = "paciasp"; |
| static PAUTH_B_KEY_PATTERN: &'static str = "pacibsp"; |
| |
| fn main() { |
| clang() |
| .arg("-v") |
| .lto("thin") |
| .arg("-mbranch-protection=bti+pac-ret+b-key+leaf") |
| .arg("-c") |
| .out_exe("test.o") |
| .input("test.c") |
| .run(); |
| llvm_ar().obj_to_ar().output_input(static_lib_name("test"), "test.o").run(); |
| rustc() |
| .linker_plugin_lto("on") |
| .opt_level("2") |
| .linker(&env_var("CLANG")) |
| .link_arg("-fuse-ld=lld") |
| .arg("-Zbranch-protection=bti,pac-ret,leaf") |
| .input("test.rs") |
| .output("test.bin") |
| .run(); |
| |
| // Check that both a-key and b-key pac-ret survived LTO |
| llvm_objdump() |
| .disassemble() |
| .input("test.bin") |
| .run() |
| .assert_stdout_contains_regex(PAUTH_A_KEY_PATTERN) |
| .assert_stdout_contains_regex(PAUTH_B_KEY_PATTERN); |
| |
| // Check that the binary actually runs |
| run("test.bin"); |
| } |