#![allow(unused_macros)]
#[cfg(feature = "nightly")]
macro_rules! naked_fn {
(
$doc:literal;
$vis:vis fn $name:ident $args:tt -> $ret:ty;
$($code:literal),*;
$($label:ident = $kind:ident $path:path),*
) => {
#[doc = $doc]
#[unsafe(naked)]
#[unsafe(no_mangle)]
$vis unsafe extern "C" fn $name $args -> $ret {
core::arch::naked_asm!(
$($code),*,
$($label = $kind $path),*
)
}
};
}
#[cfg(not(feature = "nightly"))]
macro_rules! naked_fn {
(
$doc:literal;
$vis:vis fn $name:ident $args:tt -> $ret:ty;
$($code:literal),*;
$($label:ident = $kind:ident $path:path),*
) => {
unsafe extern "C" {
#[doc = $doc]
$vis fn $name $args -> $ret;
}
core::arch::global_asm!(
concat!(".global ", stringify!($name)),
concat!(".type ", stringify!($name), ", @function"),
concat!(stringify!($name), ":"),
$($code),*,
concat!(".size ", stringify!($name), ", .-", stringify!($name)),
$($label = $kind $path),*
);
};
}