diff --git a/src/expr.rs b/src/expr.rs index efea054..e72888f 100644 --- a/src/expr.rs +++ b/src/expr.rs @@ -64,7 +64,7 @@ impl TargetMatcher for targ::TargetInfo { Some(e) => env == e, None => env.0.is_empty(), }, - Family(fam) => Some(fam) == self.family.as_ref(), + Family(fam) => self.families.contains(fam), Os(os) => Some(os) == self.os.as_ref(), PointerWidth(w) => *w == self.pointer_width, Vendor(ven) => match &self.vendor { @@ -211,8 +211,8 @@ impl TargetMatcher for target_lexicon::Triple { Netbsd, None_, Openbsd, Redox, Solaris, Tvos, Uefi, Unknown, VxWorks, Wasi, Windows, }; - let lexicon_fam = match self.operating_system { - AmdHsa | Bitrig | Cloudabi | Cuda | Hermit | Nebulet | None_ | Uefi => None, + match self.operating_system { + AmdHsa | Bitrig | Cloudabi | Cuda | Hermit | Nebulet | None_ | Uefi => false, Darwin | Dragonfly | Espidf @@ -229,30 +229,39 @@ impl TargetMatcher for target_lexicon::Triple { | Redox | Solaris | Tvos - | VxWorks => Some(crate::targets::Family::unix), - Emscripten | Unknown => { + | VxWorks => fam == &crate::targets::Family::unix, + Emscripten => { + match self.architecture { + // asmjs, wasm32 and wasm64 are part of both the wasm and unix families + Architecture::Asmjs | Architecture::Wasm32 => { + fam == &crate::targets::Family::wasm + || fam == &crate::targets::Family::unix + } + _ => false, + } + } + Unknown => { // asmjs, wasm32 and wasm64 are part of the wasm family. match self.architecture { Architecture::Asmjs | Architecture::Wasm32 | Architecture::Wasm64 => { - Some(crate::targets::Family::wasm) + fam == &crate::targets::Family::wasm } - _ => None, + _ => false, } } Linux => { // The 'kernel' environment is treated specially as not-unix if self.environment != Environment::Kernel { - Some(crate::targets::Family::unix) + fam == &crate::targets::Family::unix } else { - None + false } } - Wasi => Some(crate::targets::Family::wasm), - Windows => Some(crate::targets::Family::windows), + Wasi => fam == &crate::targets::Family::wasm, + Windows => fam == &crate::targets::Family::windows, // I really dislike non-exhaustive :( - _ => None, - }; - Some(fam) == lexicon_fam.as_ref() + _ => false, + } } Os(os) => match os.0.parse::() { Ok(o) => match self.environment { diff --git a/src/targets.rs b/src/targets.rs index 0ef7f6e..709e1c7 100644 --- a/src/targets.rs +++ b/src/targets.rs @@ -1,5 +1,5 @@ use crate::error::Reason; -use std::borrow::Cow; +use std::{borrow::Cow, ops::Deref}; mod builtins; @@ -24,8 +24,8 @@ pub struct Vendor(pub Cow<'static, str>); #[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)] pub struct Os(pub Cow<'static, str>); -/// The target family, which describes a set of targets grouped in some logical manner, typically by -/// operating system. This includes values like `unix` and `windows`. +/// Individual target families, which describe a set of targets grouped in some logical manner, +/// typically by operating system. This includes values like `unix` and `windows`. #[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)] pub struct Family(pub Cow<'static, str>); @@ -81,6 +81,70 @@ field_impls!(Os); field_impls!(Family); field_impls!(Env); +/// A set of families for a target. +/// +/// Each target can be part of one or more families. This struct represents them. +#[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)] +pub struct Families(Cow<'static, [Family]>); + +impl Families { + /// Constructs a new instance. + /// + /// This method accepts both owned `String`s and `&'static str`s. + /// + /// If you have a `&'static [&'static str]`, prefer [`Self::new_const`]. + #[inline] + pub fn new(val: impl IntoIterator) -> Self { + let mut families: Vec<_> = val.into_iter().collect(); + families.sort_unstable(); + Self(Cow::Owned(families)) + } + + /// Constructs a new instance of this field from a static slice of `&'static str`. + /// + /// `val` must be in sorted order: this constructor cannot check for that due to + /// limitations in current versions of Rust. + #[inline] + pub const fn new_const(val: &'static [Family]) -> Self { + // TODO: Check that val is sorted. + Self(Cow::Borrowed(val)) + } + + /// Returns true if this list of families contains a given family. + pub fn contains(&self, val: &Family) -> bool { + // This relies on the sorted-ness of its contents. + self.0.binary_search(val).is_ok() + } +} + +impl Deref for Families { + type Target = [Family]; + fn deref(&self) -> &Self::Target { + &*self.0 + } +} + +impl AsRef<[Family]> for Families { + #[inline] + fn as_ref(&self) -> &[Family] { + &*self.0 + } +} + +impl std::fmt::Display for Families { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{{")?; + let len = self.0.len(); + for (idx, family) in self.0.iter().enumerate() { + write!(f, "{}", family)?; + if idx + 1 < len { + write!(f, ", ")?; + } + } + write!(f, "}}") + } +} + macro_rules! target_enum { ( $(#[$outer:meta])* @@ -162,10 +226,10 @@ pub struct TargetInfo { /// [target_vendor](https://doc.rust-lang.org/reference/conditional-compilation.html#target_vendor) /// predicate. pub vendor: Option, - /// The target's family, if any. Used by the + /// The target's families, if any. Used by the /// [target_family](https://doc.rust-lang.org/reference/conditional-compilation.html#target_family) /// predicate. - pub family: Option, + pub families: Families, /// The size of the target's pointer type. Used by the /// [target_pointer_width](https://doc.rust-lang.org/reference/conditional-compilation.html#target_pointer_width) /// predicate. diff --git a/src/targets/builtins.rs b/src/targets/builtins.rs index 6e8060a..07e0329 100644 --- a/src/targets/builtins.rs +++ b/src/targets/builtins.rs @@ -19,7 +19,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::aarch64, env: None, vendor: Some(Vendor::apple), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::little, }, @@ -29,7 +29,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::aarch64, env: None, vendor: Some(Vendor::apple), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::little, }, @@ -39,7 +39,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::aarch64, env: None, vendor: Some(Vendor::apple), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::little, }, @@ -49,7 +49,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::aarch64, env: None, vendor: Some(Vendor::apple), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::little, }, @@ -59,7 +59,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::aarch64, env: None, vendor: Some(Vendor::apple), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::little, }, @@ -69,7 +69,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::aarch64, env: None, vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::little, }, @@ -79,7 +79,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::aarch64, env: None, vendor: Some(Vendor::kmc), - family: None, + families: Families::new_const(&[]), pointer_width: 64, endian: Endian::little, }, @@ -89,7 +89,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::aarch64, env: None, vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::little, }, @@ -99,7 +99,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::aarch64, env: Some(Env::msvc), vendor: Some(Vendor::pc), - family: Some(Family::windows), + families: Families::windows, pointer_width: 64, endian: Endian::little, }, @@ -109,7 +109,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::aarch64, env: None, vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::little, }, @@ -119,7 +119,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::aarch64, env: None, vendor: Some(Vendor::unknown), - family: None, + families: Families::new_const(&[]), pointer_width: 64, endian: Endian::little, }, @@ -129,7 +129,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::aarch64, env: Some(Env::gnu), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::little, }, @@ -139,7 +139,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::aarch64, env: Some(Env::gnu), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -149,7 +149,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::aarch64, env: Some(Env::musl), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::little, }, @@ -159,7 +159,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::aarch64, env: None, vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::little, }, @@ -169,7 +169,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::aarch64, env: None, vendor: Some(Vendor::unknown), - family: None, + families: Families::new_const(&[]), pointer_width: 64, endian: Endian::little, }, @@ -179,7 +179,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::aarch64, env: None, vendor: Some(Vendor::unknown), - family: None, + families: Families::new_const(&[]), pointer_width: 64, endian: Endian::little, }, @@ -189,7 +189,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::aarch64, env: None, vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::little, }, @@ -199,7 +199,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::aarch64, env: Some(Env::relibc), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::little, }, @@ -209,7 +209,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::aarch64, env: None, vendor: Some(Vendor::unknown), - family: None, + families: Families::new_const(&[]), pointer_width: 64, endian: Endian::little, }, @@ -219,7 +219,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::aarch64, env: Some(Env::msvc), vendor: Some(Vendor::uwp), - family: Some(Family::windows), + families: Families::windows, pointer_width: 64, endian: Endian::little, }, @@ -229,7 +229,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::aarch64, env: Some(Env::gnu), vendor: Some(Vendor::wrs), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::little, }, @@ -239,7 +239,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::aarch64, env: Some(Env::gnu), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::big, }, @@ -249,7 +249,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::aarch64, env: Some(Env::gnu), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::big, }, @@ -259,7 +259,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::arm, env: None, vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -269,7 +269,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::arm, env: Some(Env::gnu), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -279,7 +279,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::arm, env: Some(Env::gnu), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -289,7 +289,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::arm, env: Some(Env::musl), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -299,7 +299,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::arm, env: Some(Env::musl), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -309,7 +309,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::arm, env: None, vendor: Some(Vendor::unknown), - family: None, + families: Families::new_const(&[]), pointer_width: 32, endian: Endian::big, }, @@ -319,7 +319,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::arm, env: None, vendor: Some(Vendor::unknown), - family: None, + families: Families::new_const(&[]), pointer_width: 32, endian: Endian::big, }, @@ -329,7 +329,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::arm, env: Some(Env::gnu), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -339,7 +339,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::arm, env: Some(Env::gnu), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -349,7 +349,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::arm, env: Some(Env::musl), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -359,7 +359,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::arm, env: Some(Env::uclibc), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -369,7 +369,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::arm, env: Some(Env::gnueabihf), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -379,7 +379,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::arm, env: Some(Env::eabihf), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -389,7 +389,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::arm, env: Some(Env::newlib), vendor: Some(Vendor::nintendo), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -399,7 +399,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::arm, env: None, vendor: Some(Vendor::apple), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -409,7 +409,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::arm, env: None, vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -419,7 +419,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::arm, env: Some(Env::gnueabihf), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -429,7 +429,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::arm, env: Some(Env::gnu), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -439,7 +439,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::arm, env: Some(Env::gnu), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -449,7 +449,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::arm, env: Some(Env::musl), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -459,7 +459,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::arm, env: Some(Env::musl), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -469,7 +469,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::arm, env: Some(Env::uclibc), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -479,7 +479,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::arm, env: Some(Env::eabihf), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -489,7 +489,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::arm, env: Some(Env::gnu), vendor: Some(Vendor::wrs), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -499,7 +499,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::arm, env: None, vendor: Some(Vendor::kmc), - family: None, + families: Families::new_const(&[]), pointer_width: 32, endian: Endian::little, }, @@ -509,7 +509,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::arm, env: None, vendor: Some(Vendor::kmc), - family: None, + families: Families::new_const(&[]), pointer_width: 32, endian: Endian::little, }, @@ -519,7 +519,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::arm, env: None, vendor: Some(Vendor::unknown), - family: None, + families: Families::new_const(&[]), pointer_width: 32, endian: Endian::little, }, @@ -529,7 +529,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::arm, env: None, vendor: Some(Vendor::unknown), - family: None, + families: Families::new_const(&[]), pointer_width: 32, endian: Endian::little, }, @@ -539,7 +539,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::arm, env: None, vendor: Some(Vendor::unknown), - family: None, + families: Families::new_const(&[]), pointer_width: 32, endian: Endian::little, }, @@ -549,7 +549,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::arm, env: None, vendor: Some(Vendor::unknown), - family: None, + families: Families::new_const(&[]), pointer_width: 32, endian: Endian::little, }, @@ -559,7 +559,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::arm, env: None, vendor: Some(Vendor::apple), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -569,7 +569,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::wasm32, env: None, vendor: Some(Vendor::unknown), - family: Some(Family::wasm), + families: Families::unix_wasm, pointer_width: 32, endian: Endian::little, }, @@ -579,7 +579,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::avr, env: None, vendor: Some(Vendor::unknown), - family: None, + families: Families::new_const(&[]), pointer_width: 16, endian: Endian::little, }, @@ -589,7 +589,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::bpf, env: None, vendor: Some(Vendor::unknown), - family: None, + families: Families::new_const(&[]), pointer_width: 64, endian: Endian::big, }, @@ -599,7 +599,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::bpf, env: None, vendor: Some(Vendor::unknown), - family: None, + families: Families::new_const(&[]), pointer_width: 64, endian: Endian::little, }, @@ -609,7 +609,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::hexagon, env: Some(Env::musl), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -619,7 +619,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86, env: None, vendor: Some(Vendor::apple), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -629,7 +629,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86, env: Some(Env::msvc), vendor: Some(Vendor::pc), - family: Some(Family::windows), + families: Families::windows, pointer_width: 32, endian: Endian::little, }, @@ -639,7 +639,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86, env: Some(Env::gnu), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -649,7 +649,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86, env: Some(Env::musl), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -659,7 +659,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86, env: None, vendor: Some(Vendor::apple), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -669,7 +669,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86, env: None, vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -679,7 +679,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86, env: Some(Env::gnu), vendor: Some(Vendor::pc), - family: Some(Family::windows), + families: Families::windows, pointer_width: 32, endian: Endian::little, }, @@ -689,7 +689,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86, env: Some(Env::msvc), vendor: Some(Vendor::pc), - family: Some(Family::windows), + families: Families::windows, pointer_width: 32, endian: Endian::little, }, @@ -699,7 +699,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86, env: None, vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -709,7 +709,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86, env: None, vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -719,7 +719,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86, env: Some(Env::gnu), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -729,7 +729,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86, env: Some(Env::musl), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -739,7 +739,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86, env: None, vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -749,7 +749,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86, env: None, vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -759,7 +759,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86, env: None, vendor: Some(Vendor::unknown), - family: None, + families: Families::new_const(&[]), pointer_width: 32, endian: Endian::little, }, @@ -769,7 +769,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86, env: Some(Env::gnu), vendor: Some(Vendor::uwp), - family: Some(Family::windows), + families: Families::windows, pointer_width: 32, endian: Endian::little, }, @@ -779,7 +779,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86, env: Some(Env::msvc), vendor: Some(Vendor::uwp), - family: Some(Family::windows), + families: Families::windows, pointer_width: 32, endian: Endian::little, }, @@ -789,7 +789,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86, env: Some(Env::gnu), vendor: Some(Vendor::wrs), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -799,7 +799,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::m68k, env: None, vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::big, }, @@ -809,7 +809,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::mips, env: Some(Env::gnu), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::big, }, @@ -819,7 +819,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::mips, env: Some(Env::musl), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::big, }, @@ -829,7 +829,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::mips, env: Some(Env::uclibc), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::big, }, @@ -839,7 +839,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::mips64, env: Some(Env::gnu), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::big, }, @@ -849,7 +849,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::mips64, env: Some(Env::musl), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::big, }, @@ -859,7 +859,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::mips64, env: Some(Env::gnu), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::little, }, @@ -869,7 +869,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::mips64, env: Some(Env::musl), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::little, }, @@ -879,7 +879,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::mips, env: None, vendor: Some(Vendor::sony), - family: None, + families: Families::new_const(&[]), pointer_width: 32, endian: Endian::little, }, @@ -889,7 +889,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::mips, env: Some(Env::gnu), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -899,7 +899,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::mips, env: Some(Env::musl), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -909,7 +909,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::mips, env: Some(Env::uclibc), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -919,7 +919,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::mips, env: None, vendor: Some(Vendor::unknown), - family: None, + families: Families::new_const(&[]), pointer_width: 32, endian: Endian::little, }, @@ -929,7 +929,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::mips, env: Some(Env::gnu), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::big, }, @@ -939,7 +939,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::mips, env: Some(Env::gnu), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -949,7 +949,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::mips64, env: Some(Env::gnu), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::big, }, @@ -959,7 +959,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::mips64, env: Some(Env::gnu), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::little, }, @@ -969,7 +969,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::msp430, env: None, vendor: Some(Vendor::unknown), - family: None, + families: Families::new_const(&[]), pointer_width: 16, endian: Endian::little, }, @@ -979,7 +979,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::nvptx64, env: None, vendor: Some(Vendor::nvidia), - family: None, + families: Families::new_const(&[]), pointer_width: 64, endian: Endian::little, }, @@ -989,7 +989,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::powerpc, env: None, vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::big, }, @@ -999,7 +999,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::powerpc, env: Some(Env::gnu), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::big, }, @@ -1009,7 +1009,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::powerpc, env: Some(Env::gnu), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::big, }, @@ -1019,7 +1019,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::powerpc, env: Some(Env::musl), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::big, }, @@ -1029,7 +1029,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::powerpc, env: None, vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::big, }, @@ -1039,7 +1039,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::powerpc, env: None, vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::big, }, @@ -1049,7 +1049,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::powerpc, env: Some(Env::gnu), vendor: Some(Vendor::wrs), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::big, }, @@ -1059,7 +1059,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::powerpc, env: Some(Env::gnu), vendor: Some(Vendor::wrs), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::big, }, @@ -1069,7 +1069,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::powerpc64, env: None, vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::big, }, @@ -1079,7 +1079,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::powerpc64, env: Some(Env::gnu), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::big, }, @@ -1089,7 +1089,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::powerpc64, env: Some(Env::musl), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::big, }, @@ -1099,7 +1099,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::powerpc64, env: Some(Env::gnu), vendor: Some(Vendor::wrs), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::big, }, @@ -1109,7 +1109,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::powerpc64, env: None, vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::little, }, @@ -1119,7 +1119,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::powerpc64, env: Some(Env::gnu), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::little, }, @@ -1129,7 +1129,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::powerpc64, env: Some(Env::musl), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::little, }, @@ -1139,7 +1139,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::riscv32, env: Some(Env::gnu), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -1149,7 +1149,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::riscv32, env: Some(Env::musl), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -1159,7 +1159,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::riscv32, env: None, vendor: Some(Vendor::unknown), - family: None, + families: Families::new_const(&[]), pointer_width: 32, endian: Endian::little, }, @@ -1169,7 +1169,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::riscv32, env: None, vendor: Some(Vendor::unknown), - family: None, + families: Families::new_const(&[]), pointer_width: 32, endian: Endian::little, }, @@ -1179,7 +1179,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::riscv32, env: Some(Env::newlib), vendor: Some(Vendor::espressif), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -1189,7 +1189,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::riscv32, env: None, vendor: Some(Vendor::unknown), - family: None, + families: Families::new_const(&[]), pointer_width: 32, endian: Endian::little, }, @@ -1199,7 +1199,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::riscv64, env: Some(Env::gnu), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::little, }, @@ -1209,7 +1209,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::riscv64, env: Some(Env::musl), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::little, }, @@ -1219,7 +1219,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::riscv64, env: None, vendor: Some(Vendor::unknown), - family: None, + families: Families::new_const(&[]), pointer_width: 64, endian: Endian::little, }, @@ -1229,7 +1229,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::riscv64, env: None, vendor: Some(Vendor::unknown), - family: None, + families: Families::new_const(&[]), pointer_width: 64, endian: Endian::little, }, @@ -1239,7 +1239,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::s390x, env: Some(Env::gnu), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::big, }, @@ -1249,7 +1249,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::s390x, env: Some(Env::musl), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::big, }, @@ -1259,7 +1259,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::sparc, env: Some(Env::gnu), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::big, }, @@ -1269,7 +1269,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::sparc64, env: Some(Env::gnu), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::big, }, @@ -1279,7 +1279,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::sparc64, env: None, vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::big, }, @@ -1289,7 +1289,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::sparc64, env: None, vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::big, }, @@ -1299,7 +1299,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::sparc64, env: None, vendor: Some(Vendor::sun), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::big, }, @@ -1309,7 +1309,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::arm, env: None, vendor: Some(Vendor::unknown), - family: None, + families: Families::new_const(&[]), pointer_width: 32, endian: Endian::little, }, @@ -1319,7 +1319,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::arm, env: None, vendor: Some(Vendor::unknown), - family: None, + families: Families::new_const(&[]), pointer_width: 32, endian: Endian::little, }, @@ -1329,7 +1329,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::arm, env: Some(Env::msvc), vendor: Some(Vendor::pc), - family: Some(Family::windows), + families: Families::windows, pointer_width: 32, endian: Endian::little, }, @@ -1339,7 +1339,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::arm, env: Some(Env::msvc), vendor: Some(Vendor::uwp), - family: Some(Family::windows), + families: Families::windows, pointer_width: 32, endian: Endian::little, }, @@ -1349,7 +1349,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::arm, env: None, vendor: Some(Vendor::unknown), - family: None, + families: Families::new_const(&[]), pointer_width: 32, endian: Endian::little, }, @@ -1359,7 +1359,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::arm, env: None, vendor: Some(Vendor::unknown), - family: None, + families: Families::new_const(&[]), pointer_width: 32, endian: Endian::little, }, @@ -1369,7 +1369,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::arm, env: None, vendor: Some(Vendor::unknown), - family: None, + families: Families::new_const(&[]), pointer_width: 32, endian: Endian::little, }, @@ -1379,7 +1379,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::arm, env: None, vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -1389,7 +1389,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::arm, env: Some(Env::gnu), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -1399,7 +1399,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::arm, env: Some(Env::musl), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -1409,7 +1409,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::arm, env: None, vendor: Some(Vendor::unknown), - family: None, + families: Families::new_const(&[]), pointer_width: 32, endian: Endian::little, }, @@ -1419,7 +1419,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::arm, env: None, vendor: Some(Vendor::unknown), - family: None, + families: Families::new_const(&[]), pointer_width: 32, endian: Endian::little, }, @@ -1429,7 +1429,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::arm, env: None, vendor: Some(Vendor::unknown), - family: None, + families: Families::new_const(&[]), pointer_width: 32, endian: Endian::little, }, @@ -1439,7 +1439,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::wasm32, env: None, vendor: Some(Vendor::unknown), - family: Some(Family::wasm), + families: Families::unix_wasm, pointer_width: 32, endian: Endian::little, }, @@ -1449,7 +1449,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::wasm32, env: None, vendor: Some(Vendor::unknown), - family: Some(Family::wasm), + families: Families::wasm, pointer_width: 32, endian: Endian::little, }, @@ -1459,7 +1459,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::wasm32, env: None, vendor: Some(Vendor::unknown), - family: Some(Family::wasm), + families: Families::wasm, pointer_width: 32, endian: Endian::little, }, @@ -1469,7 +1469,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::wasm64, env: None, vendor: Some(Vendor::unknown), - family: Some(Family::wasm), + families: Families::wasm, pointer_width: 64, endian: Endian::little, }, @@ -1479,7 +1479,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86_64, env: None, vendor: Some(Vendor::apple), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::little, }, @@ -1489,7 +1489,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86_64, env: None, vendor: Some(Vendor::apple), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::little, }, @@ -1499,7 +1499,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86_64, env: None, vendor: Some(Vendor::apple), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::little, }, @@ -1509,7 +1509,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86_64, env: None, vendor: Some(Vendor::apple), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::little, }, @@ -1519,7 +1519,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86_64, env: Some(Env::sgx), vendor: Some(Vendor::fortanix), - family: None, + families: Families::new_const(&[]), pointer_width: 64, endian: Endian::little, }, @@ -1529,7 +1529,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86_64, env: None, vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::little, }, @@ -1539,7 +1539,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86_64, env: None, vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::little, }, @@ -1549,7 +1549,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86_64, env: None, vendor: Some(Vendor::pc), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::little, }, @@ -1559,7 +1559,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86_64, env: Some(Env::gnu), vendor: Some(Vendor::pc), - family: Some(Family::windows), + families: Families::windows, pointer_width: 64, endian: Endian::little, }, @@ -1569,7 +1569,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86_64, env: Some(Env::msvc), vendor: Some(Vendor::pc), - family: Some(Family::windows), + families: Families::windows, pointer_width: 64, endian: Endian::little, }, @@ -1579,7 +1579,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86_64, env: None, vendor: Some(Vendor::sun), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::little, }, @@ -1589,7 +1589,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86_64, env: None, vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::little, }, @@ -1599,7 +1599,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86_64, env: None, vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::little, }, @@ -1609,7 +1609,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86_64, env: None, vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::little, }, @@ -1619,7 +1619,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86_64, env: None, vendor: Some(Vendor::unknown), - family: None, + families: Families::new_const(&[]), pointer_width: 64, endian: Endian::little, }, @@ -1629,7 +1629,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86_64, env: None, vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::little, }, @@ -1639,7 +1639,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86_64, env: Some(Env::uclibc), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::little, }, @@ -1649,7 +1649,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86_64, env: Some(Env::gnu), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::little, }, @@ -1659,7 +1659,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86_64, env: Some(Env::gnu), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 32, endian: Endian::little, }, @@ -1669,7 +1669,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86_64, env: Some(Env::musl), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::little, }, @@ -1679,7 +1679,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86_64, env: None, vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::little, }, @@ -1689,7 +1689,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86_64, env: None, vendor: Some(Vendor::unknown), - family: None, + families: Families::new_const(&[]), pointer_width: 64, endian: Endian::little, }, @@ -1699,7 +1699,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86_64, env: None, vendor: Some(Vendor::unknown), - family: None, + families: Families::new_const(&[]), pointer_width: 64, endian: Endian::little, }, @@ -1709,7 +1709,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86_64, env: Some(Env::gnu), vendor: Some(Vendor::unknown), - family: None, + families: Families::new_const(&[]), pointer_width: 64, endian: Endian::little, }, @@ -1719,7 +1719,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86_64, env: None, vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::little, }, @@ -1729,7 +1729,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86_64, env: Some(Env::relibc), vendor: Some(Vendor::unknown), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::little, }, @@ -1739,7 +1739,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86_64, env: None, vendor: Some(Vendor::unknown), - family: None, + families: Families::new_const(&[]), pointer_width: 64, endian: Endian::little, }, @@ -1749,7 +1749,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86_64, env: Some(Env::gnu), vendor: Some(Vendor::uwp), - family: Some(Family::windows), + families: Families::windows, pointer_width: 64, endian: Endian::little, }, @@ -1759,7 +1759,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86_64, env: Some(Env::msvc), vendor: Some(Vendor::uwp), - family: Some(Family::windows), + families: Families::windows, pointer_width: 64, endian: Endian::little, }, @@ -1769,7 +1769,7 @@ pub const ALL_BUILTINS: &[TargetInfo] = &[ arch: Arch::x86_64, env: Some(Env::gnu), vendor: Some(Vendor::wrs), - family: Some(Family::unix), + families: Families::unix, pointer_width: 64, endian: Endian::little, }, @@ -1850,6 +1850,18 @@ impl super::Family { pub const windows: Family = Family::new_const("windows"); } +const __families_unix: &[Family] = &[Family::unix]; +const __families_unix_wasm: &[Family] = &[Family::unix, Family::wasm]; +const __families_wasm: &[Family] = &[Family::wasm]; +const __families_windows: &[Family] = &[Family::windows]; + +impl super::Families { + pub const unix: Families = Families::new_const(__families_unix); + pub const unix_wasm: Families = Families::new_const(__families_unix_wasm); + pub const wasm: Families = Families::new_const(__families_wasm); + pub const windows: Families = Families::new_const(__families_windows); +} + impl super::Env { pub const eabihf: Env = Env::new_const("eabihf"); pub const gnu: Env = Env::new_const("gnu"); diff --git a/tests/eval.rs b/tests/eval.rs index e3a509b..c43f7ec 100644 --- a/tests/eval.rs +++ b/tests/eval.rs @@ -117,16 +117,12 @@ fn target_family() { for target in all { let target = Target::make(target.triple.as_str()); - match target.builtin.family { - Some(_) => { - assert!(matches_any_family.eval(|pred| { tg_match!(pred, target) })); - assert!(!impossible.eval(|pred| { tg_match!(pred, target) })); - } - None => { - assert!(!matches_any_family.eval(|pred| { tg_match!(pred, target) })); - assert!(!impossible.eval(|pred| { tg_match!(pred, target) })); - } + if target.builtin.families.is_empty() { + assert!(!matches_any_family.eval(|pred| { tg_match!(pred, target) })); + } else { + assert!(matches_any_family.eval(|pred| { tg_match!(pred, target) })); } + assert!(!impossible.eval(|pred| { tg_match!(pred, target) })); } } diff --git a/update/src/main.rs b/update/src/main.rs index 94195a0..45efda2 100644 --- a/update/src/main.rs +++ b/update/src/main.rs @@ -90,6 +90,7 @@ fn real_main() -> Result<(), String> { let mut oses: Vec = Vec::new(); let mut envs: Vec = Vec::new(); let mut families: Vec = Vec::new(); + let mut family_groups: Vec> = Vec::new(); for target in targets.lines() { let output = Command::new(&rustc) @@ -115,7 +116,7 @@ fn real_main() -> Result<(), String> { let mut arch = None; let mut endian = None; let mut env = None; - let mut family = None; + let mut family_group = Vec::new(); let mut os = None; let mut width = None; let mut vendor = None; @@ -143,7 +144,7 @@ fn real_main() -> Result<(), String> { env = Some(val) } } - "family" => family = Some(val), + "family" => family_group.push(val), "feature" => { // num_feats += 1; @@ -188,7 +189,28 @@ fn real_main() -> Result<(), String> { insert(vendor, &mut vendors); insert(os, &mut oses); insert(env, &mut envs); - insert(family, &mut families); + + // Family groups require special handling. + family_group.sort_unstable(); + for family in &family_group { + insert(Some(family), &mut families); + } + + if !family_group.is_empty() { + // Can't compare Vec to Vec<&str> so have to do this comparison. + let family_group: Vec = family_group.iter().map(|&s| s.to_owned()).collect(); + if let Err(i) = family_groups.binary_search_by(|t| t.cmp(&family_group)) { + family_groups.insert(i, family_group); + } + } + + let families_str = if family_group.is_empty() { + "Families::new_const(&[])".to_owned() + } else { + let mut families_str = "Families::".to_owned(); + write_family_group_str(&mut families_str, family_group.iter().copied()); + families_str + }; writeln!( out, @@ -198,7 +220,7 @@ fn real_main() -> Result<(), String> { arch: Arch::{arch}, env: {env}, vendor: {vendor}, - family: {family}, + families: {families_str}, pointer_width: {width}, endian: Endian::{endian}, }},", @@ -213,9 +235,6 @@ fn real_main() -> Result<(), String> { vendor = vendor .map(|v| format!("Some(Vendor::{})", v)) .unwrap_or_else(|| "None".to_owned()), - family = family - .map(|f| format!("Some(Family::{})", f)) - .unwrap_or_else(|| "None".to_owned()), width = width.expect("target had no pointer_width"), endian = endian.expect("target had no endian"), ) @@ -228,6 +247,7 @@ fn real_main() -> Result<(), String> { write_impls(&mut out, "Vendor", vendors); write_impls(&mut out, "Os", oses); write_impls(&mut out, "Family", families); + write_families_impls(&mut out, family_groups); write_impls(&mut out, "Env", envs); std::fs::write("src/targets/builtins.rs", out) @@ -260,6 +280,45 @@ fn write_impls(out: &mut String, typ: &'static str, builtins: Vec) { writeln!(out, "}}").unwrap(); } +fn write_families_impls(out: &mut String, family_groups: Vec>) { + writeln!(out).unwrap(); + for family_group in &family_groups { + write!(out, "const __families_").unwrap(); + write_family_group_str(out, family_group.iter().map(|s| s.as_str())); + write!(out, ": &[Family] = ").unwrap(); + write!(out, "&[").unwrap(); + for family in family_group { + writeln!(out, "Family::{}, ", family).unwrap(); + } + writeln!(out, "];").unwrap(); + } + + writeln!(out, "\nimpl super::Families {{").unwrap(); + + for family_group in family_groups { + write!(out, "pub const ").unwrap(); + write_family_group_str(out, family_group.iter().map(|s| s.as_str())); + write!(out, ": Families = Families::new_const(__families_").unwrap(); + write_family_group_str(out, family_group.iter().map(|s| s.as_str())); + writeln!(out, ");").unwrap(); + } + + writeln!(out, "}}").unwrap(); +} + +fn write_family_group_str<'a>( + out: &mut String, + family_group: impl IntoIterator + ExactSizeIterator, +) { + let len = family_group.len(); + for (idx, family) in family_group.into_iter().enumerate() { + out.push_str(family); + if idx < len - 1 { + out.push_str("_"); + } + } +} + fn main() { // Workaround for https://github.com/rust-lang/rust/issues/36156 // the ios targets attempt to find an SDK path, and then just hide