//@ compile-flags: -C no-prepopulate-passes -Zbranch-protection=bti //@ assembly-output: emit-asm //@ needs-asm-support //@ only-aarch64 #![crate_type = "lib"] #![feature(naked_functions)] use std::arch::naked_asm; // The problem at hand: Rust has adopted a fairly strict meaning for "naked functions", // meaning "no prologue whatsoever, no, really, not one instruction." // Unfortunately, aarch64's "branch target identification" works via hints at landing sites. // LLVM implements this via making sure of that, even for functions with the naked attribute. // So, we must emit an appropriate instruction instead! #[no_mangle] #[naked] pub unsafe extern "C" fn _hlt() -> ! { // CHECK-NOT: hint #34 // CHECK: hlt #0x1 naked_asm!("hlt #1") }