Build: Add compile-time checks regarding ABI assumptions.

This commit is contained in:
Brian Smith 2024-01-15 18:13:09 -08:00
parent c5a9c81bc1
commit 73fb637078
2 changed files with 40 additions and 0 deletions

View File

@ -17,6 +17,25 @@
allow(dead_code)
)]
#[cfg(any(target_arch = "arm", target_arch = "aarch64"))]
mod abi_assumptions {
// TODO: Support ARM64_32; see
// https://github.com/briansmith/ring/issues/1832#issuecomment-1892928147. This also requires
// replacing all `cfg(target_pointer_width)` logic for non-pointer/reference things
// (`N0`, `Limb`, `LimbMask`, `crypto_word_t` etc.).
#[cfg(target_arch = "aarch64")]
const _ASSUMED_POINTER_SIZE: usize = 8;
#[cfg(target_arch = "arm")]
const _ASSUMED_POINTER_SIZE: usize = 4;
const _ASSUMED_USIZE_SIZE: () = assert!(core::mem::size_of::<usize>() == _ASSUMED_POINTER_SIZE);
const _ASSUMED_REF_SIZE: () =
assert!(core::mem::size_of::<&'static u8>() == _ASSUMED_POINTER_SIZE);
// To support big-endian, we'd need to make several changes as described in
// https://github.com/briansmith/ring/issues/1832.
const _ASSUMED_ENDIANNESS: () = assert!(cfg!(target_endian = "little"));
}
// uclibc: When linked statically, uclibc doesn't provide getauxval.
// When linked dynamically, recent versions do provide it, but we
// want to support older versions too. Assume that if uclibc is being

View File

@ -17,6 +17,27 @@
allow(dead_code)
)]
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
mod abi_assumptions {
// TOOD: Support targets that do not have SSE and SSE2 enabled, such as
// x86_64-unknown-linux-none. See
// https://github.com/briansmith/ring/issues/1793#issuecomment-1793243725,
// https://github.com/briansmith/ring/issues/1832,
// https://github.com/briansmith/ring/issues/1833.
const _ASSUMES_SSE2: () =
assert!(cfg!(target_feature = "sse") && cfg!(target_feature = "sse2"));
#[cfg(target_arch = "x86_64")]
const _ASSUMED_POINTER_SIZE: usize = 8;
#[cfg(target_arch = "x86")]
const _ASSUMED_POINTER_SIZE: usize = 4;
const _ASSUMED_USIZE_SIZE: () = assert!(core::mem::size_of::<usize>() == _ASSUMED_POINTER_SIZE);
const _ASSUMED_REF_SIZE: () =
assert!(core::mem::size_of::<&'static u8>() == _ASSUMED_POINTER_SIZE);
const _ASSUMED_ENDIANNESS: () = assert!(cfg!(target_endian = "little"));
}
pub(crate) struct Feature {
word: usize,
mask: u32,