compiler-builtins-zynq/src/macros.rs

118 lines
3.1 KiB
Rust
Raw Normal View History

macro_rules! intrinsics {
() => ();
// Anything which has a `not(feature = "c")` we'll generate a shim function
// which calls out to the C function if the `c` feature is enabled.
// Otherwise if the `c` feature isn't enabled then we'll just have a normal
// intrinsic.
(
#[cfg(not(all(feature = "c", $($cfg_clause:tt)*)))]
$(#[$attr:meta])*
pub extern $abi:tt fn $name:ident( $($argname:ident: $ty:ty),* ) -> $ret:ty {
$($body:tt)*
}
$($rest:tt)*
) => (
#[cfg(all(feature = "c", not($($cfg_clause)*)))]
$(#[$attr])*
pub extern $abi fn $name( $($argname: $ty),* ) -> $ret {
extern $abi {
fn $name($($argname: $ty),*) -> $ret;
}
unsafe {
$name($($argname),*)
}
}
#[cfg(not(all(feature = "c", not($($cfg_clause)*))))]
intrinsics! {
$(#[$attr])*
pub extern $abi fn $name( $($argname: $ty),* ) -> $ret {
$($body)*
}
}
intrinsics!($($rest)*);
);
// We recognize the `#[aapcs_only_on_arm]` attribute here and generate the
// same intrinsic but force it to have the `"aapcs"` calling convention on
// ARM and `"C"` elsewhere.
(
#[aapcs_on_arm]
$(#[$attr:meta])*
pub extern $abi:tt fn $name:ident( $($argname:ident: $ty:ty),* ) -> $ret:ty {
$($body:tt)*
}
$($rest:tt)*
) => (
#[cfg(target_arch = "arm")]
intrinsics! {
$(#[$attr])*
pub extern "aapcs" fn $name( $($argname: $ty),* ) -> $ret {
$($body)*
}
}
#[cfg(not(target_arch = "arm"))]
intrinsics! {
$(#[$attr])*
pub extern $abi fn $name( $($argname: $ty),* ) -> $ret {
$($body)*
}
}
intrinsics!($($rest)*);
);
// Like aapcs above we recognize an attribute for the "unadjusted" abi on
// win64 for some methods.
(
#[unadjusted_on_win64]
$(#[$attr:meta])*
pub extern $abi:tt fn $name:ident( $($argname:ident: $ty:ty),* ) -> $ret:ty {
$($body:tt)*
}
$($rest:tt)*
) => (
#[cfg(all(windows, target_pointer_width = "64"))]
intrinsics! {
$(#[$attr])*
pub extern "unadjusted" fn $name( $($argname: $ty),* ) -> $ret {
$($body)*
}
}
#[cfg(not(all(windows, target_pointer_width = "64")))]
intrinsics! {
$(#[$attr])*
pub extern $abi fn $name( $($argname: $ty),* ) -> $ret {
$($body)*
}
}
intrinsics!($($rest)*);
);
(
$(#[$attr:meta])*
pub extern $abi:tt fn $name:ident( $($argname:ident: $ty:ty),* ) -> $ret:ty {
$($body:tt)*
}
$($rest:tt)*
) => (
$(#[$attr])*
#[cfg_attr(not(test), no_mangle)]
pub extern $abi fn $name( $($argname: $ty),* ) -> $ret {
$($body)*
}
intrinsics!($($rest)*);
);
}