mirror of
https://github.com/rust-lang/rust.git
synced 2026-05-31 21:47:15 +03:00
028b8b6c54
The `needs-asm-mnemonic` directive was very general, but in practice was only being used for `ret`. There are very few other mnemonics that it could plausibly be useful for (e.g. `nop`), because any instruction that requires arguments is probably going to be non-portable. This PR replaces `needs-asm-mnemonic` with a simpler `needs-asm-ret` directive that uses the same machinery as other simple needs directives. If we happend to need more mnemonics in the future, we can just add more simple directives as appropriate (e.g. `needs-asm-nop`).
48 lines
1.2 KiB
Rust
48 lines
1.2 KiB
Rust
//@ compile-flags: -C no-prepopulate-passes -Copt-level=0 -Zmin-function-alignment=16
|
|
//@ needs-asm-support
|
|
//@ needs-asm-ret
|
|
//@ ignore-wasm32 aligning functions is not currently supported on wasm (#143368)
|
|
|
|
// FIXME(#82232, #143834): temporarily renamed to mitigate `#[align]` nameres ambiguity
|
|
#![feature(rustc_attrs)]
|
|
#![feature(fn_align)]
|
|
#![crate_type = "lib"]
|
|
|
|
// functions without explicit alignment use the global minimum
|
|
//
|
|
// CHECK: .balign 16
|
|
#[no_mangle]
|
|
#[unsafe(naked)]
|
|
pub extern "C" fn naked_no_explicit_align() {
|
|
core::arch::naked_asm!("ret")
|
|
}
|
|
|
|
// CHECK: .balign 16
|
|
#[no_mangle]
|
|
#[rustc_align(8)]
|
|
#[unsafe(naked)]
|
|
pub extern "C" fn naked_lower_align() {
|
|
core::arch::naked_asm!("ret")
|
|
}
|
|
|
|
// CHECK: .balign 32
|
|
#[no_mangle]
|
|
#[rustc_align(32)]
|
|
#[unsafe(naked)]
|
|
pub extern "C" fn naked_higher_align() {
|
|
core::arch::naked_asm!("ret")
|
|
}
|
|
|
|
// cold functions follow the same rules as other functions
|
|
//
|
|
// in GCC, the `-falign-functions` does not apply to cold functions, but
|
|
// `-Zmin-function-alignment` applies to all functions.
|
|
//
|
|
// CHECK: .balign 16
|
|
#[no_mangle]
|
|
#[cold]
|
|
#[unsafe(naked)]
|
|
pub extern "C" fn no_explicit_align_cold() {
|
|
core::arch::naked_asm!("ret")
|
|
}
|