| //@ compile-flags: -C no-prepopulate-passes -Zcf-protection=full |
| //@ assembly-output: emit-asm |
| //@ needs-asm-support |
| //@ only-x86_64 |
| |
| #![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, x86's control-flow enforcement, specifically indirect branch protection, |
| // works by using an instruction for each possible landing site, |
| // and LLVM implements this via making sure of that. |
| #[no_mangle] |
| #[naked] |
| pub unsafe extern "sysv64" fn will_halt() -> ! { |
| // CHECK-NOT: endbr{{32|64}} |
| // CHECK: hlt |
| naked_asm!("hlt") |
| } |
| |
| // what about aarch64? |
| // "branch-protection"=false |