119 lines
2.7 KiB
Rust
119 lines
2.7 KiB
Rust
// Keep in sync with `core_name_and_version` in build.rs.
|
|
macro_rules! core_name_and_version {
|
|
() => {
|
|
concat!(
|
|
env!("CARGO_PKG_NAME"),
|
|
"_core_",
|
|
env!("CARGO_PKG_VERSION_MAJOR"),
|
|
"_",
|
|
env!("CARGO_PKG_VERSION_MINOR"),
|
|
"_",
|
|
env!("CARGO_PKG_VERSION_PATCH"),
|
|
"_",
|
|
env!("CARGO_PKG_VERSION_PRE"), // Often empty
|
|
)
|
|
};
|
|
}
|
|
|
|
// Keep in sync with `prefix` in build.rs.
|
|
macro_rules! prefix {
|
|
( ) => {
|
|
concat!(core_name_and_version!(), "_")
|
|
};
|
|
}
|
|
|
|
macro_rules! prefixed_extern {
|
|
// Functions.
|
|
{
|
|
$(
|
|
$( #[$meta:meta] )*
|
|
$vis:vis fn $name:ident ( $( $arg_pat:ident : $arg_ty:ty ),* $(,)? )
|
|
$( -> $ret_ty:ty )?;
|
|
)+
|
|
} => {
|
|
extern "C" {
|
|
$(
|
|
prefixed_item! {
|
|
link_name
|
|
$name
|
|
{
|
|
$( #[$meta] )*
|
|
$vis fn $name ( $( $arg_pat : $arg_ty ),* ) $( -> $ret_ty )?;
|
|
}
|
|
|
|
}
|
|
)+
|
|
}
|
|
};
|
|
|
|
// A `static` global variable.
|
|
{
|
|
$( #[$meta:meta] )*
|
|
$vis:vis static $name:ident: $typ:ty;
|
|
} => {
|
|
extern "C" {
|
|
prefixed_item! {
|
|
link_name
|
|
$name
|
|
{
|
|
$( #[$meta] )*
|
|
$vis static $name: $typ;
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
// A `static mut` global variable.
|
|
{
|
|
$( #[$meta:meta] )*
|
|
$vis:vis static mut $name:ident: $typ:ty;
|
|
} => {
|
|
extern "C" {
|
|
prefixed_item! {
|
|
link_name
|
|
$name
|
|
{
|
|
$( #[$meta] )*
|
|
$vis static mut $name: $typ;
|
|
}
|
|
}
|
|
}
|
|
};
|
|
}
|
|
|
|
#[deprecated = "`#[export_name]` creates problems and we will stop doing it."]
|
|
#[cfg(not(any(
|
|
all(target_arch = "aarch64", target_endian = "little"),
|
|
all(target_arch = "arm", target_endian = "little"),
|
|
target_arch = "x86",
|
|
target_arch = "x86_64"
|
|
)))]
|
|
macro_rules! prefixed_export {
|
|
// A function.
|
|
{
|
|
$( #[$meta:meta] )*
|
|
$vis:vis unsafe extern "C"
|
|
fn $name:ident ( $( $arg_pat:ident : $arg_ty:ty ),* $(,)? ) $body:block
|
|
} => {
|
|
prefixed_item! {
|
|
export_name
|
|
$name
|
|
{
|
|
$( #[$meta] )*
|
|
$vis unsafe extern "C" fn $name ( $( $arg_pat : $arg_ty ),* ) $body
|
|
}
|
|
}
|
|
};
|
|
}
|
|
|
|
macro_rules! prefixed_item {
|
|
{
|
|
$attr:ident
|
|
$name:ident
|
|
{ $item:item }
|
|
} => {
|
|
#[$attr = concat!(prefix!(), stringify!($name))]
|
|
$item
|
|
};
|
|
}
|