diff --git a/build.rs b/build.rs index 71dec19..e94914b 100644 --- a/build.rs +++ b/build.rs @@ -12,6 +12,12 @@ fn main() { return; } + // Forcibly enable memory intrinsics on wasm32 as we don't have a libc to + // provide them. + if target.contains("wasm32") { + println!("cargo:rustc-cfg=feature=\"mem\""); + } + // NOTE we are going to assume that llvm-target, what determines our codegen option, matches the // target triple. This is usually correct for our built-in targets but can break in presence of // custom targets, which can have arbitrary names. @@ -25,9 +31,13 @@ fn main() { // mangling names though we assume that we're also in test mode so we don't // build anything and we rely on the upstream implementation of compiler-rt // functions - if !cfg!(feature = "mangled-names") { - #[cfg(feature = "c")] - c::compile(&llvm_target); + if !cfg!(feature = "mangled-names") && cfg!(feature = "c") { + // no C compiler for wasm + if !target.contains("wasm32") { + #[cfg(feature = "c")] + c::compile(&llvm_target); + println!("cargo:rustc-cfg=use_c"); + } } // To compile intrinsics.rs for thumb targets, where there is no libc diff --git a/src/macros.rs b/src/macros.rs index f6d7db7..652c911 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -31,7 +31,7 @@ /// A quick overview of attributes supported right now are: /// /// * `use_c_shim_if` - takes a #[cfg] directive and falls back to the -/// C-compiled version if `feature = "c"` is specified. +/// C-compiled version if `use_c` is specified. /// * `aapcs_on_arm` - forces the ABI of the function to be `"aapcs"` on ARM and /// the specified ABI everywhere else. /// * `unadjusted_on_win64` - like `aapcs_on_arm` this switches to the @@ -68,7 +68,7 @@ macro_rules! intrinsics { $($rest:tt)* ) => ( - #[cfg(all(feature = "c", $($cfg_clause)*))] + #[cfg(all(use_c, $($cfg_clause)*))] pub extern $abi fn $name( $($argname: $ty),* ) -> $ret { extern $abi { fn $name($($argname: $ty),*) -> $ret; @@ -78,7 +78,7 @@ macro_rules! intrinsics { } } - #[cfg(not(all(feature = "c", $($cfg_clause)*)))] + #[cfg(not(all(use_c, $($cfg_clause)*)))] intrinsics! { $(#[$($attr)*])* pub extern $abi fn $name( $($argname: $ty),* ) -> $ret {