From 5e62ce9fadb401539a08b329e4cbd98cc6393f60 Mon Sep 17 00:00:00 2001 From: Artyom Pavlov Date: Fri, 24 Jan 2025 15:40:57 +0300 Subject: [PATCH] rndr: minor tweaks (#586) The most notable change is that `is_aarch64_feature_detected!` now takes precedence over `asm!`-based detection. --- src/backends/rndr.rs | 53 ++++++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/src/backends/rndr.rs b/src/backends/rndr.rs index 7db90355..fa24a097 100644 --- a/src/backends/rndr.rs +++ b/src/backends/rndr.rs @@ -60,10 +60,21 @@ unsafe fn rndr_fill(dest: &mut [MaybeUninit]) -> Option<()> { Some(()) } +#[cfg(target_feature = "rand")] fn is_rndr_available() -> bool { + true +} + +#[cfg(not(target_feature = "rand"))] +fn is_rndr_available() -> bool { + #[path = "../lazy.rs"] + mod lazy; + static RNDR_GOOD: lazy::LazyBool = lazy::LazyBool::new(); + cfg_if::cfg_if! { - if #[cfg(target_feature = "rand")] { - true + if #[cfg(feature = "std")] { + extern crate std; + RNDR_GOOD.unsync_init(|| std::arch::is_aarch64_feature_detected!("rand")) } else if #[cfg(target_os = "linux")] { /// Check whether FEAT_RNG is available on the system /// @@ -87,14 +98,7 @@ fn is_rndr_available() -> bool { (id_aa64isar0 >> 60) & 0xf >= 1 } - #[path = "../lazy.rs"] mod lazy; - static RNDR_GOOD: lazy::LazyBool = lazy::LazyBool::new(); RNDR_GOOD.unsync_init(mrs_check) - } else if #[cfg(feature = "std")] { - extern crate std; - #[path = "../lazy.rs"] mod lazy; - static RNDR_GOOD: lazy::LazyBool = lazy::LazyBool::new(); - RNDR_GOOD.unsync_init(|| std::arch::is_aarch64_feature_detected!("rand")) } else { compile_error!( "RNDR `no_std` runtime detection is currently supported only on Linux targets. \ @@ -105,32 +109,29 @@ fn is_rndr_available() -> bool { } pub fn inner_u32() -> Result { - if is_rndr_available() { - // SAFETY: after this point, we know the `rand` target feature is enabled - let res = unsafe { rndr() }; - res.map(truncate).ok_or(Error::RNDR_FAILURE) - } else { - Err(Error::RNDR_NOT_AVAILABLE) + if !is_rndr_available() { + return Err(Error::RNDR_NOT_AVAILABLE); } + // SAFETY: after this point, we know the `rand` target feature is enabled + let res = unsafe { rndr() }; + res.map(truncate).ok_or(Error::RNDR_FAILURE) } pub fn inner_u64() -> Result { - if is_rndr_available() { - // SAFETY: after this point, we know the `rand` target feature is enabled - let res = unsafe { rndr() }; - res.ok_or(Error::RNDR_FAILURE) - } else { - Err(Error::RNDR_NOT_AVAILABLE) + if !is_rndr_available() { + return Err(Error::RNDR_NOT_AVAILABLE); } + // SAFETY: after this point, we know the `rand` target feature is enabled + let res = unsafe { rndr() }; + res.ok_or(Error::RNDR_FAILURE) } pub fn fill_inner(dest: &mut [MaybeUninit]) -> Result<(), Error> { - if is_rndr_available() { - // SAFETY: after this point, we know the `rand` target feature is enabled - unsafe { rndr_fill(dest).ok_or(Error::RNDR_FAILURE) } - } else { - Err(Error::RNDR_NOT_AVAILABLE) + if !is_rndr_available() { + return Err(Error::RNDR_NOT_AVAILABLE); } + // SAFETY: after this point, we know the `rand` target feature is enabled + unsafe { rndr_fill(dest).ok_or(Error::RNDR_FAILURE) } } impl Error {