Place intrinsics in individual object files (#349)

Co-authored-by: Tomasz Miąsko <tomasz.miasko@gmail.com>
This commit is contained in:
Tomasz Miąsko 2020-04-11 00:00:50 +02:00 committed by GitHub
parent 72526f3811
commit 2541f27e8c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 33 additions and 16 deletions

View File

@ -173,14 +173,12 @@ macro_rules! intrinsics {
#[cfg(all(windows, target_arch = "x86_64"))]
pub mod $name {
intrinsics! {
pub extern $abi fn $name( $($argname: $ty),* )
-> ::macros::win64_128bit_abi_hack::U64x2
{
let e: $ret = super::$name($($argname),*);
::macros::win64_128bit_abi_hack::U64x2::from(e)
}
#[cfg_attr(not(feature = "mangled-names"), no_mangle)]
pub extern $abi fn $name( $($argname: $ty),* )
-> ::macros::win64_128bit_abi_hack::U64x2
{
let e: $ret = super::$name($($argname),*);
::macros::win64_128bit_abi_hack::U64x2::from(e)
}
}
@ -209,17 +207,23 @@ macro_rules! intrinsics {
$($rest:tt)*
) => (
#[cfg(target_arch = "arm")]
#[cfg_attr(not(feature = "mangled-names"), no_mangle)]
pub extern $abi fn $name( $($argname: $ty),* ) -> $ret {
$($body)*
}
#[cfg(target_arch = "arm")]
pub mod $name {
intrinsics! {
pub extern "aapcs" fn $alias( $($argname: $ty),* ) -> $ret {
super::$name($($argname),*)
}
#[cfg_attr(not(feature = "mangled-names"), no_mangle)]
pub extern $abi fn $name( $($argname: $ty),* ) -> $ret {
super::$name($($argname),*)
}
}
#[cfg(target_arch = "arm")]
pub mod $alias {
#[cfg_attr(not(feature = "mangled-names"), no_mangle)]
pub extern "aapcs" fn $alias( $($argname: $ty),* ) -> $ret {
super::$name($($argname),*)
}
}
@ -234,9 +238,15 @@ macro_rules! intrinsics {
intrinsics!($($rest)*);
);
// This is the final catch-all rule. At this point we just generate an
// This is the final catch-all rule. At this point we generate an
// intrinsic with a conditional `#[no_mangle]` directive to avoid
// interfereing with duplicate symbols and whatnot during testing.
// interfering with duplicate symbols and whatnot during testing.
//
// The implementation is placed in a separate module, to take advantage
// of the fact that rustc partitions functions into code generation
// units based on module they are defined in. As a result we will have
// a separate object file for each intrinsic. For further details see
// corresponding PR in rustc https://github.com/rust-lang/rust/pull/70846
//
// After the intrinsic is defined we just continue with the rest of the
// input we were given.
@ -249,11 +259,18 @@ macro_rules! intrinsics {
$($rest:tt)*
) => (
$(#[$($attr)*])*
#[cfg_attr(not(feature = "mangled-names"), no_mangle)]
pub extern $abi fn $name( $($argname: $ty),* ) -> $ret {
$($body)*
}
pub mod $name {
$(#[$($attr)*])*
#[cfg_attr(not(feature = "mangled-names"), no_mangle)]
pub extern $abi fn $name( $($argname: $ty),* ) -> $ret {
super::$name($($argname),*)
}
}
intrinsics!($($rest)*);
);
}