1use core::result::Result;
41use std::borrow::Cow;
42use std::collections::BTreeMap;
43use std::hash::{Hash, Hasher};
44use std::ops::{Deref, DerefMut};
45use std::path::{Path, PathBuf};
46use std::str::FromStr;
47use std::{fmt, io};
48
49use rustc_abi::{
50 Align, CanonAbi, Endian, ExternAbi, Integer, Size, TargetDataLayout, TargetDataLayoutErrors,
51};
52use rustc_data_structures::fx::{FxHashSet, FxIndexSet};
53use rustc_error_messages::{DiagArgValue, IntoDiagArg, into_diag_arg_using_display};
54use rustc_fs_util::try_canonicalize;
55use rustc_macros::{BlobDecodable, Decodable, Encodable, HashStable_Generic};
56use rustc_serialize::{Decodable, Decoder, Encodable, Encoder};
57use rustc_span::{Symbol, kw, sym};
58use serde_json::Value;
59use tracing::debug;
60
61use crate::json::{Json, ToJson};
62use crate::spec::crt_objects::CrtObjects;
63
64pub mod crt_objects;
65
66mod abi_map;
67mod base;
68mod json;
69
70pub use abi_map::{AbiMap, AbiMapping};
71pub use base::apple;
72pub use base::avr::ef_avr_arch;
73pub use json::json_schema;
74
75#[derive(#[automatically_derived]
impl ::core::clone::Clone for Cc {
#[inline]
fn clone(&self) -> Cc { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for Cc { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for Cc {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self { Cc::Yes => "Yes", Cc::No => "No", })
}
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for Cc {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) -> () {}
}Eq, #[automatically_derived]
impl ::core::cmp::Ord for Cc {
#[inline]
fn cmp(&self, other: &Cc) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr)
}
}Ord, #[automatically_derived]
impl ::core::cmp::PartialEq for Cc {
#[inline]
fn eq(&self, other: &Cc) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::PartialOrd for Cc {
#[inline]
fn partial_cmp(&self, other: &Cc)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::PartialOrd::partial_cmp(&__self_discr, &__arg1_discr)
}
}PartialOrd)]
77pub enum Cc {
78 Yes,
79 No,
80}
81
82#[derive(#[automatically_derived]
impl ::core::clone::Clone for Lld {
#[inline]
fn clone(&self) -> Lld { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for Lld { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for Lld {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self { Lld::Yes => "Yes", Lld::No => "No", })
}
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for Lld {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) -> () {}
}Eq, #[automatically_derived]
impl ::core::cmp::Ord for Lld {
#[inline]
fn cmp(&self, other: &Lld) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr)
}
}Ord, #[automatically_derived]
impl ::core::cmp::PartialEq for Lld {
#[inline]
fn eq(&self, other: &Lld) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::PartialOrd for Lld {
#[inline]
fn partial_cmp(&self, other: &Lld)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::PartialOrd::partial_cmp(&__self_discr, &__arg1_discr)
}
}PartialOrd)]
84pub enum Lld {
85 Yes,
86 No,
87}
88
89#[derive(#[automatically_derived]
impl ::core::clone::Clone for LinkerFlavor {
#[inline]
fn clone(&self) -> LinkerFlavor {
let _: ::core::clone::AssertParamIsClone<Cc>;
let _: ::core::clone::AssertParamIsClone<Lld>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for LinkerFlavor { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for LinkerFlavor {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
LinkerFlavor::Gnu(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Gnu",
__self_0, &__self_1),
LinkerFlavor::Darwin(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Darwin",
__self_0, &__self_1),
LinkerFlavor::WasmLld(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"WasmLld", &__self_0),
LinkerFlavor::Unix(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Unix",
&__self_0),
LinkerFlavor::Msvc(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Msvc",
&__self_0),
LinkerFlavor::EmCc =>
::core::fmt::Formatter::write_str(f, "EmCc"),
LinkerFlavor::Bpf => ::core::fmt::Formatter::write_str(f, "Bpf"),
LinkerFlavor::Ptx => ::core::fmt::Formatter::write_str(f, "Ptx"),
LinkerFlavor::Llbc =>
::core::fmt::Formatter::write_str(f, "Llbc"),
}
}
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for LinkerFlavor {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) -> () {
let _: ::core::cmp::AssertParamIsEq<Cc>;
let _: ::core::cmp::AssertParamIsEq<Lld>;
}
}Eq, #[automatically_derived]
impl ::core::cmp::Ord for LinkerFlavor {
#[inline]
fn cmp(&self, other: &LinkerFlavor) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
match ::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr) {
::core::cmp::Ordering::Equal =>
match (self, other) {
(LinkerFlavor::Gnu(__self_0, __self_1),
LinkerFlavor::Gnu(__arg1_0, __arg1_1)) =>
match ::core::cmp::Ord::cmp(__self_0, __arg1_0) {
::core::cmp::Ordering::Equal =>
::core::cmp::Ord::cmp(__self_1, __arg1_1),
cmp => cmp,
},
(LinkerFlavor::Darwin(__self_0, __self_1),
LinkerFlavor::Darwin(__arg1_0, __arg1_1)) =>
match ::core::cmp::Ord::cmp(__self_0, __arg1_0) {
::core::cmp::Ordering::Equal =>
::core::cmp::Ord::cmp(__self_1, __arg1_1),
cmp => cmp,
},
(LinkerFlavor::WasmLld(__self_0),
LinkerFlavor::WasmLld(__arg1_0)) =>
::core::cmp::Ord::cmp(__self_0, __arg1_0),
(LinkerFlavor::Unix(__self_0), LinkerFlavor::Unix(__arg1_0))
=> ::core::cmp::Ord::cmp(__self_0, __arg1_0),
(LinkerFlavor::Msvc(__self_0), LinkerFlavor::Msvc(__arg1_0))
=> ::core::cmp::Ord::cmp(__self_0, __arg1_0),
_ => ::core::cmp::Ordering::Equal,
},
cmp => cmp,
}
}
}Ord, #[automatically_derived]
impl ::core::cmp::PartialEq for LinkerFlavor {
#[inline]
fn eq(&self, other: &LinkerFlavor) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(LinkerFlavor::Gnu(__self_0, __self_1),
LinkerFlavor::Gnu(__arg1_0, __arg1_1)) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1,
(LinkerFlavor::Darwin(__self_0, __self_1),
LinkerFlavor::Darwin(__arg1_0, __arg1_1)) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1,
(LinkerFlavor::WasmLld(__self_0),
LinkerFlavor::WasmLld(__arg1_0)) => __self_0 == __arg1_0,
(LinkerFlavor::Unix(__self_0), LinkerFlavor::Unix(__arg1_0))
=> __self_0 == __arg1_0,
(LinkerFlavor::Msvc(__self_0), LinkerFlavor::Msvc(__arg1_0))
=> __self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::PartialOrd for LinkerFlavor {
#[inline]
fn partial_cmp(&self, other: &LinkerFlavor)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
match (self, other) {
(LinkerFlavor::Gnu(__self_0, __self_1),
LinkerFlavor::Gnu(__arg1_0, __arg1_1)) =>
match ::core::cmp::PartialOrd::partial_cmp(__self_0, __arg1_0)
{
::core::option::Option::Some(::core::cmp::Ordering::Equal)
=> ::core::cmp::PartialOrd::partial_cmp(__self_1, __arg1_1),
cmp => cmp,
},
(LinkerFlavor::Darwin(__self_0, __self_1),
LinkerFlavor::Darwin(__arg1_0, __arg1_1)) =>
match ::core::cmp::PartialOrd::partial_cmp(__self_0, __arg1_0)
{
::core::option::Option::Some(::core::cmp::Ordering::Equal)
=> ::core::cmp::PartialOrd::partial_cmp(__self_1, __arg1_1),
cmp => cmp,
},
(LinkerFlavor::WasmLld(__self_0), LinkerFlavor::WasmLld(__arg1_0))
=> ::core::cmp::PartialOrd::partial_cmp(__self_0, __arg1_0),
(LinkerFlavor::Unix(__self_0), LinkerFlavor::Unix(__arg1_0)) =>
::core::cmp::PartialOrd::partial_cmp(__self_0, __arg1_0),
(LinkerFlavor::Msvc(__self_0), LinkerFlavor::Msvc(__arg1_0)) =>
::core::cmp::PartialOrd::partial_cmp(__self_0, __arg1_0),
_ =>
::core::cmp::PartialOrd::partial_cmp(&__self_discr,
&__arg1_discr),
}
}
}PartialOrd)]
110pub enum LinkerFlavor {
111 Gnu(Cc, Lld),
115 Darwin(Cc, Lld),
118 WasmLld(Cc),
122 Unix(Cc),
126 Msvc(Lld),
128 EmCc,
131 Bpf,
134 Ptx,
136 Llbc,
138}
139
140#[derive(#[automatically_derived]
impl ::core::clone::Clone for LinkerFlavorCli {
#[inline]
fn clone(&self) -> LinkerFlavorCli {
let _: ::core::clone::AssertParamIsClone<Cc>;
let _: ::core::clone::AssertParamIsClone<Lld>;
let _: ::core::clone::AssertParamIsClone<LldFlavor>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for LinkerFlavorCli { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for LinkerFlavorCli {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
LinkerFlavorCli::Gnu(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Gnu",
__self_0, &__self_1),
LinkerFlavorCli::Darwin(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Darwin",
__self_0, &__self_1),
LinkerFlavorCli::WasmLld(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"WasmLld", &__self_0),
LinkerFlavorCli::Unix(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Unix",
&__self_0),
LinkerFlavorCli::Msvc(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Msvc",
&__self_0),
LinkerFlavorCli::EmCc =>
::core::fmt::Formatter::write_str(f, "EmCc"),
LinkerFlavorCli::Bpf =>
::core::fmt::Formatter::write_str(f, "Bpf"),
LinkerFlavorCli::Ptx =>
::core::fmt::Formatter::write_str(f, "Ptx"),
LinkerFlavorCli::Llbc =>
::core::fmt::Formatter::write_str(f, "Llbc"),
LinkerFlavorCli::Gcc =>
::core::fmt::Formatter::write_str(f, "Gcc"),
LinkerFlavorCli::Ld => ::core::fmt::Formatter::write_str(f, "Ld"),
LinkerFlavorCli::Lld(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Lld",
&__self_0),
LinkerFlavorCli::Em => ::core::fmt::Formatter::write_str(f, "Em"),
}
}
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for LinkerFlavorCli {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) -> () {
let _: ::core::cmp::AssertParamIsEq<Cc>;
let _: ::core::cmp::AssertParamIsEq<Lld>;
let _: ::core::cmp::AssertParamIsEq<LldFlavor>;
}
}Eq, #[automatically_derived]
impl ::core::cmp::Ord for LinkerFlavorCli {
#[inline]
fn cmp(&self, other: &LinkerFlavorCli) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
match ::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr) {
::core::cmp::Ordering::Equal =>
match (self, other) {
(LinkerFlavorCli::Gnu(__self_0, __self_1),
LinkerFlavorCli::Gnu(__arg1_0, __arg1_1)) =>
match ::core::cmp::Ord::cmp(__self_0, __arg1_0) {
::core::cmp::Ordering::Equal =>
::core::cmp::Ord::cmp(__self_1, __arg1_1),
cmp => cmp,
},
(LinkerFlavorCli::Darwin(__self_0, __self_1),
LinkerFlavorCli::Darwin(__arg1_0, __arg1_1)) =>
match ::core::cmp::Ord::cmp(__self_0, __arg1_0) {
::core::cmp::Ordering::Equal =>
::core::cmp::Ord::cmp(__self_1, __arg1_1),
cmp => cmp,
},
(LinkerFlavorCli::WasmLld(__self_0),
LinkerFlavorCli::WasmLld(__arg1_0)) =>
::core::cmp::Ord::cmp(__self_0, __arg1_0),
(LinkerFlavorCli::Unix(__self_0),
LinkerFlavorCli::Unix(__arg1_0)) =>
::core::cmp::Ord::cmp(__self_0, __arg1_0),
(LinkerFlavorCli::Msvc(__self_0),
LinkerFlavorCli::Msvc(__arg1_0)) =>
::core::cmp::Ord::cmp(__self_0, __arg1_0),
(LinkerFlavorCli::Lld(__self_0),
LinkerFlavorCli::Lld(__arg1_0)) =>
::core::cmp::Ord::cmp(__self_0, __arg1_0),
_ => ::core::cmp::Ordering::Equal,
},
cmp => cmp,
}
}
}Ord, #[automatically_derived]
impl ::core::cmp::PartialEq for LinkerFlavorCli {
#[inline]
fn eq(&self, other: &LinkerFlavorCli) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(LinkerFlavorCli::Gnu(__self_0, __self_1),
LinkerFlavorCli::Gnu(__arg1_0, __arg1_1)) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1,
(LinkerFlavorCli::Darwin(__self_0, __self_1),
LinkerFlavorCli::Darwin(__arg1_0, __arg1_1)) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1,
(LinkerFlavorCli::WasmLld(__self_0),
LinkerFlavorCli::WasmLld(__arg1_0)) => __self_0 == __arg1_0,
(LinkerFlavorCli::Unix(__self_0),
LinkerFlavorCli::Unix(__arg1_0)) => __self_0 == __arg1_0,
(LinkerFlavorCli::Msvc(__self_0),
LinkerFlavorCli::Msvc(__arg1_0)) => __self_0 == __arg1_0,
(LinkerFlavorCli::Lld(__self_0),
LinkerFlavorCli::Lld(__arg1_0)) => __self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::PartialOrd for LinkerFlavorCli {
#[inline]
fn partial_cmp(&self, other: &LinkerFlavorCli)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
match ::core::cmp::PartialOrd::partial_cmp(&__self_discr,
&__arg1_discr) {
::core::option::Option::Some(::core::cmp::Ordering::Equal) =>
match (self, other) {
(LinkerFlavorCli::Gnu(__self_0, __self_1),
LinkerFlavorCli::Gnu(__arg1_0, __arg1_1)) =>
match ::core::cmp::PartialOrd::partial_cmp(__self_0,
__arg1_0) {
::core::option::Option::Some(::core::cmp::Ordering::Equal)
=> ::core::cmp::PartialOrd::partial_cmp(__self_1, __arg1_1),
cmp => cmp,
},
(LinkerFlavorCli::Darwin(__self_0, __self_1),
LinkerFlavorCli::Darwin(__arg1_0, __arg1_1)) =>
match ::core::cmp::PartialOrd::partial_cmp(__self_0,
__arg1_0) {
::core::option::Option::Some(::core::cmp::Ordering::Equal)
=> ::core::cmp::PartialOrd::partial_cmp(__self_1, __arg1_1),
cmp => cmp,
},
(LinkerFlavorCli::WasmLld(__self_0),
LinkerFlavorCli::WasmLld(__arg1_0)) =>
::core::cmp::PartialOrd::partial_cmp(__self_0, __arg1_0),
(LinkerFlavorCli::Unix(__self_0),
LinkerFlavorCli::Unix(__arg1_0)) =>
::core::cmp::PartialOrd::partial_cmp(__self_0, __arg1_0),
(LinkerFlavorCli::Msvc(__self_0),
LinkerFlavorCli::Msvc(__arg1_0)) =>
::core::cmp::PartialOrd::partial_cmp(__self_0, __arg1_0),
(LinkerFlavorCli::Lld(__self_0),
LinkerFlavorCli::Lld(__arg1_0)) =>
::core::cmp::PartialOrd::partial_cmp(__self_0, __arg1_0),
_ =>
::core::option::Option::Some(::core::cmp::Ordering::Equal),
},
cmp => cmp,
}
}
}PartialOrd)]
145pub enum LinkerFlavorCli {
146 Gnu(Cc, Lld),
148 Darwin(Cc, Lld),
149 WasmLld(Cc),
150 Unix(Cc),
151 Msvc(Lld),
153 EmCc,
154 Bpf,
155 Ptx,
156 Llbc,
157
158 Gcc,
160 Ld,
161 Lld(LldFlavor),
162 Em,
163}
164
165impl LinkerFlavorCli {
166 pub fn is_unstable(&self) -> bool {
168 match self {
169 LinkerFlavorCli::Gnu(..)
170 | LinkerFlavorCli::Darwin(..)
171 | LinkerFlavorCli::WasmLld(..)
172 | LinkerFlavorCli::Unix(..)
173 | LinkerFlavorCli::Msvc(Lld::Yes)
174 | LinkerFlavorCli::EmCc
175 | LinkerFlavorCli::Bpf
176 | LinkerFlavorCli::Llbc
177 | LinkerFlavorCli::Ptx => true,
178 LinkerFlavorCli::Gcc
179 | LinkerFlavorCli::Ld
180 | LinkerFlavorCli::Lld(..)
181 | LinkerFlavorCli::Msvc(Lld::No)
182 | LinkerFlavorCli::Em => false,
183 }
184 }
185}
186
187#[automatically_derived]
impl ::core::clone::Clone for LldFlavor {
#[inline]
fn clone(&self) -> LldFlavor { *self }
}
#[automatically_derived]
impl ::core::marker::Copy for LldFlavor { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for LldFlavor { }
#[automatically_derived]
impl ::core::cmp::PartialEq for LldFlavor {
#[inline]
fn eq(&self, other: &LldFlavor) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}
#[automatically_derived]
impl ::core::cmp::Eq for LldFlavor {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) -> () {}
}
#[automatically_derived]
impl ::core::hash::Hash for LldFlavor {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}
#[automatically_derived]
impl ::core::fmt::Debug for LldFlavor {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
LldFlavor::Wasm => "Wasm",
LldFlavor::Ld64 => "Ld64",
LldFlavor::Ld => "Ld",
LldFlavor::Link => "Link",
})
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for LldFlavor {
#[inline]
fn partial_cmp(&self, other: &LldFlavor)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::PartialOrd::partial_cmp(&__self_discr, &__arg1_discr)
}
}
#[automatically_derived]
impl ::core::cmp::Ord for LldFlavor {
#[inline]
fn cmp(&self, other: &LldFlavor) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr)
}
}
impl FromStr for LldFlavor {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"wasm" => Self::Wasm,
"darwin" => Self::Ld64,
"gnu" => Self::Ld,
"link" => Self::Link,
_ => {
let all =
["\'wasm\'", "\'darwin\'", "\'gnu\'",
"\'link\'"].join(", ");
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid {0}: \'{1}\'. allowed values: {2}",
"LLD flavor", s, all))
}));
}
})
}
}
impl LldFlavor {
pub const ALL: &'static [LldFlavor] =
&[LldFlavor::Wasm, LldFlavor::Ld64, LldFlavor::Ld, LldFlavor::Link];
pub fn desc(&self) -> &'static str {
match self {
Self::Wasm => "wasm",
Self::Ld64 => "darwin",
Self::Ld => "gnu",
Self::Link => "link",
}
}
}
impl crate::json::ToJson for LldFlavor {
fn to_json(&self) -> crate::json::Json { self.desc().to_json() }
}
impl<'de> serde::Deserialize<'de> for LldFlavor {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}
impl std::fmt::Display for LldFlavor {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.desc())
}
}crate::target_spec_enum! {
188 pub enum LldFlavor {
189 Wasm = "wasm",
190 Ld64 = "darwin",
191 Ld = "gnu",
192 Link = "link",
193 }
194
195 parse_error_type = "LLD flavor";
196}
197
198impl LinkerFlavor {
199 fn from_cli_json(cli: LinkerFlavorCli, lld_flavor: LldFlavor, is_gnu: bool) -> LinkerFlavor {
204 match cli {
205 LinkerFlavorCli::Gnu(cc, lld) => LinkerFlavor::Gnu(cc, lld),
206 LinkerFlavorCli::Darwin(cc, lld) => LinkerFlavor::Darwin(cc, lld),
207 LinkerFlavorCli::WasmLld(cc) => LinkerFlavor::WasmLld(cc),
208 LinkerFlavorCli::Unix(cc) => LinkerFlavor::Unix(cc),
209 LinkerFlavorCli::Msvc(lld) => LinkerFlavor::Msvc(lld),
210 LinkerFlavorCli::EmCc => LinkerFlavor::EmCc,
211 LinkerFlavorCli::Bpf => LinkerFlavor::Bpf,
212 LinkerFlavorCli::Llbc => LinkerFlavor::Llbc,
213 LinkerFlavorCli::Ptx => LinkerFlavor::Ptx,
214
215 LinkerFlavorCli::Gcc => match lld_flavor {
217 LldFlavor::Ld if is_gnu => LinkerFlavor::Gnu(Cc::Yes, Lld::No),
218 LldFlavor::Ld64 => LinkerFlavor::Darwin(Cc::Yes, Lld::No),
219 LldFlavor::Wasm => LinkerFlavor::WasmLld(Cc::Yes),
220 LldFlavor::Ld | LldFlavor::Link => LinkerFlavor::Unix(Cc::Yes),
221 },
222 LinkerFlavorCli::Ld => match lld_flavor {
223 LldFlavor::Ld if is_gnu => LinkerFlavor::Gnu(Cc::No, Lld::No),
224 LldFlavor::Ld64 => LinkerFlavor::Darwin(Cc::No, Lld::No),
225 LldFlavor::Ld | LldFlavor::Wasm | LldFlavor::Link => LinkerFlavor::Unix(Cc::No),
226 },
227 LinkerFlavorCli::Lld(LldFlavor::Ld) => LinkerFlavor::Gnu(Cc::No, Lld::Yes),
228 LinkerFlavorCli::Lld(LldFlavor::Ld64) => LinkerFlavor::Darwin(Cc::No, Lld::Yes),
229 LinkerFlavorCli::Lld(LldFlavor::Wasm) => LinkerFlavor::WasmLld(Cc::No),
230 LinkerFlavorCli::Lld(LldFlavor::Link) => LinkerFlavor::Msvc(Lld::Yes),
231 LinkerFlavorCli::Em => LinkerFlavor::EmCc,
232 }
233 }
234
235 fn to_cli(self) -> LinkerFlavorCli {
237 match self {
238 LinkerFlavor::Gnu(Cc::Yes, _)
239 | LinkerFlavor::Darwin(Cc::Yes, _)
240 | LinkerFlavor::WasmLld(Cc::Yes)
241 | LinkerFlavor::Unix(Cc::Yes) => LinkerFlavorCli::Gcc,
242 LinkerFlavor::Gnu(_, Lld::Yes) => LinkerFlavorCli::Lld(LldFlavor::Ld),
243 LinkerFlavor::Darwin(_, Lld::Yes) => LinkerFlavorCli::Lld(LldFlavor::Ld64),
244 LinkerFlavor::WasmLld(..) => LinkerFlavorCli::Lld(LldFlavor::Wasm),
245 LinkerFlavor::Gnu(..) | LinkerFlavor::Darwin(..) | LinkerFlavor::Unix(..) => {
246 LinkerFlavorCli::Ld
247 }
248 LinkerFlavor::Msvc(Lld::Yes) => LinkerFlavorCli::Lld(LldFlavor::Link),
249 LinkerFlavor::Msvc(..) => LinkerFlavorCli::Msvc(Lld::No),
250 LinkerFlavor::EmCc => LinkerFlavorCli::Em,
251 LinkerFlavor::Bpf => LinkerFlavorCli::Bpf,
252 LinkerFlavor::Llbc => LinkerFlavorCli::Llbc,
253 LinkerFlavor::Ptx => LinkerFlavorCli::Ptx,
254 }
255 }
256
257 fn to_cli_counterpart(self) -> LinkerFlavorCli {
259 match self {
260 LinkerFlavor::Gnu(cc, lld) => LinkerFlavorCli::Gnu(cc, lld),
261 LinkerFlavor::Darwin(cc, lld) => LinkerFlavorCli::Darwin(cc, lld),
262 LinkerFlavor::WasmLld(cc) => LinkerFlavorCli::WasmLld(cc),
263 LinkerFlavor::Unix(cc) => LinkerFlavorCli::Unix(cc),
264 LinkerFlavor::Msvc(lld) => LinkerFlavorCli::Msvc(lld),
265 LinkerFlavor::EmCc => LinkerFlavorCli::EmCc,
266 LinkerFlavor::Bpf => LinkerFlavorCli::Bpf,
267 LinkerFlavor::Llbc => LinkerFlavorCli::Llbc,
268 LinkerFlavor::Ptx => LinkerFlavorCli::Ptx,
269 }
270 }
271
272 fn infer_cli_hints(cli: LinkerFlavorCli) -> (Option<Cc>, Option<Lld>) {
273 match cli {
274 LinkerFlavorCli::Gnu(cc, lld) | LinkerFlavorCli::Darwin(cc, lld) => {
275 (Some(cc), Some(lld))
276 }
277 LinkerFlavorCli::WasmLld(cc) => (Some(cc), Some(Lld::Yes)),
278 LinkerFlavorCli::Unix(cc) => (Some(cc), None),
279 LinkerFlavorCli::Msvc(lld) => (Some(Cc::No), Some(lld)),
280 LinkerFlavorCli::EmCc => (Some(Cc::Yes), Some(Lld::Yes)),
281 LinkerFlavorCli::Bpf | LinkerFlavorCli::Ptx => (None, None),
282 LinkerFlavorCli::Llbc => (None, None),
283
284 LinkerFlavorCli::Gcc => (Some(Cc::Yes), None),
286 LinkerFlavorCli::Ld => (Some(Cc::No), Some(Lld::No)),
287 LinkerFlavorCli::Lld(_) => (Some(Cc::No), Some(Lld::Yes)),
288 LinkerFlavorCli::Em => (Some(Cc::Yes), Some(Lld::Yes)),
289 }
290 }
291
292 fn infer_linker_hints(linker_stem: &str) -> Result<Self, (Option<Cc>, Option<Lld>)> {
293 let stem = linker_stem
295 .rsplit_once('-')
296 .and_then(|(lhs, rhs)| rhs.chars().all(char::is_numeric).then_some(lhs))
297 .unwrap_or(linker_stem);
298
299 if stem == "llvm-bitcode-linker" {
300 Ok(Self::Llbc)
301 } else if stem == "emcc" || stem == "gcc"
303 || stem.ends_with("-gcc")
304 || stem == "g++"
305 || stem.ends_with("-g++")
306 || stem == "clang"
307 || stem.ends_with("-clang")
308 || stem == "clang++"
309 || stem.ends_with("-clang++")
310 {
311 Err((Some(Cc::Yes), Some(Lld::No)))
312 } else if stem == "wasm-ld"
313 || stem.ends_with("-wasm-ld")
314 || stem == "ld.lld"
315 || stem == "lld"
316 || stem == "rust-lld"
317 || stem == "lld-link"
318 {
319 Err((Some(Cc::No), Some(Lld::Yes)))
320 } else if stem == "ld" || stem.ends_with("-ld") || stem == "link" {
321 Err((Some(Cc::No), Some(Lld::No)))
322 } else {
323 Err((None, None))
324 }
325 }
326
327 fn with_hints(self, (cc_hint, lld_hint): (Option<Cc>, Option<Lld>)) -> LinkerFlavor {
328 match self {
329 LinkerFlavor::Gnu(cc, lld) => {
330 LinkerFlavor::Gnu(cc_hint.unwrap_or(cc), lld_hint.unwrap_or(lld))
331 }
332 LinkerFlavor::Darwin(cc, lld) => {
333 LinkerFlavor::Darwin(cc_hint.unwrap_or(cc), lld_hint.unwrap_or(lld))
334 }
335 LinkerFlavor::WasmLld(cc) => LinkerFlavor::WasmLld(cc_hint.unwrap_or(cc)),
336 LinkerFlavor::Unix(cc) => LinkerFlavor::Unix(cc_hint.unwrap_or(cc)),
337 LinkerFlavor::Msvc(lld) => LinkerFlavor::Msvc(lld_hint.unwrap_or(lld)),
338 LinkerFlavor::EmCc | LinkerFlavor::Bpf | LinkerFlavor::Llbc | LinkerFlavor::Ptx => self,
339 }
340 }
341
342 pub fn with_cli_hints(self, cli: LinkerFlavorCli) -> LinkerFlavor {
343 self.with_hints(LinkerFlavor::infer_cli_hints(cli))
344 }
345
346 pub fn with_linker_hints(self, linker_stem: &str) -> LinkerFlavor {
347 match LinkerFlavor::infer_linker_hints(linker_stem) {
348 Ok(linker_flavor) => linker_flavor,
349 Err(hints) => self.with_hints(hints),
350 }
351 }
352
353 pub fn check_compatibility(self, cli: LinkerFlavorCli) -> Option<String> {
354 let compatible = |cli| {
355 match (self, cli) {
357 (LinkerFlavor::Gnu(..), LinkerFlavorCli::Gnu(..))
359 | (LinkerFlavor::Darwin(..), LinkerFlavorCli::Darwin(..))
360 | (LinkerFlavor::WasmLld(..), LinkerFlavorCli::WasmLld(..))
361 | (LinkerFlavor::Unix(..), LinkerFlavorCli::Unix(..))
362 | (LinkerFlavor::Msvc(..), LinkerFlavorCli::Msvc(..))
363 | (LinkerFlavor::EmCc, LinkerFlavorCli::EmCc)
364 | (LinkerFlavor::Bpf, LinkerFlavorCli::Bpf)
365 | (LinkerFlavor::Llbc, LinkerFlavorCli::Llbc)
366 | (LinkerFlavor::Ptx, LinkerFlavorCli::Ptx) => return true,
367 (LinkerFlavor::Ptx, LinkerFlavorCli::Llbc) => return true,
369 _ => {}
370 }
371
372 cli == self.with_cli_hints(cli).to_cli()
374 };
375 (!compatible(cli)).then(|| {
376 LinkerFlavorCli::all()
377 .iter()
378 .filter(|cli| compatible(**cli))
379 .map(|cli| cli.desc())
380 .intersperse(", ")
381 .collect()
382 })
383 }
384
385 pub fn lld_flavor(self) -> LldFlavor {
386 match self {
387 LinkerFlavor::Gnu(..)
388 | LinkerFlavor::Unix(..)
389 | LinkerFlavor::EmCc
390 | LinkerFlavor::Bpf
391 | LinkerFlavor::Llbc
392 | LinkerFlavor::Ptx => LldFlavor::Ld,
393 LinkerFlavor::Darwin(..) => LldFlavor::Ld64,
394 LinkerFlavor::WasmLld(..) => LldFlavor::Wasm,
395 LinkerFlavor::Msvc(..) => LldFlavor::Link,
396 }
397 }
398
399 pub fn is_gnu(self) -> bool {
400 #[allow(non_exhaustive_omitted_patterns)] match self {
LinkerFlavor::Gnu(..) => true,
_ => false,
}matches!(self, LinkerFlavor::Gnu(..))
401 }
402
403 pub fn uses_lld(self) -> bool {
405 match self {
407 LinkerFlavor::Gnu(_, Lld::Yes)
408 | LinkerFlavor::Darwin(_, Lld::Yes)
409 | LinkerFlavor::WasmLld(..)
410 | LinkerFlavor::EmCc
411 | LinkerFlavor::Msvc(Lld::Yes) => true,
412 LinkerFlavor::Gnu(..)
413 | LinkerFlavor::Darwin(..)
414 | LinkerFlavor::Msvc(_)
415 | LinkerFlavor::Unix(_)
416 | LinkerFlavor::Bpf
417 | LinkerFlavor::Llbc
418 | LinkerFlavor::Ptx => false,
419 }
420 }
421
422 pub fn uses_cc(self) -> bool {
424 match self {
426 LinkerFlavor::Gnu(Cc::Yes, _)
427 | LinkerFlavor::Darwin(Cc::Yes, _)
428 | LinkerFlavor::WasmLld(Cc::Yes)
429 | LinkerFlavor::Unix(Cc::Yes)
430 | LinkerFlavor::EmCc => true,
431 LinkerFlavor::Gnu(..)
432 | LinkerFlavor::Darwin(..)
433 | LinkerFlavor::WasmLld(_)
434 | LinkerFlavor::Msvc(_)
435 | LinkerFlavor::Unix(_)
436 | LinkerFlavor::Bpf
437 | LinkerFlavor::Llbc
438 | LinkerFlavor::Ptx => false,
439 }
440 }
441
442 pub fn with_lld_enabled(self) -> LinkerFlavor {
445 match self {
446 LinkerFlavor::Gnu(cc, Lld::No) => LinkerFlavor::Gnu(cc, Lld::Yes),
447 LinkerFlavor::Darwin(cc, Lld::No) => LinkerFlavor::Darwin(cc, Lld::Yes),
448 LinkerFlavor::Msvc(Lld::No) => LinkerFlavor::Msvc(Lld::Yes),
449 _ => self,
450 }
451 }
452
453 pub fn with_lld_disabled(self) -> LinkerFlavor {
456 match self {
457 LinkerFlavor::Gnu(cc, Lld::Yes) => LinkerFlavor::Gnu(cc, Lld::No),
458 LinkerFlavor::Darwin(cc, Lld::Yes) => LinkerFlavor::Darwin(cc, Lld::No),
459 LinkerFlavor::Msvc(Lld::Yes) => LinkerFlavor::Msvc(Lld::No),
460 _ => self,
461 }
462 }
463}
464
465macro_rules! linker_flavor_cli_impls {
466 ($(($($flavor:tt)*) $string:literal)*) => (
467 impl LinkerFlavorCli {
468 const fn all() -> &'static [LinkerFlavorCli] {
469 &[$($($flavor)*,)*]
470 }
471
472 pub const fn one_of() -> &'static str {
473 concat!("one of: ", $($string, " ",)*)
474 }
475
476 pub fn desc(self) -> &'static str {
477 match self {
478 $($($flavor)* => $string,)*
479 }
480 }
481 }
482
483 impl FromStr for LinkerFlavorCli {
484 type Err = String;
485
486 fn from_str(s: &str) -> Result<LinkerFlavorCli, Self::Err> {
487 Ok(match s {
488 $($string => $($flavor)*,)*
489 _ => return Err(format!("invalid linker flavor, allowed values: {}", Self::one_of())),
490 })
491 }
492 }
493 )
494}
495
496impl LinkerFlavorCli {
const fn all() -> &'static [LinkerFlavorCli] {
&[LinkerFlavorCli::Gnu(Cc::No, Lld::No),
LinkerFlavorCli::Gnu(Cc::No, Lld::Yes),
LinkerFlavorCli::Gnu(Cc::Yes, Lld::No),
LinkerFlavorCli::Gnu(Cc::Yes, Lld::Yes),
LinkerFlavorCli::Darwin(Cc::No, Lld::No),
LinkerFlavorCli::Darwin(Cc::No, Lld::Yes),
LinkerFlavorCli::Darwin(Cc::Yes, Lld::No),
LinkerFlavorCli::Darwin(Cc::Yes, Lld::Yes),
LinkerFlavorCli::WasmLld(Cc::No),
LinkerFlavorCli::WasmLld(Cc::Yes),
LinkerFlavorCli::Unix(Cc::No),
LinkerFlavorCli::Unix(Cc::Yes),
LinkerFlavorCli::Msvc(Lld::Yes),
LinkerFlavorCli::Msvc(Lld::No), LinkerFlavorCli::EmCc,
LinkerFlavorCli::Bpf, LinkerFlavorCli::Llbc,
LinkerFlavorCli::Ptx, LinkerFlavorCli::Gcc,
LinkerFlavorCli::Ld, LinkerFlavorCli::Lld(LldFlavor::Ld),
LinkerFlavorCli::Lld(LldFlavor::Ld64),
LinkerFlavorCli::Lld(LldFlavor::Link),
LinkerFlavorCli::Lld(LldFlavor::Wasm), LinkerFlavorCli::Em]
}
pub const fn one_of() -> &'static str {
"one of: gnu gnu-lld gnu-cc gnu-lld-cc darwin darwin-lld darwin-cc darwin-lld-cc wasm-lld wasm-lld-cc unix unix-cc msvc-lld msvc em-cc bpf llbc ptx gcc ld ld.lld ld64.lld lld-link wasm-ld em "
}
pub fn desc(self) -> &'static str {
match self {
LinkerFlavorCli::Gnu(Cc::No, Lld::No) => "gnu",
LinkerFlavorCli::Gnu(Cc::No, Lld::Yes) => "gnu-lld",
LinkerFlavorCli::Gnu(Cc::Yes, Lld::No) => "gnu-cc",
LinkerFlavorCli::Gnu(Cc::Yes, Lld::Yes) => "gnu-lld-cc",
LinkerFlavorCli::Darwin(Cc::No, Lld::No) => "darwin",
LinkerFlavorCli::Darwin(Cc::No, Lld::Yes) => "darwin-lld",
LinkerFlavorCli::Darwin(Cc::Yes, Lld::No) => "darwin-cc",
LinkerFlavorCli::Darwin(Cc::Yes, Lld::Yes) => "darwin-lld-cc",
LinkerFlavorCli::WasmLld(Cc::No) => "wasm-lld",
LinkerFlavorCli::WasmLld(Cc::Yes) => "wasm-lld-cc",
LinkerFlavorCli::Unix(Cc::No) => "unix",
LinkerFlavorCli::Unix(Cc::Yes) => "unix-cc",
LinkerFlavorCli::Msvc(Lld::Yes) => "msvc-lld",
LinkerFlavorCli::Msvc(Lld::No) => "msvc",
LinkerFlavorCli::EmCc => "em-cc",
LinkerFlavorCli::Bpf => "bpf",
LinkerFlavorCli::Llbc => "llbc",
LinkerFlavorCli::Ptx => "ptx",
LinkerFlavorCli::Gcc => "gcc",
LinkerFlavorCli::Ld => "ld",
LinkerFlavorCli::Lld(LldFlavor::Ld) => "ld.lld",
LinkerFlavorCli::Lld(LldFlavor::Ld64) => "ld64.lld",
LinkerFlavorCli::Lld(LldFlavor::Link) => "lld-link",
LinkerFlavorCli::Lld(LldFlavor::Wasm) => "wasm-ld",
LinkerFlavorCli::Em => "em",
}
}
}
impl FromStr for LinkerFlavorCli {
type Err = String;
fn from_str(s: &str) -> Result<LinkerFlavorCli, Self::Err> {
Ok(match s {
"gnu" => LinkerFlavorCli::Gnu(Cc::No, Lld::No),
"gnu-lld" => LinkerFlavorCli::Gnu(Cc::No, Lld::Yes),
"gnu-cc" => LinkerFlavorCli::Gnu(Cc::Yes, Lld::No),
"gnu-lld-cc" => LinkerFlavorCli::Gnu(Cc::Yes, Lld::Yes),
"darwin" => LinkerFlavorCli::Darwin(Cc::No, Lld::No),
"darwin-lld" => LinkerFlavorCli::Darwin(Cc::No, Lld::Yes),
"darwin-cc" => LinkerFlavorCli::Darwin(Cc::Yes, Lld::No),
"darwin-lld-cc" => LinkerFlavorCli::Darwin(Cc::Yes, Lld::Yes),
"wasm-lld" => LinkerFlavorCli::WasmLld(Cc::No),
"wasm-lld-cc" => LinkerFlavorCli::WasmLld(Cc::Yes),
"unix" => LinkerFlavorCli::Unix(Cc::No),
"unix-cc" => LinkerFlavorCli::Unix(Cc::Yes),
"msvc-lld" => LinkerFlavorCli::Msvc(Lld::Yes),
"msvc" => LinkerFlavorCli::Msvc(Lld::No),
"em-cc" => LinkerFlavorCli::EmCc,
"bpf" => LinkerFlavorCli::Bpf,
"llbc" => LinkerFlavorCli::Llbc,
"ptx" => LinkerFlavorCli::Ptx,
"gcc" => LinkerFlavorCli::Gcc,
"ld" => LinkerFlavorCli::Ld,
"ld.lld" => LinkerFlavorCli::Lld(LldFlavor::Ld),
"ld64.lld" => LinkerFlavorCli::Lld(LldFlavor::Ld64),
"lld-link" => LinkerFlavorCli::Lld(LldFlavor::Link),
"wasm-ld" => LinkerFlavorCli::Lld(LldFlavor::Wasm),
"em" => LinkerFlavorCli::Em,
_ =>
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid linker flavor, allowed values: {0}",
Self::one_of()))
})),
})
}
}linker_flavor_cli_impls! {
497 (LinkerFlavorCli::Gnu(Cc::No, Lld::No)) "gnu"
498 (LinkerFlavorCli::Gnu(Cc::No, Lld::Yes)) "gnu-lld"
499 (LinkerFlavorCli::Gnu(Cc::Yes, Lld::No)) "gnu-cc"
500 (LinkerFlavorCli::Gnu(Cc::Yes, Lld::Yes)) "gnu-lld-cc"
501 (LinkerFlavorCli::Darwin(Cc::No, Lld::No)) "darwin"
502 (LinkerFlavorCli::Darwin(Cc::No, Lld::Yes)) "darwin-lld"
503 (LinkerFlavorCli::Darwin(Cc::Yes, Lld::No)) "darwin-cc"
504 (LinkerFlavorCli::Darwin(Cc::Yes, Lld::Yes)) "darwin-lld-cc"
505 (LinkerFlavorCli::WasmLld(Cc::No)) "wasm-lld"
506 (LinkerFlavorCli::WasmLld(Cc::Yes)) "wasm-lld-cc"
507 (LinkerFlavorCli::Unix(Cc::No)) "unix"
508 (LinkerFlavorCli::Unix(Cc::Yes)) "unix-cc"
509 (LinkerFlavorCli::Msvc(Lld::Yes)) "msvc-lld"
510 (LinkerFlavorCli::Msvc(Lld::No)) "msvc"
511 (LinkerFlavorCli::EmCc) "em-cc"
512 (LinkerFlavorCli::Bpf) "bpf"
513 (LinkerFlavorCli::Llbc) "llbc"
514 (LinkerFlavorCli::Ptx) "ptx"
515
516 (LinkerFlavorCli::Gcc) "gcc"
518 (LinkerFlavorCli::Ld) "ld"
519 (LinkerFlavorCli::Lld(LldFlavor::Ld)) "ld.lld"
520 (LinkerFlavorCli::Lld(LldFlavor::Ld64)) "ld64.lld"
521 (LinkerFlavorCli::Lld(LldFlavor::Link)) "lld-link"
522 (LinkerFlavorCli::Lld(LldFlavor::Wasm)) "wasm-ld"
523 (LinkerFlavorCli::Em) "em"
524}
525
526impl<'de> serde::Deserialize<'de> for LinkerFlavorCli {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}crate::json::serde_deserialize_from_str!(LinkerFlavorCli);
527impl schemars::JsonSchema for LinkerFlavorCli {
528 fn schema_name() -> std::borrow::Cow<'static, str> {
529 "LinkerFlavor".into()
530 }
531 fn json_schema(_: &mut schemars::SchemaGenerator) -> schemars::Schema {
532 let all: Vec<&'static str> =
533 Self::all().iter().map(|flavor| flavor.desc()).collect::<Vec<_>>();
534 <::schemars::Schema as
::core::convert::TryFrom<_>>::try_from(::serde_json::Value::Object({
let mut object = ::serde_json::Map::new();
let _ =
object.insert(("type").into(),
::serde_json::to_value(&"string").unwrap());
let _ =
object.insert(("enum").into(),
::serde_json::to_value(&all).unwrap());
object
})).unwrap()schemars::json_schema! ({
535 "type": "string",
536 "enum": all
537 })
538 .into()
539 }
540}
541
542impl ToJson for LinkerFlavorCli {
543 fn to_json(&self) -> Json {
544 self.desc().to_json()
545 }
546}
547
548#[derive(#[automatically_derived]
impl ::core::clone::Clone for LinkSelfContainedDefault {
#[inline]
fn clone(&self) -> LinkSelfContainedDefault {
let _: ::core::clone::AssertParamIsClone<LinkSelfContainedComponents>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for LinkSelfContainedDefault { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for LinkSelfContainedDefault {
#[inline]
fn eq(&self, other: &LinkSelfContainedDefault) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(LinkSelfContainedDefault::WithComponents(__self_0),
LinkSelfContainedDefault::WithComponents(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::fmt::Debug for LinkSelfContainedDefault {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
LinkSelfContainedDefault::True =>
::core::fmt::Formatter::write_str(f, "True"),
LinkSelfContainedDefault::False =>
::core::fmt::Formatter::write_str(f, "False"),
LinkSelfContainedDefault::InferredForMusl =>
::core::fmt::Formatter::write_str(f, "InferredForMusl"),
LinkSelfContainedDefault::InferredForMingw =>
::core::fmt::Formatter::write_str(f, "InferredForMingw"),
LinkSelfContainedDefault::WithComponents(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"WithComponents", &__self_0),
}
}
}Debug)]
555pub enum LinkSelfContainedDefault {
556 True,
558
559 False,
561
562 InferredForMusl,
564
565 InferredForMingw,
567
568 WithComponents(LinkSelfContainedComponents),
571}
572
573impl FromStr for LinkSelfContainedDefault {
575 type Err = String;
576
577 fn from_str(s: &str) -> Result<LinkSelfContainedDefault, Self::Err> {
578 Ok(match s {
579 "false" => LinkSelfContainedDefault::False,
580 "true" | "wasm" => LinkSelfContainedDefault::True,
581 "musl" => LinkSelfContainedDefault::InferredForMusl,
582 "mingw" => LinkSelfContainedDefault::InferredForMingw,
583 _ => {
584 return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("\'{0}\' is not a valid `-Clink-self-contained` default. Use \'false\', \'true\', \'wasm\', \'musl\' or \'mingw\'",
s))
})format!(
585 "'{s}' is not a valid `-Clink-self-contained` default. \
586 Use 'false', 'true', 'wasm', 'musl' or 'mingw'",
587 ));
588 }
589 })
590 }
591}
592
593impl<'de> serde::Deserialize<'de> for LinkSelfContainedDefault {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}crate::json::serde_deserialize_from_str!(LinkSelfContainedDefault);
594impl schemars::JsonSchema for LinkSelfContainedDefault {
595 fn schema_name() -> std::borrow::Cow<'static, str> {
596 "LinkSelfContainedDefault".into()
597 }
598 fn json_schema(_: &mut schemars::SchemaGenerator) -> schemars::Schema {
599 <::schemars::Schema as
::core::convert::TryFrom<_>>::try_from(::serde_json::Value::Object({
let mut object = ::serde_json::Map::new();
let _ =
object.insert(("type").into(),
::serde_json::to_value(&"string").unwrap());
let _ =
object.insert(("enum").into(),
::serde_json::Value::Array(<[_]>::into_vec(::alloc::boxed::box_new([::serde_json::to_value(&"false").unwrap(),
::serde_json::to_value(&"true").unwrap(),
::serde_json::to_value(&"wasm").unwrap(),
::serde_json::to_value(&"musl").unwrap(),
::serde_json::to_value(&"mingw").unwrap()]))));
object
})).unwrap()schemars::json_schema! ({
600 "type": "string",
601 "enum": ["false", "true", "wasm", "musl", "mingw"]
602 })
603 .into()
604 }
605}
606
607impl ToJson for LinkSelfContainedDefault {
608 fn to_json(&self) -> Json {
609 match *self {
610 LinkSelfContainedDefault::WithComponents(components) => {
611 let mut map = BTreeMap::new();
615 map.insert("components", components);
616 map.to_json()
617 }
618
619 LinkSelfContainedDefault::True => "true".to_json(),
621 LinkSelfContainedDefault::False => "false".to_json(),
622 LinkSelfContainedDefault::InferredForMusl => "musl".to_json(),
623 LinkSelfContainedDefault::InferredForMingw => "mingw".to_json(),
624 }
625 }
626}
627
628impl LinkSelfContainedDefault {
629 pub fn is_disabled(self) -> bool {
632 self == LinkSelfContainedDefault::False
633 }
634
635 fn json_key(self) -> &'static str {
639 match self {
640 LinkSelfContainedDefault::WithComponents(_) => "link-self-contained",
641 _ => "crt-objects-fallback",
642 }
643 }
644
645 pub fn with_linker() -> LinkSelfContainedDefault {
648 LinkSelfContainedDefault::WithComponents(LinkSelfContainedComponents::LINKER)
649 }
650}
651
652bitflags::bitflags! {
653 #[derive(#[automatically_derived]
impl ::core::clone::Clone for LinkSelfContainedComponents {
#[inline]
fn clone(&self) -> LinkSelfContainedComponents {
let _:
::core::clone::AssertParamIsClone<<LinkSelfContainedComponents
as ::bitflags::__private::PublicFlags>::Internal>;
*self
}
}
impl LinkSelfContainedComponents {
#[doc = r" CRT objects (e.g. on `windows-gnu`, `musl`, `wasi` targets)"]
#[allow(deprecated, non_upper_case_globals,)]
pub const CRT_OBJECTS: Self = Self::from_bits_retain(1 << 0);
#[doc = r" libc static library (e.g. on `musl`, `wasi` targets)"]
#[allow(deprecated, non_upper_case_globals,)]
pub const LIBC: Self = Self::from_bits_retain(1 << 1);
#[doc =
r" libgcc/libunwind (e.g. on `windows-gnu`, `fuchsia`, `fortanix`, `gnullvm` targets)"]
#[allow(deprecated, non_upper_case_globals,)]
pub const UNWIND: Self = Self::from_bits_retain(1 << 2);
#[doc =
r" Linker, dlltool, and their necessary libraries (e.g. on `windows-gnu` and for `rust-lld`)"]
#[allow(deprecated, non_upper_case_globals,)]
pub const LINKER: Self = Self::from_bits_retain(1 << 3);
#[doc = r" Sanitizer runtime libraries"]
#[allow(deprecated, non_upper_case_globals,)]
pub const SANITIZERS: Self = Self::from_bits_retain(1 << 4);
#[doc = r" Other MinGW libs and Windows import libs"]
#[allow(deprecated, non_upper_case_globals,)]
pub const MINGW: Self = Self::from_bits_retain(1 << 5);
}
impl ::bitflags::Flags for LinkSelfContainedComponents {
const FLAGS: &'static [::bitflags::Flag<LinkSelfContainedComponents>] =
&[{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("CRT_OBJECTS",
LinkSelfContainedComponents::CRT_OBJECTS)
},
{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("LIBC",
LinkSelfContainedComponents::LIBC)
},
{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("UNWIND",
LinkSelfContainedComponents::UNWIND)
},
{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("LINKER",
LinkSelfContainedComponents::LINKER)
},
{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("SANITIZERS",
LinkSelfContainedComponents::SANITIZERS)
},
{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("MINGW",
LinkSelfContainedComponents::MINGW)
}];
type Bits = u8;
fn bits(&self) -> u8 { LinkSelfContainedComponents::bits(self) }
fn from_bits_retain(bits: u8) -> LinkSelfContainedComponents {
LinkSelfContainedComponents::from_bits_retain(bits)
}
}
#[allow(dead_code, deprecated, unused_doc_comments, unused_attributes,
unused_mut, unused_imports, non_upper_case_globals, clippy ::
assign_op_pattern, clippy :: indexing_slicing, clippy :: same_name_method,
clippy :: iter_without_into_iter,)]
const _: () =
{
#[repr(transparent)]
pub struct InternalBitFlags(u8);
#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for InternalBitFlags { }
#[automatically_derived]
impl ::core::clone::Clone for InternalBitFlags {
#[inline]
fn clone(&self) -> InternalBitFlags {
let _: ::core::clone::AssertParamIsClone<u8>;
*self
}
}
#[automatically_derived]
impl ::core::marker::Copy for InternalBitFlags { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for InternalBitFlags { }
#[automatically_derived]
impl ::core::cmp::PartialEq for InternalBitFlags {
#[inline]
fn eq(&self, other: &InternalBitFlags) -> bool {
self.0 == other.0
}
}
#[automatically_derived]
impl ::core::cmp::Eq for InternalBitFlags {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) -> () {
let _: ::core::cmp::AssertParamIsEq<u8>;
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for InternalBitFlags {
#[inline]
fn partial_cmp(&self, other: &InternalBitFlags)
-> ::core::option::Option<::core::cmp::Ordering> {
::core::cmp::PartialOrd::partial_cmp(&self.0, &other.0)
}
}
#[automatically_derived]
impl ::core::cmp::Ord for InternalBitFlags {
#[inline]
fn cmp(&self, other: &InternalBitFlags) -> ::core::cmp::Ordering {
::core::cmp::Ord::cmp(&self.0, &other.0)
}
}
#[automatically_derived]
impl ::core::hash::Hash for InternalBitFlags {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () {
::core::hash::Hash::hash(&self.0, state)
}
}
impl ::bitflags::__private::PublicFlags for
LinkSelfContainedComponents {
type Primitive = u8;
type Internal = InternalBitFlags;
}
impl ::bitflags::__private::core::default::Default for
InternalBitFlags {
#[inline]
fn default() -> Self { InternalBitFlags::empty() }
}
impl ::bitflags::__private::core::fmt::Debug for InternalBitFlags {
fn fmt(&self,
f: &mut ::bitflags::__private::core::fmt::Formatter<'_>)
-> ::bitflags::__private::core::fmt::Result {
if self.is_empty() {
f.write_fmt(format_args!("{0:#x}",
<u8 as ::bitflags::Bits>::EMPTY))
} else {
::bitflags::__private::core::fmt::Display::fmt(self, f)
}
}
}
impl ::bitflags::__private::core::fmt::Display for InternalBitFlags {
fn fmt(&self,
f: &mut ::bitflags::__private::core::fmt::Formatter<'_>)
-> ::bitflags::__private::core::fmt::Result {
::bitflags::parser::to_writer(&LinkSelfContainedComponents(*self),
f)
}
}
impl ::bitflags::__private::core::str::FromStr for InternalBitFlags {
type Err = ::bitflags::parser::ParseError;
fn from_str(s: &str)
->
::bitflags::__private::core::result::Result<Self,
Self::Err> {
::bitflags::parser::from_str::<LinkSelfContainedComponents>(s).map(|flags|
flags.0)
}
}
impl ::bitflags::__private::core::convert::AsRef<u8> for
InternalBitFlags {
fn as_ref(&self) -> &u8 { &self.0 }
}
impl ::bitflags::__private::core::convert::From<u8> for
InternalBitFlags {
fn from(bits: u8) -> Self { Self::from_bits_retain(bits) }
}
#[allow(dead_code, deprecated, unused_attributes)]
impl InternalBitFlags {
#[inline]
pub const fn empty() -> Self {
Self(<u8 as ::bitflags::Bits>::EMPTY)
}
#[inline]
pub const fn all() -> Self {
let mut truncated = <u8 as ::bitflags::Bits>::EMPTY;
let mut i = 0;
{
{
let flag =
<LinkSelfContainedComponents as
::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
{
{
let flag =
<LinkSelfContainedComponents as
::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
{
{
let flag =
<LinkSelfContainedComponents as
::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
{
{
let flag =
<LinkSelfContainedComponents as
::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
{
{
let flag =
<LinkSelfContainedComponents as
::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
{
{
let flag =
<LinkSelfContainedComponents as
::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
let _ = i;
Self(truncated)
}
#[inline]
pub const fn bits(&self) -> u8 { self.0 }
#[inline]
pub const fn from_bits(bits: u8)
-> ::bitflags::__private::core::option::Option<Self> {
let truncated = Self::from_bits_truncate(bits).0;
if truncated == bits {
::bitflags::__private::core::option::Option::Some(Self(bits))
} else { ::bitflags::__private::core::option::Option::None }
}
#[inline]
pub const fn from_bits_truncate(bits: u8) -> Self {
Self(bits & Self::all().0)
}
#[inline]
pub const fn from_bits_retain(bits: u8) -> Self { Self(bits) }
#[inline]
pub fn from_name(name: &str)
-> ::bitflags::__private::core::option::Option<Self> {
{
if name == "CRT_OBJECTS" {
return ::bitflags::__private::core::option::Option::Some(Self(LinkSelfContainedComponents::CRT_OBJECTS.bits()));
}
};
;
{
if name == "LIBC" {
return ::bitflags::__private::core::option::Option::Some(Self(LinkSelfContainedComponents::LIBC.bits()));
}
};
;
{
if name == "UNWIND" {
return ::bitflags::__private::core::option::Option::Some(Self(LinkSelfContainedComponents::UNWIND.bits()));
}
};
;
{
if name == "LINKER" {
return ::bitflags::__private::core::option::Option::Some(Self(LinkSelfContainedComponents::LINKER.bits()));
}
};
;
{
if name == "SANITIZERS" {
return ::bitflags::__private::core::option::Option::Some(Self(LinkSelfContainedComponents::SANITIZERS.bits()));
}
};
;
{
if name == "MINGW" {
return ::bitflags::__private::core::option::Option::Some(Self(LinkSelfContainedComponents::MINGW.bits()));
}
};
;
let _ = name;
::bitflags::__private::core::option::Option::None
}
#[inline]
pub const fn is_empty(&self) -> bool {
self.0 == <u8 as ::bitflags::Bits>::EMPTY
}
#[inline]
pub const fn is_all(&self) -> bool {
Self::all().0 | self.0 == self.0
}
#[inline]
pub const fn intersects(&self, other: Self) -> bool {
self.0 & other.0 != <u8 as ::bitflags::Bits>::EMPTY
}
#[inline]
pub const fn contains(&self, other: Self) -> bool {
self.0 & other.0 == other.0
}
#[inline]
pub fn insert(&mut self, other: Self) {
*self = Self(self.0).union(other);
}
#[inline]
pub fn remove(&mut self, other: Self) {
*self = Self(self.0).difference(other);
}
#[inline]
pub fn toggle(&mut self, other: Self) {
*self = Self(self.0).symmetric_difference(other);
}
#[inline]
pub fn set(&mut self, other: Self, value: bool) {
if value { self.insert(other); } else { self.remove(other); }
}
#[inline]
#[must_use]
pub const fn intersection(self, other: Self) -> Self {
Self(self.0 & other.0)
}
#[inline]
#[must_use]
pub const fn union(self, other: Self) -> Self {
Self(self.0 | other.0)
}
#[inline]
#[must_use]
pub const fn difference(self, other: Self) -> Self {
Self(self.0 & !other.0)
}
#[inline]
#[must_use]
pub const fn symmetric_difference(self, other: Self) -> Self {
Self(self.0 ^ other.0)
}
#[inline]
#[must_use]
pub const fn complement(self) -> Self {
Self::from_bits_truncate(!self.0)
}
}
impl ::bitflags::__private::core::fmt::Binary for InternalBitFlags {
fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
-> ::bitflags::__private::core::fmt::Result {
let inner = self.0;
::bitflags::__private::core::fmt::Binary::fmt(&inner, f)
}
}
impl ::bitflags::__private::core::fmt::Octal for InternalBitFlags {
fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
-> ::bitflags::__private::core::fmt::Result {
let inner = self.0;
::bitflags::__private::core::fmt::Octal::fmt(&inner, f)
}
}
impl ::bitflags::__private::core::fmt::LowerHex for InternalBitFlags {
fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
-> ::bitflags::__private::core::fmt::Result {
let inner = self.0;
::bitflags::__private::core::fmt::LowerHex::fmt(&inner, f)
}
}
impl ::bitflags::__private::core::fmt::UpperHex for InternalBitFlags {
fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
-> ::bitflags::__private::core::fmt::Result {
let inner = self.0;
::bitflags::__private::core::fmt::UpperHex::fmt(&inner, f)
}
}
impl ::bitflags::__private::core::ops::BitOr for InternalBitFlags {
type Output = Self;
#[inline]
fn bitor(self, other: InternalBitFlags) -> Self {
self.union(other)
}
}
impl ::bitflags::__private::core::ops::BitOrAssign for
InternalBitFlags {
#[inline]
fn bitor_assign(&mut self, other: Self) { self.insert(other); }
}
impl ::bitflags::__private::core::ops::BitXor for InternalBitFlags {
type Output = Self;
#[inline]
fn bitxor(self, other: Self) -> Self {
self.symmetric_difference(other)
}
}
impl ::bitflags::__private::core::ops::BitXorAssign for
InternalBitFlags {
#[inline]
fn bitxor_assign(&mut self, other: Self) { self.toggle(other); }
}
impl ::bitflags::__private::core::ops::BitAnd for InternalBitFlags {
type Output = Self;
#[inline]
fn bitand(self, other: Self) -> Self { self.intersection(other) }
}
impl ::bitflags::__private::core::ops::BitAndAssign for
InternalBitFlags {
#[inline]
fn bitand_assign(&mut self, other: Self) {
*self =
Self::from_bits_retain(self.bits()).intersection(other);
}
}
impl ::bitflags::__private::core::ops::Sub for InternalBitFlags {
type Output = Self;
#[inline]
fn sub(self, other: Self) -> Self { self.difference(other) }
}
impl ::bitflags::__private::core::ops::SubAssign for InternalBitFlags
{
#[inline]
fn sub_assign(&mut self, other: Self) { self.remove(other); }
}
impl ::bitflags::__private::core::ops::Not for InternalBitFlags {
type Output = Self;
#[inline]
fn not(self) -> Self { self.complement() }
}
impl ::bitflags::__private::core::iter::Extend<InternalBitFlags> for
InternalBitFlags {
fn extend<T: ::bitflags::__private::core::iter::IntoIterator<Item
= Self>>(&mut self, iterator: T) {
for item in iterator { self.insert(item) }
}
}
impl ::bitflags::__private::core::iter::FromIterator<InternalBitFlags>
for InternalBitFlags {
fn from_iter<T: ::bitflags::__private::core::iter::IntoIterator<Item
= Self>>(iterator: T) -> Self {
use ::bitflags::__private::core::iter::Extend;
let mut result = Self::empty();
result.extend(iterator);
result
}
}
impl InternalBitFlags {
#[inline]
pub const fn iter(&self)
-> ::bitflags::iter::Iter<LinkSelfContainedComponents> {
::bitflags::iter::Iter::__private_const_new(<LinkSelfContainedComponents
as ::bitflags::Flags>::FLAGS,
LinkSelfContainedComponents::from_bits_retain(self.bits()),
LinkSelfContainedComponents::from_bits_retain(self.bits()))
}
#[inline]
pub const fn iter_names(&self)
-> ::bitflags::iter::IterNames<LinkSelfContainedComponents> {
::bitflags::iter::IterNames::__private_const_new(<LinkSelfContainedComponents
as ::bitflags::Flags>::FLAGS,
LinkSelfContainedComponents::from_bits_retain(self.bits()),
LinkSelfContainedComponents::from_bits_retain(self.bits()))
}
}
impl ::bitflags::__private::core::iter::IntoIterator for
InternalBitFlags {
type Item = LinkSelfContainedComponents;
type IntoIter =
::bitflags::iter::Iter<LinkSelfContainedComponents>;
fn into_iter(self) -> Self::IntoIter { self.iter() }
}
impl InternalBitFlags {
#[inline]
pub fn bits_mut(&mut self) -> &mut u8 { &mut self.0 }
}
#[allow(dead_code, deprecated, unused_attributes)]
impl LinkSelfContainedComponents {
#[inline]
pub const fn empty() -> Self { Self(InternalBitFlags::empty()) }
#[inline]
pub const fn all() -> Self { Self(InternalBitFlags::all()) }
#[inline]
pub const fn bits(&self) -> u8 { self.0.bits() }
#[inline]
pub const fn from_bits(bits: u8)
-> ::bitflags::__private::core::option::Option<Self> {
match InternalBitFlags::from_bits(bits) {
::bitflags::__private::core::option::Option::Some(bits) =>
::bitflags::__private::core::option::Option::Some(Self(bits)),
::bitflags::__private::core::option::Option::None =>
::bitflags::__private::core::option::Option::None,
}
}
#[inline]
pub const fn from_bits_truncate(bits: u8) -> Self {
Self(InternalBitFlags::from_bits_truncate(bits))
}
#[inline]
pub const fn from_bits_retain(bits: u8) -> Self {
Self(InternalBitFlags::from_bits_retain(bits))
}
#[inline]
pub fn from_name(name: &str)
-> ::bitflags::__private::core::option::Option<Self> {
match InternalBitFlags::from_name(name) {
::bitflags::__private::core::option::Option::Some(bits) =>
::bitflags::__private::core::option::Option::Some(Self(bits)),
::bitflags::__private::core::option::Option::None =>
::bitflags::__private::core::option::Option::None,
}
}
#[inline]
pub const fn is_empty(&self) -> bool { self.0.is_empty() }
#[inline]
pub const fn is_all(&self) -> bool { self.0.is_all() }
#[inline]
pub const fn intersects(&self, other: Self) -> bool {
self.0.intersects(other.0)
}
#[inline]
pub const fn contains(&self, other: Self) -> bool {
self.0.contains(other.0)
}
#[inline]
pub fn insert(&mut self, other: Self) { self.0.insert(other.0) }
#[inline]
pub fn remove(&mut self, other: Self) { self.0.remove(other.0) }
#[inline]
pub fn toggle(&mut self, other: Self) { self.0.toggle(other.0) }
#[inline]
pub fn set(&mut self, other: Self, value: bool) {
self.0.set(other.0, value)
}
#[inline]
#[must_use]
pub const fn intersection(self, other: Self) -> Self {
Self(self.0.intersection(other.0))
}
#[inline]
#[must_use]
pub const fn union(self, other: Self) -> Self {
Self(self.0.union(other.0))
}
#[inline]
#[must_use]
pub const fn difference(self, other: Self) -> Self {
Self(self.0.difference(other.0))
}
#[inline]
#[must_use]
pub const fn symmetric_difference(self, other: Self) -> Self {
Self(self.0.symmetric_difference(other.0))
}
#[inline]
#[must_use]
pub const fn complement(self) -> Self {
Self(self.0.complement())
}
}
impl ::bitflags::__private::core::fmt::Binary for
LinkSelfContainedComponents {
fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
-> ::bitflags::__private::core::fmt::Result {
let inner = self.0;
::bitflags::__private::core::fmt::Binary::fmt(&inner, f)
}
}
impl ::bitflags::__private::core::fmt::Octal for
LinkSelfContainedComponents {
fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
-> ::bitflags::__private::core::fmt::Result {
let inner = self.0;
::bitflags::__private::core::fmt::Octal::fmt(&inner, f)
}
}
impl ::bitflags::__private::core::fmt::LowerHex for
LinkSelfContainedComponents {
fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
-> ::bitflags::__private::core::fmt::Result {
let inner = self.0;
::bitflags::__private::core::fmt::LowerHex::fmt(&inner, f)
}
}
impl ::bitflags::__private::core::fmt::UpperHex for
LinkSelfContainedComponents {
fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
-> ::bitflags::__private::core::fmt::Result {
let inner = self.0;
::bitflags::__private::core::fmt::UpperHex::fmt(&inner, f)
}
}
impl ::bitflags::__private::core::ops::BitOr for
LinkSelfContainedComponents {
type Output = Self;
#[inline]
fn bitor(self, other: LinkSelfContainedComponents) -> Self {
self.union(other)
}
}
impl ::bitflags::__private::core::ops::BitOrAssign for
LinkSelfContainedComponents {
#[inline]
fn bitor_assign(&mut self, other: Self) { self.insert(other); }
}
impl ::bitflags::__private::core::ops::BitXor for
LinkSelfContainedComponents {
type Output = Self;
#[inline]
fn bitxor(self, other: Self) -> Self {
self.symmetric_difference(other)
}
}
impl ::bitflags::__private::core::ops::BitXorAssign for
LinkSelfContainedComponents {
#[inline]
fn bitxor_assign(&mut self, other: Self) { self.toggle(other); }
}
impl ::bitflags::__private::core::ops::BitAnd for
LinkSelfContainedComponents {
type Output = Self;
#[inline]
fn bitand(self, other: Self) -> Self { self.intersection(other) }
}
impl ::bitflags::__private::core::ops::BitAndAssign for
LinkSelfContainedComponents {
#[inline]
fn bitand_assign(&mut self, other: Self) {
*self =
Self::from_bits_retain(self.bits()).intersection(other);
}
}
impl ::bitflags::__private::core::ops::Sub for
LinkSelfContainedComponents {
type Output = Self;
#[inline]
fn sub(self, other: Self) -> Self { self.difference(other) }
}
impl ::bitflags::__private::core::ops::SubAssign for
LinkSelfContainedComponents {
#[inline]
fn sub_assign(&mut self, other: Self) { self.remove(other); }
}
impl ::bitflags::__private::core::ops::Not for
LinkSelfContainedComponents {
type Output = Self;
#[inline]
fn not(self) -> Self { self.complement() }
}
impl ::bitflags::__private::core::iter::Extend<LinkSelfContainedComponents>
for LinkSelfContainedComponents {
fn extend<T: ::bitflags::__private::core::iter::IntoIterator<Item
= Self>>(&mut self, iterator: T) {
for item in iterator { self.insert(item) }
}
}
impl ::bitflags::__private::core::iter::FromIterator<LinkSelfContainedComponents>
for LinkSelfContainedComponents {
fn from_iter<T: ::bitflags::__private::core::iter::IntoIterator<Item
= Self>>(iterator: T) -> Self {
use ::bitflags::__private::core::iter::Extend;
let mut result = Self::empty();
result.extend(iterator);
result
}
}
impl LinkSelfContainedComponents {
#[inline]
pub const fn iter(&self)
-> ::bitflags::iter::Iter<LinkSelfContainedComponents> {
::bitflags::iter::Iter::__private_const_new(<LinkSelfContainedComponents
as ::bitflags::Flags>::FLAGS,
LinkSelfContainedComponents::from_bits_retain(self.bits()),
LinkSelfContainedComponents::from_bits_retain(self.bits()))
}
#[inline]
pub const fn iter_names(&self)
-> ::bitflags::iter::IterNames<LinkSelfContainedComponents> {
::bitflags::iter::IterNames::__private_const_new(<LinkSelfContainedComponents
as ::bitflags::Flags>::FLAGS,
LinkSelfContainedComponents::from_bits_retain(self.bits()),
LinkSelfContainedComponents::from_bits_retain(self.bits()))
}
}
impl ::bitflags::__private::core::iter::IntoIterator for
LinkSelfContainedComponents {
type Item = LinkSelfContainedComponents;
type IntoIter =
::bitflags::iter::Iter<LinkSelfContainedComponents>;
fn into_iter(self) -> Self::IntoIter { self.iter() }
}
};Clone, #[automatically_derived]
impl ::core::marker::Copy for LinkSelfContainedComponents { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for LinkSelfContainedComponents {
#[inline]
fn eq(&self, other: &LinkSelfContainedComponents) -> bool {
self.0 == other.0
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for LinkSelfContainedComponents {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) -> () {
let _:
::core::cmp::AssertParamIsEq<<LinkSelfContainedComponents as
::bitflags::__private::PublicFlags>::Internal>;
}
}Eq, #[automatically_derived]
impl ::core::default::Default for LinkSelfContainedComponents {
#[inline]
fn default() -> LinkSelfContainedComponents {
LinkSelfContainedComponents(::core::default::Default::default())
}
}Default)]
654 pub struct LinkSelfContainedComponents: u8 {
656 const CRT_OBJECTS = 1 << 0;
658 const LIBC = 1 << 1;
660 const UNWIND = 1 << 2;
662 const LINKER = 1 << 3;
664 const SANITIZERS = 1 << 4;
666 const MINGW = 1 << 5;
668 }
669}
670impl ::std::fmt::Debug for LinkSelfContainedComponents {
fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
::bitflags::parser::to_writer(self, f)
}
}rustc_data_structures::external_bitflags_debug! { LinkSelfContainedComponents }
671
672impl LinkSelfContainedComponents {
673 pub fn as_str(self) -> Option<&'static str> {
677 Some(match self {
678 LinkSelfContainedComponents::CRT_OBJECTS => "crto",
679 LinkSelfContainedComponents::LIBC => "libc",
680 LinkSelfContainedComponents::UNWIND => "unwind",
681 LinkSelfContainedComponents::LINKER => "linker",
682 LinkSelfContainedComponents::SANITIZERS => "sanitizers",
683 LinkSelfContainedComponents::MINGW => "mingw",
684 _ => return None,
685 })
686 }
687
688 fn all_components() -> [LinkSelfContainedComponents; 6] {
690 [
691 LinkSelfContainedComponents::CRT_OBJECTS,
692 LinkSelfContainedComponents::LIBC,
693 LinkSelfContainedComponents::UNWIND,
694 LinkSelfContainedComponents::LINKER,
695 LinkSelfContainedComponents::SANITIZERS,
696 LinkSelfContainedComponents::MINGW,
697 ]
698 }
699
700 pub fn are_any_components_enabled(self) -> bool {
702 !self.is_empty()
703 }
704
705 pub fn is_linker_enabled(self) -> bool {
707 self.contains(LinkSelfContainedComponents::LINKER)
708 }
709
710 pub fn is_crt_objects_enabled(self) -> bool {
712 self.contains(LinkSelfContainedComponents::CRT_OBJECTS)
713 }
714}
715
716impl FromStr for LinkSelfContainedComponents {
717 type Err = String;
718
719 fn from_str(s: &str) -> Result<Self, Self::Err> {
721 Ok(match s {
722 "crto" => LinkSelfContainedComponents::CRT_OBJECTS,
723 "libc" => LinkSelfContainedComponents::LIBC,
724 "unwind" => LinkSelfContainedComponents::UNWIND,
725 "linker" => LinkSelfContainedComponents::LINKER,
726 "sanitizers" => LinkSelfContainedComponents::SANITIZERS,
727 "mingw" => LinkSelfContainedComponents::MINGW,
728 _ => {
729 return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("\'{0}\' is not a valid link-self-contained component, expected \'crto\', \'libc\', \'unwind\', \'linker\', \'sanitizers\', \'mingw\'",
s))
})format!(
730 "'{s}' is not a valid link-self-contained component, expected 'crto', 'libc', 'unwind', 'linker', 'sanitizers', 'mingw'"
731 ));
732 }
733 })
734 }
735}
736
737impl<'de> serde::Deserialize<'de> for LinkSelfContainedComponents {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}crate::json::serde_deserialize_from_str!(LinkSelfContainedComponents);
738impl schemars::JsonSchema for LinkSelfContainedComponents {
739 fn schema_name() -> std::borrow::Cow<'static, str> {
740 "LinkSelfContainedComponents".into()
741 }
742 fn json_schema(_: &mut schemars::SchemaGenerator) -> schemars::Schema {
743 let all =
744 Self::all_components().iter().map(|component| component.as_str()).collect::<Vec<_>>();
745 <::schemars::Schema as
::core::convert::TryFrom<_>>::try_from(::serde_json::Value::Object({
let mut object = ::serde_json::Map::new();
let _ =
object.insert(("type").into(),
::serde_json::to_value(&"string").unwrap());
let _ =
object.insert(("enum").into(),
::serde_json::to_value(&all).unwrap());
;
object
})).unwrap()schemars::json_schema! ({
746 "type": "string",
747 "enum": all,
748 })
749 .into()
750 }
751}
752
753impl ToJson for LinkSelfContainedComponents {
754 fn to_json(&self) -> Json {
755 let components: Vec<_> = Self::all_components()
756 .into_iter()
757 .filter(|c| self.contains(*c))
758 .map(|c| {
759 c.as_str().unwrap().to_owned()
762 })
763 .collect();
764
765 components.to_json()
766 }
767}
768
769bitflags::bitflags! {
770 #[derive(#[automatically_derived]
impl ::core::clone::Clone for LinkerFeatures {
#[inline]
fn clone(&self) -> LinkerFeatures {
let _:
::core::clone::AssertParamIsClone<<LinkerFeatures as
::bitflags::__private::PublicFlags>::Internal>;
*self
}
}
impl LinkerFeatures {
#[doc =
r" Invoke the linker via a C/C++ compiler (e.g. on most unix targets)."]
#[allow(deprecated, non_upper_case_globals,)]
pub const CC: Self = Self::from_bits_retain(1 << 0);
#[doc =
r" Use the lld linker, either the system lld or the self-contained linker `rust-lld`."]
#[allow(deprecated, non_upper_case_globals,)]
pub const LLD: Self = Self::from_bits_retain(1 << 1);
}
impl ::bitflags::Flags for LinkerFeatures {
const FLAGS: &'static [::bitflags::Flag<LinkerFeatures>] =
&[{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("CC", LinkerFeatures::CC)
},
{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("LLD", LinkerFeatures::LLD)
}];
type Bits = u8;
fn bits(&self) -> u8 { LinkerFeatures::bits(self) }
fn from_bits_retain(bits: u8) -> LinkerFeatures {
LinkerFeatures::from_bits_retain(bits)
}
}
#[allow(dead_code, deprecated, unused_doc_comments, unused_attributes,
unused_mut, unused_imports, non_upper_case_globals, clippy ::
assign_op_pattern, clippy :: indexing_slicing, clippy :: same_name_method,
clippy :: iter_without_into_iter,)]
const _: () =
{
#[repr(transparent)]
pub struct InternalBitFlags(u8);
#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for InternalBitFlags { }
#[automatically_derived]
impl ::core::clone::Clone for InternalBitFlags {
#[inline]
fn clone(&self) -> InternalBitFlags {
let _: ::core::clone::AssertParamIsClone<u8>;
*self
}
}
#[automatically_derived]
impl ::core::marker::Copy for InternalBitFlags { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for InternalBitFlags { }
#[automatically_derived]
impl ::core::cmp::PartialEq for InternalBitFlags {
#[inline]
fn eq(&self, other: &InternalBitFlags) -> bool {
self.0 == other.0
}
}
#[automatically_derived]
impl ::core::cmp::Eq for InternalBitFlags {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) -> () {
let _: ::core::cmp::AssertParamIsEq<u8>;
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for InternalBitFlags {
#[inline]
fn partial_cmp(&self, other: &InternalBitFlags)
-> ::core::option::Option<::core::cmp::Ordering> {
::core::cmp::PartialOrd::partial_cmp(&self.0, &other.0)
}
}
#[automatically_derived]
impl ::core::cmp::Ord for InternalBitFlags {
#[inline]
fn cmp(&self, other: &InternalBitFlags) -> ::core::cmp::Ordering {
::core::cmp::Ord::cmp(&self.0, &other.0)
}
}
#[automatically_derived]
impl ::core::hash::Hash for InternalBitFlags {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () {
::core::hash::Hash::hash(&self.0, state)
}
}
impl ::bitflags::__private::PublicFlags for LinkerFeatures {
type Primitive = u8;
type Internal = InternalBitFlags;
}
impl ::bitflags::__private::core::default::Default for
InternalBitFlags {
#[inline]
fn default() -> Self { InternalBitFlags::empty() }
}
impl ::bitflags::__private::core::fmt::Debug for InternalBitFlags {
fn fmt(&self,
f: &mut ::bitflags::__private::core::fmt::Formatter<'_>)
-> ::bitflags::__private::core::fmt::Result {
if self.is_empty() {
f.write_fmt(format_args!("{0:#x}",
<u8 as ::bitflags::Bits>::EMPTY))
} else {
::bitflags::__private::core::fmt::Display::fmt(self, f)
}
}
}
impl ::bitflags::__private::core::fmt::Display for InternalBitFlags {
fn fmt(&self,
f: &mut ::bitflags::__private::core::fmt::Formatter<'_>)
-> ::bitflags::__private::core::fmt::Result {
::bitflags::parser::to_writer(&LinkerFeatures(*self), f)
}
}
impl ::bitflags::__private::core::str::FromStr for InternalBitFlags {
type Err = ::bitflags::parser::ParseError;
fn from_str(s: &str)
->
::bitflags::__private::core::result::Result<Self,
Self::Err> {
::bitflags::parser::from_str::<LinkerFeatures>(s).map(|flags|
flags.0)
}
}
impl ::bitflags::__private::core::convert::AsRef<u8> for
InternalBitFlags {
fn as_ref(&self) -> &u8 { &self.0 }
}
impl ::bitflags::__private::core::convert::From<u8> for
InternalBitFlags {
fn from(bits: u8) -> Self { Self::from_bits_retain(bits) }
}
#[allow(dead_code, deprecated, unused_attributes)]
impl InternalBitFlags {
#[inline]
pub const fn empty() -> Self {
Self(<u8 as ::bitflags::Bits>::EMPTY)
}
#[inline]
pub const fn all() -> Self {
let mut truncated = <u8 as ::bitflags::Bits>::EMPTY;
let mut i = 0;
{
{
let flag =
<LinkerFeatures as
::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
{
{
let flag =
<LinkerFeatures as
::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
let _ = i;
Self(truncated)
}
#[inline]
pub const fn bits(&self) -> u8 { self.0 }
#[inline]
pub const fn from_bits(bits: u8)
-> ::bitflags::__private::core::option::Option<Self> {
let truncated = Self::from_bits_truncate(bits).0;
if truncated == bits {
::bitflags::__private::core::option::Option::Some(Self(bits))
} else { ::bitflags::__private::core::option::Option::None }
}
#[inline]
pub const fn from_bits_truncate(bits: u8) -> Self {
Self(bits & Self::all().0)
}
#[inline]
pub const fn from_bits_retain(bits: u8) -> Self { Self(bits) }
#[inline]
pub fn from_name(name: &str)
-> ::bitflags::__private::core::option::Option<Self> {
{
if name == "CC" {
return ::bitflags::__private::core::option::Option::Some(Self(LinkerFeatures::CC.bits()));
}
};
;
{
if name == "LLD" {
return ::bitflags::__private::core::option::Option::Some(Self(LinkerFeatures::LLD.bits()));
}
};
;
let _ = name;
::bitflags::__private::core::option::Option::None
}
#[inline]
pub const fn is_empty(&self) -> bool {
self.0 == <u8 as ::bitflags::Bits>::EMPTY
}
#[inline]
pub const fn is_all(&self) -> bool {
Self::all().0 | self.0 == self.0
}
#[inline]
pub const fn intersects(&self, other: Self) -> bool {
self.0 & other.0 != <u8 as ::bitflags::Bits>::EMPTY
}
#[inline]
pub const fn contains(&self, other: Self) -> bool {
self.0 & other.0 == other.0
}
#[inline]
pub fn insert(&mut self, other: Self) {
*self = Self(self.0).union(other);
}
#[inline]
pub fn remove(&mut self, other: Self) {
*self = Self(self.0).difference(other);
}
#[inline]
pub fn toggle(&mut self, other: Self) {
*self = Self(self.0).symmetric_difference(other);
}
#[inline]
pub fn set(&mut self, other: Self, value: bool) {
if value { self.insert(other); } else { self.remove(other); }
}
#[inline]
#[must_use]
pub const fn intersection(self, other: Self) -> Self {
Self(self.0 & other.0)
}
#[inline]
#[must_use]
pub const fn union(self, other: Self) -> Self {
Self(self.0 | other.0)
}
#[inline]
#[must_use]
pub const fn difference(self, other: Self) -> Self {
Self(self.0 & !other.0)
}
#[inline]
#[must_use]
pub const fn symmetric_difference(self, other: Self) -> Self {
Self(self.0 ^ other.0)
}
#[inline]
#[must_use]
pub const fn complement(self) -> Self {
Self::from_bits_truncate(!self.0)
}
}
impl ::bitflags::__private::core::fmt::Binary for InternalBitFlags {
fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
-> ::bitflags::__private::core::fmt::Result {
let inner = self.0;
::bitflags::__private::core::fmt::Binary::fmt(&inner, f)
}
}
impl ::bitflags::__private::core::fmt::Octal for InternalBitFlags {
fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
-> ::bitflags::__private::core::fmt::Result {
let inner = self.0;
::bitflags::__private::core::fmt::Octal::fmt(&inner, f)
}
}
impl ::bitflags::__private::core::fmt::LowerHex for InternalBitFlags {
fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
-> ::bitflags::__private::core::fmt::Result {
let inner = self.0;
::bitflags::__private::core::fmt::LowerHex::fmt(&inner, f)
}
}
impl ::bitflags::__private::core::fmt::UpperHex for InternalBitFlags {
fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
-> ::bitflags::__private::core::fmt::Result {
let inner = self.0;
::bitflags::__private::core::fmt::UpperHex::fmt(&inner, f)
}
}
impl ::bitflags::__private::core::ops::BitOr for InternalBitFlags {
type Output = Self;
#[inline]
fn bitor(self, other: InternalBitFlags) -> Self {
self.union(other)
}
}
impl ::bitflags::__private::core::ops::BitOrAssign for
InternalBitFlags {
#[inline]
fn bitor_assign(&mut self, other: Self) { self.insert(other); }
}
impl ::bitflags::__private::core::ops::BitXor for InternalBitFlags {
type Output = Self;
#[inline]
fn bitxor(self, other: Self) -> Self {
self.symmetric_difference(other)
}
}
impl ::bitflags::__private::core::ops::BitXorAssign for
InternalBitFlags {
#[inline]
fn bitxor_assign(&mut self, other: Self) { self.toggle(other); }
}
impl ::bitflags::__private::core::ops::BitAnd for InternalBitFlags {
type Output = Self;
#[inline]
fn bitand(self, other: Self) -> Self { self.intersection(other) }
}
impl ::bitflags::__private::core::ops::BitAndAssign for
InternalBitFlags {
#[inline]
fn bitand_assign(&mut self, other: Self) {
*self =
Self::from_bits_retain(self.bits()).intersection(other);
}
}
impl ::bitflags::__private::core::ops::Sub for InternalBitFlags {
type Output = Self;
#[inline]
fn sub(self, other: Self) -> Self { self.difference(other) }
}
impl ::bitflags::__private::core::ops::SubAssign for InternalBitFlags
{
#[inline]
fn sub_assign(&mut self, other: Self) { self.remove(other); }
}
impl ::bitflags::__private::core::ops::Not for InternalBitFlags {
type Output = Self;
#[inline]
fn not(self) -> Self { self.complement() }
}
impl ::bitflags::__private::core::iter::Extend<InternalBitFlags> for
InternalBitFlags {
fn extend<T: ::bitflags::__private::core::iter::IntoIterator<Item
= Self>>(&mut self, iterator: T) {
for item in iterator { self.insert(item) }
}
}
impl ::bitflags::__private::core::iter::FromIterator<InternalBitFlags>
for InternalBitFlags {
fn from_iter<T: ::bitflags::__private::core::iter::IntoIterator<Item
= Self>>(iterator: T) -> Self {
use ::bitflags::__private::core::iter::Extend;
let mut result = Self::empty();
result.extend(iterator);
result
}
}
impl InternalBitFlags {
#[inline]
pub const fn iter(&self)
-> ::bitflags::iter::Iter<LinkerFeatures> {
::bitflags::iter::Iter::__private_const_new(<LinkerFeatures as
::bitflags::Flags>::FLAGS,
LinkerFeatures::from_bits_retain(self.bits()),
LinkerFeatures::from_bits_retain(self.bits()))
}
#[inline]
pub const fn iter_names(&self)
-> ::bitflags::iter::IterNames<LinkerFeatures> {
::bitflags::iter::IterNames::__private_const_new(<LinkerFeatures
as ::bitflags::Flags>::FLAGS,
LinkerFeatures::from_bits_retain(self.bits()),
LinkerFeatures::from_bits_retain(self.bits()))
}
}
impl ::bitflags::__private::core::iter::IntoIterator for
InternalBitFlags {
type Item = LinkerFeatures;
type IntoIter = ::bitflags::iter::Iter<LinkerFeatures>;
fn into_iter(self) -> Self::IntoIter { self.iter() }
}
impl InternalBitFlags {
#[inline]
pub fn bits_mut(&mut self) -> &mut u8 { &mut self.0 }
}
#[allow(dead_code, deprecated, unused_attributes)]
impl LinkerFeatures {
#[inline]
pub const fn empty() -> Self { Self(InternalBitFlags::empty()) }
#[inline]
pub const fn all() -> Self { Self(InternalBitFlags::all()) }
#[inline]
pub const fn bits(&self) -> u8 { self.0.bits() }
#[inline]
pub const fn from_bits(bits: u8)
-> ::bitflags::__private::core::option::Option<Self> {
match InternalBitFlags::from_bits(bits) {
::bitflags::__private::core::option::Option::Some(bits) =>
::bitflags::__private::core::option::Option::Some(Self(bits)),
::bitflags::__private::core::option::Option::None =>
::bitflags::__private::core::option::Option::None,
}
}
#[inline]
pub const fn from_bits_truncate(bits: u8) -> Self {
Self(InternalBitFlags::from_bits_truncate(bits))
}
#[inline]
pub const fn from_bits_retain(bits: u8) -> Self {
Self(InternalBitFlags::from_bits_retain(bits))
}
#[inline]
pub fn from_name(name: &str)
-> ::bitflags::__private::core::option::Option<Self> {
match InternalBitFlags::from_name(name) {
::bitflags::__private::core::option::Option::Some(bits) =>
::bitflags::__private::core::option::Option::Some(Self(bits)),
::bitflags::__private::core::option::Option::None =>
::bitflags::__private::core::option::Option::None,
}
}
#[inline]
pub const fn is_empty(&self) -> bool { self.0.is_empty() }
#[inline]
pub const fn is_all(&self) -> bool { self.0.is_all() }
#[inline]
pub const fn intersects(&self, other: Self) -> bool {
self.0.intersects(other.0)
}
#[inline]
pub const fn contains(&self, other: Self) -> bool {
self.0.contains(other.0)
}
#[inline]
pub fn insert(&mut self, other: Self) { self.0.insert(other.0) }
#[inline]
pub fn remove(&mut self, other: Self) { self.0.remove(other.0) }
#[inline]
pub fn toggle(&mut self, other: Self) { self.0.toggle(other.0) }
#[inline]
pub fn set(&mut self, other: Self, value: bool) {
self.0.set(other.0, value)
}
#[inline]
#[must_use]
pub const fn intersection(self, other: Self) -> Self {
Self(self.0.intersection(other.0))
}
#[inline]
#[must_use]
pub const fn union(self, other: Self) -> Self {
Self(self.0.union(other.0))
}
#[inline]
#[must_use]
pub const fn difference(self, other: Self) -> Self {
Self(self.0.difference(other.0))
}
#[inline]
#[must_use]
pub const fn symmetric_difference(self, other: Self) -> Self {
Self(self.0.symmetric_difference(other.0))
}
#[inline]
#[must_use]
pub const fn complement(self) -> Self {
Self(self.0.complement())
}
}
impl ::bitflags::__private::core::fmt::Binary for LinkerFeatures {
fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
-> ::bitflags::__private::core::fmt::Result {
let inner = self.0;
::bitflags::__private::core::fmt::Binary::fmt(&inner, f)
}
}
impl ::bitflags::__private::core::fmt::Octal for LinkerFeatures {
fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
-> ::bitflags::__private::core::fmt::Result {
let inner = self.0;
::bitflags::__private::core::fmt::Octal::fmt(&inner, f)
}
}
impl ::bitflags::__private::core::fmt::LowerHex for LinkerFeatures {
fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
-> ::bitflags::__private::core::fmt::Result {
let inner = self.0;
::bitflags::__private::core::fmt::LowerHex::fmt(&inner, f)
}
}
impl ::bitflags::__private::core::fmt::UpperHex for LinkerFeatures {
fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
-> ::bitflags::__private::core::fmt::Result {
let inner = self.0;
::bitflags::__private::core::fmt::UpperHex::fmt(&inner, f)
}
}
impl ::bitflags::__private::core::ops::BitOr for LinkerFeatures {
type Output = Self;
#[inline]
fn bitor(self, other: LinkerFeatures) -> Self {
self.union(other)
}
}
impl ::bitflags::__private::core::ops::BitOrAssign for LinkerFeatures
{
#[inline]
fn bitor_assign(&mut self, other: Self) { self.insert(other); }
}
impl ::bitflags::__private::core::ops::BitXor for LinkerFeatures {
type Output = Self;
#[inline]
fn bitxor(self, other: Self) -> Self {
self.symmetric_difference(other)
}
}
impl ::bitflags::__private::core::ops::BitXorAssign for LinkerFeatures
{
#[inline]
fn bitxor_assign(&mut self, other: Self) { self.toggle(other); }
}
impl ::bitflags::__private::core::ops::BitAnd for LinkerFeatures {
type Output = Self;
#[inline]
fn bitand(self, other: Self) -> Self { self.intersection(other) }
}
impl ::bitflags::__private::core::ops::BitAndAssign for LinkerFeatures
{
#[inline]
fn bitand_assign(&mut self, other: Self) {
*self =
Self::from_bits_retain(self.bits()).intersection(other);
}
}
impl ::bitflags::__private::core::ops::Sub for LinkerFeatures {
type Output = Self;
#[inline]
fn sub(self, other: Self) -> Self { self.difference(other) }
}
impl ::bitflags::__private::core::ops::SubAssign for LinkerFeatures {
#[inline]
fn sub_assign(&mut self, other: Self) { self.remove(other); }
}
impl ::bitflags::__private::core::ops::Not for LinkerFeatures {
type Output = Self;
#[inline]
fn not(self) -> Self { self.complement() }
}
impl ::bitflags::__private::core::iter::Extend<LinkerFeatures> for
LinkerFeatures {
fn extend<T: ::bitflags::__private::core::iter::IntoIterator<Item
= Self>>(&mut self, iterator: T) {
for item in iterator { self.insert(item) }
}
}
impl ::bitflags::__private::core::iter::FromIterator<LinkerFeatures>
for LinkerFeatures {
fn from_iter<T: ::bitflags::__private::core::iter::IntoIterator<Item
= Self>>(iterator: T) -> Self {
use ::bitflags::__private::core::iter::Extend;
let mut result = Self::empty();
result.extend(iterator);
result
}
}
impl LinkerFeatures {
#[inline]
pub const fn iter(&self)
-> ::bitflags::iter::Iter<LinkerFeatures> {
::bitflags::iter::Iter::__private_const_new(<LinkerFeatures as
::bitflags::Flags>::FLAGS,
LinkerFeatures::from_bits_retain(self.bits()),
LinkerFeatures::from_bits_retain(self.bits()))
}
#[inline]
pub const fn iter_names(&self)
-> ::bitflags::iter::IterNames<LinkerFeatures> {
::bitflags::iter::IterNames::__private_const_new(<LinkerFeatures
as ::bitflags::Flags>::FLAGS,
LinkerFeatures::from_bits_retain(self.bits()),
LinkerFeatures::from_bits_retain(self.bits()))
}
}
impl ::bitflags::__private::core::iter::IntoIterator for
LinkerFeatures {
type Item = LinkerFeatures;
type IntoIter = ::bitflags::iter::Iter<LinkerFeatures>;
fn into_iter(self) -> Self::IntoIter { self.iter() }
}
};Clone, #[automatically_derived]
impl ::core::marker::Copy for LinkerFeatures { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for LinkerFeatures {
#[inline]
fn eq(&self, other: &LinkerFeatures) -> bool { self.0 == other.0 }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for LinkerFeatures {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) -> () {
let _:
::core::cmp::AssertParamIsEq<<LinkerFeatures as
::bitflags::__private::PublicFlags>::Internal>;
}
}Eq, #[automatically_derived]
impl ::core::default::Default for LinkerFeatures {
#[inline]
fn default() -> LinkerFeatures {
LinkerFeatures(::core::default::Default::default())
}
}Default)]
791 pub struct LinkerFeatures: u8 {
792 const CC = 1 << 0;
794 const LLD = 1 << 1;
796 }
797}
798impl ::std::fmt::Debug for LinkerFeatures {
fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
::bitflags::parser::to_writer(self, f)
}
}rustc_data_structures::external_bitflags_debug! { LinkerFeatures }
799
800impl LinkerFeatures {
801 pub fn from_str(s: &str) -> Option<LinkerFeatures> {
803 Some(match s {
804 "cc" => LinkerFeatures::CC,
805 "lld" => LinkerFeatures::LLD,
806 _ => return None,
807 })
808 }
809
810 pub fn as_str(self) -> Option<&'static str> {
814 Some(match self {
815 LinkerFeatures::CC => "cc",
816 LinkerFeatures::LLD => "lld",
817 _ => return None,
818 })
819 }
820
821 pub fn is_lld_enabled(self) -> bool {
823 self.contains(LinkerFeatures::LLD)
824 }
825
826 pub fn is_cc_enabled(self) -> bool {
828 self.contains(LinkerFeatures::CC)
829 }
830}
831
832#[automatically_derived]
impl ::core::clone::Clone for PanicStrategy {
#[inline]
fn clone(&self) -> PanicStrategy { *self }
}
#[automatically_derived]
impl ::core::marker::Copy for PanicStrategy { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for PanicStrategy { }
#[automatically_derived]
impl ::core::cmp::PartialEq for PanicStrategy {
#[inline]
fn eq(&self, other: &PanicStrategy) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}
#[automatically_derived]
impl ::core::cmp::Eq for PanicStrategy {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) -> () {}
}
#[automatically_derived]
impl ::core::hash::Hash for PanicStrategy {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}
#[automatically_derived]
impl ::core::fmt::Debug for PanicStrategy {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
PanicStrategy::Unwind => "Unwind",
PanicStrategy::Abort => "Abort",
PanicStrategy::ImmediateAbort => "ImmediateAbort",
})
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for PanicStrategy {
#[inline]
fn partial_cmp(&self, other: &PanicStrategy)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::PartialOrd::partial_cmp(&__self_discr, &__arg1_discr)
}
}
#[automatically_derived]
impl ::core::cmp::Ord for PanicStrategy {
#[inline]
fn cmp(&self, other: &PanicStrategy) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr)
}
}
const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for PanicStrategy {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
PanicStrategy::Unwind => { 0usize }
PanicStrategy::Abort => { 1usize }
PanicStrategy::ImmediateAbort => { 2usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
PanicStrategy::Unwind => {}
PanicStrategy::Abort => {}
PanicStrategy::ImmediateAbort => {}
}
}
}
};
const _: () =
{
impl<__D: ::rustc_span::BlobDecoder> ::rustc_serialize::Decodable<__D>
for PanicStrategy {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { PanicStrategy::Unwind }
1usize => { PanicStrategy::Abort }
2usize => { PanicStrategy::ImmediateAbort }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `PanicStrategy`, expected 0..3, actual {0}",
n));
}
}
}
}
};
const _: () =
{
impl<__CTX> ::rustc_data_structures::stable_hasher::HashStable<__CTX>
for PanicStrategy where __CTX: crate::HashStableContext {
#[inline]
fn hash_stable(&self, __hcx: &mut __CTX,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
match *self {
PanicStrategy::Unwind => {}
PanicStrategy::Abort => {}
PanicStrategy::ImmediateAbort => {}
}
}
}
};
impl FromStr for PanicStrategy {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"unwind" => Self::Unwind,
"abort" => Self::Abort,
"immediate-abort" => Self::ImmediateAbort,
_ => {
let all =
["\'unwind\'", "\'abort\'",
"\'immediate-abort\'"].join(", ");
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid {0}: \'{1}\'. allowed values: {2}",
"panic strategy", s, all))
}));
}
})
}
}
impl PanicStrategy {
pub const ALL: &'static [PanicStrategy] =
&[PanicStrategy::Unwind, PanicStrategy::Abort,
PanicStrategy::ImmediateAbort];
pub fn desc(&self) -> &'static str {
match self {
Self::Unwind => "unwind",
Self::Abort => "abort",
Self::ImmediateAbort => "immediate-abort",
}
}
}
impl crate::json::ToJson for PanicStrategy {
fn to_json(&self) -> crate::json::Json { self.desc().to_json() }
}
impl<'de> serde::Deserialize<'de> for PanicStrategy {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}
impl std::fmt::Display for PanicStrategy {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.desc())
}
}crate::target_spec_enum! {
833 #[derive(Encodable, BlobDecodable, HashStable_Generic)]
834 pub enum PanicStrategy {
835 Unwind = "unwind",
836 Abort = "abort",
837 ImmediateAbort = "immediate-abort",
838 }
839
840 parse_error_type = "panic strategy";
841}
842
843#[derive(#[automatically_derived]
impl ::core::clone::Clone for OnBrokenPipe {
#[inline]
fn clone(&self) -> OnBrokenPipe { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for OnBrokenPipe { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for OnBrokenPipe {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
OnBrokenPipe::Default => "Default",
OnBrokenPipe::Kill => "Kill",
OnBrokenPipe::Error => "Error",
OnBrokenPipe::Inherit => "Inherit",
})
}
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for OnBrokenPipe {
#[inline]
fn eq(&self, other: &OnBrokenPipe) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for OnBrokenPipe {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}Hash, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for OnBrokenPipe {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
OnBrokenPipe::Default => { 0usize }
OnBrokenPipe::Kill => { 1usize }
OnBrokenPipe::Error => { 2usize }
OnBrokenPipe::Inherit => { 3usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
OnBrokenPipe::Default => {}
OnBrokenPipe::Kill => {}
OnBrokenPipe::Error => {}
OnBrokenPipe::Inherit => {}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::BlobDecoder> ::rustc_serialize::Decodable<__D>
for OnBrokenPipe {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { OnBrokenPipe::Default }
1usize => { OnBrokenPipe::Kill }
2usize => { OnBrokenPipe::Error }
3usize => { OnBrokenPipe::Inherit }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `OnBrokenPipe`, expected 0..4, actual {0}",
n));
}
}
}
}
};BlobDecodable, const _: () =
{
impl<__CTX> ::rustc_data_structures::stable_hasher::HashStable<__CTX>
for OnBrokenPipe where __CTX: crate::HashStableContext {
#[inline]
fn hash_stable(&self, __hcx: &mut __CTX,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
match *self {
OnBrokenPipe::Default => {}
OnBrokenPipe::Kill => {}
OnBrokenPipe::Error => {}
OnBrokenPipe::Inherit => {}
}
}
}
};HashStable_Generic)]
844pub enum OnBrokenPipe {
845 Default,
846 Kill,
847 Error,
848 Inherit,
849}
850
851impl PanicStrategy {
852 pub const fn desc_symbol(&self) -> Symbol {
853 match *self {
854 PanicStrategy::Unwind => sym::unwind,
855 PanicStrategy::Abort => sym::abort,
856 PanicStrategy::ImmediateAbort => sym::immediate_abort,
857 }
858 }
859
860 pub fn unwinds(self) -> bool {
861 #[allow(non_exhaustive_omitted_patterns)] match self {
PanicStrategy::Unwind => true,
_ => false,
}matches!(self, PanicStrategy::Unwind)
862 }
863}
864
865#[automatically_derived]
impl ::core::clone::Clone for RelroLevel {
#[inline]
fn clone(&self) -> RelroLevel { *self }
}
#[automatically_derived]
impl ::core::marker::Copy for RelroLevel { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for RelroLevel { }
#[automatically_derived]
impl ::core::cmp::PartialEq for RelroLevel {
#[inline]
fn eq(&self, other: &RelroLevel) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}
#[automatically_derived]
impl ::core::cmp::Eq for RelroLevel {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) -> () {}
}
#[automatically_derived]
impl ::core::hash::Hash for RelroLevel {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}
#[automatically_derived]
impl ::core::fmt::Debug for RelroLevel {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
RelroLevel::Full => "Full",
RelroLevel::Partial => "Partial",
RelroLevel::Off => "Off",
RelroLevel::None => "None",
})
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for RelroLevel {
#[inline]
fn partial_cmp(&self, other: &RelroLevel)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::PartialOrd::partial_cmp(&__self_discr, &__arg1_discr)
}
}
#[automatically_derived]
impl ::core::cmp::Ord for RelroLevel {
#[inline]
fn cmp(&self, other: &RelroLevel) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr)
}
}
impl FromStr for RelroLevel {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"full" => Self::Full,
"partial" => Self::Partial,
"off" => Self::Off,
"none" => Self::None,
_ => {
let all =
["\'full\'", "\'partial\'", "\'off\'",
"\'none\'"].join(", ");
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid {0}: \'{1}\'. allowed values: {2}",
"relro level", s, all))
}));
}
})
}
}
impl RelroLevel {
pub const ALL: &'static [RelroLevel] =
&[RelroLevel::Full, RelroLevel::Partial, RelroLevel::Off,
RelroLevel::None];
pub fn desc(&self) -> &'static str {
match self {
Self::Full => "full",
Self::Partial => "partial",
Self::Off => "off",
Self::None => "none",
}
}
}
impl crate::json::ToJson for RelroLevel {
fn to_json(&self) -> crate::json::Json { self.desc().to_json() }
}
impl<'de> serde::Deserialize<'de> for RelroLevel {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}
impl std::fmt::Display for RelroLevel {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.desc())
}
}crate::target_spec_enum! {
866 pub enum RelroLevel {
867 Full = "full",
868 Partial = "partial",
869 Off = "off",
870 None = "none",
871 }
872
873 parse_error_type = "relro level";
874}
875
876impl IntoDiagArg for PanicStrategy {
877 fn into_diag_arg(self, _: &mut Option<std::path::PathBuf>) -> DiagArgValue {
878 DiagArgValue::Str(Cow::Owned(self.desc().to_string()))
879 }
880}
881
882#[automatically_derived]
impl ::core::clone::Clone for SymbolVisibility {
#[inline]
fn clone(&self) -> SymbolVisibility { *self }
}
#[automatically_derived]
impl ::core::marker::Copy for SymbolVisibility { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for SymbolVisibility { }
#[automatically_derived]
impl ::core::cmp::PartialEq for SymbolVisibility {
#[inline]
fn eq(&self, other: &SymbolVisibility) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}
#[automatically_derived]
impl ::core::cmp::Eq for SymbolVisibility {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) -> () {}
}
#[automatically_derived]
impl ::core::hash::Hash for SymbolVisibility {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}
#[automatically_derived]
impl ::core::fmt::Debug for SymbolVisibility {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
SymbolVisibility::Hidden => "Hidden",
SymbolVisibility::Protected => "Protected",
SymbolVisibility::Interposable => "Interposable",
})
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for SymbolVisibility {
#[inline]
fn partial_cmp(&self, other: &SymbolVisibility)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::PartialOrd::partial_cmp(&__self_discr, &__arg1_discr)
}
}
#[automatically_derived]
impl ::core::cmp::Ord for SymbolVisibility {
#[inline]
fn cmp(&self, other: &SymbolVisibility) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr)
}
}
impl FromStr for SymbolVisibility {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"hidden" => Self::Hidden,
"protected" => Self::Protected,
"interposable" => Self::Interposable,
_ => {
let all =
["\'hidden\'", "\'protected\'",
"\'interposable\'"].join(", ");
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid {0}: \'{1}\'. allowed values: {2}",
"symbol visibility", s, all))
}));
}
})
}
}
impl SymbolVisibility {
pub const ALL: &'static [SymbolVisibility] =
&[SymbolVisibility::Hidden, SymbolVisibility::Protected,
SymbolVisibility::Interposable];
pub fn desc(&self) -> &'static str {
match self {
Self::Hidden => "hidden",
Self::Protected => "protected",
Self::Interposable => "interposable",
}
}
}
impl crate::json::ToJson for SymbolVisibility {
fn to_json(&self) -> crate::json::Json { self.desc().to_json() }
}
impl<'de> serde::Deserialize<'de> for SymbolVisibility {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}
impl std::fmt::Display for SymbolVisibility {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.desc())
}
}crate::target_spec_enum! {
883 pub enum SymbolVisibility {
884 Hidden = "hidden",
885 Protected = "protected",
886 Interposable = "interposable",
887 }
888
889 parse_error_type = "symbol visibility";
890}
891
892#[derive(#[automatically_derived]
impl ::core::clone::Clone for SmallDataThresholdSupport {
#[inline]
fn clone(&self) -> SmallDataThresholdSupport {
match self {
SmallDataThresholdSupport::None =>
SmallDataThresholdSupport::None,
SmallDataThresholdSupport::DefaultForArch =>
SmallDataThresholdSupport::DefaultForArch,
SmallDataThresholdSupport::LlvmModuleFlag(__self_0) =>
SmallDataThresholdSupport::LlvmModuleFlag(::core::clone::Clone::clone(__self_0)),
SmallDataThresholdSupport::LlvmArg(__self_0) =>
SmallDataThresholdSupport::LlvmArg(::core::clone::Clone::clone(__self_0)),
}
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for SmallDataThresholdSupport {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
SmallDataThresholdSupport::None =>
::core::fmt::Formatter::write_str(f, "None"),
SmallDataThresholdSupport::DefaultForArch =>
::core::fmt::Formatter::write_str(f, "DefaultForArch"),
SmallDataThresholdSupport::LlvmModuleFlag(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"LlvmModuleFlag", &__self_0),
SmallDataThresholdSupport::LlvmArg(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"LlvmArg", &__self_0),
}
}
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for SmallDataThresholdSupport {
#[inline]
fn eq(&self, other: &SmallDataThresholdSupport) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(SmallDataThresholdSupport::LlvmModuleFlag(__self_0),
SmallDataThresholdSupport::LlvmModuleFlag(__arg1_0)) =>
__self_0 == __arg1_0,
(SmallDataThresholdSupport::LlvmArg(__self_0),
SmallDataThresholdSupport::LlvmArg(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for SmallDataThresholdSupport {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state);
match self {
SmallDataThresholdSupport::LlvmModuleFlag(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
SmallDataThresholdSupport::LlvmArg(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}Hash)]
893pub enum SmallDataThresholdSupport {
894 None,
895 DefaultForArch,
896 LlvmModuleFlag(StaticCow<str>),
897 LlvmArg(StaticCow<str>),
898}
899
900impl FromStr for SmallDataThresholdSupport {
901 type Err = String;
902
903 fn from_str(s: &str) -> Result<Self, Self::Err> {
904 if s == "none" {
905 Ok(Self::None)
906 } else if s == "default-for-arch" {
907 Ok(Self::DefaultForArch)
908 } else if let Some(flag) = s.strip_prefix("llvm-module-flag=") {
909 Ok(Self::LlvmModuleFlag(flag.to_string().into()))
910 } else if let Some(arg) = s.strip_prefix("llvm-arg=") {
911 Ok(Self::LlvmArg(arg.to_string().into()))
912 } else {
913 Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("\'{0}\' is not a valid value for small-data-threshold-support.",
s))
})format!("'{s}' is not a valid value for small-data-threshold-support."))
914 }
915 }
916}
917
918impl<'de> serde::Deserialize<'de> for SmallDataThresholdSupport {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}crate::json::serde_deserialize_from_str!(SmallDataThresholdSupport);
919impl schemars::JsonSchema for SmallDataThresholdSupport {
920 fn schema_name() -> std::borrow::Cow<'static, str> {
921 "SmallDataThresholdSupport".into()
922 }
923 fn json_schema(_: &mut schemars::SchemaGenerator) -> schemars::Schema {
924 <::schemars::Schema as
::core::convert::TryFrom<_>>::try_from(::serde_json::Value::Object({
let mut object = ::serde_json::Map::new();
let _ =
object.insert(("type").into(),
::serde_json::to_value(&"string").unwrap());
let _ =
object.insert(("pattern").into(),
::serde_json::to_value(&r#"^none|default-for-arch|llvm-module-flag=.+|llvm-arg=.+$"#).unwrap());
;
object
})).unwrap()schemars::json_schema! ({
925 "type": "string",
926 "pattern": r#"^none|default-for-arch|llvm-module-flag=.+|llvm-arg=.+$"#,
927 })
928 .into()
929 }
930}
931
932impl ToJson for SmallDataThresholdSupport {
933 fn to_json(&self) -> Value {
934 match self {
935 Self::None => "none".to_json(),
936 Self::DefaultForArch => "default-for-arch".to_json(),
937 Self::LlvmModuleFlag(flag) => ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("llvm-module-flag={0}", flag))
})format!("llvm-module-flag={flag}").to_json(),
938 Self::LlvmArg(arg) => ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("llvm-arg={0}", arg))
})format!("llvm-arg={arg}").to_json(),
939 }
940 }
941}
942
943#[automatically_derived]
impl ::core::clone::Clone for MergeFunctions {
#[inline]
fn clone(&self) -> MergeFunctions { *self }
}
#[automatically_derived]
impl ::core::marker::Copy for MergeFunctions { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for MergeFunctions { }
#[automatically_derived]
impl ::core::cmp::PartialEq for MergeFunctions {
#[inline]
fn eq(&self, other: &MergeFunctions) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}
#[automatically_derived]
impl ::core::cmp::Eq for MergeFunctions {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) -> () {}
}
#[automatically_derived]
impl ::core::hash::Hash for MergeFunctions {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}
#[automatically_derived]
impl ::core::fmt::Debug for MergeFunctions {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
MergeFunctions::Disabled => "Disabled",
MergeFunctions::Trampolines => "Trampolines",
MergeFunctions::Aliases => "Aliases",
})
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for MergeFunctions {
#[inline]
fn partial_cmp(&self, other: &MergeFunctions)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::PartialOrd::partial_cmp(&__self_discr, &__arg1_discr)
}
}
#[automatically_derived]
impl ::core::cmp::Ord for MergeFunctions {
#[inline]
fn cmp(&self, other: &MergeFunctions) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr)
}
}
impl FromStr for MergeFunctions {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"disabled" => Self::Disabled,
"trampolines" => Self::Trampolines,
"aliases" => Self::Aliases,
_ => {
let all =
["\'disabled\'", "\'trampolines\'",
"\'aliases\'"].join(", ");
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid {0}: \'{1}\'. allowed values: {2}",
"value for merge-functions", s, all))
}));
}
})
}
}
impl MergeFunctions {
pub const ALL: &'static [MergeFunctions] =
&[MergeFunctions::Disabled, MergeFunctions::Trampolines,
MergeFunctions::Aliases];
pub fn desc(&self) -> &'static str {
match self {
Self::Disabled => "disabled",
Self::Trampolines => "trampolines",
Self::Aliases => "aliases",
}
}
}
impl crate::json::ToJson for MergeFunctions {
fn to_json(&self) -> crate::json::Json { self.desc().to_json() }
}
impl<'de> serde::Deserialize<'de> for MergeFunctions {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}
impl std::fmt::Display for MergeFunctions {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.desc())
}
}crate::target_spec_enum! {
944 pub enum MergeFunctions {
945 Disabled = "disabled",
946 Trampolines = "trampolines",
947 Aliases = "aliases",
948 }
949
950 parse_error_type = "value for merge-functions";
951}
952
953#[automatically_derived]
impl ::core::clone::Clone for RelocModel {
#[inline]
fn clone(&self) -> RelocModel { *self }
}
#[automatically_derived]
impl ::core::marker::Copy for RelocModel { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for RelocModel { }
#[automatically_derived]
impl ::core::cmp::PartialEq for RelocModel {
#[inline]
fn eq(&self, other: &RelocModel) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}
#[automatically_derived]
impl ::core::cmp::Eq for RelocModel {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) -> () {}
}
#[automatically_derived]
impl ::core::hash::Hash for RelocModel {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}
#[automatically_derived]
impl ::core::fmt::Debug for RelocModel {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
RelocModel::Static => "Static",
RelocModel::Pic => "Pic",
RelocModel::Pie => "Pie",
RelocModel::DynamicNoPic => "DynamicNoPic",
RelocModel::Ropi => "Ropi",
RelocModel::Rwpi => "Rwpi",
RelocModel::RopiRwpi => "RopiRwpi",
})
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for RelocModel {
#[inline]
fn partial_cmp(&self, other: &RelocModel)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::PartialOrd::partial_cmp(&__self_discr, &__arg1_discr)
}
}
#[automatically_derived]
impl ::core::cmp::Ord for RelocModel {
#[inline]
fn cmp(&self, other: &RelocModel) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr)
}
}
impl FromStr for RelocModel {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"static" => Self::Static,
"pic" => Self::Pic,
"pie" => Self::Pie,
"dynamic-no-pic" => Self::DynamicNoPic,
"ropi" => Self::Ropi,
"rwpi" => Self::Rwpi,
"ropi-rwpi" => Self::RopiRwpi,
_ => {
let all =
["\'static\'", "\'pic\'", "\'pie\'", "\'dynamic-no-pic\'",
"\'ropi\'", "\'rwpi\'", "\'ropi-rwpi\'"].join(", ");
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid {0}: \'{1}\'. allowed values: {2}",
"relocation model", s, all))
}));
}
})
}
}
impl RelocModel {
pub const ALL: &'static [RelocModel] =
&[RelocModel::Static, RelocModel::Pic, RelocModel::Pie,
RelocModel::DynamicNoPic, RelocModel::Ropi,
RelocModel::Rwpi, RelocModel::RopiRwpi];
pub fn desc(&self) -> &'static str {
match self {
Self::Static => "static",
Self::Pic => "pic",
Self::Pie => "pie",
Self::DynamicNoPic => "dynamic-no-pic",
Self::Ropi => "ropi",
Self::Rwpi => "rwpi",
Self::RopiRwpi => "ropi-rwpi",
}
}
}
impl crate::json::ToJson for RelocModel {
fn to_json(&self) -> crate::json::Json { self.desc().to_json() }
}
impl<'de> serde::Deserialize<'de> for RelocModel {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}
impl std::fmt::Display for RelocModel {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.desc())
}
}crate::target_spec_enum! {
954 pub enum RelocModel {
955 Static = "static",
956 Pic = "pic",
957 Pie = "pie",
958 DynamicNoPic = "dynamic-no-pic",
959 Ropi = "ropi",
960 Rwpi = "rwpi",
961 RopiRwpi = "ropi-rwpi",
962 }
963
964 parse_error_type = "relocation model";
965}
966
967impl RelocModel {
968 pub const fn desc_symbol(&self) -> Symbol {
969 match *self {
970 RelocModel::Static => kw::Static,
971 RelocModel::Pic => sym::pic,
972 RelocModel::Pie => sym::pie,
973 RelocModel::DynamicNoPic => sym::dynamic_no_pic,
974 RelocModel::Ropi => sym::ropi,
975 RelocModel::Rwpi => sym::rwpi,
976 RelocModel::RopiRwpi => sym::ropi_rwpi,
977 }
978 }
979}
980
981#[automatically_derived]
impl ::core::clone::Clone for CodeModel {
#[inline]
fn clone(&self) -> CodeModel { *self }
}
#[automatically_derived]
impl ::core::marker::Copy for CodeModel { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for CodeModel { }
#[automatically_derived]
impl ::core::cmp::PartialEq for CodeModel {
#[inline]
fn eq(&self, other: &CodeModel) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}
#[automatically_derived]
impl ::core::cmp::Eq for CodeModel {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) -> () {}
}
#[automatically_derived]
impl ::core::hash::Hash for CodeModel {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}
#[automatically_derived]
impl ::core::fmt::Debug for CodeModel {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
CodeModel::Tiny => "Tiny",
CodeModel::Small => "Small",
CodeModel::Kernel => "Kernel",
CodeModel::Medium => "Medium",
CodeModel::Large => "Large",
})
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for CodeModel {
#[inline]
fn partial_cmp(&self, other: &CodeModel)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::PartialOrd::partial_cmp(&__self_discr, &__arg1_discr)
}
}
#[automatically_derived]
impl ::core::cmp::Ord for CodeModel {
#[inline]
fn cmp(&self, other: &CodeModel) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr)
}
}
impl FromStr for CodeModel {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"tiny" => Self::Tiny,
"small" => Self::Small,
"kernel" => Self::Kernel,
"medium" => Self::Medium,
"large" => Self::Large,
_ => {
let all =
["\'tiny\'", "\'small\'", "\'kernel\'", "\'medium\'",
"\'large\'"].join(", ");
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid {0}: \'{1}\'. allowed values: {2}",
"code model", s, all))
}));
}
})
}
}
impl CodeModel {
pub const ALL: &'static [CodeModel] =
&[CodeModel::Tiny, CodeModel::Small, CodeModel::Kernel,
CodeModel::Medium, CodeModel::Large];
pub fn desc(&self) -> &'static str {
match self {
Self::Tiny => "tiny",
Self::Small => "small",
Self::Kernel => "kernel",
Self::Medium => "medium",
Self::Large => "large",
}
}
}
impl crate::json::ToJson for CodeModel {
fn to_json(&self) -> crate::json::Json { self.desc().to_json() }
}
impl<'de> serde::Deserialize<'de> for CodeModel {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}
impl std::fmt::Display for CodeModel {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.desc())
}
}crate::target_spec_enum! {
982 pub enum CodeModel {
983 Tiny = "tiny",
984 Small = "small",
985 Kernel = "kernel",
986 Medium = "medium",
987 Large = "large",
988 }
989
990 parse_error_type = "code model";
991}
992
993#[automatically_derived]
impl ::core::clone::Clone for FloatAbi {
#[inline]
fn clone(&self) -> FloatAbi { *self }
}
#[automatically_derived]
impl ::core::marker::Copy for FloatAbi { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for FloatAbi { }
#[automatically_derived]
impl ::core::cmp::PartialEq for FloatAbi {
#[inline]
fn eq(&self, other: &FloatAbi) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}
#[automatically_derived]
impl ::core::cmp::Eq for FloatAbi {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) -> () {}
}
#[automatically_derived]
impl ::core::hash::Hash for FloatAbi {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}
#[automatically_derived]
impl ::core::fmt::Debug for FloatAbi {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
FloatAbi::Soft => "Soft",
FloatAbi::Hard => "Hard",
})
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for FloatAbi {
#[inline]
fn partial_cmp(&self, other: &FloatAbi)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::PartialOrd::partial_cmp(&__self_discr, &__arg1_discr)
}
}
#[automatically_derived]
impl ::core::cmp::Ord for FloatAbi {
#[inline]
fn cmp(&self, other: &FloatAbi) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr)
}
}
impl FromStr for FloatAbi {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"soft" => Self::Soft,
"hard" => Self::Hard,
_ => {
let all = ["\'soft\'", "\'hard\'"].join(", ");
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid {0}: \'{1}\'. allowed values: {2}",
"float abi", s, all))
}));
}
})
}
}
impl FloatAbi {
pub const ALL: &'static [FloatAbi] = &[FloatAbi::Soft, FloatAbi::Hard];
pub fn desc(&self) -> &'static str {
match self { Self::Soft => "soft", Self::Hard => "hard", }
}
}
impl crate::json::ToJson for FloatAbi {
fn to_json(&self) -> crate::json::Json { self.desc().to_json() }
}
impl<'de> serde::Deserialize<'de> for FloatAbi {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}
impl std::fmt::Display for FloatAbi {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.desc())
}
}crate::target_spec_enum! {
994 pub enum FloatAbi {
996 Soft = "soft",
997 Hard = "hard",
998 }
999
1000 parse_error_type = "float abi";
1001}
1002
1003#[automatically_derived]
impl ::core::clone::Clone for RustcAbi {
#[inline]
fn clone(&self) -> RustcAbi { *self }
}
#[automatically_derived]
impl ::core::marker::Copy for RustcAbi { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for RustcAbi { }
#[automatically_derived]
impl ::core::cmp::PartialEq for RustcAbi {
#[inline]
fn eq(&self, other: &RustcAbi) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}
#[automatically_derived]
impl ::core::cmp::Eq for RustcAbi {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) -> () {}
}
#[automatically_derived]
impl ::core::hash::Hash for RustcAbi {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}
#[automatically_derived]
impl ::core::fmt::Debug for RustcAbi {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
RustcAbi::X86Sse2 => "X86Sse2",
RustcAbi::X86Softfloat => "X86Softfloat",
})
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for RustcAbi {
#[inline]
fn partial_cmp(&self, other: &RustcAbi)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::PartialOrd::partial_cmp(&__self_discr, &__arg1_discr)
}
}
#[automatically_derived]
impl ::core::cmp::Ord for RustcAbi {
#[inline]
fn cmp(&self, other: &RustcAbi) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr)
}
}
impl FromStr for RustcAbi {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"x86-sse2" => Self::X86Sse2,
"x86-softfloat" => Self::X86Softfloat,
_ => {
let all = ["\'x86-sse2\'", "\'x86-softfloat\'"].join(", ");
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid {0}: \'{1}\'. allowed values: {2}",
"rustc abi", s, all))
}));
}
})
}
}
impl RustcAbi {
pub const ALL: &'static [RustcAbi] =
&[RustcAbi::X86Sse2, RustcAbi::X86Softfloat];
pub fn desc(&self) -> &'static str {
match self {
Self::X86Sse2 => "x86-sse2",
Self::X86Softfloat => "x86-softfloat",
}
}
}
impl crate::json::ToJson for RustcAbi {
fn to_json(&self) -> crate::json::Json { self.desc().to_json() }
}
impl<'de> serde::Deserialize<'de> for RustcAbi {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}
impl std::fmt::Display for RustcAbi {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.desc())
}
}crate::target_spec_enum! {
1004 pub enum RustcAbi {
1006 X86Sse2 = "x86-sse2",
1008 X86Softfloat = "x86-softfloat",
1010 }
1011
1012 parse_error_type = "rustc abi";
1013}
1014
1015#[automatically_derived]
impl ::core::clone::Clone for TlsModel {
#[inline]
fn clone(&self) -> TlsModel { *self }
}
#[automatically_derived]
impl ::core::marker::Copy for TlsModel { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for TlsModel { }
#[automatically_derived]
impl ::core::cmp::PartialEq for TlsModel {
#[inline]
fn eq(&self, other: &TlsModel) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}
#[automatically_derived]
impl ::core::cmp::Eq for TlsModel {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) -> () {}
}
#[automatically_derived]
impl ::core::hash::Hash for TlsModel {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}
#[automatically_derived]
impl ::core::fmt::Debug for TlsModel {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
TlsModel::GeneralDynamic => "GeneralDynamic",
TlsModel::LocalDynamic => "LocalDynamic",
TlsModel::InitialExec => "InitialExec",
TlsModel::LocalExec => "LocalExec",
TlsModel::Emulated => "Emulated",
})
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for TlsModel {
#[inline]
fn partial_cmp(&self, other: &TlsModel)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::PartialOrd::partial_cmp(&__self_discr, &__arg1_discr)
}
}
#[automatically_derived]
impl ::core::cmp::Ord for TlsModel {
#[inline]
fn cmp(&self, other: &TlsModel) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr)
}
}
impl FromStr for TlsModel {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"global-dynamic" => Self::GeneralDynamic,
"local-dynamic" => Self::LocalDynamic,
"initial-exec" => Self::InitialExec,
"local-exec" => Self::LocalExec,
"emulated" => Self::Emulated,
_ => {
let all =
["\'global-dynamic\'", "\'local-dynamic\'",
"\'initial-exec\'", "\'local-exec\'",
"\'emulated\'"].join(", ");
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid {0}: \'{1}\'. allowed values: {2}",
"TLS model", s, all))
}));
}
})
}
}
impl TlsModel {
pub const ALL: &'static [TlsModel] =
&[TlsModel::GeneralDynamic, TlsModel::LocalDynamic,
TlsModel::InitialExec, TlsModel::LocalExec,
TlsModel::Emulated];
pub fn desc(&self) -> &'static str {
match self {
Self::GeneralDynamic => "global-dynamic",
Self::LocalDynamic => "local-dynamic",
Self::InitialExec => "initial-exec",
Self::LocalExec => "local-exec",
Self::Emulated => "emulated",
}
}
}
impl crate::json::ToJson for TlsModel {
fn to_json(&self) -> crate::json::Json { self.desc().to_json() }
}
impl<'de> serde::Deserialize<'de> for TlsModel {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}
impl std::fmt::Display for TlsModel {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.desc())
}
}crate::target_spec_enum! {
1016 pub enum TlsModel {
1017 GeneralDynamic = "global-dynamic",
1018 LocalDynamic = "local-dynamic",
1019 InitialExec = "initial-exec",
1020 LocalExec = "local-exec",
1021 Emulated = "emulated",
1022 }
1023
1024 parse_error_type = "TLS model";
1025}
1026
1027#[automatically_derived]
impl ::core::clone::Clone for LinkOutputKind {
#[inline]
fn clone(&self) -> LinkOutputKind { *self }
}
#[automatically_derived]
impl ::core::marker::Copy for LinkOutputKind { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for LinkOutputKind { }
#[automatically_derived]
impl ::core::cmp::PartialEq for LinkOutputKind {
#[inline]
fn eq(&self, other: &LinkOutputKind) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}
#[automatically_derived]
impl ::core::cmp::Eq for LinkOutputKind {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) -> () {}
}
#[automatically_derived]
impl ::core::hash::Hash for LinkOutputKind {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}
#[automatically_derived]
impl ::core::fmt::Debug for LinkOutputKind {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
LinkOutputKind::DynamicNoPicExe => "DynamicNoPicExe",
LinkOutputKind::DynamicPicExe => "DynamicPicExe",
LinkOutputKind::StaticNoPicExe => "StaticNoPicExe",
LinkOutputKind::StaticPicExe => "StaticPicExe",
LinkOutputKind::DynamicDylib => "DynamicDylib",
LinkOutputKind::StaticDylib => "StaticDylib",
LinkOutputKind::WasiReactorExe => "WasiReactorExe",
})
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for LinkOutputKind {
#[inline]
fn partial_cmp(&self, other: &LinkOutputKind)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::PartialOrd::partial_cmp(&__self_discr, &__arg1_discr)
}
}
#[automatically_derived]
impl ::core::cmp::Ord for LinkOutputKind {
#[inline]
fn cmp(&self, other: &LinkOutputKind) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr)
}
}
impl FromStr for LinkOutputKind {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"dynamic-nopic-exe" => Self::DynamicNoPicExe,
"dynamic-pic-exe" => Self::DynamicPicExe,
"static-nopic-exe" => Self::StaticNoPicExe,
"static-pic-exe" => Self::StaticPicExe,
"dynamic-dylib" => Self::DynamicDylib,
"static-dylib" => Self::StaticDylib,
"wasi-reactor-exe" => Self::WasiReactorExe,
_ => {
let all =
["\'dynamic-nopic-exe\'", "\'dynamic-pic-exe\'",
"\'static-nopic-exe\'", "\'static-pic-exe\'",
"\'dynamic-dylib\'", "\'static-dylib\'",
"\'wasi-reactor-exe\'"].join(", ");
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid {0}: \'{1}\'. allowed values: {2}",
"CRT object kind", s, all))
}));
}
})
}
}
impl LinkOutputKind {
pub const ALL: &'static [LinkOutputKind] =
&[LinkOutputKind::DynamicNoPicExe, LinkOutputKind::DynamicPicExe,
LinkOutputKind::StaticNoPicExe,
LinkOutputKind::StaticPicExe, LinkOutputKind::DynamicDylib,
LinkOutputKind::StaticDylib,
LinkOutputKind::WasiReactorExe];
pub fn desc(&self) -> &'static str {
match self {
Self::DynamicNoPicExe => "dynamic-nopic-exe",
Self::DynamicPicExe => "dynamic-pic-exe",
Self::StaticNoPicExe => "static-nopic-exe",
Self::StaticPicExe => "static-pic-exe",
Self::DynamicDylib => "dynamic-dylib",
Self::StaticDylib => "static-dylib",
Self::WasiReactorExe => "wasi-reactor-exe",
}
}
}
impl crate::json::ToJson for LinkOutputKind {
fn to_json(&self) -> crate::json::Json { self.desc().to_json() }
}
impl<'de> serde::Deserialize<'de> for LinkOutputKind {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}
impl std::fmt::Display for LinkOutputKind {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.desc())
}
}crate::target_spec_enum! {
1028 pub enum LinkOutputKind {
1030 DynamicNoPicExe = "dynamic-nopic-exe",
1032 DynamicPicExe = "dynamic-pic-exe",
1034 StaticNoPicExe = "static-nopic-exe",
1036 StaticPicExe = "static-pic-exe",
1038 DynamicDylib = "dynamic-dylib",
1040 StaticDylib = "static-dylib",
1042 WasiReactorExe = "wasi-reactor-exe",
1044 }
1045
1046 parse_error_type = "CRT object kind";
1047}
1048
1049impl LinkOutputKind {
1050 pub fn can_link_dylib(self) -> bool {
1051 match self {
1052 LinkOutputKind::StaticNoPicExe | LinkOutputKind::StaticPicExe => false,
1053 LinkOutputKind::DynamicNoPicExe
1054 | LinkOutputKind::DynamicPicExe
1055 | LinkOutputKind::DynamicDylib
1056 | LinkOutputKind::StaticDylib
1057 | LinkOutputKind::WasiReactorExe => true,
1058 }
1059 }
1060}
1061
1062pub type LinkArgs = BTreeMap<LinkerFlavor, Vec<StaticCow<str>>>;
1063pub type LinkArgsCli = BTreeMap<LinkerFlavorCli, Vec<StaticCow<str>>>;
1064
1065#[automatically_derived]
impl ::core::clone::Clone for DebuginfoKind {
#[inline]
fn clone(&self) -> DebuginfoKind { *self }
}
#[automatically_derived]
impl ::core::marker::Copy for DebuginfoKind { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for DebuginfoKind { }
#[automatically_derived]
impl ::core::cmp::PartialEq for DebuginfoKind {
#[inline]
fn eq(&self, other: &DebuginfoKind) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}
#[automatically_derived]
impl ::core::cmp::Eq for DebuginfoKind {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) -> () {}
}
#[automatically_derived]
impl ::core::hash::Hash for DebuginfoKind {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}
#[automatically_derived]
impl ::core::fmt::Debug for DebuginfoKind {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
DebuginfoKind::Dwarf => "Dwarf",
DebuginfoKind::DwarfDsym => "DwarfDsym",
DebuginfoKind::Pdb => "Pdb",
})
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for DebuginfoKind {
#[inline]
fn partial_cmp(&self, other: &DebuginfoKind)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::PartialOrd::partial_cmp(&__self_discr, &__arg1_discr)
}
}
#[automatically_derived]
impl ::core::cmp::Ord for DebuginfoKind {
#[inline]
fn cmp(&self, other: &DebuginfoKind) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr)
}
}
#[automatically_derived]
impl ::core::default::Default for DebuginfoKind {
#[inline]
fn default() -> DebuginfoKind { Self::Dwarf }
}
impl FromStr for DebuginfoKind {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"dwarf" => Self::Dwarf,
"dwarf-dsym" => Self::DwarfDsym,
"pdb" => Self::Pdb,
_ => {
let all =
["\'dwarf\'", "\'dwarf-dsym\'", "\'pdb\'"].join(", ");
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid {0}: \'{1}\'. allowed values: {2}",
"debuginfo kind", s, all))
}));
}
})
}
}
impl DebuginfoKind {
pub const ALL: &'static [DebuginfoKind] =
&[DebuginfoKind::Dwarf, DebuginfoKind::DwarfDsym, DebuginfoKind::Pdb];
pub fn desc(&self) -> &'static str {
match self {
Self::Dwarf => "dwarf",
Self::DwarfDsym => "dwarf-dsym",
Self::Pdb => "pdb",
}
}
}
impl crate::json::ToJson for DebuginfoKind {
fn to_json(&self) -> crate::json::Json { self.desc().to_json() }
}
impl<'de> serde::Deserialize<'de> for DebuginfoKind {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}
impl std::fmt::Display for DebuginfoKind {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.desc())
}
}crate::target_spec_enum! {
1066 #[derive(Default)]
1071 pub enum DebuginfoKind {
1072 #[default]
1074 Dwarf = "dwarf",
1075 DwarfDsym = "dwarf-dsym",
1077 Pdb = "pdb",
1079 }
1080
1081 parse_error_type = "debuginfo kind";
1082}
1083
1084#[automatically_derived]
impl ::core::clone::Clone for SplitDebuginfo {
#[inline]
fn clone(&self) -> SplitDebuginfo { *self }
}
#[automatically_derived]
impl ::core::marker::Copy for SplitDebuginfo { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for SplitDebuginfo { }
#[automatically_derived]
impl ::core::cmp::PartialEq for SplitDebuginfo {
#[inline]
fn eq(&self, other: &SplitDebuginfo) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}
#[automatically_derived]
impl ::core::cmp::Eq for SplitDebuginfo {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) -> () {}
}
#[automatically_derived]
impl ::core::hash::Hash for SplitDebuginfo {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}
#[automatically_derived]
impl ::core::fmt::Debug for SplitDebuginfo {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
SplitDebuginfo::Off => "Off",
SplitDebuginfo::Packed => "Packed",
SplitDebuginfo::Unpacked => "Unpacked",
})
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for SplitDebuginfo {
#[inline]
fn partial_cmp(&self, other: &SplitDebuginfo)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::PartialOrd::partial_cmp(&__self_discr, &__arg1_discr)
}
}
#[automatically_derived]
impl ::core::cmp::Ord for SplitDebuginfo {
#[inline]
fn cmp(&self, other: &SplitDebuginfo) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr)
}
}
#[automatically_derived]
impl ::core::default::Default for SplitDebuginfo {
#[inline]
fn default() -> SplitDebuginfo { Self::Off }
}
impl FromStr for SplitDebuginfo {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"off" => Self::Off,
"packed" => Self::Packed,
"unpacked" => Self::Unpacked,
_ => {
let all =
["\'off\'", "\'packed\'", "\'unpacked\'"].join(", ");
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid {0}: \'{1}\'. allowed values: {2}",
"split debuginfo", s, all))
}));
}
})
}
}
impl SplitDebuginfo {
pub const ALL: &'static [SplitDebuginfo] =
&[SplitDebuginfo::Off, SplitDebuginfo::Packed,
SplitDebuginfo::Unpacked];
pub fn desc(&self) -> &'static str {
match self {
Self::Off => "off",
Self::Packed => "packed",
Self::Unpacked => "unpacked",
}
}
}
impl crate::json::ToJson for SplitDebuginfo {
fn to_json(&self) -> crate::json::Json { self.desc().to_json() }
}
impl<'de> serde::Deserialize<'de> for SplitDebuginfo {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}
impl std::fmt::Display for SplitDebuginfo {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.desc())
}
}crate::target_spec_enum! {
1085 #[derive(Default)]
1086 pub enum SplitDebuginfo {
1087 #[default]
1095 Off = "off",
1096
1097 Packed = "packed",
1104
1105 Unpacked = "unpacked",
1112 }
1113
1114 parse_error_type = "split debuginfo";
1115}
1116
1117impl ::rustc_error_messages::IntoDiagArg for SplitDebuginfo {
fn into_diag_arg(self, path: &mut Option<std::path::PathBuf>)
-> ::rustc_error_messages::DiagArgValue {
self.to_string().into_diag_arg(path)
}
}into_diag_arg_using_display!(SplitDebuginfo);
1118
1119#[derive(#[automatically_derived]
impl ::core::clone::Clone for StackProbeType {
#[inline]
fn clone(&self) -> StackProbeType {
match self {
StackProbeType::None => StackProbeType::None,
StackProbeType::Inline => StackProbeType::Inline,
StackProbeType::Call => StackProbeType::Call,
StackProbeType::InlineOrCall {
min_llvm_version_for_inline: __self_0 } =>
StackProbeType::InlineOrCall {
min_llvm_version_for_inline: ::core::clone::Clone::clone(__self_0),
},
}
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for StackProbeType {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
StackProbeType::None =>
::core::fmt::Formatter::write_str(f, "None"),
StackProbeType::Inline =>
::core::fmt::Formatter::write_str(f, "Inline"),
StackProbeType::Call =>
::core::fmt::Formatter::write_str(f, "Call"),
StackProbeType::InlineOrCall {
min_llvm_version_for_inline: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"InlineOrCall", "min_llvm_version_for_inline", &__self_0),
}
}
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for StackProbeType {
#[inline]
fn eq(&self, other: &StackProbeType) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(StackProbeType::InlineOrCall {
min_llvm_version_for_inline: __self_0 },
StackProbeType::InlineOrCall {
min_llvm_version_for_inline: __arg1_0 }) =>
__self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for StackProbeType {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) -> () {
let _: ::core::cmp::AssertParamIsEq<(u32, u32, u32)>;
}
}Eq, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
{
#[allow(unused_extern_crates, clippy :: useless_attribute)]
extern crate serde as _serde;
;
#[automatically_derived]
impl<'de> _serde::Deserialize<'de> for StackProbeType {
fn deserialize<__D>(__deserializer: __D)
-> _serde::__private228::Result<Self, __D::Error> where
__D: _serde::Deserializer<'de> {
#[allow(non_camel_case_types)]
#[doc(hidden)]
enum __Field { __field0, __field1, __field2, __field3, }
#[doc(hidden)]
struct __FieldVisitor;
#[automatically_derived]
impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
type Value = __Field;
fn expecting(&self,
__formatter: &mut _serde::__private228::Formatter)
-> _serde::__private228::fmt::Result {
_serde::__private228::Formatter::write_str(__formatter,
"variant identifier")
}
fn visit_u64<__E>(self, __value: u64)
-> _serde::__private228::Result<Self::Value, __E> where
__E: _serde::de::Error {
match __value {
0u64 => _serde::__private228::Ok(__Field::__field0),
1u64 => _serde::__private228::Ok(__Field::__field1),
2u64 => _serde::__private228::Ok(__Field::__field2),
3u64 => _serde::__private228::Ok(__Field::__field3),
_ =>
_serde::__private228::Err(_serde::de::Error::invalid_value(_serde::de::Unexpected::Unsigned(__value),
&"variant index 0 <= i < 4")),
}
}
fn visit_str<__E>(self, __value: &str)
-> _serde::__private228::Result<Self::Value, __E> where
__E: _serde::de::Error {
match __value {
"none" => _serde::__private228::Ok(__Field::__field0),
"inline" => _serde::__private228::Ok(__Field::__field1),
"call" => _serde::__private228::Ok(__Field::__field2),
"inline-or-call" =>
_serde::__private228::Ok(__Field::__field3),
_ => {
_serde::__private228::Err(_serde::de::Error::unknown_variant(__value,
VARIANTS))
}
}
}
fn visit_bytes<__E>(self, __value: &[u8])
-> _serde::__private228::Result<Self::Value, __E> where
__E: _serde::de::Error {
match __value {
b"none" => _serde::__private228::Ok(__Field::__field0),
b"inline" => _serde::__private228::Ok(__Field::__field1),
b"call" => _serde::__private228::Ok(__Field::__field2),
b"inline-or-call" =>
_serde::__private228::Ok(__Field::__field3),
_ => {
let __value =
&_serde::__private228::from_utf8_lossy(__value);
_serde::__private228::Err(_serde::de::Error::unknown_variant(__value,
VARIANTS))
}
}
}
}
#[automatically_derived]
impl<'de> _serde::Deserialize<'de> for __Field {
#[inline]
fn deserialize<__D>(__deserializer: __D)
-> _serde::__private228::Result<Self, __D::Error> where
__D: _serde::Deserializer<'de> {
_serde::Deserializer::deserialize_identifier(__deserializer,
__FieldVisitor)
}
}
#[doc(hidden)]
const VARIANTS: &'static [&'static str] =
&["none", "inline", "call", "inline-or-call"];
let (__tag, __content) =
_serde::Deserializer::deserialize_any(__deserializer,
_serde::__private228::de::TaggedContentVisitor::<__Field>::new("kind",
"internally tagged enum StackProbeType"))?;
let __deserializer =
_serde::__private228::de::ContentDeserializer::<__D::Error>::new(__content);
match __tag {
__Field::__field0 => {
_serde::Deserializer::deserialize_any(__deserializer,
_serde::__private228::de::InternallyTaggedUnitVisitor::new("StackProbeType",
"None"))?;
_serde::__private228::Ok(StackProbeType::None)
}
__Field::__field1 => {
_serde::Deserializer::deserialize_any(__deserializer,
_serde::__private228::de::InternallyTaggedUnitVisitor::new("StackProbeType",
"Inline"))?;
_serde::__private228::Ok(StackProbeType::Inline)
}
__Field::__field2 => {
_serde::Deserializer::deserialize_any(__deserializer,
_serde::__private228::de::InternallyTaggedUnitVisitor::new("StackProbeType",
"Call"))?;
_serde::__private228::Ok(StackProbeType::Call)
}
__Field::__field3 => {
#[allow(non_camel_case_types)]
#[doc(hidden)]
enum __Field { __field0, __ignore, }
#[doc(hidden)]
struct __FieldVisitor;
#[automatically_derived]
impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
type Value = __Field;
fn expecting(&self,
__formatter: &mut _serde::__private228::Formatter)
-> _serde::__private228::fmt::Result {
_serde::__private228::Formatter::write_str(__formatter,
"field identifier")
}
fn visit_u64<__E>(self, __value: u64)
-> _serde::__private228::Result<Self::Value, __E> where
__E: _serde::de::Error {
match __value {
0u64 => _serde::__private228::Ok(__Field::__field0),
_ => _serde::__private228::Ok(__Field::__ignore),
}
}
fn visit_str<__E>(self, __value: &str)
-> _serde::__private228::Result<Self::Value, __E> where
__E: _serde::de::Error {
match __value {
"min-llvm-version-for-inline" =>
_serde::__private228::Ok(__Field::__field0),
_ => { _serde::__private228::Ok(__Field::__ignore) }
}
}
fn visit_bytes<__E>(self, __value: &[u8])
-> _serde::__private228::Result<Self::Value, __E> where
__E: _serde::de::Error {
match __value {
b"min-llvm-version-for-inline" =>
_serde::__private228::Ok(__Field::__field0),
_ => { _serde::__private228::Ok(__Field::__ignore) }
}
}
}
#[automatically_derived]
impl<'de> _serde::Deserialize<'de> for __Field {
#[inline]
fn deserialize<__D>(__deserializer: __D)
-> _serde::__private228::Result<Self, __D::Error> where
__D: _serde::Deserializer<'de> {
_serde::Deserializer::deserialize_identifier(__deserializer,
__FieldVisitor)
}
}
#[doc(hidden)]
struct __Visitor<'de> {
marker: _serde::__private228::PhantomData<StackProbeType>,
lifetime: _serde::__private228::PhantomData<&'de ()>,
}
#[automatically_derived]
impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
type Value = StackProbeType;
fn expecting(&self,
__formatter: &mut _serde::__private228::Formatter)
-> _serde::__private228::fmt::Result {
_serde::__private228::Formatter::write_str(__formatter,
"struct variant StackProbeType::InlineOrCall")
}
#[inline]
fn visit_seq<__A>(self, mut __seq: __A)
-> _serde::__private228::Result<Self::Value, __A::Error>
where __A: _serde::de::SeqAccess<'de> {
let __field0 =
match _serde::de::SeqAccess::next_element::<(u32, u32,
u32)>(&mut __seq)? {
_serde::__private228::Some(__value) => __value,
_serde::__private228::None =>
return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
&"struct variant StackProbeType::InlineOrCall with 1 element")),
};
_serde::__private228::Ok(StackProbeType::InlineOrCall {
min_llvm_version_for_inline: __field0,
})
}
#[inline]
fn visit_map<__A>(self, mut __map: __A)
-> _serde::__private228::Result<Self::Value, __A::Error>
where __A: _serde::de::MapAccess<'de> {
let mut __field0:
_serde::__private228::Option<(u32, u32, u32)> =
_serde::__private228::None;
while let _serde::__private228::Some(__key) =
_serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
match __key {
__Field::__field0 => {
if _serde::__private228::Option::is_some(&__field0) {
return _serde::__private228::Err(<__A::Error as
_serde::de::Error>::duplicate_field("min-llvm-version-for-inline"));
}
__field0 =
_serde::__private228::Some(_serde::de::MapAccess::next_value::<(u32,
u32, u32)>(&mut __map)?);
}
_ => {
let _ =
_serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
}
}
}
let __field0 =
match __field0 {
_serde::__private228::Some(__field0) => __field0,
_serde::__private228::None =>
_serde::__private228::de::missing_field("min-llvm-version-for-inline")?,
};
_serde::__private228::Ok(StackProbeType::InlineOrCall {
min_llvm_version_for_inline: __field0,
})
}
}
#[doc(hidden)]
const FIELDS: &'static [&'static str] =
&["min-llvm-version-for-inline"];
_serde::Deserializer::deserialize_any(__deserializer,
__Visitor {
marker: _serde::__private228::PhantomData::<StackProbeType>,
lifetime: _serde::__private228::PhantomData,
})
}
}
}
}
};serde_derive::Deserialize, const _: () =
{
#[automatically_derived]
#[allow(unused_braces)]
impl schemars::JsonSchema for StackProbeType {
fn schema_name()
-> schemars::_private::alloc::borrow::Cow<'static, str> {
schemars::_private::alloc::borrow::Cow::Borrowed("StackProbeType")
}
fn schema_id()
-> schemars::_private::alloc::borrow::Cow<'static, str> {
schemars::_private::alloc::borrow::Cow::Borrowed("rustc_target::spec::StackProbeType")
}
fn json_schema(generator: &mut schemars::SchemaGenerator)
-> schemars::Schema {
{
{
let mut map = schemars::_private::serde_json::Map::new();
map.insert("oneOf".into(),
schemars::_private::serde_json::Value::Array({
let mut enum_values =
schemars::_private::alloc::vec::Vec::new();
enum_values.push({
let mut schema = generator.subschema_for::<()>();
schemars::_private::apply_internal_enum_variant_tag(&mut schema,
"kind", "none", false);
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"title",
{
const TITLE: &str =
schemars::_private::get_title_and_description("Don\'t emit any stack probes.").0;
TITLE
});
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"description",
{
const DESCRIPTION: &str =
schemars::_private::get_title_and_description("Don\'t emit any stack probes.").1;
DESCRIPTION
});
schema
}.to_value());
enum_values.push({
let mut schema = generator.subschema_for::<()>();
schemars::_private::apply_internal_enum_variant_tag(&mut schema,
"kind", "inline", false);
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"title",
{
const TITLE: &str =
schemars::_private::get_title_and_description("It is harmless to use this option even on targets that do not have backend support for\nstack probes as the failure mode is the same as if no stack-probe option was specified in\nthe first place.").0;
TITLE
});
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"description",
{
const DESCRIPTION: &str =
schemars::_private::get_title_and_description("It is harmless to use this option even on targets that do not have backend support for\nstack probes as the failure mode is the same as if no stack-probe option was specified in\nthe first place.").1;
DESCRIPTION
});
schema
}.to_value());
enum_values.push({
let mut schema = generator.subschema_for::<()>();
schemars::_private::apply_internal_enum_variant_tag(&mut schema,
"kind", "call", false);
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"title",
{
const TITLE: &str =
schemars::_private::get_title_and_description("Call `__rust_probestack` whenever stack needs to be probed.").0;
TITLE
});
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"description",
{
const DESCRIPTION: &str =
schemars::_private::get_title_and_description("Call `__rust_probestack` whenever stack needs to be probed.").1;
DESCRIPTION
});
schema
}.to_value());
enum_values.push({
let mut schema =
<::schemars::Schema as
::core::convert::TryFrom<_>>::try_from(::serde_json::Value::Object({
let mut object = ::serde_json::Map::new();
let _ =
object.insert(("type").into(),
::serde_json::to_value(&"object").unwrap());
;
object
})).unwrap();
{
schemars::_private::insert_object_property(&mut schema,
"min-llvm-version-for-inline",
generator.contract().is_deserialize() &&
<(u32, u32, u32) as
schemars::JsonSchema>::_schemars_private_is_option(),
{ generator.subschema_for::<(u32, u32, u32)>() });
}
schemars::_private::apply_internal_enum_variant_tag(&mut schema,
"kind", "inline-or-call", false);
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"title",
{
const TITLE: &str =
schemars::_private::get_title_and_description("Use inline option for LLVM versions later than specified in `min_llvm_version_for_inline`\nand call `__rust_probestack` otherwise.").0;
TITLE
});
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"description",
{
const DESCRIPTION: &str =
schemars::_private::get_title_and_description("Use inline option for LLVM versions later than specified in `min_llvm_version_for_inline`\nand call `__rust_probestack` otherwise.").1;
DESCRIPTION
});
schema
}.to_value());
enum_values
}));
schemars::Schema::from(map)
}
}
}
fn inline_schema() -> bool { false }
}
;
};schemars::JsonSchema)]
1120#[serde(tag = "kind")]
1121#[serde(rename_all = "kebab-case")]
1122pub enum StackProbeType {
1123 None,
1125 Inline,
1129 Call,
1131 InlineOrCall {
1134 #[serde(rename = "min-llvm-version-for-inline")]
1135 min_llvm_version_for_inline: (u32, u32, u32),
1136 },
1137}
1138
1139impl ToJson for StackProbeType {
1140 fn to_json(&self) -> Json {
1141 Json::Object(match self {
1142 StackProbeType::None => {
1143 [(String::from("kind"), "none".to_json())].into_iter().collect()
1144 }
1145 StackProbeType::Inline => {
1146 [(String::from("kind"), "inline".to_json())].into_iter().collect()
1147 }
1148 StackProbeType::Call => {
1149 [(String::from("kind"), "call".to_json())].into_iter().collect()
1150 }
1151 StackProbeType::InlineOrCall { min_llvm_version_for_inline: (maj, min, patch) } => [
1152 (String::from("kind"), "inline-or-call".to_json()),
1153 (
1154 String::from("min-llvm-version-for-inline"),
1155 Json::Array(<[_]>::into_vec(::alloc::boxed::box_new([maj.to_json(), min.to_json(),
patch.to_json()]))vec![maj.to_json(), min.to_json(), patch.to_json()]),
1156 ),
1157 ]
1158 .into_iter()
1159 .collect(),
1160 })
1161 }
1162}
1163
1164#[derive(#[automatically_derived]
impl ::core::default::Default for SanitizerSet {
#[inline]
fn default() -> SanitizerSet {
SanitizerSet(::core::default::Default::default())
}
}Default, #[automatically_derived]
impl ::core::clone::Clone for SanitizerSet {
#[inline]
fn clone(&self) -> SanitizerSet {
let _: ::core::clone::AssertParamIsClone<u16>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for SanitizerSet { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for SanitizerSet {
#[inline]
fn eq(&self, other: &SanitizerSet) -> bool { self.0 == other.0 }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for SanitizerSet {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) -> () {
let _: ::core::cmp::AssertParamIsEq<u16>;
}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for SanitizerSet {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () {
::core::hash::Hash::hash(&self.0, state)
}
}Hash, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for SanitizerSet {
fn encode(&self, __encoder: &mut __E) {
match *self {
SanitizerSet(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for SanitizerSet {
fn decode(__decoder: &mut __D) -> Self {
SanitizerSet(::rustc_serialize::Decodable::decode(__decoder))
}
}
};Decodable, const _: () =
{
impl<__CTX> ::rustc_data_structures::stable_hasher::HashStable<__CTX>
for SanitizerSet where __CTX: crate::HashStableContext {
#[inline]
fn hash_stable(&self, __hcx: &mut __CTX,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
SanitizerSet(ref __binding_0) => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable_Generic)]
1165pub struct SanitizerSet(u16);
1166impl SanitizerSet {
#[allow(deprecated, non_upper_case_globals,)]
pub const ADDRESS: Self = Self::from_bits_retain(1 << 0);
#[allow(deprecated, non_upper_case_globals,)]
pub const LEAK: Self = Self::from_bits_retain(1 << 1);
#[allow(deprecated, non_upper_case_globals,)]
pub const MEMORY: Self = Self::from_bits_retain(1 << 2);
#[allow(deprecated, non_upper_case_globals,)]
pub const THREAD: Self = Self::from_bits_retain(1 << 3);
#[allow(deprecated, non_upper_case_globals,)]
pub const HWADDRESS: Self = Self::from_bits_retain(1 << 4);
#[allow(deprecated, non_upper_case_globals,)]
pub const CFI: Self = Self::from_bits_retain(1 << 5);
#[allow(deprecated, non_upper_case_globals,)]
pub const MEMTAG: Self = Self::from_bits_retain(1 << 6);
#[allow(deprecated, non_upper_case_globals,)]
pub const SHADOWCALLSTACK: Self = Self::from_bits_retain(1 << 7);
#[allow(deprecated, non_upper_case_globals,)]
pub const KCFI: Self = Self::from_bits_retain(1 << 8);
#[allow(deprecated, non_upper_case_globals,)]
pub const KERNELADDRESS: Self = Self::from_bits_retain(1 << 9);
#[allow(deprecated, non_upper_case_globals,)]
pub const SAFESTACK: Self = Self::from_bits_retain(1 << 10);
#[allow(deprecated, non_upper_case_globals,)]
pub const DATAFLOW: Self = Self::from_bits_retain(1 << 11);
#[allow(deprecated, non_upper_case_globals,)]
pub const REALTIME: Self = Self::from_bits_retain(1 << 12);
}
impl ::bitflags::Flags for SanitizerSet {
const FLAGS: &'static [::bitflags::Flag<SanitizerSet>] =
&[{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("ADDRESS", SanitizerSet::ADDRESS)
},
{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("LEAK", SanitizerSet::LEAK)
},
{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("MEMORY", SanitizerSet::MEMORY)
},
{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("THREAD", SanitizerSet::THREAD)
},
{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("HWADDRESS", SanitizerSet::HWADDRESS)
},
{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("CFI", SanitizerSet::CFI)
},
{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("MEMTAG", SanitizerSet::MEMTAG)
},
{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("SHADOWCALLSTACK",
SanitizerSet::SHADOWCALLSTACK)
},
{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("KCFI", SanitizerSet::KCFI)
},
{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("KERNELADDRESS",
SanitizerSet::KERNELADDRESS)
},
{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("SAFESTACK", SanitizerSet::SAFESTACK)
},
{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("DATAFLOW", SanitizerSet::DATAFLOW)
},
{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("REALTIME", SanitizerSet::REALTIME)
}];
type Bits = u16;
fn bits(&self) -> u16 { SanitizerSet::bits(self) }
fn from_bits_retain(bits: u16) -> SanitizerSet {
SanitizerSet::from_bits_retain(bits)
}
}
#[allow(dead_code, deprecated, unused_doc_comments, unused_attributes,
unused_mut, unused_imports, non_upper_case_globals, clippy ::
assign_op_pattern, clippy :: iter_without_into_iter,)]
const _: () =
{
#[allow(dead_code, deprecated, unused_attributes)]
impl SanitizerSet {
#[inline]
pub const fn empty() -> Self {
Self(<u16 as ::bitflags::Bits>::EMPTY)
}
#[inline]
pub const fn all() -> Self {
let mut truncated = <u16 as ::bitflags::Bits>::EMPTY;
let mut i = 0;
{
{
let flag =
<SanitizerSet as
::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
{
{
let flag =
<SanitizerSet as
::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
{
{
let flag =
<SanitizerSet as
::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
{
{
let flag =
<SanitizerSet as
::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
{
{
let flag =
<SanitizerSet as
::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
{
{
let flag =
<SanitizerSet as
::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
{
{
let flag =
<SanitizerSet as
::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
{
{
let flag =
<SanitizerSet as
::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
{
{
let flag =
<SanitizerSet as
::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
{
{
let flag =
<SanitizerSet as
::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
{
{
let flag =
<SanitizerSet as
::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
{
{
let flag =
<SanitizerSet as
::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
{
{
let flag =
<SanitizerSet as
::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
let _ = i;
Self(truncated)
}
#[inline]
pub const fn bits(&self) -> u16 { self.0 }
#[inline]
pub const fn from_bits(bits: u16)
-> ::bitflags::__private::core::option::Option<Self> {
let truncated = Self::from_bits_truncate(bits).0;
if truncated == bits {
::bitflags::__private::core::option::Option::Some(Self(bits))
} else { ::bitflags::__private::core::option::Option::None }
}
#[inline]
pub const fn from_bits_truncate(bits: u16) -> Self {
Self(bits & Self::all().0)
}
#[inline]
pub const fn from_bits_retain(bits: u16) -> Self { Self(bits) }
#[inline]
pub fn from_name(name: &str)
-> ::bitflags::__private::core::option::Option<Self> {
{
if name == "ADDRESS" {
return ::bitflags::__private::core::option::Option::Some(Self(SanitizerSet::ADDRESS.bits()));
}
};
;
{
if name == "LEAK" {
return ::bitflags::__private::core::option::Option::Some(Self(SanitizerSet::LEAK.bits()));
}
};
;
{
if name == "MEMORY" {
return ::bitflags::__private::core::option::Option::Some(Self(SanitizerSet::MEMORY.bits()));
}
};
;
{
if name == "THREAD" {
return ::bitflags::__private::core::option::Option::Some(Self(SanitizerSet::THREAD.bits()));
}
};
;
{
if name == "HWADDRESS" {
return ::bitflags::__private::core::option::Option::Some(Self(SanitizerSet::HWADDRESS.bits()));
}
};
;
{
if name == "CFI" {
return ::bitflags::__private::core::option::Option::Some(Self(SanitizerSet::CFI.bits()));
}
};
;
{
if name == "MEMTAG" {
return ::bitflags::__private::core::option::Option::Some(Self(SanitizerSet::MEMTAG.bits()));
}
};
;
{
if name == "SHADOWCALLSTACK" {
return ::bitflags::__private::core::option::Option::Some(Self(SanitizerSet::SHADOWCALLSTACK.bits()));
}
};
;
{
if name == "KCFI" {
return ::bitflags::__private::core::option::Option::Some(Self(SanitizerSet::KCFI.bits()));
}
};
;
{
if name == "KERNELADDRESS" {
return ::bitflags::__private::core::option::Option::Some(Self(SanitizerSet::KERNELADDRESS.bits()));
}
};
;
{
if name == "SAFESTACK" {
return ::bitflags::__private::core::option::Option::Some(Self(SanitizerSet::SAFESTACK.bits()));
}
};
;
{
if name == "DATAFLOW" {
return ::bitflags::__private::core::option::Option::Some(Self(SanitizerSet::DATAFLOW.bits()));
}
};
;
{
if name == "REALTIME" {
return ::bitflags::__private::core::option::Option::Some(Self(SanitizerSet::REALTIME.bits()));
}
};
;
let _ = name;
::bitflags::__private::core::option::Option::None
}
#[inline]
pub const fn is_empty(&self) -> bool {
self.0 == <u16 as ::bitflags::Bits>::EMPTY
}
#[inline]
pub const fn is_all(&self) -> bool {
Self::all().0 | self.0 == self.0
}
#[inline]
pub const fn intersects(&self, other: Self) -> bool {
self.0 & other.0 != <u16 as ::bitflags::Bits>::EMPTY
}
#[inline]
pub const fn contains(&self, other: Self) -> bool {
self.0 & other.0 == other.0
}
#[inline]
pub fn insert(&mut self, other: Self) {
*self = Self(self.0).union(other);
}
#[inline]
pub fn remove(&mut self, other: Self) {
*self = Self(self.0).difference(other);
}
#[inline]
pub fn toggle(&mut self, other: Self) {
*self = Self(self.0).symmetric_difference(other);
}
#[inline]
pub fn set(&mut self, other: Self, value: bool) {
if value { self.insert(other); } else { self.remove(other); }
}
#[inline]
#[must_use]
pub const fn intersection(self, other: Self) -> Self {
Self(self.0 & other.0)
}
#[inline]
#[must_use]
pub const fn union(self, other: Self) -> Self {
Self(self.0 | other.0)
}
#[inline]
#[must_use]
pub const fn difference(self, other: Self) -> Self {
Self(self.0 & !other.0)
}
#[inline]
#[must_use]
pub const fn symmetric_difference(self, other: Self) -> Self {
Self(self.0 ^ other.0)
}
#[inline]
#[must_use]
pub const fn complement(self) -> Self {
Self::from_bits_truncate(!self.0)
}
}
impl ::bitflags::__private::core::fmt::Binary for SanitizerSet {
fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
-> ::bitflags::__private::core::fmt::Result {
let inner = self.0;
::bitflags::__private::core::fmt::Binary::fmt(&inner, f)
}
}
impl ::bitflags::__private::core::fmt::Octal for SanitizerSet {
fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
-> ::bitflags::__private::core::fmt::Result {
let inner = self.0;
::bitflags::__private::core::fmt::Octal::fmt(&inner, f)
}
}
impl ::bitflags::__private::core::fmt::LowerHex for SanitizerSet {
fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
-> ::bitflags::__private::core::fmt::Result {
let inner = self.0;
::bitflags::__private::core::fmt::LowerHex::fmt(&inner, f)
}
}
impl ::bitflags::__private::core::fmt::UpperHex for SanitizerSet {
fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
-> ::bitflags::__private::core::fmt::Result {
let inner = self.0;
::bitflags::__private::core::fmt::UpperHex::fmt(&inner, f)
}
}
impl ::bitflags::__private::core::ops::BitOr for SanitizerSet {
type Output = Self;
#[inline]
fn bitor(self, other: SanitizerSet) -> Self { self.union(other) }
}
impl ::bitflags::__private::core::ops::BitOrAssign for SanitizerSet {
#[inline]
fn bitor_assign(&mut self, other: Self) { self.insert(other); }
}
impl ::bitflags::__private::core::ops::BitXor for SanitizerSet {
type Output = Self;
#[inline]
fn bitxor(self, other: Self) -> Self {
self.symmetric_difference(other)
}
}
impl ::bitflags::__private::core::ops::BitXorAssign for SanitizerSet {
#[inline]
fn bitxor_assign(&mut self, other: Self) { self.toggle(other); }
}
impl ::bitflags::__private::core::ops::BitAnd for SanitizerSet {
type Output = Self;
#[inline]
fn bitand(self, other: Self) -> Self { self.intersection(other) }
}
impl ::bitflags::__private::core::ops::BitAndAssign for SanitizerSet {
#[inline]
fn bitand_assign(&mut self, other: Self) {
*self =
Self::from_bits_retain(self.bits()).intersection(other);
}
}
impl ::bitflags::__private::core::ops::Sub for SanitizerSet {
type Output = Self;
#[inline]
fn sub(self, other: Self) -> Self { self.difference(other) }
}
impl ::bitflags::__private::core::ops::SubAssign for SanitizerSet {
#[inline]
fn sub_assign(&mut self, other: Self) { self.remove(other); }
}
impl ::bitflags::__private::core::ops::Not for SanitizerSet {
type Output = Self;
#[inline]
fn not(self) -> Self { self.complement() }
}
impl ::bitflags::__private::core::iter::Extend<SanitizerSet> for
SanitizerSet {
fn extend<T: ::bitflags::__private::core::iter::IntoIterator<Item
= Self>>(&mut self, iterator: T) {
for item in iterator { self.insert(item) }
}
}
impl ::bitflags::__private::core::iter::FromIterator<SanitizerSet> for
SanitizerSet {
fn from_iter<T: ::bitflags::__private::core::iter::IntoIterator<Item
= Self>>(iterator: T) -> Self {
use ::bitflags::__private::core::iter::Extend;
let mut result = Self::empty();
result.extend(iterator);
result
}
}
impl SanitizerSet {
#[inline]
pub const fn iter(&self) -> ::bitflags::iter::Iter<SanitizerSet> {
::bitflags::iter::Iter::__private_const_new(<SanitizerSet as
::bitflags::Flags>::FLAGS,
SanitizerSet::from_bits_retain(self.bits()),
SanitizerSet::from_bits_retain(self.bits()))
}
#[inline]
pub const fn iter_names(&self)
-> ::bitflags::iter::IterNames<SanitizerSet> {
::bitflags::iter::IterNames::__private_const_new(<SanitizerSet
as ::bitflags::Flags>::FLAGS,
SanitizerSet::from_bits_retain(self.bits()),
SanitizerSet::from_bits_retain(self.bits()))
}
}
impl ::bitflags::__private::core::iter::IntoIterator for SanitizerSet
{
type Item = SanitizerSet;
type IntoIter = ::bitflags::iter::Iter<SanitizerSet>;
fn into_iter(self) -> Self::IntoIter { self.iter() }
}
};bitflags::bitflags! {
1167 impl SanitizerSet: u16 {
1168 const ADDRESS = 1 << 0;
1169 const LEAK = 1 << 1;
1170 const MEMORY = 1 << 2;
1171 const THREAD = 1 << 3;
1172 const HWADDRESS = 1 << 4;
1173 const CFI = 1 << 5;
1174 const MEMTAG = 1 << 6;
1175 const SHADOWCALLSTACK = 1 << 7;
1176 const KCFI = 1 << 8;
1177 const KERNELADDRESS = 1 << 9;
1178 const SAFESTACK = 1 << 10;
1179 const DATAFLOW = 1 << 11;
1180 const REALTIME = 1 << 12;
1181 }
1182}
1183impl ::std::fmt::Debug for SanitizerSet {
fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
::bitflags::parser::to_writer(self, f)
}
}rustc_data_structures::external_bitflags_debug! { SanitizerSet }
1184
1185impl SanitizerSet {
1186 const MUTUALLY_EXCLUSIVE: &'static [(SanitizerSet, SanitizerSet)] = &[
1189 (SanitizerSet::ADDRESS, SanitizerSet::MEMORY),
1190 (SanitizerSet::ADDRESS, SanitizerSet::THREAD),
1191 (SanitizerSet::ADDRESS, SanitizerSet::HWADDRESS),
1192 (SanitizerSet::ADDRESS, SanitizerSet::MEMTAG),
1193 (SanitizerSet::ADDRESS, SanitizerSet::KERNELADDRESS),
1194 (SanitizerSet::ADDRESS, SanitizerSet::SAFESTACK),
1195 (SanitizerSet::LEAK, SanitizerSet::MEMORY),
1196 (SanitizerSet::LEAK, SanitizerSet::THREAD),
1197 (SanitizerSet::LEAK, SanitizerSet::KERNELADDRESS),
1198 (SanitizerSet::LEAK, SanitizerSet::SAFESTACK),
1199 (SanitizerSet::MEMORY, SanitizerSet::THREAD),
1200 (SanitizerSet::MEMORY, SanitizerSet::HWADDRESS),
1201 (SanitizerSet::MEMORY, SanitizerSet::KERNELADDRESS),
1202 (SanitizerSet::MEMORY, SanitizerSet::SAFESTACK),
1203 (SanitizerSet::THREAD, SanitizerSet::HWADDRESS),
1204 (SanitizerSet::THREAD, SanitizerSet::KERNELADDRESS),
1205 (SanitizerSet::THREAD, SanitizerSet::SAFESTACK),
1206 (SanitizerSet::HWADDRESS, SanitizerSet::MEMTAG),
1207 (SanitizerSet::HWADDRESS, SanitizerSet::KERNELADDRESS),
1208 (SanitizerSet::HWADDRESS, SanitizerSet::SAFESTACK),
1209 (SanitizerSet::CFI, SanitizerSet::KCFI),
1210 (SanitizerSet::MEMTAG, SanitizerSet::KERNELADDRESS),
1211 (SanitizerSet::KERNELADDRESS, SanitizerSet::SAFESTACK),
1212 ];
1213
1214 pub fn as_str(self) -> Option<&'static str> {
1218 Some(match self {
1219 SanitizerSet::ADDRESS => "address",
1220 SanitizerSet::CFI => "cfi",
1221 SanitizerSet::DATAFLOW => "dataflow",
1222 SanitizerSet::KCFI => "kcfi",
1223 SanitizerSet::KERNELADDRESS => "kernel-address",
1224 SanitizerSet::LEAK => "leak",
1225 SanitizerSet::MEMORY => "memory",
1226 SanitizerSet::MEMTAG => "memtag",
1227 SanitizerSet::SAFESTACK => "safestack",
1228 SanitizerSet::SHADOWCALLSTACK => "shadow-call-stack",
1229 SanitizerSet::THREAD => "thread",
1230 SanitizerSet::HWADDRESS => "hwaddress",
1231 SanitizerSet::REALTIME => "realtime",
1232 _ => return None,
1233 })
1234 }
1235
1236 pub fn mutually_exclusive(self) -> Option<(SanitizerSet, SanitizerSet)> {
1237 Self::MUTUALLY_EXCLUSIVE
1238 .into_iter()
1239 .find(|&(a, b)| self.contains(*a) && self.contains(*b))
1240 .copied()
1241 }
1242}
1243
1244impl fmt::Display for SanitizerSet {
1246 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1247 let mut first = true;
1248 for s in *self {
1249 let name = s.as_str().unwrap_or_else(|| {
::core::panicking::panic_fmt(format_args!("unrecognized sanitizer {0:?}",
s));
}panic!("unrecognized sanitizer {s:?}"));
1250 if !first {
1251 f.write_str(", ")?;
1252 }
1253 f.write_str(name)?;
1254 first = false;
1255 }
1256 Ok(())
1257 }
1258}
1259
1260impl FromStr for SanitizerSet {
1261 type Err = String;
1262 fn from_str(s: &str) -> Result<Self, Self::Err> {
1263 Ok(match s {
1264 "address" => SanitizerSet::ADDRESS,
1265 "cfi" => SanitizerSet::CFI,
1266 "dataflow" => SanitizerSet::DATAFLOW,
1267 "kcfi" => SanitizerSet::KCFI,
1268 "kernel-address" => SanitizerSet::KERNELADDRESS,
1269 "leak" => SanitizerSet::LEAK,
1270 "memory" => SanitizerSet::MEMORY,
1271 "memtag" => SanitizerSet::MEMTAG,
1272 "safestack" => SanitizerSet::SAFESTACK,
1273 "shadow-call-stack" => SanitizerSet::SHADOWCALLSTACK,
1274 "thread" => SanitizerSet::THREAD,
1275 "hwaddress" => SanitizerSet::HWADDRESS,
1276 "realtime" => SanitizerSet::REALTIME,
1277 s => return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("unknown sanitizer {0}", s))
})format!("unknown sanitizer {s}")),
1278 })
1279 }
1280}
1281
1282impl<'de> serde::Deserialize<'de> for SanitizerSet {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}crate::json::serde_deserialize_from_str!(SanitizerSet);
1283impl schemars::JsonSchema for SanitizerSet {
1284 fn schema_name() -> std::borrow::Cow<'static, str> {
1285 "SanitizerSet".into()
1286 }
1287 fn json_schema(_: &mut schemars::SchemaGenerator) -> schemars::Schema {
1288 let all = Self::all().iter().map(|sanitizer| sanitizer.as_str()).collect::<Vec<_>>();
1289 <::schemars::Schema as
::core::convert::TryFrom<_>>::try_from(::serde_json::Value::Object({
let mut object = ::serde_json::Map::new();
let _ =
object.insert(("type").into(),
::serde_json::to_value(&"string").unwrap());
let _ =
object.insert(("enum").into(),
::serde_json::to_value(&all).unwrap());
;
object
})).unwrap()schemars::json_schema! ({
1290 "type": "string",
1291 "enum": all,
1292 })
1293 .into()
1294 }
1295}
1296
1297impl ToJson for SanitizerSet {
1298 fn to_json(&self) -> Json {
1299 self.into_iter()
1300 .map(|v| Some(v.as_str()?.to_json()))
1301 .collect::<Option<Vec<_>>>()
1302 .unwrap_or_default()
1303 .to_json()
1304 }
1305}
1306
1307#[automatically_derived]
impl ::core::clone::Clone for FramePointer {
#[inline]
fn clone(&self) -> FramePointer { *self }
}
#[automatically_derived]
impl ::core::marker::Copy for FramePointer { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for FramePointer { }
#[automatically_derived]
impl ::core::cmp::PartialEq for FramePointer {
#[inline]
fn eq(&self, other: &FramePointer) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}
#[automatically_derived]
impl ::core::cmp::Eq for FramePointer {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) -> () {}
}
#[automatically_derived]
impl ::core::hash::Hash for FramePointer {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}
#[automatically_derived]
impl ::core::fmt::Debug for FramePointer {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
FramePointer::Always => "Always",
FramePointer::NonLeaf => "NonLeaf",
FramePointer::MayOmit => "MayOmit",
})
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for FramePointer {
#[inline]
fn partial_cmp(&self, other: &FramePointer)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::PartialOrd::partial_cmp(&__self_discr, &__arg1_discr)
}
}
#[automatically_derived]
impl ::core::cmp::Ord for FramePointer {
#[inline]
fn cmp(&self, other: &FramePointer) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr)
}
}
impl FromStr for FramePointer {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"always" => Self::Always,
"non-leaf" => Self::NonLeaf,
"may-omit" => Self::MayOmit,
_ => {
let all =
["\'always\'", "\'non-leaf\'", "\'may-omit\'"].join(", ");
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid {0}: \'{1}\'. allowed values: {2}",
"frame pointer", s, all))
}));
}
})
}
}
impl FramePointer {
pub const ALL: &'static [FramePointer] =
&[FramePointer::Always, FramePointer::NonLeaf, FramePointer::MayOmit];
pub fn desc(&self) -> &'static str {
match self {
Self::Always => "always",
Self::NonLeaf => "non-leaf",
Self::MayOmit => "may-omit",
}
}
}
impl crate::json::ToJson for FramePointer {
fn to_json(&self) -> crate::json::Json { self.desc().to_json() }
}
impl<'de> serde::Deserialize<'de> for FramePointer {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}
impl std::fmt::Display for FramePointer {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.desc())
}
}crate::target_spec_enum! {
1308 pub enum FramePointer {
1309 Always = "always",
1311 NonLeaf = "non-leaf",
1314 MayOmit = "may-omit",
1318 }
1319
1320 parse_error_type = "frame pointer";
1321}
1322
1323impl FramePointer {
1324 #[inline]
1327 pub fn ratchet(&mut self, rhs: FramePointer) -> FramePointer {
1328 *self = match (*self, rhs) {
1329 (FramePointer::Always, _) | (_, FramePointer::Always) => FramePointer::Always,
1330 (FramePointer::NonLeaf, _) | (_, FramePointer::NonLeaf) => FramePointer::NonLeaf,
1331 _ => FramePointer::MayOmit,
1332 };
1333 *self
1334 }
1335}
1336
1337#[automatically_derived]
impl ::core::clone::Clone for StackProtector {
#[inline]
fn clone(&self) -> StackProtector { *self }
}
#[automatically_derived]
impl ::core::marker::Copy for StackProtector { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for StackProtector { }
#[automatically_derived]
impl ::core::cmp::PartialEq for StackProtector {
#[inline]
fn eq(&self, other: &StackProtector) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}
#[automatically_derived]
impl ::core::cmp::Eq for StackProtector {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) -> () {}
}
#[automatically_derived]
impl ::core::hash::Hash for StackProtector {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}
#[automatically_derived]
impl ::core::fmt::Debug for StackProtector {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
StackProtector::None => "None",
StackProtector::Basic => "Basic",
StackProtector::Strong => "Strong",
StackProtector::All => "All",
})
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for StackProtector {
#[inline]
fn partial_cmp(&self, other: &StackProtector)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::PartialOrd::partial_cmp(&__self_discr, &__arg1_discr)
}
}
#[automatically_derived]
impl ::core::cmp::Ord for StackProtector {
#[inline]
fn cmp(&self, other: &StackProtector) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr)
}
}
impl FromStr for StackProtector {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"none" => Self::None,
"basic" => Self::Basic,
"strong" => Self::Strong,
"all" => Self::All,
_ => {
let all =
["\'none\'", "\'basic\'", "\'strong\'",
"\'all\'"].join(", ");
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid {0}: \'{1}\'. allowed values: {2}",
"stack protector", s, all))
}));
}
})
}
}
impl StackProtector {
pub const ALL: &'static [StackProtector] =
&[StackProtector::None, StackProtector::Basic, StackProtector::Strong,
StackProtector::All];
pub fn desc(&self) -> &'static str {
match self {
Self::None => "none",
Self::Basic => "basic",
Self::Strong => "strong",
Self::All => "all",
}
}
}
impl crate::json::ToJson for StackProtector {
fn to_json(&self) -> crate::json::Json { self.desc().to_json() }
}
impl<'de> serde::Deserialize<'de> for StackProtector {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}
impl std::fmt::Display for StackProtector {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.desc())
}
}crate::target_spec_enum! {
1338 pub enum StackProtector {
1340 None = "none",
1342
1343 Basic = "basic",
1348
1349 Strong = "strong",
1354
1355 All = "all",
1357 }
1358
1359 parse_error_type = "stack protector";
1360}
1361
1362impl ::rustc_error_messages::IntoDiagArg for StackProtector {
fn into_diag_arg(self, path: &mut Option<std::path::PathBuf>)
-> ::rustc_error_messages::DiagArgValue {
self.to_string().into_diag_arg(path)
}
}into_diag_arg_using_display!(StackProtector);
1363
1364#[automatically_derived]
impl ::core::clone::Clone for BinaryFormat {
#[inline]
fn clone(&self) -> BinaryFormat { *self }
}
#[automatically_derived]
impl ::core::marker::Copy for BinaryFormat { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for BinaryFormat { }
#[automatically_derived]
impl ::core::cmp::PartialEq for BinaryFormat {
#[inline]
fn eq(&self, other: &BinaryFormat) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}
#[automatically_derived]
impl ::core::cmp::Eq for BinaryFormat {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) -> () {}
}
#[automatically_derived]
impl ::core::hash::Hash for BinaryFormat {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}
#[automatically_derived]
impl ::core::fmt::Debug for BinaryFormat {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
BinaryFormat::Coff => "Coff",
BinaryFormat::Elf => "Elf",
BinaryFormat::MachO => "MachO",
BinaryFormat::Wasm => "Wasm",
BinaryFormat::Xcoff => "Xcoff",
})
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for BinaryFormat {
#[inline]
fn partial_cmp(&self, other: &BinaryFormat)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::PartialOrd::partial_cmp(&__self_discr, &__arg1_discr)
}
}
#[automatically_derived]
impl ::core::cmp::Ord for BinaryFormat {
#[inline]
fn cmp(&self, other: &BinaryFormat) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr)
}
}
impl FromStr for BinaryFormat {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"coff" => Self::Coff,
"elf" => Self::Elf,
"mach-o" => Self::MachO,
"wasm" => Self::Wasm,
"xcoff" => Self::Xcoff,
_ => {
let all =
["\'coff\'", "\'elf\'", "\'mach-o\'", "\'wasm\'",
"\'xcoff\'"].join(", ");
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid {0}: \'{1}\'. allowed values: {2}",
"binary format", s, all))
}));
}
})
}
}
impl BinaryFormat {
pub const ALL: &'static [BinaryFormat] =
&[BinaryFormat::Coff, BinaryFormat::Elf, BinaryFormat::MachO,
BinaryFormat::Wasm, BinaryFormat::Xcoff];
pub fn desc(&self) -> &'static str {
match self {
Self::Coff => "coff",
Self::Elf => "elf",
Self::MachO => "mach-o",
Self::Wasm => "wasm",
Self::Xcoff => "xcoff",
}
}
}
impl crate::json::ToJson for BinaryFormat {
fn to_json(&self) -> crate::json::Json { self.desc().to_json() }
}
impl<'de> serde::Deserialize<'de> for BinaryFormat {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}
impl std::fmt::Display for BinaryFormat {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.desc())
}
}crate::target_spec_enum! {
1365 pub enum BinaryFormat {
1366 Coff = "coff",
1367 Elf = "elf",
1368 MachO = "mach-o",
1369 Wasm = "wasm",
1370 Xcoff = "xcoff",
1371 }
1372
1373 parse_error_type = "binary format";
1374}
1375
1376impl BinaryFormat {
1377 pub fn to_object(&self) -> object::BinaryFormat {
1379 match self {
1380 Self::Coff => object::BinaryFormat::Coff,
1381 Self::Elf => object::BinaryFormat::Elf,
1382 Self::MachO => object::BinaryFormat::MachO,
1383 Self::Wasm => object::BinaryFormat::Wasm,
1384 Self::Xcoff => object::BinaryFormat::Xcoff,
1385 }
1386 }
1387}
1388
1389impl ToJson for Align {
1390 fn to_json(&self) -> Json {
1391 self.bits().to_json()
1392 }
1393}
1394
1395macro_rules! supported_targets {
1396 ( $(($tuple:literal, $module:ident),)+ ) => {
1397 mod targets {
1398 $(pub(crate) mod $module;)+
1399 }
1400
1401 pub static TARGETS: &[&str] = &[$($tuple),+];
1403
1404 fn load_builtin(target: &str) -> Option<Target> {
1405 let t = match target {
1406 $( $tuple => targets::$module::target(), )+
1407 _ => return None,
1408 };
1409 debug!("got builtin target: {:?}", t);
1410 Some(t)
1411 }
1412
1413 fn load_all_builtins() -> impl Iterator<Item = Target> {
1414 [
1415 $( targets::$module::target, )+
1416 ]
1417 .into_iter()
1418 .map(|f| f())
1419 }
1420
1421 #[cfg(test)]
1422 mod tests {
1423 $(
1425 #[test] fn $module() {
1427 crate::spec::targets::$module::target().test_target()
1428 }
1429 )+
1430 }
1431 };
1432}
1433
1434mod targets {
pub(crate) mod x86_64_unknown_linux_gnu {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, SanitizerSet, StackProbeType, Target,
TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_gnu::opts();
base.cpu = "x86-64".into();
base.plt_by_default = false;
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.stack_probes = StackProbeType::Inline;
base.static_position_independent_executables = true;
base.supported_sanitizers =
SanitizerSet::ADDRESS | SanitizerSet::CFI | SanitizerSet::KCFI
| SanitizerSet::DATAFLOW | SanitizerSet::LEAK |
SanitizerSet::MEMORY | SanitizerSet::SAFESTACK |
SanitizerSet::THREAD | SanitizerSet::REALTIME;
base.supports_xray = true;
Target {
llvm_target: "x86_64-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: Some("64-bit Linux (kernel 3.2+, glibc 2.17+)".into()),
tier: Some(1),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod x86_64_unknown_linux_gnux32 {
use crate::spec::{
Abi, Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_gnu::opts();
base.cpu = "x86-64".into();
base.abi = Abi::X32;
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-mx32"]);
base.stack_probes = StackProbeType::Inline;
base.has_thread_local = false;
base.plt_by_default = true;
Target {
llvm_target: "x86_64-unknown-linux-gnux32".into(),
metadata: TargetMetadata {
description: Some("64-bit Linux (x32 ABI) (kernel 4.15, glibc 2.27)".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod i686_unknown_linux_gnu {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, RustcAbi, SanitizerSet,
StackProbeType, Target, TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_gnu::opts();
base.rustc_abi = Some(RustcAbi::X86Sse2);
base.cpu = "pentium4".into();
base.max_atomic_width = Some(64);
base.supported_sanitizers = SanitizerSet::ADDRESS;
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m32"]);
base.stack_probes = StackProbeType::Inline;
Target {
llvm_target: "i686-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: Some("32-bit Linux (kernel 3.2, glibc 2.17+)".into()),
tier: Some(1),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i128:128-f64:32:64-f80:32-n8:16:32-S128".into(),
arch: Arch::X86,
options: base,
}
}
}
pub(crate) mod i586_unknown_linux_gnu {
use crate::spec::Target;
pub(crate) fn target() -> Target {
let mut base = super::i686_unknown_linux_gnu::target();
base.rustc_abi = None;
base.cpu = "pentium".into();
base.llvm_target = "i586-unknown-linux-gnu".into();
base.metadata =
crate::spec::TargetMetadata {
description: Some("32-bit Linux (kernel 3.2, glibc 2.17+)".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
};
base
}
}
pub(crate) mod loongarch64_unknown_linux_gnu {
use crate::spec::{
Arch, CodeModel, SanitizerSet, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "loongarch64-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: Some("LoongArch64 Linux, LP64D ABI (kernel 5.19, glibc 2.36)".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::LoongArch64,
options: TargetOptions {
code_model: Some(CodeModel::Medium),
cpu: "generic".into(),
features: "+f,+d,+lsx".into(),
llvm_abiname: "lp64d".into(),
max_atomic_width: Some(64),
supported_sanitizers: SanitizerSet::ADDRESS |
SanitizerSet::CFI | SanitizerSet::LEAK |
SanitizerSet::MEMORY | SanitizerSet::THREAD,
supports_xray: true,
direct_access_external_data: Some(false),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod loongarch64_unknown_linux_musl {
use crate::spec::{
Arch, CodeModel, SanitizerSet, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "loongarch64-unknown-linux-musl".into(),
metadata: TargetMetadata {
description: Some("LoongArch64 Linux (LP64D ABI) with musl 1.2.5".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::LoongArch64,
options: TargetOptions {
code_model: Some(CodeModel::Medium),
cpu: "generic".into(),
features: "+f,+d,+lsx".into(),
llvm_abiname: "lp64d".into(),
max_atomic_width: Some(64),
crt_static_default: false,
supported_sanitizers: SanitizerSet::ADDRESS |
SanitizerSet::CFI | SanitizerSet::LEAK |
SanitizerSet::MEMORY | SanitizerSet::THREAD,
supports_xray: true,
direct_access_external_data: Some(false),
..base::linux_musl::opts()
},
}
}
}
pub(crate) mod m68k_unknown_linux_gnu {
use rustc_abi::Endian;
use crate::spec::{
Arch, LinkSelfContainedDefault, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_gnu::opts();
base.cpu = "M68020".into();
base.max_atomic_width = Some(32);
Target {
llvm_target: "m68k-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: Some("Motorola 680x0 Linux".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "E-m:e-p:32:16:32-i8:8:8-i16:16:16-i32:16:32-n8:16:32-a:0:16-S16".into(),
arch: Arch::M68k,
options: TargetOptions {
endian: Endian::Big,
mcount: "_mcount".into(),
link_self_contained: LinkSelfContainedDefault::False,
..base
},
}
}
}
pub(crate) mod m68k_unknown_none_elf {
use rustc_abi::Endian;
use crate::spec::{
Arch, CodeModel, PanicStrategy, RelocModel, Target,
TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
let options =
TargetOptions {
cpu: "M68010".into(),
max_atomic_width: None,
endian: Endian::Big,
linker: Some("m68k-linux-gnu-ld".into()),
panic_strategy: PanicStrategy::Abort,
code_model: Some(CodeModel::Medium),
has_rpath: false,
llvm_floatabi: None,
relocation_model: RelocModel::Static,
..Default::default()
};
Target {
llvm_target: "m68k".into(),
metadata: TargetMetadata {
description: Some("Motorola 680x0".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
data_layout: "E-m:e-p:32:16:32-i8:8:8-i16:16:16-i32:16:32-n8:16:32-a:0:16-S16".into(),
arch: Arch::M68k,
options,
}
}
}
pub(crate) mod csky_unknown_linux_gnuabiv2 {
use crate::spec::{
Abi, Arch, Cc, LinkerFlavor, Lld, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "csky-unknown-linux-gnuabiv2".into(),
metadata: TargetMetadata {
description: Some("C-SKY abiv2 Linux (little endian)".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-S32-p:32:32-i32:32:32-i64:32:32-f32:32:32-f64:32:32-v64:32:32-v128:32:32-a:0:32-Fi32-n32".into(),
arch: Arch::CSky,
options: TargetOptions {
abi: Abi::AbiV2,
features: "+2e3,+3e7,+7e10,+cache,+dsp1e2,+dspe60,+e1,+e2,+edsp,+elrw,+hard-tp,+high-registers,+hwdiv,+mp,+mp1e2,+nvic,+trust".into(),
late_link_args: TargetOptions::link_args(LinkerFlavor::Gnu(Cc::Yes,
Lld::No), &["-l:libatomic.a"]),
max_atomic_width: Some(32),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod csky_unknown_linux_gnuabiv2hf {
use crate::spec::{
Abi, Arch, Cc, LinkerFlavor, Lld, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "csky-unknown-linux-gnuabiv2".into(),
metadata: TargetMetadata {
description: Some("C-SKY abiv2 Linux, hardfloat (little endian)".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-S32-p:32:32-i32:32:32-i64:32:32-f32:32:32-f64:32:32-v64:32:32-v128:32:32-a:0:32-Fi32-n32".into(),
arch: Arch::CSky,
options: TargetOptions {
abi: Abi::AbiV2Hf,
cpu: "ck860fv".into(),
features: "+hard-float,+hard-float-abi,+2e3,+3e7,+7e10,+cache,+dsp1e2,+dspe60,+e1,+e2,+edsp,+elrw,+hard-tp,+high-registers,+hwdiv,+mp,+mp1e2,+nvic,+trust".into(),
late_link_args: TargetOptions::link_args(LinkerFlavor::Gnu(Cc::Yes,
Lld::No), &["-l:libatomic.a", "-mhard-float"]),
max_atomic_width: Some(32),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod mips_unknown_linux_gnu {
use rustc_abi::Endian;
use crate::spec::{Arch, Target, TargetMetadata, TargetOptions, base};
pub(crate) fn target() -> Target {
Target {
llvm_target: "mips-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: Some("MIPS Linux (kernel 4.4, glibc 2.23)".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64".into(),
arch: Arch::Mips,
options: TargetOptions {
endian: Endian::Big,
cpu: "mips32r2".into(),
features: "+mips32r2,+fpxx,+nooddspreg".into(),
max_atomic_width: Some(32),
mcount: "_mcount".into(),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod mips64_unknown_linux_gnuabi64 {
use rustc_abi::Endian;
use crate::spec::{
Abi, Arch, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "mips64-unknown-linux-gnuabi64".into(),
metadata: TargetMetadata {
description: Some("MIPS64 Linux, N64 ABI (kernel 4.4, glibc 2.23)".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::Mips64,
options: TargetOptions {
abi: Abi::Abi64,
endian: Endian::Big,
cpu: "mips64r2".into(),
features: "+mips64r2,+xgot".into(),
max_atomic_width: Some(64),
mcount: "_mcount".into(),
llvm_abiname: "n64".into(),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod mips64el_unknown_linux_gnuabi64 {
use crate::spec::{
Abi, Arch, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "mips64el-unknown-linux-gnuabi64".into(),
metadata: TargetMetadata {
description: Some("MIPS64 Linux, N64 ABI (kernel 4.4, glibc 2.23)".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::Mips64,
options: TargetOptions {
abi: Abi::Abi64,
cpu: "mips64r2".into(),
features: "+mips64r2,+xgot".into(),
max_atomic_width: Some(64),
mcount: "_mcount".into(),
llvm_abiname: "n64".into(),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod mipsisa32r6_unknown_linux_gnu {
use rustc_abi::Endian;
use crate::spec::{Arch, Target, TargetMetadata, TargetOptions, base};
pub(crate) fn target() -> Target {
Target {
llvm_target: "mipsisa32r6-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: Some("32-bit MIPS Release 6 Big Endian".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64".into(),
arch: Arch::Mips32r6,
options: TargetOptions {
endian: Endian::Big,
cpu: "mips32r6".into(),
features: "+mips32r6".into(),
max_atomic_width: Some(32),
mcount: "_mcount".into(),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod mipsisa32r6el_unknown_linux_gnu {
use crate::spec::{Arch, Target, TargetMetadata, TargetOptions, base};
pub(crate) fn target() -> Target {
Target {
llvm_target: "mipsisa32r6el-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: Some("32-bit MIPS Release 6 Little Endian".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64".into(),
arch: Arch::Mips32r6,
options: TargetOptions {
cpu: "mips32r6".into(),
features: "+mips32r6".into(),
max_atomic_width: Some(32),
mcount: "_mcount".into(),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod mipsisa64r6_unknown_linux_gnuabi64 {
use rustc_abi::Endian;
use crate::spec::{
Abi, Arch, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "mipsisa64r6-unknown-linux-gnuabi64".into(),
metadata: TargetMetadata {
description: Some("64-bit MIPS Release 6 Big Endian".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::Mips64r6,
options: TargetOptions {
abi: Abi::Abi64,
endian: Endian::Big,
cpu: "mips64r6".into(),
features: "+mips64r6".into(),
max_atomic_width: Some(64),
mcount: "_mcount".into(),
llvm_abiname: "n64".into(),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod mipsisa64r6el_unknown_linux_gnuabi64 {
use crate::spec::{
Abi, Arch, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "mipsisa64r6el-unknown-linux-gnuabi64".into(),
metadata: TargetMetadata {
description: Some("64-bit MIPS Release 6 Little Endian".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::Mips64r6,
options: TargetOptions {
abi: Abi::Abi64,
cpu: "mips64r6".into(),
features: "+mips64r6".into(),
max_atomic_width: Some(64),
mcount: "_mcount".into(),
llvm_abiname: "n64".into(),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod mipsel_unknown_linux_gnu {
use crate::spec::{Arch, Target, TargetMetadata, TargetOptions, base};
pub(crate) fn target() -> Target {
Target {
llvm_target: "mipsel-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: Some("MIPS (little endian) Linux (kernel 4.4, glibc 2.23)".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64".into(),
arch: Arch::Mips,
options: TargetOptions {
cpu: "mips32r2".into(),
features: "+mips32r2,+fpxx,+nooddspreg".into(),
max_atomic_width: Some(32),
mcount: "_mcount".into(),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod powerpc_unknown_linux_gnu {
use rustc_abi::Endian;
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_gnu::opts();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m32"]);
base.max_atomic_width = Some(32);
base.stack_probes = StackProbeType::Inline;
Target {
llvm_target: "powerpc-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: Some("PowerPC Linux (kernel 3.2, glibc 2.17)".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "E-m:e-p:32:32-Fn32-i64:64-n32".into(),
arch: Arch::PowerPC,
options: TargetOptions {
endian: Endian::Big,
features: "+secure-plt".into(),
mcount: "_mcount".into(),
..base
},
}
}
}
pub(crate) mod powerpc_unknown_linux_gnuspe {
use rustc_abi::Endian;
use crate::spec::{
Abi, Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_gnu::opts();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-mspe"]);
base.max_atomic_width = Some(32);
base.stack_probes = StackProbeType::Inline;
Target {
llvm_target: "powerpc-unknown-linux-gnuspe".into(),
metadata: TargetMetadata {
description: Some("PowerPC SPE Linux".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "E-m:e-p:32:32-Fn32-i64:64-n32".into(),
arch: Arch::PowerPC,
options: TargetOptions {
abi: Abi::Spe,
endian: Endian::Big,
features: "+secure-plt,+msync".into(),
mcount: "_mcount".into(),
..base
},
}
}
}
pub(crate) mod powerpc_unknown_linux_musl {
use rustc_abi::Endian;
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_musl::opts();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m32"]);
base.max_atomic_width = Some(32);
base.stack_probes = StackProbeType::Inline;
Target {
llvm_target: "powerpc-unknown-linux-musl".into(),
metadata: TargetMetadata {
description: Some("PowerPC Linux with musl 1.2.5".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "E-m:e-p:32:32-Fn32-i64:64-n32".into(),
arch: Arch::PowerPC,
options: TargetOptions {
endian: Endian::Big,
mcount: "_mcount".into(),
..base
},
}
}
}
pub(crate) mod powerpc_unknown_linux_muslspe {
use rustc_abi::Endian;
use crate::spec::{
Abi, Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_musl::opts();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-mspe"]);
base.max_atomic_width = Some(32);
base.stack_probes = StackProbeType::Inline;
Target {
llvm_target: "powerpc-unknown-linux-muslspe".into(),
metadata: TargetMetadata {
description: Some("PowerPC SPE Linux with musl".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "E-m:e-p:32:32-Fn32-i64:64-n32".into(),
arch: Arch::PowerPC,
options: TargetOptions {
abi: Abi::Spe,
endian: Endian::Big,
features: "+msync".into(),
mcount: "_mcount".into(),
..base
},
}
}
}
pub(crate) mod powerpc64_ibm_aix {
use crate::spec::{
Arch, Cc, LinkerFlavor, Target, TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::aix::opts();
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Unix(Cc::No),
&["-b64", "-bpT:0x100000000", "-bpD:0x110000000",
"-bcdtors:all:0:s"]);
Target {
llvm_target: "powerpc64-ibm-aix".into(),
metadata: TargetMetadata {
description: Some("64-bit AIX (7.2 and newer)".into()),
tier: Some(3),
host_tools: Some(false),
std: None,
},
pointer_width: 64,
data_layout: "E-m:a-Fi64-i64:64-i128:128-n32:64-f64:32:64-S128-v256:256:256-v512:512:512".into(),
arch: Arch::PowerPC64,
options: base,
}
}
}
pub(crate) mod powerpc64_unknown_linux_gnu {
use rustc_abi::Endian;
use crate::spec::{
Abi, Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_gnu::opts();
base.cpu = "ppc64".into();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.max_atomic_width = Some(64);
base.stack_probes = StackProbeType::Inline;
base.abi = Abi::ElfV1;
base.llvm_abiname = "elfv1".into();
Target {
llvm_target: "powerpc64-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: Some("PowerPC Linux (kernel 3.2, glibc 2.17)".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "E-m:e-Fi64-i64:64-i128:128-n32:64-S128-v256:256:256-v512:512:512".into(),
arch: Arch::PowerPC64,
options: TargetOptions {
endian: Endian::Big,
mcount: "_mcount".into(),
..base
},
}
}
}
pub(crate) mod powerpc64_unknown_linux_musl {
use rustc_abi::Endian;
use crate::spec::{
Abi, Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_musl::opts();
base.cpu = "ppc64".into();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.max_atomic_width = Some(64);
base.stack_probes = StackProbeType::Inline;
base.abi = Abi::ElfV2;
base.llvm_abiname = "elfv2".into();
Target {
llvm_target: "powerpc64-unknown-linux-musl".into(),
metadata: TargetMetadata {
description: Some("64-bit PowerPC Linux with musl 1.2.5".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "E-m:e-Fn32-i64:64-i128:128-n32:64-S128-v256:256:256-v512:512:512".into(),
arch: Arch::PowerPC64,
options: TargetOptions {
endian: Endian::Big,
mcount: "_mcount".into(),
..base
},
}
}
}
pub(crate) mod powerpc64le_unknown_linux_gnu {
use crate::spec::{
Abi, Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_gnu::opts();
base.cpu = "ppc64le".into();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.max_atomic_width = Some(64);
base.stack_probes = StackProbeType::Inline;
base.abi = Abi::ElfV2;
base.llvm_abiname = "elfv2".into();
Target {
llvm_target: "powerpc64le-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: Some("PPC64LE Linux (kernel 3.10, glibc 2.17)".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-Fn32-i64:64-i128:128-n32:64-S128-v256:256:256-v512:512:512".into(),
arch: Arch::PowerPC64,
options: TargetOptions { mcount: "_mcount".into(), ..base },
}
}
}
pub(crate) mod powerpc64le_unknown_linux_musl {
use crate::spec::{
Abi, Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_musl::opts();
base.cpu = "ppc64le".into();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.max_atomic_width = Some(64);
base.stack_probes = StackProbeType::Inline;
base.crt_static_default = true;
base.abi = Abi::ElfV2;
base.llvm_abiname = "elfv2".into();
Target {
llvm_target: "powerpc64le-unknown-linux-musl".into(),
metadata: TargetMetadata {
description: Some("64-bit PowerPC Linux with musl 1.2.5, Little Endian".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-Fn32-i64:64-i128:128-n32:64-S128-v256:256:256-v512:512:512".into(),
arch: Arch::PowerPC64,
options: TargetOptions { mcount: "_mcount".into(), ..base },
}
}
}
pub(crate) mod s390x_unknown_linux_gnu {
use rustc_abi::{Align, Endian};
use crate::spec::{
Arch, SanitizerSet, StackProbeType, Target, TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_gnu::opts();
base.endian = Endian::Big;
base.cpu = "z10".into();
base.max_atomic_width = Some(128);
base.min_global_align = Some(Align::from_bits(16).unwrap());
base.stack_probes = StackProbeType::Inline;
base.supported_sanitizers =
SanitizerSet::ADDRESS | SanitizerSet::LEAK |
SanitizerSet::MEMORY | SanitizerSet::THREAD;
Target {
llvm_target: "s390x-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: Some("S390x Linux (kernel 3.2, glibc 2.17)".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-v128:64-a:8:16-n32:64".into(),
arch: Arch::S390x,
options: base,
}
}
}
pub(crate) mod s390x_unknown_linux_musl {
use rustc_abi::{Align, Endian};
use crate::spec::{
Arch, SanitizerSet, StackProbeType, Target, TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_musl::opts();
base.endian = Endian::Big;
base.cpu = "z10".into();
base.max_atomic_width = Some(128);
base.min_global_align = Some(Align::from_bits(16).unwrap());
base.static_position_independent_executables = true;
base.stack_probes = StackProbeType::Inline;
base.supported_sanitizers =
SanitizerSet::ADDRESS | SanitizerSet::LEAK |
SanitizerSet::MEMORY | SanitizerSet::THREAD;
Target {
llvm_target: "s390x-unknown-linux-musl".into(),
metadata: TargetMetadata {
description: Some("S390x Linux (kernel 3.2, musl 1.2.5)".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-v128:64-a:8:16-n32:64".into(),
arch: Arch::S390x,
options: base,
}
}
}
pub(crate) mod sparc_unknown_linux_gnu {
use rustc_abi::Endian;
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "sparc-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: Some("32-bit SPARC Linux".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "E-m:e-p:32:32-i64:64-i128:128-f128:64-n32-S64".into(),
arch: Arch::Sparc,
options: TargetOptions {
features: "+v8plus".into(),
cpu: "v9".into(),
endian: Endian::Big,
late_link_args: TargetOptions::link_args(LinkerFlavor::Gnu(Cc::Yes,
Lld::No), &["-mcpu=v9", "-m32"]),
max_atomic_width: Some(32),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod sparc64_unknown_linux_gnu {
use rustc_abi::Endian;
use crate::spec::{Arch, Target, TargetMetadata, base};
pub(crate) fn target() -> Target {
let mut base = base::linux_gnu::opts();
base.endian = Endian::Big;
base.cpu = "v9".into();
base.max_atomic_width = Some(64);
Target {
llvm_target: "sparc64-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: Some("SPARC Linux (kernel 4.4, glibc 2.23)".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "E-m:e-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::Sparc64,
options: base,
}
}
}
pub(crate) mod arm_unknown_linux_gnueabi {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "arm-unknown-linux-gnueabi".into(),
metadata: TargetMetadata {
description: Some("Armv6 Linux (kernel 3.2, glibc 2.17)".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
features: "+strict-align,+v6".into(),
max_atomic_width: Some(64),
mcount: "\u{1}__gnu_mcount_nc".into(),
llvm_mcount_intrinsic: Some("llvm.arm.gnu.eabi.mcount".into()),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod arm_unknown_linux_gnueabihf {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "arm-unknown-linux-gnueabihf".into(),
metadata: TargetMetadata {
description: Some("Armv6 Linux, hardfloat (kernel 3.2, glibc 2.17)".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
features: "+strict-align,+v6,+vfp2".into(),
max_atomic_width: Some(64),
mcount: "\u{1}__gnu_mcount_nc".into(),
llvm_mcount_intrinsic: Some("llvm.arm.gnu.eabi.mcount".into()),
default_uwtable: false,
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod armeb_unknown_linux_gnueabi {
use rustc_abi::Endian;
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armeb-unknown-linux-gnueabi".into(),
metadata: TargetMetadata {
description: Some("Arm BE8 the default Arm big-endian architecture since Armv6".into()),
tier: Some(3),
host_tools: None,
std: Some(true),
},
pointer_width: 32,
data_layout: "E-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
features: "+strict-align,+v8,+crc".into(),
endian: Endian::Big,
max_atomic_width: Some(64),
mcount: "\u{1}__gnu_mcount_nc".into(),
llvm_mcount_intrinsic: Some("llvm.arm.gnu.eabi.mcount".into()),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod arm_unknown_linux_musleabi {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "arm-unknown-linux-musleabi".into(),
metadata: TargetMetadata {
description: Some("Armv6 Linux with musl 1.2.5".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
features: "+strict-align,+v6".into(),
max_atomic_width: Some(64),
mcount: "\u{1}mcount".into(),
crt_static_default: true,
..base::linux_musl::opts()
},
}
}
}
pub(crate) mod arm_unknown_linux_musleabihf {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "arm-unknown-linux-musleabihf".into(),
metadata: TargetMetadata {
description: Some("Armv6 Linux with musl 1.2.5, hardfloat".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
features: "+strict-align,+v6,+vfp2".into(),
max_atomic_width: Some(64),
mcount: "\u{1}mcount".into(),
crt_static_default: true,
..base::linux_musl::opts()
},
}
}
}
pub(crate) mod armv4t_unknown_linux_gnueabi {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv4t-unknown-linux-gnueabi".into(),
metadata: TargetMetadata {
description: Some("Armv4T Linux".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
features: "+soft-float,+strict-align".into(),
max_atomic_width: Some(32),
mcount: "\u{1}__gnu_mcount_nc".into(),
llvm_mcount_intrinsic: Some("llvm.arm.gnu.eabi.mcount".into()),
has_thumb_interworking: true,
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod armv5te_unknown_linux_gnueabi {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv5te-unknown-linux-gnueabi".into(),
metadata: TargetMetadata {
description: Some("Armv5TE Linux (kernel 4.4, glibc 2.23)".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
features: "+soft-float,+strict-align".into(),
max_atomic_width: Some(32),
mcount: "\u{1}__gnu_mcount_nc".into(),
has_thumb_interworking: true,
llvm_mcount_intrinsic: Some("llvm.arm.gnu.eabi.mcount".into()),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod armv5te_unknown_linux_musleabi {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv5te-unknown-linux-musleabi".into(),
metadata: TargetMetadata {
description: Some("Armv5TE Linux with musl 1.2.5".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
features: "+soft-float,+strict-align".into(),
max_atomic_width: Some(32),
mcount: "\u{1}mcount".into(),
has_thumb_interworking: true,
crt_static_default: true,
..base::linux_musl::opts()
},
}
}
}
pub(crate) mod armv5te_unknown_linux_uclibceabi {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv5te-unknown-linux-gnueabi".into(),
metadata: TargetMetadata {
description: Some("Armv5TE Linux with uClibc".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
features: "+soft-float,+strict-align".into(),
max_atomic_width: Some(32),
mcount: "\u{1}__gnu_mcount_nc".into(),
has_thumb_interworking: true,
..base::linux_uclibc::opts()
},
}
}
}
pub(crate) mod armv7_unknown_linux_gnueabi {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv7-unknown-linux-gnueabi".into(),
metadata: TargetMetadata {
description: Some("Armv7-A Linux (kernel 4.15, glibc 2.27)".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
features: "+v7,+thumb2,+soft-float,-neon".into(),
max_atomic_width: Some(64),
mcount: "\u{1}__gnu_mcount_nc".into(),
llvm_mcount_intrinsic: Some("llvm.arm.gnu.eabi.mcount".into()),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod armv7_unknown_linux_gnueabihf {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv7-unknown-linux-gnueabihf".into(),
metadata: TargetMetadata {
description: Some("Armv7-A Linux, hardfloat (kernel 3.2, glibc 2.17)".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
features: "+v7,+vfp3d16,+thumb2,-neon".into(),
max_atomic_width: Some(64),
mcount: "\u{1}__gnu_mcount_nc".into(),
llvm_mcount_intrinsic: Some("llvm.arm.gnu.eabi.mcount".into()),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod thumbv7neon_unknown_linux_gnueabihf {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv7-unknown-linux-gnueabihf".into(),
metadata: TargetMetadata {
description: Some("Thumb2-mode ARMv7-A Linux with NEON (kernel 4.4, glibc 2.23)".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
features: "+v7,+thumb-mode,+thumb2,+vfp3,+neon".into(),
max_atomic_width: Some(64),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod thumbv7neon_unknown_linux_musleabihf {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv7-unknown-linux-musleabihf".into(),
metadata: TargetMetadata {
description: Some("Thumb2-mode ARMv7-A Linux with NEON, musl 1.2.5".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
features: "+v7,+thumb-mode,+thumb2,+vfp3,+neon".into(),
max_atomic_width: Some(64),
mcount: "\u{1}mcount".into(),
..base::linux_musl::opts()
},
}
}
}
pub(crate) mod armv7_unknown_linux_musleabi {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv7-unknown-linux-musleabi".into(),
metadata: TargetMetadata {
description: Some("Armv7-A Linux with musl 1.2.5".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
features: "+v7,+thumb2,+soft-float,-neon".into(),
max_atomic_width: Some(64),
mcount: "\u{1}mcount".into(),
crt_static_default: true,
..base::linux_musl::opts()
},
}
}
}
pub(crate) mod armv7_unknown_linux_musleabihf {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv7-unknown-linux-musleabihf".into(),
metadata: TargetMetadata {
description: Some("Armv7-A Linux with musl 1.2.5, hardfloat".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
features: "+v7,+vfp3d16,+thumb2,-neon".into(),
max_atomic_width: Some(64),
mcount: "\u{1}mcount".into(),
crt_static_default: true,
..base::linux_musl::opts()
},
}
}
}
pub(crate) mod aarch64_unknown_linux_gnu {
use crate::spec::{
Arch, FramePointer, SanitizerSet, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "aarch64-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: Some("ARM64 Linux (kernel 4.1, glibc 2.17+)".into()),
tier: Some(1),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: TargetOptions {
features: "+v8a,+outline-atomics".into(),
frame_pointer: FramePointer::NonLeaf,
mcount: "\u{1}_mcount".into(),
max_atomic_width: Some(128),
stack_probes: StackProbeType::Inline,
supported_sanitizers: SanitizerSet::ADDRESS |
SanitizerSet::CFI | SanitizerSet::KCFI | SanitizerSet::LEAK
| SanitizerSet::MEMORY | SanitizerSet::MEMTAG |
SanitizerSet::THREAD | SanitizerSet::HWADDRESS |
SanitizerSet::REALTIME,
supports_xray: true,
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod aarch64_unknown_linux_musl {
use crate::spec::{
Arch, FramePointer, SanitizerSet, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_musl::opts();
base.max_atomic_width = Some(128);
base.supports_xray = true;
base.features = "+v8a,+outline-atomics".into();
base.stack_probes = StackProbeType::Inline;
base.supported_sanitizers =
SanitizerSet::ADDRESS | SanitizerSet::CFI | SanitizerSet::LEAK
| SanitizerSet::MEMORY | SanitizerSet::THREAD;
base.crt_static_default = true;
Target {
llvm_target: "aarch64-unknown-linux-musl".into(),
metadata: TargetMetadata {
description: Some("ARM64 Linux with musl 1.2.5".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: TargetOptions {
frame_pointer: FramePointer::NonLeaf,
mcount: "\u{1}_mcount".into(),
..base
},
}
}
}
pub(crate) mod aarch64_be_unknown_linux_musl {
use rustc_abi::Endian;
use crate::spec::{
Arch, FramePointer, SanitizerSet, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_musl::opts();
base.max_atomic_width = Some(128);
base.supports_xray = true;
base.features = "+v8a,+outline-atomics".into();
base.stack_probes = StackProbeType::Inline;
base.supported_sanitizers =
SanitizerSet::ADDRESS | SanitizerSet::CFI | SanitizerSet::LEAK
| SanitizerSet::MEMORY | SanitizerSet::THREAD;
Target {
llvm_target: "aarch64_be-unknown-linux-musl".into(),
metadata: TargetMetadata {
description: Some("ARM64 Linux (big-endian) with musl-libc 1.2.5".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "E-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: TargetOptions {
frame_pointer: FramePointer::NonLeaf,
mcount: "\u{1}_mcount".into(),
endian: Endian::Big,
..base
},
}
}
}
pub(crate) mod x86_64_unknown_linux_musl {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, SanitizerSet, StackProbeType, Target,
TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_musl::opts();
base.cpu = "x86-64".into();
base.plt_by_default = false;
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.stack_probes = StackProbeType::Inline;
base.static_position_independent_executables = true;
base.supported_sanitizers =
SanitizerSet::ADDRESS | SanitizerSet::CFI | SanitizerSet::LEAK
| SanitizerSet::MEMORY | SanitizerSet::THREAD;
base.supports_xray = true;
base.crt_static_default = true;
Target {
llvm_target: "x86_64-unknown-linux-musl".into(),
metadata: TargetMetadata {
description: Some("64-bit Linux with musl 1.2.5".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod i686_unknown_linux_musl {
use crate::spec::{
Arch, Cc, FramePointer, LinkerFlavor, Lld, RustcAbi,
StackProbeType, Target, TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_musl::opts();
base.rustc_abi = Some(RustcAbi::X86Sse2);
base.cpu = "pentium4".into();
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m32", "-Wl,-melf_i386"]);
base.stack_probes = StackProbeType::Inline;
base.crt_static_default = true;
base.frame_pointer = FramePointer::Always;
Target {
llvm_target: "i686-unknown-linux-musl".into(),
metadata: TargetMetadata {
description: Some("32-bit Linux with musl 1.2.5".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i128:128-f64:32:64-f80:32-n8:16:32-S128".into(),
arch: Arch::X86,
options: base,
}
}
}
pub(crate) mod i586_unknown_linux_musl {
use crate::spec::Target;
pub(crate) fn target() -> Target {
let mut base = super::i686_unknown_linux_musl::target();
base.rustc_abi = None;
base.cpu = "pentium".into();
base.llvm_target = "i586-unknown-linux-musl".into();
base.crt_static_default = true;
base
}
}
pub(crate) mod mips_unknown_linux_musl {
use rustc_abi::Endian;
use crate::spec::{Arch, Target, TargetMetadata, TargetOptions, base};
pub(crate) fn target() -> Target {
let mut base = base::linux_musl::opts();
base.cpu = "mips32r2".into();
base.features = "+mips32r2,+soft-float".into();
base.max_atomic_width = Some(32);
Target {
llvm_target: "mips-unknown-linux-musl".into(),
metadata: TargetMetadata {
description: Some("MIPS Linux with musl 1.2.5".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64".into(),
arch: Arch::Mips,
options: TargetOptions {
endian: Endian::Big,
mcount: "_mcount".into(),
..base
},
}
}
}
pub(crate) mod mipsel_unknown_linux_musl {
use crate::spec::{Arch, Target, TargetMetadata, TargetOptions, base};
pub(crate) fn target() -> Target {
let mut base = base::linux_musl::opts();
base.cpu = "mips32r2".into();
base.features = "+mips32r2,+soft-float".into();
base.max_atomic_width = Some(32);
Target {
llvm_target: "mipsel-unknown-linux-musl".into(),
metadata: TargetMetadata {
description: Some("MIPS (little endian) Linux with musl 1.2.5".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64".into(),
arch: Arch::Mips,
options: TargetOptions { mcount: "_mcount".into(), ..base },
}
}
}
pub(crate) mod mips64_unknown_linux_muslabi64 {
use rustc_abi::Endian;
use crate::spec::{
Abi, Arch, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_musl::opts();
base.cpu = "mips64r2".into();
base.features = "+mips64r2,+xgot".into();
base.max_atomic_width = Some(64);
Target {
llvm_target: "mips64-unknown-linux-musl".into(),
metadata: TargetMetadata {
description: Some("MIPS64 Linux, N64 ABI, musl 1.2.5".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::Mips64,
options: TargetOptions {
abi: Abi::Abi64,
endian: Endian::Big,
mcount: "_mcount".into(),
llvm_abiname: "n64".into(),
..base
},
}
}
}
pub(crate) mod mips64el_unknown_linux_muslabi64 {
use crate::spec::{
Abi, Arch, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_musl::opts();
base.cpu = "mips64r2".into();
base.features = "+mips64r2,+xgot".into();
base.max_atomic_width = Some(64);
Target {
llvm_target: "mips64el-unknown-linux-musl".into(),
metadata: TargetMetadata {
description: Some("MIPS64 Linux, N64 ABI, musl 1.2.5".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::Mips64,
options: TargetOptions {
abi: Abi::Abi64,
mcount: "_mcount".into(),
llvm_abiname: "n64".into(),
..base
},
}
}
}
pub(crate) mod hexagon_unknown_linux_musl {
use crate::spec::{
Arch, Cc, LinkerFlavor, Target, TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_musl::opts();
base.cpu = "hexagonv60".into();
base.max_atomic_width = Some(32);
base.features = "-small-data,+hvx-length128b".into();
base.has_rpath = true;
base.linker = Some("rust-lld".into());
base.linker_flavor = LinkerFlavor::Unix(Cc::Yes);
base.c_enum_min_bits = Some(8);
Target {
llvm_target: "hexagon-unknown-linux-musl".into(),
metadata: TargetMetadata {
description: Some("Hexagon Linux with musl 1.2.5".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32:32-a:0-n16:32-i64:64:64-i32:32:32-i16:16:16-i1:8:8-f32:32:32-f64:64:64-v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048".into(),
arch: Arch::Hexagon,
options: base,
}
}
}
pub(crate) mod hexagon_unknown_none_elf {
use crate::spec::{
Arch, PanicStrategy, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "hexagon-unknown-none-elf".into(),
metadata: TargetMetadata {
description: Some("Bare Hexagon (v60+, HVX)".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32:32-a:0-n16:32-i64:64:64-i32:32:32-i16:16:16-i1:8:8-f32:32:32-f64:64:64-v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048".into(),
arch: Arch::Hexagon,
options: TargetOptions {
cpu: "hexagonv60".into(),
panic_strategy: PanicStrategy::Abort,
dynamic_linking: true,
features: "-small-data,+hvx-length128b".into(),
max_atomic_width: Some(32),
emit_debug_gdb_scripts: false,
c_enum_min_bits: Some(8),
linker: Some("rust-lld".into()),
..Default::default()
},
}
}
}
pub(crate) mod hexagon_unknown_qurt {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, Os, Target, TargetMetadata,
TargetOptions, cvs,
};
pub(crate) fn target() -> Target {
let mut base = TargetOptions::default();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::No, Lld::No),
&["-G0"]);
Target {
llvm_target: "hexagon-unknown-elf".into(),
metadata: TargetMetadata {
description: Some("Hexagon QuRT".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
data_layout: "\
e-m:e-p:32:32:32-a:0-n16:32-i64:64:64-i32:32\
:32-i16:16:16-i1:8:8-f32:32:32-f64:64:64-v32\
:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048\
:2048:2048".into(),
arch: Arch::Hexagon,
options: TargetOptions {
os: Os::Qurt,
vendor: "unknown".into(),
cpu: "hexagonv69".into(),
linker: Some("rust-lld".into()),
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
exe_suffix: ".elf".into(),
dynamic_linking: true,
executables: true,
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
has_thread_local: true,
has_rpath: false,
crt_static_default: false,
crt_static_respected: true,
crt_static_allows_dylibs: true,
no_default_libraries: false,
max_atomic_width: Some(32),
features: "-small-data,+hvx-length128b".into(),
c_enum_min_bits: Some(8),
..base
},
}
}
}
pub(crate) mod mips_unknown_linux_uclibc {
use rustc_abi::Endian;
use crate::spec::{Arch, Target, TargetMetadata, TargetOptions, base};
pub(crate) fn target() -> Target {
Target {
llvm_target: "mips-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: Some("MIPS Linux with uClibc".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64".into(),
arch: Arch::Mips,
options: TargetOptions {
endian: Endian::Big,
cpu: "mips32r2".into(),
features: "+mips32r2,+soft-float".into(),
max_atomic_width: Some(32),
mcount: "_mcount".into(),
..base::linux_uclibc::opts()
},
}
}
}
pub(crate) mod mipsel_unknown_linux_uclibc {
use crate::spec::{Arch, Target, TargetMetadata, TargetOptions, base};
pub(crate) fn target() -> Target {
Target {
llvm_target: "mipsel-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: Some("MIPS (LE) Linux with uClibc".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64".into(),
arch: Arch::Mips,
options: TargetOptions {
cpu: "mips32r2".into(),
features: "+mips32r2,+soft-float".into(),
max_atomic_width: Some(32),
mcount: "_mcount".into(),
..base::linux_uclibc::opts()
},
}
}
}
pub(crate) mod i686_linux_android {
use crate::spec::{
Arch, RustcAbi, SanitizerSet, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::android::opts();
base.max_atomic_width = Some(64);
base.rustc_abi = Some(RustcAbi::X86Sse2);
base.cpu = "pentium4".into();
base.features = "+mmx,+sse,+sse2,+sse3,+ssse3".into();
base.stack_probes = StackProbeType::Inline;
Target {
llvm_target: "i686-linux-android".into(),
metadata: TargetMetadata {
description: Some("32-bit x86 Android".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i128:128-f64:32:64-f80:32-n8:16:32-S128".into(),
arch: Arch::X86,
options: TargetOptions {
supported_sanitizers: SanitizerSet::ADDRESS,
..base
},
}
}
}
pub(crate) mod x86_64_linux_android {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, SanitizerSet, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::android::opts();
base.cpu = "x86-64".into();
base.plt_by_default = false;
base.features =
"+mmx,+sse,+sse2,+sse3,+ssse3,+sse4.1,+sse4.2,+popcnt".into();
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.stack_probes = StackProbeType::Inline;
base.supports_xray = true;
Target {
llvm_target: "x86_64-linux-android".into(),
metadata: TargetMetadata {
description: Some("64-bit x86 Android".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: TargetOptions {
supported_sanitizers: SanitizerSet::ADDRESS,
..base
},
}
}
}
pub(crate) mod arm_linux_androideabi {
use crate::spec::{
Abi, Arch, FloatAbi, SanitizerSet, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "arm-linux-androideabi".into(),
metadata: TargetMetadata {
description: Some("Armv6 Android".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
features: "+strict-align,+v5te".into(),
supported_sanitizers: SanitizerSet::ADDRESS,
max_atomic_width: Some(32),
..base::android::opts()
},
}
}
}
pub(crate) mod armv7_linux_androideabi {
use crate::spec::{
Abi, Arch, Cc, FloatAbi, LinkerFlavor, Lld, SanitizerSet, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::android::opts();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-march=armv7-a"]);
Target {
llvm_target: "armv7-none-linux-android".into(),
metadata: TargetMetadata {
description: Some("Armv7-A Android".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
features: "+v7,+thumb-mode,+thumb2,+vfp3d16,-neon".into(),
supported_sanitizers: SanitizerSet::ADDRESS,
max_atomic_width: Some(64),
..base
},
}
}
}
pub(crate) mod thumbv7neon_linux_androideabi {
use crate::spec::{
Abi, Arch, Cc, FloatAbi, LinkerFlavor, Lld, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::android::opts();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-march=armv7-a"]);
Target {
llvm_target: "armv7-none-linux-android".into(),
metadata: TargetMetadata {
description: Some("Thumb2-mode ARMv7-A Android with NEON".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
features: "+v7,+thumb-mode,+thumb2,+vfp3,+neon".into(),
max_atomic_width: Some(64),
..base
},
}
}
}
pub(crate) mod aarch64_linux_android {
use crate::spec::{
Arch, FramePointer, SanitizerSet, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "aarch64-linux-android".into(),
metadata: TargetMetadata {
description: Some("ARM64 Android".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: TargetOptions {
max_atomic_width: Some(128),
features: "+v8a,+neon,+outline-atomics".into(),
frame_pointer: FramePointer::NonLeaf,
stack_probes: StackProbeType::Inline,
supported_sanitizers: SanitizerSet::CFI |
SanitizerSet::HWADDRESS | SanitizerSet::MEMTAG |
SanitizerSet::SHADOWCALLSTACK | SanitizerSet::ADDRESS,
supports_xray: true,
..base::android::opts()
},
}
}
}
pub(crate) mod riscv64_linux_android {
use std::borrow::Cow;
use crate::spec::{
Arch, CodeModel, SanitizerSet, SplitDebuginfo, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "riscv64-linux-android".into(),
metadata: TargetMetadata {
description: Some("RISC-V 64-bit Android".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::RiscV64,
options: TargetOptions {
code_model: Some(CodeModel::Medium),
cpu: "generic-rv64".into(),
features: "+m,+a,+f,+d,+c,+b,+v,+zicsr,+zifencei".into(),
llvm_abiname: "lp64d".into(),
supported_sanitizers: SanitizerSet::ADDRESS,
max_atomic_width: Some(64),
supported_split_debuginfo: Cow::Borrowed(&[SplitDebuginfo::Off]),
..base::android::opts()
},
}
}
}
pub(crate) mod aarch64_unknown_freebsd {
use crate::spec::{
Arch, SanitizerSet, StackProbeType, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "aarch64-unknown-freebsd".into(),
metadata: TargetMetadata {
description: Some("ARM64 FreeBSD".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: TargetOptions {
features: "+v8a,+outline-atomics".into(),
max_atomic_width: Some(128),
stack_probes: StackProbeType::Inline,
supported_sanitizers: SanitizerSet::ADDRESS |
SanitizerSet::CFI | SanitizerSet::MEMORY |
SanitizerSet::THREAD,
..base::freebsd::opts()
},
}
}
}
pub(crate) mod armv6_unknown_freebsd {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv6-unknown-freebsd-gnueabihf".into(),
metadata: TargetMetadata {
description: Some("Armv6 FreeBSD".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
features: "+v6,+vfp2".into(),
max_atomic_width: Some(64),
mcount: "\u{1}__gnu_mcount_nc".into(),
llvm_mcount_intrinsic: Some("llvm.arm.gnu.eabi.mcount".into()),
..base::freebsd::opts()
},
}
}
}
pub(crate) mod armv7_unknown_freebsd {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv7-unknown-freebsd-gnueabihf".into(),
metadata: TargetMetadata {
description: Some("Armv7-A FreeBSD".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
features: "+v7,+vfp3d16,+thumb2,-neon".into(),
max_atomic_width: Some(64),
mcount: "\u{1}__gnu_mcount_nc".into(),
..base::freebsd::opts()
},
}
}
}
pub(crate) mod i686_unknown_freebsd {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, RustcAbi, StackProbeType, Target,
TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::freebsd::opts();
base.rustc_abi = Some(RustcAbi::X86Sse2);
base.cpu = "pentium4".into();
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m32", "-Wl,-znotext"]);
base.stack_probes = StackProbeType::Inline;
Target {
llvm_target: "i686-unknown-freebsd".into(),
metadata: TargetMetadata {
description: Some("32-bit FreeBSD".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i128:128-f64:32:64-f80:32-n8:16:32-S128".into(),
arch: Arch::X86,
options: base,
}
}
}
pub(crate) mod powerpc_unknown_freebsd {
use rustc_abi::Endian;
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::freebsd::opts();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m32", "--target=powerpc-unknown-freebsd13.0"]);
base.max_atomic_width = Some(32);
base.stack_probes = StackProbeType::Inline;
Target {
llvm_target: "powerpc-unknown-freebsd13.0".into(),
metadata: TargetMetadata {
description: Some("PowerPC FreeBSD".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "E-m:e-p:32:32-Fn32-i64:64-n32".into(),
arch: Arch::PowerPC,
options: TargetOptions {
endian: Endian::Big,
features: "+secure-plt".into(),
mcount: "_mcount".into(),
..base
},
}
}
}
pub(crate) mod powerpc64_unknown_freebsd {
use rustc_abi::Endian;
use crate::spec::{
Abi, Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::freebsd::opts();
base.cpu = "ppc64".into();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.max_atomic_width = Some(64);
base.stack_probes = StackProbeType::Inline;
base.abi = Abi::ElfV2;
base.llvm_abiname = "elfv2".into();
Target {
llvm_target: "powerpc64-unknown-freebsd".into(),
metadata: TargetMetadata {
description: Some("PPC64 FreeBSD (ELFv2)".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "E-m:e-Fn32-i64:64-i128:128-n32:64".into(),
arch: Arch::PowerPC64,
options: TargetOptions {
endian: Endian::Big,
mcount: "_mcount".into(),
..base
},
}
}
}
pub(crate) mod powerpc64le_unknown_freebsd {
use crate::spec::{
Abi, Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::freebsd::opts();
base.cpu = "ppc64le".into();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.max_atomic_width = Some(64);
base.stack_probes = StackProbeType::Inline;
base.abi = Abi::ElfV2;
base.llvm_abiname = "elfv2".into();
Target {
llvm_target: "powerpc64le-unknown-freebsd".into(),
metadata: TargetMetadata {
description: Some("PPC64LE FreeBSD".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-Fn32-i64:64-i128:128-n32:64".into(),
arch: Arch::PowerPC64,
options: TargetOptions { mcount: "_mcount".into(), ..base },
}
}
}
pub(crate) mod riscv64gc_unknown_freebsd {
use crate::spec::{
Arch, CodeModel, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "riscv64-unknown-freebsd".into(),
metadata: TargetMetadata {
description: Some("RISC-V FreeBSD".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::RiscV64,
options: TargetOptions {
code_model: Some(CodeModel::Medium),
cpu: "generic-rv64".into(),
features: "+m,+a,+f,+d,+c,+zicsr,+zifencei".into(),
llvm_abiname: "lp64d".into(),
max_atomic_width: Some(64),
..base::freebsd::opts()
},
}
}
}
pub(crate) mod x86_64_unknown_freebsd {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, SanitizerSet, StackProbeType, Target,
TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::freebsd::opts();
base.cpu = "x86-64".into();
base.plt_by_default = false;
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.stack_probes = StackProbeType::Inline;
base.supported_sanitizers =
SanitizerSet::ADDRESS | SanitizerSet::CFI |
SanitizerSet::MEMORY | SanitizerSet::THREAD;
base.supports_xray = true;
Target {
llvm_target: "x86_64-unknown-freebsd".into(),
metadata: TargetMetadata {
description: Some("64-bit FreeBSD".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod x86_64_unknown_dragonfly {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::dragonfly::opts();
base.cpu = "x86-64".into();
base.plt_by_default = false;
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.stack_probes = StackProbeType::Inline;
Target {
llvm_target: "x86_64-unknown-dragonfly".into(),
metadata: TargetMetadata {
description: Some("64-bit DragonFlyBSD".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod aarch64_unknown_openbsd {
use crate::spec::{
Arch, StackProbeType, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "aarch64-unknown-openbsd".into(),
metadata: TargetMetadata {
description: Some("ARM64 OpenBSD".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: TargetOptions {
features: "+v8a,+outline-atomics".into(),
max_atomic_width: Some(128),
stack_probes: StackProbeType::Inline,
..base::openbsd::opts()
},
}
}
}
pub(crate) mod i686_unknown_openbsd {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, RustcAbi, StackProbeType, Target,
TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::openbsd::opts();
base.rustc_abi = Some(RustcAbi::X86Sse2);
base.cpu = "pentium4".into();
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m32", "-fuse-ld=lld"]);
base.stack_probes = StackProbeType::Inline;
Target {
llvm_target: "i686-unknown-openbsd".into(),
metadata: TargetMetadata {
description: Some("32-bit OpenBSD".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i128:128-f64:32:64-f80:32-n8:16:32-S128".into(),
arch: Arch::X86,
options: base,
}
}
}
pub(crate) mod powerpc_unknown_openbsd {
use rustc_abi::Endian;
use crate::spec::{Arch, StackProbeType, Target, TargetMetadata, base};
pub(crate) fn target() -> Target {
let mut base = base::openbsd::opts();
base.endian = Endian::Big;
base.max_atomic_width = Some(32);
base.stack_probes = StackProbeType::Inline;
Target {
llvm_target: "powerpc-unknown-openbsd".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "E-m:e-p:32:32-Fn32-i64:64-n32".into(),
arch: Arch::PowerPC,
options: base,
}
}
}
pub(crate) mod powerpc64_unknown_openbsd {
use rustc_abi::Endian;
use crate::spec::{
Abi, Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::openbsd::opts();
base.cpu = "ppc64".into();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.max_atomic_width = Some(64);
base.stack_probes = StackProbeType::Inline;
base.abi = Abi::ElfV2;
base.llvm_abiname = "elfv2".into();
Target {
llvm_target: "powerpc64-unknown-openbsd".into(),
metadata: TargetMetadata {
description: Some("OpenBSD/powerpc64".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "E-m:e-Fn32-i64:64-i128:128-n32:64".into(),
arch: Arch::PowerPC64,
options: TargetOptions {
endian: Endian::Big,
mcount: "_mcount".into(),
..base
},
}
}
}
pub(crate) mod riscv64gc_unknown_openbsd {
use crate::spec::{
Arch, CodeModel, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "riscv64-unknown-openbsd".into(),
metadata: TargetMetadata {
description: Some("OpenBSD/riscv64".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::RiscV64,
options: TargetOptions {
code_model: Some(CodeModel::Medium),
cpu: "generic-rv64".into(),
features: "+m,+a,+f,+d,+c,+zicsr,+zifencei".into(),
llvm_abiname: "lp64d".into(),
max_atomic_width: Some(64),
..base::openbsd::opts()
},
}
}
}
pub(crate) mod sparc64_unknown_openbsd {
use rustc_abi::Endian;
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, Target, TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::openbsd::opts();
base.endian = Endian::Big;
base.cpu = "v9".into();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.max_atomic_width = Some(64);
Target {
llvm_target: "sparc64-unknown-openbsd".into(),
metadata: TargetMetadata {
description: Some("OpenBSD/sparc64".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "E-m:e-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::Sparc64,
options: base,
}
}
}
pub(crate) mod x86_64_unknown_openbsd {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::openbsd::opts();
base.cpu = "x86-64".into();
base.plt_by_default = false;
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.stack_probes = StackProbeType::Inline;
base.supports_xray = true;
Target {
llvm_target: "x86_64-unknown-openbsd".into(),
metadata: TargetMetadata {
description: Some("64-bit OpenBSD".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod aarch64_unknown_netbsd {
use crate::spec::{
Arch, StackProbeType, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "aarch64-unknown-netbsd".into(),
metadata: TargetMetadata {
description: Some("ARM64 NetBSD".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: TargetOptions {
features: "+v8a".into(),
mcount: "__mcount".into(),
max_atomic_width: Some(128),
stack_probes: StackProbeType::Inline,
..base::netbsd::opts()
},
}
}
}
pub(crate) mod aarch64_be_unknown_netbsd {
use rustc_abi::Endian;
use crate::spec::{
Arch, StackProbeType, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "aarch64_be-unknown-netbsd".into(),
metadata: TargetMetadata {
description: Some("ARM64 NetBSD (big-endian)".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "E-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: TargetOptions {
mcount: "__mcount".into(),
max_atomic_width: Some(128),
stack_probes: StackProbeType::Inline,
endian: Endian::Big,
..base::netbsd::opts()
},
}
}
}
pub(crate) mod armv6_unknown_netbsd_eabihf {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv6-unknown-netbsdelf-eabihf".into(),
metadata: TargetMetadata {
description: Some("Armv6 NetBSD w/hard-float".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
features: "+v6,+vfp2".into(),
max_atomic_width: Some(64),
mcount: "__mcount".into(),
..base::netbsd::opts()
},
}
}
}
pub(crate) mod armv7_unknown_netbsd_eabihf {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv7-unknown-netbsdelf-eabihf".into(),
metadata: TargetMetadata {
description: Some("Armv7-A NetBSD w/hard-float".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
features: "+v7,+vfp3d16,+thumb2,-neon".into(),
max_atomic_width: Some(64),
mcount: "__mcount".into(),
..base::netbsd::opts()
},
}
}
}
pub(crate) mod i586_unknown_netbsd {
use crate::spec::{
Arch, StackProbeType, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::netbsd::opts();
base.cpu = "pentium".into();
base.max_atomic_width = Some(64);
base.stack_probes = StackProbeType::Inline;
Target {
llvm_target: "i586-unknown-netbsdelf".into(),
metadata: TargetMetadata {
description: Some("32-bit x86, resricted to Pentium".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i128:128-f64:32:64-f80:32-n8:16:32-S128".into(),
arch: Arch::X86,
options: TargetOptions { mcount: "__mcount".into(), ..base },
}
}
}
pub(crate) mod i686_unknown_netbsd {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, RustcAbi, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::netbsd::opts();
base.rustc_abi = Some(RustcAbi::X86Sse2);
base.cpu = "pentium4".into();
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m32"]);
base.stack_probes = StackProbeType::Inline;
Target {
llvm_target: "i686-unknown-netbsdelf".into(),
metadata: TargetMetadata {
description: Some("NetBSD/i386 with SSE2".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i128:128-f64:32:64-f80:32-n8:16:32-S128".into(),
arch: Arch::X86,
options: TargetOptions { mcount: "__mcount".into(), ..base },
}
}
}
pub(crate) mod mipsel_unknown_netbsd {
use rustc_abi::Endian;
use crate::spec::{Arch, Target, TargetMetadata, TargetOptions, base};
pub(crate) fn target() -> Target {
let mut base = base::netbsd::opts();
base.max_atomic_width = Some(32);
base.cpu = "mips32".into();
Target {
llvm_target: "mipsel-unknown-netbsd".into(),
metadata: TargetMetadata {
description: Some("32-bit MIPS (LE), requires mips32 cpu support".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64".into(),
arch: Arch::Mips,
options: TargetOptions {
features: "+soft-float".into(),
mcount: "__mcount".into(),
endian: Endian::Little,
..base
},
}
}
}
pub(crate) mod powerpc_unknown_netbsd {
use rustc_abi::Endian;
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::netbsd::opts();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m32"]);
base.max_atomic_width = Some(32);
base.stack_probes = StackProbeType::Inline;
Target {
llvm_target: "powerpc-unknown-netbsd".into(),
metadata: TargetMetadata {
description: Some("NetBSD 32-bit powerpc systems".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "E-m:e-p:32:32-Fn32-i64:64-n32".into(),
arch: Arch::PowerPC,
options: TargetOptions {
endian: Endian::Big,
mcount: "__mcount".into(),
..base
},
}
}
}
pub(crate) mod riscv64gc_unknown_netbsd {
use crate::spec::{
Arch, CodeModel, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "riscv64-unknown-netbsd".into(),
metadata: TargetMetadata {
description: Some("RISC-V NetBSD".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::RiscV64,
options: TargetOptions {
code_model: Some(CodeModel::Medium),
cpu: "generic-rv64".into(),
features: "+m,+a,+f,+d,+c,+zicsr,+zifencei".into(),
llvm_abiname: "lp64d".into(),
max_atomic_width: Some(64),
mcount: "__mcount".into(),
..base::netbsd::opts()
},
}
}
}
pub(crate) mod sparc64_unknown_netbsd {
use rustc_abi::Endian;
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::netbsd::opts();
base.cpu = "v9".into();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.max_atomic_width = Some(64);
Target {
llvm_target: "sparc64-unknown-netbsd".into(),
metadata: TargetMetadata {
description: Some("NetBSD/sparc64".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "E-m:e-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::Sparc64,
options: TargetOptions {
endian: Endian::Big,
mcount: "__mcount".into(),
..base
},
}
}
}
pub(crate) mod x86_64_unknown_netbsd {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, SanitizerSet, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::netbsd::opts();
base.cpu = "x86-64".into();
base.plt_by_default = false;
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.stack_probes = StackProbeType::Inline;
base.supported_sanitizers =
SanitizerSet::ADDRESS | SanitizerSet::CFI | SanitizerSet::LEAK
| SanitizerSet::MEMORY | SanitizerSet::THREAD;
base.supports_xray = true;
Target {
llvm_target: "x86_64-unknown-netbsd".into(),
metadata: TargetMetadata {
description: Some("NetBSD/amd64".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: TargetOptions { mcount: "__mcount".into(), ..base },
}
}
}
pub(crate) mod i686_unknown_haiku {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, RustcAbi, StackProbeType, Target,
TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::haiku::opts();
base.rustc_abi = Some(RustcAbi::X86Sse2);
base.cpu = "pentium4".into();
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m32"]);
base.stack_probes = StackProbeType::Inline;
Target {
llvm_target: "i686-unknown-haiku".into(),
metadata: TargetMetadata {
description: Some("32-bit Haiku".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i128:128-f64:32:64-f80:32-n8:16:32-S128".into(),
arch: Arch::X86,
options: base,
}
}
}
pub(crate) mod x86_64_unknown_haiku {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::haiku::opts();
base.cpu = "x86-64".into();
base.plt_by_default = false;
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.stack_probes = StackProbeType::Inline;
base.position_independent_executables = true;
Target {
llvm_target: "x86_64-unknown-haiku".into(),
metadata: TargetMetadata {
description: Some("64-bit Haiku".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod aarch64_unknown_helenos {
use crate::spec::{Arch, Target, base};
pub(crate) fn target() -> Target {
let mut base = base::helenos::opts();
base.max_atomic_width = Some(128);
base.features = "+v8a".into();
base.linker = Some("aarch64-helenos-gcc".into());
Target {
llvm_target: "aarch64-unknown-helenos".into(),
metadata: crate::spec::TargetMetadata {
description: Some("ARM64 HelenOS".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: base,
}
}
}
pub(crate) mod i686_unknown_helenos {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, RustcAbi, Target, base,
};
pub(crate) fn target() -> Target {
let mut base = base::helenos::opts();
base.cpu = "pentium4".into();
base.max_atomic_width = Some(64);
base.linker = Some("i686-helenos-gcc".into());
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m32"]);
base.rustc_abi = Some(RustcAbi::X86Sse2);
Target {
llvm_target: "i686-unknown-helenos".into(),
metadata: crate::spec::TargetMetadata {
description: Some("IA-32 (i686) HelenOS".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i128:128-f64:32:64-f80:32-n8:16:32-S128".into(),
arch: Arch::X86,
options: base,
}
}
}
pub(crate) mod powerpc_unknown_helenos {
use rustc_abi::Endian;
use crate::spec::{Arch, Target, TargetMetadata, base};
pub(crate) fn target() -> Target {
let mut base = base::helenos::opts();
base.endian = Endian::Big;
base.max_atomic_width = Some(32);
base.linker = Some("ppc-helenos-gcc".into());
Target {
llvm_target: "powerpc-unknown-helenos".into(),
metadata: TargetMetadata {
description: Some("PowerPC HelenOS".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "E-m:e-p:32:32-Fn32-i64:64-n32".into(),
arch: Arch::PowerPC,
options: base,
}
}
}
pub(crate) mod sparc64_unknown_helenos {
use rustc_abi::Endian;
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, Target, TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::helenos::opts();
base.endian = Endian::Big;
base.cpu = "v9".into();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.max_atomic_width = Some(64);
base.linker = Some("sparc64-helenos-gcc".into());
Target {
llvm_target: "sparc64-unknown-helenos".into(),
metadata: TargetMetadata {
description: Some("SPARC HelenOS".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "E-m:e-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::Sparc64,
options: base,
}
}
}
pub(crate) mod x86_64_unknown_helenos {
use crate::spec::{Arch, Cc, LinkerFlavor, Lld, Target, base};
pub(crate) fn target() -> Target {
let mut base = base::helenos::opts();
base.cpu = "x86-64".into();
base.plt_by_default = false;
base.max_atomic_width = Some(64);
base.linker = Some("amd64-helenos-gcc".into());
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
Target {
llvm_target: "x86_64-unknown-helenos".into(),
metadata: crate::spec::TargetMetadata {
description: Some("64-bit HelenOS".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod i686_unknown_hurd_gnu {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::hurd_gnu::opts();
base.cpu = "pentium4".into();
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m32"]);
base.stack_probes = StackProbeType::Inline;
Target {
llvm_target: "i686-unknown-hurd-gnu".into(),
metadata: TargetMetadata {
description: Some("32-bit GNU/Hurd".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i128:128-f64:32:64-f80:32-n8:16:32-S128".into(),
arch: Arch::X86,
options: base,
}
}
}
pub(crate) mod x86_64_unknown_hurd_gnu {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::hurd_gnu::opts();
base.cpu = "x86-64".into();
base.plt_by_default = false;
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.stack_probes = StackProbeType::Inline;
base.supports_xray = true;
Target {
llvm_target: "x86_64-unknown-hurd-gnu".into(),
metadata: TargetMetadata {
description: Some("64-bit GNU/Hurd".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod aarch64_apple_darwin {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{
Os, SanitizerSet, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::MacOs, Arch::Arm64, TargetEnv::Normal);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("ARM64 Apple macOS (11.0+, Big Sur+)".into()),
tier: Some(1),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch,
options: TargetOptions {
mcount: "\u{1}mcount".into(),
cpu: "apple-m1".into(),
max_atomic_width: Some(128),
supported_sanitizers: SanitizerSet::ADDRESS |
SanitizerSet::CFI | SanitizerSet::THREAD |
SanitizerSet::REALTIME,
supports_xray: true,
..opts
},
}
}
}
pub(crate) mod arm64e_apple_darwin {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{
Os, SanitizerSet, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::MacOs, Arch::Arm64e, TargetEnv::Normal);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("ARM64e Apple Darwin".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch,
options: TargetOptions {
mcount: "\u{1}mcount".into(),
cpu: "apple-m1".into(),
max_atomic_width: Some(128),
supported_sanitizers: SanitizerSet::ADDRESS |
SanitizerSet::CFI | SanitizerSet::THREAD,
..opts
},
}
}
}
pub(crate) mod x86_64_apple_darwin {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{
Os, SanitizerSet, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::MacOs, Arch::X86_64, TargetEnv::Normal);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("x86_64 Apple macOS (10.12+, Sierra+)".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch,
options: TargetOptions {
mcount: "\u{1}mcount".into(),
max_atomic_width: Some(128),
supported_sanitizers: SanitizerSet::ADDRESS |
SanitizerSet::CFI | SanitizerSet::LEAK |
SanitizerSet::THREAD | SanitizerSet::REALTIME,
supports_xray: true,
..opts
},
}
}
}
pub(crate) mod x86_64h_apple_darwin {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{
Os, SanitizerSet, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
let (mut opts, llvm_target, arch) =
base(Os::MacOs, Arch::X86_64h, TargetEnv::Normal);
opts.max_atomic_width = Some(128);
opts.supported_sanitizers =
SanitizerSet::ADDRESS | SanitizerSet::CFI | SanitizerSet::LEAK
| SanitizerSet::THREAD;
opts.features = "-rdrand,-aes,-pclmulqdq,-rtm,-fsgsbase".into();
match (&opts.cpu, &"core-avx2") {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val,
::core::option::Option::Some(format_args!("you need to adjust the feature list in x86_64h-apple-darwin if you change this")));
}
}
};
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("x86_64 Apple macOS with Intel Haswell+".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch,
options: TargetOptions {
mcount: "\u{1}mcount".into(),
..opts
},
}
}
}
pub(crate) mod i686_apple_darwin {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{Os, Target, TargetMetadata, TargetOptions};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::MacOs, Arch::I686, TargetEnv::Normal);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("x86 Apple macOS (10.12+, Sierra+)".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:o-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i128:128-f64:32:64-f80:128-n8:16:32-S128".into(),
arch,
options: TargetOptions {
mcount: "\u{1}mcount".into(),
max_atomic_width: Some(64),
..opts
},
}
}
}
pub(crate) mod aarch64_unknown_fuchsia {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, SanitizerSet, StackProbeType, Target,
TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::fuchsia::opts();
base.cpu = "generic".into();
base.features =
"+v8a,+crc,+aes,+sha2,+neon,+outline-atomics".into();
base.max_atomic_width = Some(128);
base.stack_probes = StackProbeType::Inline;
base.supported_sanitizers =
SanitizerSet::ADDRESS | SanitizerSet::CFI | SanitizerSet::LEAK
| SanitizerSet::SHADOWCALLSTACK;
base.default_sanitizers = SanitizerSet::SHADOWCALLSTACK;
base.supports_xray = true;
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::No, Lld::No),
&["--execute-only", "--fix-cortex-a53-843419"]);
Target {
llvm_target: "aarch64-unknown-fuchsia".into(),
metadata: TargetMetadata {
description: Some("ARM64 Fuchsia".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: base,
}
}
}
pub(crate) mod riscv64gc_unknown_fuchsia {
use crate::spec::{
Arch, CodeModel, SanitizerSet, StackProbeType, Target,
TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::fuchsia::opts();
base.code_model = Some(CodeModel::Medium);
base.cpu = "generic-rv64".into();
base.features = "+m,+a,+f,+d,+c,+zicsr,+zifencei".into();
base.llvm_abiname = "lp64d".into();
base.max_atomic_width = Some(64);
base.stack_probes = StackProbeType::Inline;
base.supported_sanitizers = SanitizerSet::SHADOWCALLSTACK;
base.default_sanitizers = SanitizerSet::SHADOWCALLSTACK;
base.supports_xray = true;
Target {
llvm_target: "riscv64-unknown-fuchsia".into(),
metadata: TargetMetadata {
description: Some("RISC-V Fuchsia".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::RiscV64,
options: base,
}
}
}
pub(crate) mod x86_64_unknown_fuchsia {
use crate::spec::{
Arch, SanitizerSet, StackProbeType, Target, TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::fuchsia::opts();
base.cpu = "x86-64".into();
base.plt_by_default = false;
base.features =
"+cmpxchg16b,+lahfsahf,+popcnt,+sse3,+sse4.1,+sse4.2,+ssse3".into();
base.max_atomic_width = Some(128);
base.stack_probes = StackProbeType::Inline;
base.supported_sanitizers =
SanitizerSet::ADDRESS | SanitizerSet::CFI |
SanitizerSet::LEAK;
base.supports_xray = true;
Target {
llvm_target: "x86_64-unknown-fuchsia".into(),
metadata: TargetMetadata {
description: Some("64-bit x86 Fuchsia".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod avr_none {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, RelocModel, Target, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
arch: Arch::Avr,
metadata: crate::spec::TargetMetadata {
description: None,
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
data_layout: "e-P1-p:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8:16-a:8".into(),
llvm_target: "avr-unknown-unknown".into(),
pointer_width: 16,
options: TargetOptions {
c_int_width: 16,
exe_suffix: ".elf".into(),
linker: Some("avr-gcc".into()),
eh_frame_header: false,
pre_link_args: TargetOptions::link_args(LinkerFlavor::Gnu(Cc::Yes,
Lld::No), &[]),
late_link_args: TargetOptions::link_args(LinkerFlavor::Gnu(Cc::Yes,
Lld::No), &["-lgcc"]),
max_atomic_width: Some(16),
atomic_cas: false,
relocation_model: RelocModel::Static,
need_explicit_cpu: true,
..TargetOptions::default()
},
}
}
}
pub(crate) mod x86_64_unknown_l4re_uclibc {
use crate::spec::{Arch, PanicStrategy, Target, TargetMetadata, base};
pub(crate) fn target() -> Target {
let mut base = base::l4re::opts();
base.cpu = "x86-64".into();
base.plt_by_default = false;
base.max_atomic_width = Some(64);
base.panic_strategy = PanicStrategy::Abort;
Target {
llvm_target: "x86_64-unknown-l4re-gnu".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: Some(false),
std: None,
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod aarch64_unknown_redox {
use crate::spec::{Arch, StackProbeType, Target, TargetMetadata, base};
pub(crate) fn target() -> Target {
let mut base = base::redox::opts();
base.max_atomic_width = Some(128);
base.stack_probes = StackProbeType::Inline;
base.features = "+v8a".into();
Target {
llvm_target: "aarch64-unknown-redox".into(),
metadata: TargetMetadata {
description: Some("ARM64 RedoxOS".into()),
tier: Some(3),
host_tools: Some(false),
std: None,
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: base,
}
}
}
pub(crate) mod i586_unknown_redox {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::redox::opts();
base.cpu = "pentiumpro".into();
base.plt_by_default = false;
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m32"]);
base.stack_probes = StackProbeType::Call;
Target {
llvm_target: "i586-unknown-redox".into(),
metadata: TargetMetadata {
description: None,
tier: None,
host_tools: None,
std: None,
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-i128:128-f64:32:64-f80:32-n8:16:32-S128".into(),
arch: Arch::X86,
options: base,
}
}
}
pub(crate) mod riscv64gc_unknown_redox {
use crate::spec::{Arch, CodeModel, Target, TargetMetadata, base};
pub(crate) fn target() -> Target {
let mut base = base::redox::opts();
base.code_model = Some(CodeModel::Medium);
base.cpu = "generic-rv64".into();
base.features = "+m,+a,+f,+d,+c".into();
base.llvm_abiname = "lp64d".into();
base.plt_by_default = false;
base.max_atomic_width = Some(64);
Target {
llvm_target: "riscv64-unknown-redox".into(),
metadata: TargetMetadata {
description: Some("Redox OS".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::RiscV64,
options: base,
}
}
}
pub(crate) mod x86_64_unknown_redox {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::redox::opts();
base.cpu = "x86-64".into();
base.plt_by_default = false;
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.stack_probes = StackProbeType::Inline;
Target {
llvm_target: "x86_64-unknown-redox".into(),
metadata: TargetMetadata {
description: Some("Redox OS".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod x86_64_unknown_managarm_mlibc {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target, base,
};
pub(crate) fn target() -> Target {
let mut base = base::managarm_mlibc::opts();
base.cpu = "x86-64".into();
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.stack_probes = StackProbeType::Inline;
Target {
llvm_target: "x86_64-unknown-managarm-mlibc".into(),
metadata: crate::spec::TargetMetadata {
description: Some("managarm/amd64".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod aarch64_unknown_managarm_mlibc {
use crate::spec::{Arch, StackProbeType, Target, base};
pub(crate) fn target() -> Target {
let mut base = base::managarm_mlibc::opts();
base.max_atomic_width = Some(128);
base.stack_probes = StackProbeType::Inline;
base.features = "+v8a".into();
Target {
llvm_target: "aarch64-unknown-managarm-mlibc".into(),
metadata: crate::spec::TargetMetadata {
description: Some("managarm/aarch64".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: base,
}
}
}
pub(crate) mod riscv64gc_unknown_managarm_mlibc {
use crate::spec::{Arch, CodeModel, Target, TargetOptions, base};
pub(crate) fn target() -> Target {
Target {
llvm_target: "riscv64-unknown-managarm-mlibc".into(),
metadata: crate::spec::TargetMetadata {
description: Some("managarm/riscv64".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 64,
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::RiscV64,
options: TargetOptions {
code_model: Some(CodeModel::Medium),
cpu: "generic-rv64".into(),
features: "+m,+a,+f,+d,+c".into(),
llvm_abiname: "lp64d".into(),
max_atomic_width: Some(64),
..base::managarm_mlibc::opts()
},
}
}
}
pub(crate) mod i386_apple_ios {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{Os, Target, TargetMetadata, TargetOptions};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::IOs, Arch::I386, TargetEnv::Simulator);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("x86 Apple iOS Simulator".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:o-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i128:128-f64:32:64-f80:128-n8:16:32-S128".into(),
arch,
options: TargetOptions { max_atomic_width: Some(64), ..opts },
}
}
}
pub(crate) mod x86_64_apple_ios {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{
Os, SanitizerSet, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::IOs, Arch::X86_64, TargetEnv::Simulator);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("x86_64 Apple iOS Simulator".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch,
options: TargetOptions {
max_atomic_width: Some(128),
supported_sanitizers: SanitizerSet::ADDRESS |
SanitizerSet::THREAD,
..opts
},
}
}
}
pub(crate) mod aarch64_apple_ios {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{
Os, SanitizerSet, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::IOs, Arch::Arm64, TargetEnv::Normal);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("ARM64 Apple iOS".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch,
options: TargetOptions {
features: "+neon,+apple-a7".into(),
max_atomic_width: Some(128),
supported_sanitizers: SanitizerSet::ADDRESS |
SanitizerSet::THREAD | SanitizerSet::REALTIME,
..opts
},
}
}
}
pub(crate) mod arm64e_apple_ios {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{
Os, SanitizerSet, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::IOs, Arch::Arm64e, TargetEnv::Normal);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("ARM64e Apple iOS".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch,
options: TargetOptions {
features: "+neon,+apple-a12,+v8.3a,+paca,+pacg".into(),
max_atomic_width: Some(128),
supported_sanitizers: SanitizerSet::ADDRESS |
SanitizerSet::THREAD,
..opts
},
}
}
}
pub(crate) mod armv7s_apple_ios {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{Os, Target, TargetMetadata, TargetOptions};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::IOs, Arch::Armv7s, TargetEnv::Normal);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("ARMv7-A Apple-A6 Apple iOS".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:o-p:32:32-Fi8-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32".into(),
arch,
options: TargetOptions {
features: "+v7,+vfp4,+neon".into(),
max_atomic_width: Some(64),
..opts
},
}
}
}
pub(crate) mod x86_64_apple_ios_macabi {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{
Os, SanitizerSet, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::IOs, Arch::X86_64, TargetEnv::MacCatalyst);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("x86_64 Apple Mac Catalyst".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch,
options: TargetOptions {
max_atomic_width: Some(128),
supported_sanitizers: SanitizerSet::ADDRESS |
SanitizerSet::LEAK | SanitizerSet::THREAD,
..opts
},
}
}
}
pub(crate) mod aarch64_apple_ios_macabi {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{
Os, SanitizerSet, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::IOs, Arch::Arm64, TargetEnv::MacCatalyst);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("ARM64 Apple Mac Catalyst".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch,
options: TargetOptions {
features: "+neon,+apple-a12".into(),
max_atomic_width: Some(128),
supported_sanitizers: SanitizerSet::ADDRESS |
SanitizerSet::LEAK | SanitizerSet::THREAD,
..opts
},
}
}
}
pub(crate) mod aarch64_apple_ios_sim {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{
Os, SanitizerSet, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::IOs, Arch::Arm64, TargetEnv::Simulator);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("ARM64 Apple iOS Simulator".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch,
options: TargetOptions {
features: "+neon,+apple-a7".into(),
max_atomic_width: Some(128),
supported_sanitizers: SanitizerSet::ADDRESS |
SanitizerSet::THREAD | SanitizerSet::REALTIME,
..opts
},
}
}
}
pub(crate) mod aarch64_apple_tvos {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{Os, Target, TargetMetadata, TargetOptions};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::TvOs, Arch::Arm64, TargetEnv::Normal);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("ARM64 Apple tvOS".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch,
options: TargetOptions {
features: "+neon,+apple-a7".into(),
max_atomic_width: Some(128),
..opts
},
}
}
}
pub(crate) mod aarch64_apple_tvos_sim {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{Os, Target, TargetMetadata, TargetOptions};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::TvOs, Arch::Arm64, TargetEnv::Simulator);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("ARM64 Apple tvOS Simulator".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch,
options: TargetOptions {
features: "+neon,+apple-a7".into(),
max_atomic_width: Some(128),
..opts
},
}
}
}
pub(crate) mod arm64e_apple_tvos {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{Os, Target, TargetMetadata, TargetOptions};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::TvOs, Arch::Arm64e, TargetEnv::Normal);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("ARM64e Apple tvOS".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch,
options: TargetOptions {
features: "+neon,+apple-a12,+v8.3a,+paca,+pacg".into(),
max_atomic_width: Some(128),
..opts
},
}
}
}
pub(crate) mod x86_64_apple_tvos {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{Os, Target, TargetMetadata, TargetOptions};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::TvOs, Arch::X86_64, TargetEnv::Simulator);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("x86_64 Apple tvOS Simulator".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch,
options: TargetOptions { max_atomic_width: Some(128), ..opts },
}
}
}
pub(crate) mod armv7k_apple_watchos {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{Os, Target, TargetMetadata, TargetOptions};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::WatchOs, Arch::Armv7k, TargetEnv::Normal);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("Armv7-A Apple WatchOS".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:o-p:32:32-Fi8-i64:64-a:0:32-n32-S128".into(),
arch,
options: TargetOptions {
features: "+v7,+vfp4,+neon".into(),
max_atomic_width: Some(64),
dynamic_linking: false,
position_independent_executables: true,
..opts
},
}
}
}
pub(crate) mod arm64_32_apple_watchos {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{Os, Target, TargetMetadata, TargetOptions};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::WatchOs, Arch::Arm64_32, TargetEnv::Normal);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("ARM64 Apple watchOS with 32-bit pointers".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:o-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch,
options: TargetOptions {
features: "+v8a,+neon,+apple-a7".into(),
max_atomic_width: Some(128),
dynamic_linking: false,
position_independent_executables: true,
..opts
},
}
}
}
pub(crate) mod x86_64_apple_watchos_sim {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{Os, Target, TargetMetadata, TargetOptions};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::WatchOs, Arch::X86_64, TargetEnv::Simulator);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("x86_64 Apple watchOS Simulator".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch,
options: TargetOptions { max_atomic_width: Some(128), ..opts },
}
}
}
pub(crate) mod aarch64_apple_watchos {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{Os, Target, TargetMetadata, TargetOptions};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::WatchOs, Arch::Arm64, TargetEnv::Normal);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("ARM64 Apple watchOS".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch,
options: TargetOptions {
features: "+v8a,+neon,+apple-a7".into(),
max_atomic_width: Some(128),
dynamic_linking: false,
position_independent_executables: true,
..opts
},
}
}
}
pub(crate) mod aarch64_apple_watchos_sim {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{Os, Target, TargetMetadata, TargetOptions};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::WatchOs, Arch::Arm64, TargetEnv::Simulator);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("ARM64 Apple watchOS Simulator".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch,
options: TargetOptions {
features: "+neon,+apple-a7".into(),
max_atomic_width: Some(128),
..opts
},
}
}
}
pub(crate) mod aarch64_apple_visionos {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{
Os, SanitizerSet, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::VisionOs, Arch::Arm64, TargetEnv::Normal);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("ARM64 Apple visionOS".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch,
options: TargetOptions {
features: "+neon,+apple-a16".into(),
max_atomic_width: Some(128),
supported_sanitizers: SanitizerSet::ADDRESS |
SanitizerSet::THREAD,
..opts
},
}
}
}
pub(crate) mod aarch64_apple_visionos_sim {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{
Os, SanitizerSet, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::VisionOs, Arch::Arm64, TargetEnv::Simulator);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("ARM64 Apple visionOS simulator".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch,
options: TargetOptions {
features: "+neon,+apple-a16".into(),
max_atomic_width: Some(128),
supported_sanitizers: SanitizerSet::ADDRESS |
SanitizerSet::THREAD,
..opts
},
}
}
}
pub(crate) mod armebv7r_none_eabi {
use rustc_abi::Endian;
use crate::spec::{
Abi, Arch, Cc, FloatAbi, LinkerFlavor, Lld, PanicStrategy,
RelocModel, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armebv7r-none-eabi".into(),
metadata: TargetMetadata {
description: Some("Bare Armv7-R, Big Endian".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
data_layout: "E-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
endian: Endian::Big,
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
relocation_model: RelocModel::Static,
panic_strategy: PanicStrategy::Abort,
max_atomic_width: Some(64),
emit_debug_gdb_scripts: false,
c_enum_min_bits: Some(8),
has_thumb_interworking: true,
..Default::default()
},
}
}
}
pub(crate) mod armebv7r_none_eabihf {
use rustc_abi::Endian;
use crate::spec::{
Abi, Arch, Cc, FloatAbi, LinkerFlavor, Lld, PanicStrategy,
RelocModel, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armebv7r-none-eabihf".into(),
metadata: TargetMetadata {
description: Some("Bare Armv7-R, Big Endian, hardfloat".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
data_layout: "E-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
endian: Endian::Big,
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
relocation_model: RelocModel::Static,
panic_strategy: PanicStrategy::Abort,
features: "+vfp3d16".into(),
max_atomic_width: Some(64),
emit_debug_gdb_scripts: false,
c_enum_min_bits: Some(8),
has_thumb_interworking: true,
..Default::default()
},
}
}
}
pub(crate) mod armv7r_none_eabi {
use crate::spec::{
Abi, Arch, Cc, FloatAbi, LinkerFlavor, Lld, PanicStrategy,
RelocModel, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv7r-none-eabi".into(),
metadata: TargetMetadata {
description: Some("Armv7-R".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
relocation_model: RelocModel::Static,
panic_strategy: PanicStrategy::Abort,
max_atomic_width: Some(64),
emit_debug_gdb_scripts: false,
c_enum_min_bits: Some(8),
has_thumb_interworking: true,
..Default::default()
},
}
}
}
pub(crate) mod armv7r_none_eabihf {
use crate::spec::{
Abi, Arch, Cc, FloatAbi, LinkerFlavor, Lld, PanicStrategy,
RelocModel, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv7r-none-eabihf".into(),
metadata: TargetMetadata {
description: Some("Armv7-R, hardfloat".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
relocation_model: RelocModel::Static,
panic_strategy: PanicStrategy::Abort,
features: "+vfp3d16".into(),
max_atomic_width: Some(64),
emit_debug_gdb_scripts: false,
c_enum_min_bits: Some(8),
has_thumb_interworking: true,
..Default::default()
},
}
}
}
pub(crate) mod armv8r_none_eabihf {
use crate::spec::{
Abi, Arch, Cc, FloatAbi, LinkerFlavor, Lld, PanicStrategy,
RelocModel, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv8r-none-eabihf".into(),
metadata: TargetMetadata {
description: Some("Bare Armv8-R, hardfloat".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
relocation_model: RelocModel::Static,
panic_strategy: PanicStrategy::Abort,
max_atomic_width: Some(64),
emit_debug_gdb_scripts: false,
c_enum_min_bits: Some(8),
has_thumb_interworking: true,
..Default::default()
},
}
}
}
pub(crate) mod armv7_rtems_eabihf {
use crate::spec::{
Abi, Arch, Cc, Env, FloatAbi, LinkerFlavor, Lld, Os,
PanicStrategy, RelocModel, Target, TargetMetadata, TargetOptions,
cvs,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv7-unknown-none-eabihf".into(),
metadata: TargetMetadata {
description: Some("Armv7 RTEMS (Requires RTEMS toolchain and kernel".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
os: Os::Rtems,
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
linker_flavor: LinkerFlavor::Gnu(Cc::Yes, Lld::No),
linker: None,
relocation_model: RelocModel::Static,
panic_strategy: PanicStrategy::Unwind,
features: "+thumb2,+neon,+vfp3".into(),
max_atomic_width: Some(64),
emit_debug_gdb_scripts: false,
c_enum_min_bits: Some(8),
eh_frame_header: false,
no_default_libraries: false,
env: Env::Newlib,
..Default::default()
},
}
}
}
pub(crate) mod x86_64_pc_solaris {
use crate::spec::{
Arch, Cc, LinkerFlavor, SanitizerSet, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base =
TargetOptions {
cpu: "x86-64".into(),
plt_by_default: false,
vendor: "pc".into(),
max_atomic_width: Some(64),
stack_probes: StackProbeType::Inline,
supported_sanitizers: SanitizerSet::ADDRESS |
SanitizerSet::CFI | SanitizerSet::THREAD,
..base::solaris::opts()
};
base.add_pre_link_args(LinkerFlavor::Unix(Cc::Yes), &["-m64"]);
Target {
llvm_target: "x86_64-pc-solaris".into(),
metadata: TargetMetadata {
description: Some("64-bit Solaris 11.4".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod sparcv9_sun_solaris {
use rustc_abi::Endian;
use crate::spec::{
Arch, Cc, LinkerFlavor, Target, TargetMetadata, TargetOptions,
base,
};
pub(crate) fn target() -> Target {
let mut base =
TargetOptions {
endian: Endian::Big,
cpu: "v9".into(),
vendor: "sun".into(),
max_atomic_width: Some(64),
..base::solaris::opts()
};
base.add_pre_link_args(LinkerFlavor::Unix(Cc::Yes), &["-m64"]);
Target {
llvm_target: "sparcv9-sun-solaris".into(),
metadata: TargetMetadata {
description: Some("SPARC Solaris 11.4".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "E-m:e-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::Sparc64,
options: base,
}
}
}
pub(crate) mod x86_64_unknown_illumos {
use crate::spec::{
Arch, Cc, LinkerFlavor, SanitizerSet, Target, TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::illumos::opts();
base.add_pre_link_args(LinkerFlavor::Unix(Cc::Yes),
&["-m64", "-std=c99"]);
base.cpu = "x86-64".into();
base.plt_by_default = false;
base.max_atomic_width = Some(64);
base.supported_sanitizers =
SanitizerSet::ADDRESS | SanitizerSet::CFI |
SanitizerSet::THREAD;
Target {
llvm_target: "x86_64-pc-solaris".into(),
metadata: TargetMetadata {
description: Some("illumos".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod aarch64_unknown_illumos {
use crate::spec::{
Arch, Cc, LinkerFlavor, SanitizerSet, Target, TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::illumos::opts();
base.add_pre_link_args(LinkerFlavor::Unix(Cc::Yes),
&["-std=c99"]);
base.max_atomic_width = Some(128);
base.supported_sanitizers =
SanitizerSet::ADDRESS | SanitizerSet::CFI;
base.features = "+v8a".into();
Target {
llvm_target: "aarch64-unknown-solaris2.11".into(),
metadata: TargetMetadata {
description: Some("ARM64 illumos".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: base,
}
}
}
pub(crate) mod x86_64_pc_windows_gnu {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, Target, TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::windows_gnu::opts();
base.cpu = "x86-64".into();
base.features = "+cmpxchg16b,+sse3,+lahfsahf".into();
base.plt_by_default = false;
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::No, Lld::No),
&["-m", "i386pep", "--high-entropy-va"]);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64", "-Wl,--high-entropy-va"]);
base.max_atomic_width = Some(128);
base.linker = Some("x86_64-w64-mingw32-gcc".into());
Target {
llvm_target: "x86_64-pc-windows-gnu".into(),
metadata: TargetMetadata {
description: Some("64-bit MinGW (Windows 10+)".into()),
tier: Some(1),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod x86_64_uwp_windows_gnu {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, Target, TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::windows_uwp_gnu::opts();
base.cpu = "x86-64".into();
base.features = "+cmpxchg16b,+sse3,+lahfsahf".into();
base.plt_by_default = false;
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::No, Lld::No),
&["-m", "i386pep", "--high-entropy-va"]);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64", "-Wl,--high-entropy-va"]);
base.max_atomic_width = Some(128);
Target {
llvm_target: "x86_64-pc-windows-gnu".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod x86_64_win7_windows_gnu {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base =
TargetOptions {
vendor: "win7".into(),
cpu: "x86-64".into(),
plt_by_default: false,
max_atomic_width: Some(64),
linker: Some("x86_64-w64-mingw32-gcc".into()),
..base::windows_gnu::opts()
};
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::No, Lld::No),
&["-m", "i386pep", "--high-entropy-va"]);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64", "-Wl,--high-entropy-va"]);
Target {
llvm_target: "x86_64-pc-windows-gnu".into(),
metadata: TargetMetadata {
description: Some("64-bit MinGW (Windows 7+)".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod i686_pc_windows_gnu {
use crate::spec::{
Arch, Cc, FramePointer, LinkerFlavor, Lld, RustcAbi, Target,
TargetMetadata, base, crt_objects,
};
pub(crate) fn target() -> Target {
let mut base = base::windows_gnu::opts();
base.rustc_abi = Some(RustcAbi::X86Sse2);
base.cpu = "pentium4".into();
base.max_atomic_width = Some(64);
base.frame_pointer = FramePointer::Always;
base.linker = Some("i686-w64-mingw32-gcc".into());
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::No, Lld::No),
&["-m", "i386pe", "--large-address-aware"]);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-Wl,--large-address-aware"]);
base.pre_link_objects = crt_objects::pre_i686_mingw();
base.post_link_objects = crt_objects::post_i686_mingw();
base.pre_link_objects_self_contained =
crt_objects::pre_i686_mingw_self_contained();
base.post_link_objects_self_contained =
crt_objects::post_i686_mingw_self_contained();
Target {
llvm_target: "i686-pc-windows-gnu".into(),
metadata: TargetMetadata {
description: Some("32-bit MinGW (Windows 10+)".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:x-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i64:64-i128:128-f80:32-n8:16:32-a:0:32-S32".into(),
arch: Arch::X86,
options: base,
}
}
}
pub(crate) mod i686_uwp_windows_gnu {
use crate::spec::{
Arch, Cc, FramePointer, LinkerFlavor, Lld, RustcAbi, Target,
TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::windows_uwp_gnu::opts();
base.rustc_abi = Some(RustcAbi::X86Sse2);
base.cpu = "pentium4".into();
base.max_atomic_width = Some(64);
base.frame_pointer = FramePointer::Always;
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::No, Lld::No),
&["-m", "i386pe", "--large-address-aware"]);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-Wl,--large-address-aware"]);
Target {
llvm_target: "i686-pc-windows-gnu".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: Some(false),
std: None,
},
pointer_width: 32,
data_layout: "e-m:x-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i64:64-i128:128-f80:32-n8:16:32-a:0:32-S32".into(),
arch: Arch::X86,
options: base,
}
}
}
pub(crate) mod i686_win7_windows_gnu {
use crate::spec::{
Arch, Cc, FramePointer, LinkerFlavor, Lld, RustcAbi, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base =
TargetOptions {
vendor: "win7".into(),
rustc_abi: Some(RustcAbi::X86Sse2),
cpu: "pentium4".into(),
max_atomic_width: Some(64),
frame_pointer: FramePointer::Always,
linker: Some("i686-w64-mingw32-gcc".into()),
..base::windows_gnu::opts()
};
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::No, Lld::No),
&["-m", "i386pe", "--large-address-aware"]);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-Wl,--large-address-aware"]);
Target {
llvm_target: "i686-pc-windows-gnu".into(),
metadata: TargetMetadata {
description: Some("32-bit MinGW (Windows 7+)".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:x-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i64:64-i128:128-f80:32-n8:16:32-a:0:32-S32".into(),
arch: Arch::X86,
options: base,
}
}
}
pub(crate) mod aarch64_pc_windows_gnullvm {
use crate::spec::{
Arch, Cc, FramePointer, LinkerFlavor, Lld, Target, TargetMetadata,
base,
};
pub(crate) fn target() -> Target {
let mut base = base::windows_gnullvm::opts();
base.max_atomic_width = Some(128);
base.features = "+v8a,+neon,+outline-atomics".into();
base.linker = Some("aarch64-w64-mingw32-clang".into());
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::No, Lld::No),
&["-m", "arm64pe"]);
base.frame_pointer = FramePointer::NonLeaf;
Target {
llvm_target: "aarch64-pc-windows-gnu".into(),
metadata: TargetMetadata {
description: Some("ARM64 MinGW (Windows 10+), LLVM ABI".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:w-p270:32:32-p271:32:32-p272:64:64-p:64:64-i32:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: base,
}
}
}
pub(crate) mod i686_pc_windows_gnullvm {
use crate::spec::{
Arch, Cc, FramePointer, LinkerFlavor, Lld, RustcAbi, Target,
TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::windows_gnullvm::opts();
base.rustc_abi = Some(RustcAbi::X86Sse2);
base.cpu = "pentium4".into();
base.max_atomic_width = Some(64);
base.frame_pointer = FramePointer::Always;
base.linker = Some("i686-w64-mingw32-clang".into());
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::No, Lld::No),
&["-m", "i386pe", "--large-address-aware"]);
Target {
llvm_target: "i686-pc-windows-gnu".into(),
metadata: TargetMetadata {
description: Some("32-bit x86 MinGW (Windows 10+), LLVM ABI".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:x-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i64:64-i128:128-f80:32-n8:16:32-a:0:32-S32".into(),
arch: Arch::X86,
options: base,
}
}
}
pub(crate) mod x86_64_pc_windows_gnullvm {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, Target, TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::windows_gnullvm::opts();
base.cpu = "x86-64".into();
base.features = "+cmpxchg16b,+sse3,+lahfsahf".into();
base.plt_by_default = false;
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::No, Lld::No),
&["-m", "i386pep"]);
base.max_atomic_width = Some(128);
base.linker = Some("x86_64-w64-mingw32-clang".into());
Target {
llvm_target: "x86_64-pc-windows-gnu".into(),
metadata: TargetMetadata {
description: Some("64-bit x86 MinGW (Windows 10+), LLVM ABI".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod aarch64_pc_windows_msvc {
use crate::spec::{Arch, FramePointer, Target, TargetMetadata, base};
pub(crate) fn target() -> Target {
let mut base = base::windows_msvc::opts();
base.max_atomic_width = Some(128);
base.features = "+v8a,+neon,+outline-atomics".into();
base.frame_pointer = FramePointer::NonLeaf;
Target {
llvm_target: "aarch64-pc-windows-msvc".into(),
metadata: TargetMetadata {
description: Some("ARM64 Windows MSVC".into()),
tier: Some(1),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:w-p270:32:32-p271:32:32-p272:64:64-p:64:64-i32:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: base,
}
}
}
pub(crate) mod aarch64_uwp_windows_msvc {
use crate::spec::{Arch, Target, TargetMetadata, base};
pub(crate) fn target() -> Target {
let mut base = base::windows_uwp_msvc::opts();
base.max_atomic_width = Some(128);
base.features = "+v8a".into();
Target {
llvm_target: "aarch64-pc-windows-msvc".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: Some(false),
std: None,
},
pointer_width: 64,
data_layout: "e-m:w-p270:32:32-p271:32:32-p272:64:64-p:64:64-i32:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: base,
}
}
}
pub(crate) mod arm64ec_pc_windows_msvc {
use crate::spec::{
Arch, FramePointer, LinkerFlavor, Lld, Target, TargetMetadata,
add_link_args, base,
};
pub(crate) fn target() -> Target {
let mut base = base::windows_msvc::opts();
base.max_atomic_width = Some(128);
base.features = "+v8a,+neon".into();
add_link_args(&mut base.late_link_args,
LinkerFlavor::Msvc(Lld::No),
&["/machine:arm64ec", "softintrin.lib"]);
base.frame_pointer = FramePointer::NonLeaf;
Target {
llvm_target: "arm64ec-pc-windows-msvc".into(),
metadata: TargetMetadata {
description: Some("Arm64EC Windows MSVC".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:w-p270:32:32-p271:32:32-p272:64:64-p:64:64-i32:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::Arm64EC,
options: base,
}
}
}
pub(crate) mod x86_64_pc_windows_msvc {
use crate::spec::{Arch, SanitizerSet, Target, TargetMetadata, base};
pub(crate) fn target() -> Target {
let mut base = base::windows_msvc::opts();
base.cpu = "x86-64".into();
base.features = "+cmpxchg16b,+sse3,+lahfsahf".into();
base.plt_by_default = false;
base.max_atomic_width = Some(128);
base.supported_sanitizers = SanitizerSet::ADDRESS;
Target {
llvm_target: "x86_64-pc-windows-msvc".into(),
metadata: TargetMetadata {
description: Some("64-bit MSVC (Windows 10+)".into()),
tier: Some(1),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod x86_64_uwp_windows_msvc {
use crate::spec::{Arch, Target, TargetMetadata, base};
pub(crate) fn target() -> Target {
let mut base = base::windows_uwp_msvc::opts();
base.cpu = "x86-64".into();
base.features = "+cmpxchg16b,+sse3,+lahfsahf".into();
base.plt_by_default = false;
base.max_atomic_width = Some(128);
Target {
llvm_target: "x86_64-pc-windows-msvc".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod x86_64_win7_windows_msvc {
use crate::spec::{
Arch, SanitizerSet, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let base =
TargetOptions {
vendor: "win7".into(),
cpu: "x86-64".into(),
plt_by_default: false,
max_atomic_width: Some(64),
supported_sanitizers: SanitizerSet::ADDRESS,
..base::windows_msvc::opts()
};
Target {
llvm_target: "x86_64-pc-windows-msvc".into(),
metadata: TargetMetadata {
description: Some("64-bit MSVC (Windows 7+)".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod i686_pc_windows_msvc {
use crate::spec::{
Arch, LinkerFlavor, Lld, RustcAbi, SanitizerSet, Target,
TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::windows_msvc::opts();
base.rustc_abi = Some(RustcAbi::X86Sse2);
base.cpu = "pentium4".into();
base.max_atomic_width = Some(64);
base.supported_sanitizers = SanitizerSet::ADDRESS;
base.add_pre_link_args(LinkerFlavor::Msvc(Lld::No),
&["/LARGEADDRESSAWARE", "/SAFESEH"]);
Target {
llvm_target: "i686-pc-windows-msvc".into(),
metadata: TargetMetadata {
description: Some("32-bit MSVC (Windows 10+)".into()),
tier: Some(1),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:x-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i64:64-i128:128-f80:128-n8:16:32-a:0:32-S32".into(),
arch: Arch::X86,
options: base,
}
}
}
pub(crate) mod i686_uwp_windows_msvc {
use crate::spec::{Arch, RustcAbi, Target, TargetMetadata, base};
pub(crate) fn target() -> Target {
let mut base = base::windows_uwp_msvc::opts();
base.rustc_abi = Some(RustcAbi::X86Sse2);
base.cpu = "pentium4".into();
base.max_atomic_width = Some(64);
Target {
llvm_target: "i686-pc-windows-msvc".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: Some(false),
std: None,
},
pointer_width: 32,
data_layout: "e-m:x-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i64:64-i128:128-f80:128-n8:16:32-a:0:32-S32".into(),
arch: Arch::X86,
options: base,
}
}
}
pub(crate) mod i686_win7_windows_msvc {
use crate::spec::{
Arch, LinkerFlavor, Lld, RustcAbi, SanitizerSet, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base =
TargetOptions {
vendor: "win7".into(),
rustc_abi: Some(RustcAbi::X86Sse2),
cpu: "pentium4".into(),
max_atomic_width: Some(64),
supported_sanitizers: SanitizerSet::ADDRESS,
has_thread_local: false,
..base::windows_msvc::opts()
};
base.add_pre_link_args(LinkerFlavor::Msvc(Lld::No),
&["/LARGEADDRESSAWARE", "/SAFESEH"]);
Target {
llvm_target: "i686-pc-windows-msvc".into(),
metadata: TargetMetadata {
description: Some("32-bit MSVC (Windows 7+)".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:x-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i64:64-i128:128-f80:128-n8:16:32-a:0:32-S32".into(),
arch: Arch::X86,
options: base,
}
}
}
pub(crate) mod thumbv7a_pc_windows_msvc {
use crate::spec::{
Arch, FloatAbi, LinkerFlavor, Lld, PanicStrategy, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::windows_msvc::opts();
base.add_pre_link_args(LinkerFlavor::Msvc(Lld::No),
&["/OPT:NOLBR"]);
Target {
llvm_target: "thumbv7a-pc-windows-msvc".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: Some(false),
std: None,
},
pointer_width: 32,
data_layout: "e-m:w-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
llvm_floatabi: Some(FloatAbi::Hard),
features: "+vfp3,+neon".into(),
max_atomic_width: Some(64),
panic_strategy: PanicStrategy::Abort,
..base
},
}
}
}
pub(crate) mod thumbv7a_uwp_windows_msvc {
use crate::spec::{
Arch, FloatAbi, PanicStrategy, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv7a-pc-windows-msvc".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:w-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
llvm_floatabi: Some(FloatAbi::Hard),
features: "+vfp3,+neon".into(),
max_atomic_width: Some(64),
panic_strategy: PanicStrategy::Abort,
..base::windows_uwp_msvc::opts()
},
}
}
}
pub(crate) mod wasm32_unknown_emscripten {
use crate::spec::{
Arch, LinkArgs, LinkerFlavor, Os, PanicStrategy, RelocModel,
Target, TargetMetadata, TargetOptions, base, cvs,
};
pub(crate) fn target() -> Target {
let pre_link_args = LinkArgs::new();
let post_link_args =
TargetOptions::link_args(LinkerFlavor::EmCc,
&["-sABORTING_MALLOC=0", "-sWASM_BIGINT"]);
let opts =
TargetOptions {
os: Os::Emscripten,
linker_flavor: LinkerFlavor::EmCc,
exe_suffix: ".js".into(),
linker: None,
pre_link_args,
post_link_args,
relocation_model: RelocModel::Pic,
panic_strategy: PanicStrategy::Unwind,
no_default_libraries: false,
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix"),
::std::borrow::Cow::Borrowed("wasm")]),
..base::wasm::options()
};
Target {
llvm_target: "wasm32-unknown-emscripten".into(),
metadata: TargetMetadata {
description: Some("WebAssembly via Emscripten".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-i128:128-f128:64-n32:64-S128-ni:1:10:20".into(),
arch: Arch::Wasm32,
options: opts,
}
}
}
pub(crate) mod wasm32_unknown_unknown {
use crate::spec::{
Arch, Cc, LinkerFlavor, Os, Target, TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut options = base::wasm::options();
options.os = Os::Unknown;
options.add_pre_link_args(LinkerFlavor::WasmLld(Cc::No),
&["--no-entry"]);
options.add_pre_link_args(LinkerFlavor::WasmLld(Cc::Yes),
&["--target=wasm32-unknown-unknown", "-Wl,--no-entry"]);
Target {
llvm_target: "wasm32-unknown-unknown".into(),
metadata: TargetMetadata {
description: Some("WebAssembly".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-i128:128-n32:64-S128-ni:1:10:20".into(),
arch: Arch::Wasm32,
options,
}
}
}
pub(crate) mod wasm32v1_none {
use crate::spec::{
Arch, Cc, LinkerFlavor, Os, Target, TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut options = base::wasm::options();
options.os = Os::None;
options.cpu = "mvp".into();
options.features = "+mutable-globals".into();
options.add_pre_link_args(LinkerFlavor::WasmLld(Cc::No),
&["--no-entry"]);
options.add_pre_link_args(LinkerFlavor::WasmLld(Cc::Yes),
&["--target=wasm32-unknown-unknown", "-Wl,--no-entry"]);
Target {
llvm_target: "wasm32-unknown-unknown".into(),
metadata: TargetMetadata {
description: Some("WebAssembly".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-i128:128-n32:64-S128-ni:1:10:20".into(),
arch: Arch::Wasm32,
options,
}
}
}
pub(crate) mod wasm32_wasip1 {
use crate::spec::{
Arch, Cc, Env, LinkSelfContainedDefault, LinkerFlavor, Os, Target,
TargetMetadata, base, crt_objects,
};
pub(crate) fn target() -> Target {
let mut options = base::wasm::options();
options.os = Os::Wasi;
options.env = Env::P1;
options.add_pre_link_args(LinkerFlavor::WasmLld(Cc::Yes),
&["--target=wasm32-wasip1"]);
options.pre_link_objects_self_contained =
crt_objects::pre_wasi_self_contained();
options.post_link_objects_self_contained =
crt_objects::post_wasi_self_contained();
options.link_self_contained = LinkSelfContainedDefault::True;
options.crt_static_default = true;
options.crt_static_respected = true;
options.crt_static_allows_dylibs = true;
options.main_needs_argc_argv = false;
options.entry_name = "__main_void".into();
Target {
llvm_target: "wasm32-wasip1".into(),
metadata: TargetMetadata {
description: Some("WebAssembly with WASI".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-i128:128-n32:64-S128-ni:1:10:20".into(),
arch: Arch::Wasm32,
options,
}
}
}
pub(crate) mod wasm32_wasip2 {
use crate::spec::{
Arch, Env, LinkSelfContainedDefault, Os, RelocModel, Target,
TargetMetadata, base, crt_objects,
};
pub(crate) fn target() -> Target {
let mut options = base::wasm::options();
options.os = Os::Wasi;
options.env = Env::P2;
options.linker = Some("wasm-component-ld".into());
options.pre_link_objects_self_contained =
crt_objects::pre_wasi_self_contained();
options.post_link_objects_self_contained =
crt_objects::post_wasi_self_contained();
options.link_self_contained = LinkSelfContainedDefault::True;
options.crt_static_default = true;
options.crt_static_respected = true;
options.crt_static_allows_dylibs = true;
options.main_needs_argc_argv = false;
options.entry_name = "__main_void".into();
options.relocation_model = RelocModel::Pic;
Target {
llvm_target: "wasm32-wasip2".into(),
metadata: TargetMetadata {
description: Some("WebAssembly".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-i128:128-n32:64-S128-ni:1:10:20".into(),
arch: Arch::Wasm32,
options,
}
}
}
pub(crate) mod wasm32_wasip3 {
use crate::spec::{Env, Target};
pub(crate) fn target() -> Target {
let mut target = super::wasm32_wasip2::target();
target.llvm_target = "wasm32-wasip3".into();
target.metadata =
crate::spec::TargetMetadata {
description: Some("WebAssembly".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
};
target.options.env = Env::P3;
target
}
}
pub(crate) mod wasm32_wasip1_threads {
use crate::spec::{
Arch, Cc, Env, LinkSelfContainedDefault, LinkerFlavor, Os, Target,
TargetMetadata, base, crt_objects,
};
pub(crate) fn target() -> Target {
let mut options = base::wasm::options();
options.os = Os::Wasi;
options.env = Env::P1;
options.add_pre_link_args(LinkerFlavor::WasmLld(Cc::No),
&["--import-memory", "--export-memory", "--shared-memory",
"--max-memory=1073741824"]);
options.add_pre_link_args(LinkerFlavor::WasmLld(Cc::Yes),
&["--target=wasm32-wasip1-threads", "-Wl,--import-memory",
"-Wl,--export-memory,", "-Wl,--shared-memory",
"-Wl,--max-memory=1073741824"]);
options.pre_link_objects_self_contained =
crt_objects::pre_wasi_self_contained();
options.post_link_objects_self_contained =
crt_objects::post_wasi_self_contained();
options.link_self_contained = LinkSelfContainedDefault::True;
options.crt_static_default = true;
options.crt_static_respected = true;
options.crt_static_allows_dylibs = true;
options.main_needs_argc_argv = false;
options.entry_name = "__main_void".into();
options.singlethread = false;
options.features =
"+atomics,+bulk-memory,+mutable-globals".into();
Target {
llvm_target: "wasm32-wasi".into(),
metadata: TargetMetadata {
description: None,
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-i128:128-n32:64-S128-ni:1:10:20".into(),
arch: Arch::Wasm32,
options,
}
}
}
pub(crate) mod wasm32_wali_linux_musl {
use crate::spec::{
Arch, Cc, LinkerFlavor, Target, TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut options = base::linux_wasm::opts();
options.add_pre_link_args(LinkerFlavor::WasmLld(Cc::No),
&["--export-memory", "--shared-memory",
"--max-memory=1073741824"]);
options.add_pre_link_args(LinkerFlavor::WasmLld(Cc::Yes),
&["--target=wasm32-wasi-threads", "-Wl,--export-memory,",
"-Wl,--shared-memory", "-Wl,--max-memory=1073741824"]);
Target {
llvm_target: "wasm32-wasi".into(),
metadata: TargetMetadata {
description: Some("WebAssembly Linux Interface with musl-libc".into()),
tier: Some(3),
host_tools: Some(false),
std: None,
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-i128:128-n32:64-S128-ni:1:10:20".into(),
arch: Arch::Wasm32,
options,
}
}
}
pub(crate) mod wasm64_unknown_unknown {
use crate::spec::{
Arch, Cc, LinkerFlavor, Os, Target, TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut options = base::wasm::options();
options.os = Os::Unknown;
options.add_pre_link_args(LinkerFlavor::WasmLld(Cc::No),
&["--no-entry", "-mwasm64"]);
options.add_pre_link_args(LinkerFlavor::WasmLld(Cc::Yes),
&["--target=wasm64-unknown-unknown", "-Wl,--no-entry"]);
options.features =
"+bulk-memory,+mutable-globals,+sign-ext,+nontrapping-fptoint".into();
Target {
llvm_target: "wasm64-unknown-unknown".into(),
metadata: TargetMetadata {
description: Some("WebAssembly".into()),
tier: Some(3),
host_tools: Some(false),
std: None,
},
pointer_width: 64,
data_layout: "e-m:e-p:64:64-p10:8:8-p20:8:8-i64:64-i128:128-n32:64-S128-ni:1:10:20".into(),
arch: Arch::Wasm64,
options,
}
}
}
pub(crate) mod thumbv6m_none_eabi {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv6m-none-eabi".into(),
metadata: TargetMetadata {
description: Some("Bare ARMv6-M".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
features: "+strict-align,+atomics-32".into(),
atomic_cas: false,
..base::arm_none::opts()
},
}
}
}
pub(crate) mod thumbv7m_none_eabi {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv7m-none-eabi".into(),
metadata: TargetMetadata {
description: Some("Bare ARMv7-M".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
max_atomic_width: Some(32),
..base::arm_none::opts()
},
}
}
}
pub(crate) mod thumbv7em_none_eabi {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv7em-none-eabi".into(),
metadata: TargetMetadata {
description: Some("Bare ARMv7E-M".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
max_atomic_width: Some(32),
..base::arm_none::opts()
},
}
}
}
pub(crate) mod thumbv7em_none_eabihf {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv7em-none-eabihf".into(),
metadata: TargetMetadata {
description: Some("Bare ARMv7E-M, hardfloat".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
features: "+vfp4d16sp".into(),
max_atomic_width: Some(32),
..base::arm_none::opts()
},
}
}
}
pub(crate) mod thumbv8m_base_none_eabi {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv8m.base-none-eabi".into(),
metadata: TargetMetadata {
description: Some("Bare ARMv8-M Baseline".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
features: "+strict-align".into(),
max_atomic_width: Some(32),
..base::arm_none::opts()
},
}
}
}
pub(crate) mod thumbv8m_main_none_eabi {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv8m.main-none-eabi".into(),
metadata: TargetMetadata {
description: Some("Bare ARMv8-M Mainline".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
max_atomic_width: Some(32),
..base::arm_none::opts()
},
}
}
}
pub(crate) mod thumbv8m_main_none_eabihf {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv8m.main-none-eabihf".into(),
metadata: TargetMetadata {
description: Some("Bare ARMv8-M Mainline, hardfloat".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
features: "+fp-armv8d16sp".into(),
max_atomic_width: Some(32),
..base::arm_none::opts()
},
}
}
}
pub(crate) mod armv7a_none_eabi {
use crate::spec::{
Abi, Arch, Cc, FloatAbi, LinkerFlavor, Lld, PanicStrategy,
RelocModel, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
let opts =
TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
features: "+v7,+thumb2,+soft-float,-neon,+strict-align".into(),
relocation_model: RelocModel::Static,
disable_redzone: true,
max_atomic_width: Some(64),
panic_strategy: PanicStrategy::Abort,
emit_debug_gdb_scripts: false,
c_enum_min_bits: Some(8),
has_thumb_interworking: true,
..Default::default()
};
Target {
llvm_target: "armv7a-none-eabi".into(),
metadata: TargetMetadata {
description: Some("Bare Armv7-A".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: opts,
}
}
}
pub(crate) mod armv7a_none_eabihf {
use crate::spec::{
Abi, Arch, Cc, FloatAbi, LinkerFlavor, Lld, PanicStrategy,
RelocModel, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
let opts =
TargetOptions {
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
features: "+v7,+vfp3d16,+thumb2,-neon,+strict-align".into(),
relocation_model: RelocModel::Static,
disable_redzone: true,
max_atomic_width: Some(64),
panic_strategy: PanicStrategy::Abort,
emit_debug_gdb_scripts: false,
c_enum_min_bits: Some(8),
has_thumb_interworking: true,
..Default::default()
};
Target {
llvm_target: "armv7a-none-eabihf".into(),
metadata: TargetMetadata {
description: Some("Bare Armv7-A, hardfloat".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: opts,
}
}
}
pub(crate) mod armv7a_nuttx_eabi {
use crate::spec::{
Abi, Arch, Cc, FloatAbi, LinkerFlavor, Lld, Os, PanicStrategy,
RelocModel, Target, TargetMetadata, TargetOptions, cvs,
};
pub(crate) fn target() -> Target {
let opts =
TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
features: "+v7,+thumb2,+soft-float,-neon,+strict-align".into(),
relocation_model: RelocModel::Static,
disable_redzone: true,
max_atomic_width: Some(64),
panic_strategy: PanicStrategy::Abort,
emit_debug_gdb_scripts: false,
c_enum_min_bits: Some(8),
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
os: Os::NuttX,
..Default::default()
};
Target {
llvm_target: "armv7a-none-eabi".into(),
metadata: TargetMetadata {
description: Some("ARMv7-A Cortex-A with NuttX".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: opts,
}
}
}
pub(crate) mod armv7a_nuttx_eabihf {
use crate::spec::{
Abi, Arch, Cc, FloatAbi, LinkerFlavor, Lld, Os, PanicStrategy,
RelocModel, Target, TargetMetadata, TargetOptions, cvs,
};
pub(crate) fn target() -> Target {
let opts =
TargetOptions {
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
features: "+v7,+thumb2,+vfp3,+neon,+strict-align".into(),
relocation_model: RelocModel::Static,
disable_redzone: true,
max_atomic_width: Some(64),
panic_strategy: PanicStrategy::Abort,
emit_debug_gdb_scripts: false,
c_enum_min_bits: Some(8),
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
os: Os::NuttX,
..Default::default()
};
Target {
llvm_target: "armv7a-none-eabihf".into(),
metadata: TargetMetadata {
description: Some("ARMv7-A Cortex-A with NuttX (hard float)".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: opts,
}
}
}
pub(crate) mod armv7a_vex_v5 {
use crate::spec::{
Abi, Arch, Cc, Env, FloatAbi, LinkerFlavor, Lld, Os,
PanicStrategy, RelocModel, Target, TargetMetadata, TargetOptions,
};
const LINKER_SCRIPT: &str =
"OUTPUT_FORMAT(\"elf32-littlearm\")\nENTRY(_boot)\n\n/*\n * PROVIDE() is used here so that users can override default values.\n * This is intended to give developers the option to use this Rust\n * target even if the default values in this linker script aren\'t\n * suitable for their needs.\n *\n * For example: `-C link-arg=--defsym=__stack_length=8M` could\n * be used to increase the stack size above the value set in this\n * file.\n */\n\nPROVIDE(__vcodesig_magic = 0x35585658); /* XVX5 */\nPROVIDE(__vcodesig_type = 0); /* V5_SIG_TYPE_USER */\nPROVIDE(__vcodesig_owner = 2); /* V5_SIG_OWNER_PARTNER */\nPROVIDE(__vcodesig_options = 0); /* none (0) */\n\n__user_ram_start = 0x03800000;\n__user_ram_end = 0x08000000;\n/* (0x48 =) 72 MiB length */\n__user_ram_length = __user_ram_start - __user_ram_end;\n\n/*\n * VEXos provides a method for pre-loading a \"linked file\" at a specified\n * address in User RAM, conventionally near the end, after the primary\n * program binary. We need to be sure not to place any data in that location,\n * so we allow the user of this linker script to inform the start address of\n * this blob.\n */\nPROVIDE(__linked_file_length = 0);\nPROVIDE(__linked_file_end = __user_ram_end);\nPROVIDE(__linked_file_start = __linked_file_end - __linked_file_length);\n\nPROVIDE(__stack_length = 4M);\nPROVIDE(__stack_top = __linked_file_start);\nPROVIDE(__stack_bottom = __linked_file_start - __stack_length);\n\nMEMORY {\n USER_RAM (RWX) : ORIGIN = __user_ram_start, LENGTH = __user_ram_length\n}\n\nSECTIONS {\n /*\n * VEXos expects program binaries to have a 32-byte header called a \"code signature\"\n * at their start which tells the OS that we are a valid program and configures some\n * miscellaneous startup behavior.\n */\n .code_signature : {\n LONG(__vcodesig_magic)\n LONG(__vcodesig_type)\n LONG(__vcodesig_owner)\n LONG(__vcodesig_options)\n\n FILL(0)\n . = __user_ram_start + 0x20;\n } > USER_RAM\n\n /*\n * Executable program instructions.\n */\n .text ALIGN(4) : {\n /* _boot routine (entry point from VEXos, must be at 0x03800020) */\n *(.boot)\n\n /* The rest of the program. */\n *(.text .text.*)\n } > USER_RAM\n\n /*\n * Global/uninitialized/static/constant data sections.\n */\n .rodata : {\n *(.rodata .rodata1 .rodata.*)\n *(.srodata .srodata.*)\n } > USER_RAM\n\n /*\n * ARM Stack Unwinding Sections\n *\n * These sections are added by the compiler in some cases to facilitate stack unwinding.\n * __eh_frame_start and similar symbols are used by libunwind.\n */\n\n .except_ordered : {\n PROVIDE(__extab_start = .);\n *(.gcc_except_table *.gcc_except_table.*)\n *(.ARM.extab*)\n PROVIDE(__extab_end = .);\n } > USER_RAM\n\n .eh_frame_hdr : {\n /* see https://github.com/llvm/llvm-project/blob/main/libunwind/src/AddressSpace.hpp#L78 */\n PROVIDE(__eh_frame_hdr_start = .);\n KEEP(*(.eh_frame_hdr))\n PROVIDE(__eh_frame_hdr_end = .);\n } > USER_RAM\n\n .eh_frame : {\n PROVIDE(__eh_frame_start = .);\n KEEP(*(.eh_frame))\n PROVIDE(__eh_frame_end = .);\n } > USER_RAM\n\n .except_unordered : {\n PROVIDE(__exidx_start = .);\n *(.ARM.exidx*)\n PROVIDE(__exidx_end = .);\n } > USER_RAM\n\n /* -- Data intended to be mutable at runtime begins here. -- */\n\n .data : {\n *(.data .data1 .data.*)\n *(.sdata .sdata.* .sdata2.*)\n } > USER_RAM\n\n /* -- End of loadable sections - anything beyond this point shouldn\'t go in the binary uploaded to the device. -- */\n\n .bss (NOLOAD) : {\n __bss_start = .;\n *(.sbss*)\n *(.bss .bss.*)\n\n /* Align the heap */\n . = ALIGN(8);\n __bss_end = .;\n } > USER_RAM\n\n /*\n * Active memory sections for the stack/heap.\n *\n * Because these are (NOLOAD), they will not influence the final size of the binary.\n */\n .heap (NOLOAD) : {\n __heap_start = .;\n . = __stack_bottom;\n __heap_end = .;\n } > USER_RAM\n\n .stack (NOLOAD) : ALIGN(8) {\n __stack_bottom = .;\n . += __stack_length;\n __stack_top = .;\n } > USER_RAM\n\n /*\n * `.ARM.attributes` contains arch metadata for compatibility purposes, but we\n * only target one hardware configuration, meaning it\'d just take up space.\n */\n /DISCARD/ : {\n *(.ARM.attributes*)\n }\n}\n";
pub(crate) fn target() -> Target {
let opts =
TargetOptions {
vendor: "vex".into(),
env: Env::V5,
os: Os::VexOs,
cpu: "cortex-a9".into(),
abi: Abi::EabiHf,
is_like_vexos: true,
llvm_floatabi: Some(FloatAbi::Hard),
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
features: "+v7,+neon,+vfp3d16,+thumb2".into(),
relocation_model: RelocModel::Static,
disable_redzone: true,
max_atomic_width: Some(64),
panic_strategy: PanicStrategy::Abort,
emit_debug_gdb_scripts: false,
c_enum_min_bits: Some(8),
default_uwtable: true,
has_thumb_interworking: true,
link_script: Some(LINKER_SCRIPT.into()),
..Default::default()
};
Target {
llvm_target: "armv7a-none-eabihf".into(),
metadata: TargetMetadata {
description: Some("ARMv7-A Cortex-A9 VEX V5 Brain".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: opts,
}
}
}
pub(crate) mod msp430_none_elf {
use crate::spec::{
Arch, Cc, LinkerFlavor, PanicStrategy, RelocModel, Target,
TargetMetadata, TargetOptions, cvs,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "msp430-none-elf".into(),
metadata: TargetMetadata {
description: Some("16-bit MSP430 microcontrollers".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 16,
data_layout: "e-m:e-p:16:16-i32:16-i64:16-f32:16-f64:16-a:8-n8:16-S16".into(),
arch: Arch::Msp430,
options: TargetOptions {
c_int_width: 16,
asm_args: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("-mcpu=msp430")]),
linker: Some("msp430-elf-gcc".into()),
linker_flavor: LinkerFlavor::Unix(Cc::Yes),
max_atomic_width: Some(0),
atomic_cas: false,
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
default_codegen_units: Some(1),
trap_unreachable: false,
emit_debug_gdb_scripts: false,
eh_frame_header: false,
..Default::default()
},
}
}
}
pub(crate) mod aarch64_be_unknown_hermit {
use rustc_abi::Endian;
use crate::spec::{
Arch, StackProbeType, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "aarch64_be-unknown-hermit".into(),
metadata: TargetMetadata {
description: Some("ARM64 Hermit (big-endian)".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
arch: Arch::AArch64,
data_layout: "E-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
options: TargetOptions {
features: "+v8a,+strict-align,+neon".into(),
max_atomic_width: Some(128),
stack_probes: StackProbeType::Inline,
endian: Endian::Big,
..base::hermit::opts()
},
}
}
}
pub(crate) mod aarch64_unknown_hermit {
use crate::spec::{
Arch, StackProbeType, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "aarch64-unknown-hermit".into(),
metadata: TargetMetadata {
description: Some("ARM64 Hermit".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
arch: Arch::AArch64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
options: TargetOptions {
features: "+v8a,+strict-align,+neon".into(),
max_atomic_width: Some(128),
stack_probes: StackProbeType::Inline,
..base::hermit::opts()
},
}
}
}
pub(crate) mod riscv64gc_unknown_hermit {
use crate::spec::{
Arch, CodeModel, RelocModel, Target, TargetMetadata,
TargetOptions, TlsModel, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "riscv64-unknown-hermit".into(),
metadata: TargetMetadata {
description: Some("RISC-V Hermit".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
arch: Arch::RiscV64,
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
options: TargetOptions {
cpu: "generic-rv64".into(),
features: "+m,+a,+f,+d,+c,+zicsr,+zifencei".into(),
relocation_model: RelocModel::Pic,
code_model: Some(CodeModel::Medium),
tls_model: TlsModel::LocalExec,
max_atomic_width: Some(64),
llvm_abiname: "lp64d".into(),
..base::hermit::opts()
},
}
}
}
pub(crate) mod x86_64_unknown_hermit {
use crate::spec::{
Arch, StackProbeType, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "x86_64-unknown-hermit".into(),
metadata: TargetMetadata {
description: Some("x86_64 Hermit".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
arch: Arch::X86_64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
options: TargetOptions {
cpu: "x86-64".into(),
features: "+rdrand,+rdseed".into(),
plt_by_default: false,
max_atomic_width: Some(64),
stack_probes: StackProbeType::Inline,
..base::hermit::opts()
},
}
}
}
pub(crate) mod x86_64_unknown_motor {
use crate::spec::{
Arch, CodeModel, LinkSelfContainedDefault, RelocModel, RelroLevel,
Target, base,
};
pub(crate) fn target() -> Target {
let mut base = base::motor::opts();
base.cpu = "x86-64".into();
base.max_atomic_width = Some(64);
base.code_model = Some(CodeModel::Small);
base.position_independent_executables = true;
base.relro_level = RelroLevel::Full;
base.static_position_independent_executables = true;
base.relocation_model = RelocModel::Pic;
base.link_self_contained = LinkSelfContainedDefault::True;
base.dynamic_linking = false;
base.crt_static_default = true;
base.crt_static_respected = true;
Target {
llvm_target: "x86_64-unknown-none-elf".into(),
metadata: crate::spec::TargetMetadata {
description: Some("Motor OS".into()),
tier: Some(3),
host_tools: None,
std: None,
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod x86_64_unikraft_linux_musl {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "x86_64-unknown-linux-musl".into(),
metadata: TargetMetadata {
description: Some("64-bit Unikraft with musl 1.2.5".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
arch: Arch::X86_64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
options: TargetOptions {
cpu: "x86-64".into(),
plt_by_default: false,
pre_link_args: TargetOptions::link_args(LinkerFlavor::Gnu(Cc::Yes,
Lld::No), &["-m64"]),
max_atomic_width: Some(64),
stack_probes: StackProbeType::Inline,
..base::unikraft_linux_musl::opts()
},
}
}
}
pub(crate) mod armv7_unknown_trusty {
use crate::spec::{
Abi, Arch, FloatAbi, LinkSelfContainedDefault, Os, PanicStrategy,
RelroLevel, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv7-unknown-unknown-gnueabi".into(),
metadata: TargetMetadata {
description: Some("Armv7-A Trusty".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
features: "+v7,+thumb2,+soft-float,-neon".into(),
max_atomic_width: Some(64),
mcount: "\u{1}mcount".into(),
os: Os::Trusty,
link_self_contained: LinkSelfContainedDefault::InferredForMusl,
dynamic_linking: false,
executables: true,
crt_static_default: true,
crt_static_respected: true,
relro_level: RelroLevel::Full,
panic_strategy: PanicStrategy::Abort,
position_independent_executables: true,
static_position_independent_executables: true,
..Default::default()
},
}
}
}
pub(crate) mod aarch64_unknown_trusty {
use crate::spec::{
Arch, LinkSelfContainedDefault, Os, PanicStrategy, RelroLevel,
Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "aarch64-unknown-unknown-musl".into(),
metadata: TargetMetadata {
description: Some("ARM64 Trusty".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: TargetOptions {
features: "+neon,+reserve-x18".into(),
executables: true,
max_atomic_width: Some(128),
panic_strategy: PanicStrategy::Abort,
os: Os::Trusty,
position_independent_executables: true,
static_position_independent_executables: true,
crt_static_default: true,
crt_static_respected: true,
dynamic_linking: false,
link_self_contained: LinkSelfContainedDefault::InferredForMusl,
relro_level: RelroLevel::Full,
mcount: "\u{1}_mcount".into(),
..Default::default()
},
}
}
}
pub(crate) mod x86_64_unknown_trusty {
use crate::spec::{
Arch, LinkSelfContainedDefault, Os, PanicStrategy, RelroLevel,
StackProbeType, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "x86_64-unknown-unknown-musl".into(),
metadata: TargetMetadata {
description: Some("x86_64 Trusty".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: TargetOptions {
executables: true,
max_atomic_width: Some(64),
panic_strategy: PanicStrategy::Abort,
os: Os::Trusty,
link_self_contained: LinkSelfContainedDefault::InferredForMusl,
position_independent_executables: true,
static_position_independent_executables: true,
crt_static_default: true,
crt_static_respected: true,
dynamic_linking: false,
plt_by_default: false,
relro_level: RelroLevel::Full,
stack_probes: StackProbeType::Inline,
mcount: "\u{1}_mcount".into(),
..Default::default()
},
}
}
}
pub(crate) mod riscv32i_unknown_none_elf {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel, Target,
TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:e-p:32:32-i64:64-n32-S128".into(),
llvm_target: "riscv32".into(),
metadata: TargetMetadata {
description: Some("Bare RISC-V (RV32I ISA)".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
arch: Arch::RiscV32,
options: TargetOptions {
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
cpu: "generic-rv32".into(),
max_atomic_width: Some(32),
atomic_cas: false,
features: "+forced-atomics".into(),
llvm_abiname: "ilp32".into(),
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
emit_debug_gdb_scripts: false,
eh_frame_header: false,
..Default::default()
},
}
}
}
pub(crate) mod riscv32im_risc0_zkvm_elf {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, Os, PanicStrategy, RelocModel,
Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:e-p:32:32-i64:64-n32-S128".into(),
llvm_target: "riscv32".into(),
metadata: TargetMetadata {
description: Some("RISC Zero's zero-knowledge Virtual Machine (RV32IM ISA)".into()),
tier: Some(3),
host_tools: Some(false),
std: None,
},
pointer_width: 32,
arch: Arch::RiscV32,
options: TargetOptions {
os: Os::Zkvm,
vendor: "risc0".into(),
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
cpu: "generic-rv32".into(),
max_atomic_width: Some(64),
atomic_cas: true,
features: "+m".into(),
llvm_abiname: "ilp32".into(),
executables: true,
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
emit_debug_gdb_scripts: false,
eh_frame_header: false,
singlethread: true,
..Default::default()
},
}
}
}
pub(crate) mod riscv32im_unknown_none_elf {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel, Target,
TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:e-p:32:32-i64:64-n32-S128".into(),
llvm_target: "riscv32".into(),
metadata: TargetMetadata {
description: None,
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
arch: Arch::RiscV32,
options: TargetOptions {
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
cpu: "generic-rv32".into(),
max_atomic_width: Some(32),
atomic_cas: false,
features: "+m,+forced-atomics".into(),
llvm_abiname: "ilp32".into(),
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
emit_debug_gdb_scripts: false,
eh_frame_header: false,
..Default::default()
},
}
}
}
pub(crate) mod riscv32ima_unknown_none_elf {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel, Target,
TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:e-p:32:32-i64:64-n32-S128".into(),
llvm_target: "riscv32".into(),
metadata: TargetMetadata {
description: Some("Bare RISC-V (RV32IMA ISA)".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
arch: Arch::RiscV32,
options: TargetOptions {
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
cpu: "generic-rv32".into(),
max_atomic_width: Some(32),
features: "+m,+a".into(),
llvm_abiname: "ilp32".into(),
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
emit_debug_gdb_scripts: false,
eh_frame_header: false,
..Default::default()
},
}
}
}
pub(crate) mod riscv32imc_unknown_none_elf {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel, Target,
TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:e-p:32:32-i64:64-n32-S128".into(),
llvm_target: "riscv32".into(),
metadata: TargetMetadata {
description: Some("Bare RISC-V (RV32IMC ISA)".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
arch: Arch::RiscV32,
options: TargetOptions {
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
cpu: "generic-rv32".into(),
max_atomic_width: Some(32),
atomic_cas: false,
features: "+m,+c,+forced-atomics".into(),
llvm_abiname: "ilp32".into(),
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
emit_debug_gdb_scripts: false,
eh_frame_header: false,
..Default::default()
},
}
}
}
pub(crate) mod riscv32imc_esp_espidf {
use crate::spec::{
Arch, Env, Os, PanicStrategy, RelocModel, Target, TargetMetadata,
TargetOptions, cvs,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:e-p:32:32-i64:64-n32-S128".into(),
llvm_target: "riscv32".into(),
metadata: TargetMetadata {
description: Some("RISC-V ESP-IDF".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
arch: Arch::RiscV32,
options: TargetOptions {
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
os: Os::EspIdf,
env: Env::Newlib,
vendor: "espressif".into(),
linker: Some("riscv32-esp-elf-gcc".into()),
cpu: "generic-rv32".into(),
max_atomic_width: Some(32),
atomic_cas: true,
features: "+m,+c".into(),
llvm_abiname: "ilp32".into(),
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
emit_debug_gdb_scripts: false,
eh_frame_header: false,
..Default::default()
},
}
}
}
pub(crate) mod riscv32imac_esp_espidf {
use crate::spec::{
Arch, Env, Os, PanicStrategy, RelocModel, Target, TargetMetadata,
TargetOptions, cvs,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:e-p:32:32-i64:64-n32-S128".into(),
llvm_target: "riscv32".into(),
metadata: TargetMetadata {
description: Some("RISC-V ESP-IDF".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
arch: Arch::RiscV32,
options: TargetOptions {
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
os: Os::EspIdf,
env: Env::Newlib,
vendor: "espressif".into(),
linker: Some("riscv32-esp-elf-gcc".into()),
cpu: "generic-rv32".into(),
max_atomic_width: Some(32),
atomic_cas: true,
features: "+m,+a,+c".into(),
llvm_abiname: "ilp32".into(),
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
emit_debug_gdb_scripts: false,
eh_frame_header: false,
..Default::default()
},
}
}
}
pub(crate) mod riscv32imafc_esp_espidf {
use crate::spec::{
Arch, Env, Os, PanicStrategy, RelocModel, Target, TargetMetadata,
TargetOptions, cvs,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:e-p:32:32-i64:64-n32-S128".into(),
llvm_target: "riscv32".into(),
metadata: TargetMetadata {
description: Some("RISC-V ESP-IDF".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
arch: Arch::RiscV32,
options: TargetOptions {
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
os: Os::EspIdf,
env: Env::Newlib,
vendor: "espressif".into(),
linker: Some("riscv32-esp-elf-gcc".into()),
cpu: "generic-rv32".into(),
max_atomic_width: Some(32),
atomic_cas: true,
llvm_abiname: "ilp32f".into(),
features: "+m,+a,+c,+f".into(),
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
emit_debug_gdb_scripts: false,
eh_frame_header: false,
..Default::default()
},
}
}
}
pub(crate) mod riscv32e_unknown_none_elf {
use crate::spec::{
Abi, Arch, Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel,
Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:e-p:32:32-i64:64-n32-S32".into(),
llvm_target: "riscv32".into(),
metadata: TargetMetadata {
description: Some("Bare RISC-V (RV32E ISA)".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
arch: Arch::RiscV32,
options: TargetOptions {
abi: Abi::Ilp32e,
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
cpu: "generic-rv32".into(),
llvm_abiname: "ilp32e".into(),
max_atomic_width: Some(32),
atomic_cas: false,
features: "+e,+forced-atomics".into(),
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
emit_debug_gdb_scripts: false,
eh_frame_header: false,
..Default::default()
},
}
}
}
pub(crate) mod riscv32em_unknown_none_elf {
use crate::spec::{
Abi, Arch, Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel,
Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:e-p:32:32-i64:64-n32-S32".into(),
llvm_target: "riscv32".into(),
metadata: TargetMetadata {
description: Some("Bare RISC-V (RV32EM ISA)".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
arch: Arch::RiscV32,
options: TargetOptions {
abi: Abi::Ilp32e,
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
cpu: "generic-rv32".into(),
llvm_abiname: "ilp32e".into(),
max_atomic_width: Some(32),
atomic_cas: false,
features: "+e,+m,+forced-atomics".into(),
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
emit_debug_gdb_scripts: false,
eh_frame_header: false,
..Default::default()
},
}
}
}
pub(crate) mod riscv32emc_unknown_none_elf {
use crate::spec::{
Abi, Arch, Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel,
Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:e-p:32:32-i64:64-n32-S32".into(),
llvm_target: "riscv32".into(),
metadata: TargetMetadata {
description: Some("Bare RISC-V (RV32EMC ISA)".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
arch: Arch::RiscV32,
options: TargetOptions {
abi: Abi::Ilp32e,
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
cpu: "generic-rv32".into(),
llvm_abiname: "ilp32e".into(),
max_atomic_width: Some(32),
atomic_cas: false,
features: "+e,+m,+c,+forced-atomics".into(),
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
emit_debug_gdb_scripts: false,
eh_frame_header: false,
..Default::default()
},
}
}
}
pub(crate) mod riscv32imac_unknown_none_elf {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel, Target,
TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:e-p:32:32-i64:64-n32-S128".into(),
llvm_target: "riscv32".into(),
metadata: TargetMetadata {
description: Some("Bare RISC-V (RV32IMAC ISA)".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
arch: Arch::RiscV32,
options: TargetOptions {
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
cpu: "generic-rv32".into(),
max_atomic_width: Some(32),
features: "+m,+a,+c".into(),
llvm_abiname: "ilp32".into(),
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
emit_debug_gdb_scripts: false,
eh_frame_header: false,
..Default::default()
},
}
}
}
pub(crate) mod riscv32imafc_unknown_none_elf {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel, Target,
TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:e-p:32:32-i64:64-n32-S128".into(),
llvm_target: "riscv32".into(),
metadata: TargetMetadata {
description: Some("Bare RISC-V (RV32IMAFC ISA)".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
arch: Arch::RiscV32,
options: TargetOptions {
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
cpu: "generic-rv32".into(),
max_atomic_width: Some(32),
llvm_abiname: "ilp32f".into(),
features: "+m,+a,+c,+f".into(),
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
emit_debug_gdb_scripts: false,
eh_frame_header: false,
..Default::default()
},
}
}
}
pub(crate) mod riscv32imac_unknown_xous_elf {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, Os, PanicStrategy, RelocModel,
Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:e-p:32:32-i64:64-n32-S128".into(),
llvm_target: "riscv32".into(),
metadata: TargetMetadata {
description: Some("RISC-V Xous (RV32IMAC ISA)".into()),
tier: Some(3),
host_tools: Some(false),
std: None,
},
pointer_width: 32,
arch: Arch::RiscV32,
options: TargetOptions {
os: Os::Xous,
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
cpu: "generic-rv32".into(),
max_atomic_width: Some(32),
features: "+m,+a,+c".into(),
llvm_abiname: "ilp32".into(),
panic_strategy: PanicStrategy::Unwind,
relocation_model: RelocModel::Static,
..Default::default()
},
}
}
}
pub(crate) mod riscv32gc_unknown_linux_gnu {
use std::borrow::Cow;
use crate::spec::{
Arch, CodeModel, SplitDebuginfo, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "riscv32-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: Some("RISC-V Linux (kernel 5.4, glibc 2.33)".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-i64:64-n32-S128".into(),
arch: Arch::RiscV32,
options: TargetOptions {
code_model: Some(CodeModel::Medium),
cpu: "generic-rv32".into(),
features: "+m,+a,+f,+d,+c,+zicsr,+zifencei".into(),
llvm_abiname: "ilp32d".into(),
max_atomic_width: Some(32),
supported_split_debuginfo: Cow::Borrowed(&[SplitDebuginfo::Off]),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod riscv32gc_unknown_linux_musl {
use std::borrow::Cow;
use crate::spec::{
Arch, CodeModel, SplitDebuginfo, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "riscv32-unknown-linux-musl".into(),
metadata: TargetMetadata {
description: Some("RISC-V Linux (kernel 5.4, musl 1.2.5)".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-i64:64-n32-S128".into(),
arch: Arch::RiscV32,
options: TargetOptions {
code_model: Some(CodeModel::Medium),
cpu: "generic-rv32".into(),
features: "+m,+a,+f,+d,+c,+zicsr,+zifencei".into(),
llvm_abiname: "ilp32d".into(),
max_atomic_width: Some(32),
supported_split_debuginfo: Cow::Borrowed(&[SplitDebuginfo::Off]),
..base::linux_musl::opts()
},
}
}
}
pub(crate) mod riscv64im_unknown_none_elf {
use crate::spec::{
Arch, Cc, CodeModel, LinkerFlavor, Lld, PanicStrategy, RelocModel,
Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
llvm_target: "riscv64".into(),
metadata: TargetMetadata {
description: Some("Bare RISC-V (RV64IM ISA)".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 64,
arch: Arch::RiscV64,
options: TargetOptions {
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
cpu: "generic-rv64".into(),
max_atomic_width: Some(64),
atomic_cas: false,
features: "+m,+forced-atomics".into(),
llvm_abiname: "lp64".into(),
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
code_model: Some(CodeModel::Medium),
emit_debug_gdb_scripts: false,
eh_frame_header: false,
..Default::default()
},
}
}
}
pub(crate) mod riscv64imac_unknown_none_elf {
use crate::spec::{
Arch, Cc, CodeModel, LinkerFlavor, Lld, PanicStrategy, RelocModel,
SanitizerSet, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
llvm_target: "riscv64".into(),
metadata: TargetMetadata {
description: Some("Bare RISC-V (RV64IMAC ISA)".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 64,
arch: Arch::RiscV64,
options: TargetOptions {
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
cpu: "generic-rv64".into(),
max_atomic_width: Some(64),
features: "+m,+a,+c".into(),
llvm_abiname: "lp64".into(),
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
code_model: Some(CodeModel::Medium),
emit_debug_gdb_scripts: false,
eh_frame_header: false,
supported_sanitizers: SanitizerSet::KERNELADDRESS |
SanitizerSet::SHADOWCALLSTACK,
..Default::default()
},
}
}
}
pub(crate) mod riscv64gc_unknown_none_elf {
use crate::spec::{
Arch, Cc, CodeModel, LinkerFlavor, Lld, PanicStrategy, RelocModel,
SanitizerSet, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
metadata: TargetMetadata {
description: Some("Bare RISC-V (RV64IMAFDC ISA)".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
llvm_target: "riscv64".into(),
pointer_width: 64,
arch: Arch::RiscV64,
options: TargetOptions {
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
llvm_abiname: "lp64d".into(),
cpu: "generic-rv64".into(),
max_atomic_width: Some(64),
features: "+m,+a,+f,+d,+c,+zicsr,+zifencei".into(),
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
code_model: Some(CodeModel::Medium),
emit_debug_gdb_scripts: false,
eh_frame_header: false,
supported_sanitizers: SanitizerSet::KERNELADDRESS |
SanitizerSet::SHADOWCALLSTACK,
..Default::default()
},
}
}
}
pub(crate) mod riscv64gc_unknown_linux_gnu {
use std::borrow::Cow;
use crate::spec::{
Arch, CodeModel, SplitDebuginfo, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "riscv64-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: Some("RISC-V Linux (kernel 4.20, glibc 2.29)".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::RiscV64,
options: TargetOptions {
code_model: Some(CodeModel::Medium),
cpu: "generic-rv64".into(),
features: "+m,+a,+f,+d,+c,+zicsr,+zifencei".into(),
llvm_abiname: "lp64d".into(),
max_atomic_width: Some(64),
supported_split_debuginfo: Cow::Borrowed(&[SplitDebuginfo::Off]),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod riscv64gc_unknown_linux_musl {
use std::borrow::Cow;
use crate::spec::{
Arch, CodeModel, SplitDebuginfo, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "riscv64-unknown-linux-musl".into(),
metadata: TargetMetadata {
description: Some("RISC-V Linux (kernel 4.20, musl 1.2.5)".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::RiscV64,
options: TargetOptions {
code_model: Some(CodeModel::Medium),
cpu: "generic-rv64".into(),
features: "+m,+a,+f,+d,+c,+zicsr,+zifencei".into(),
llvm_abiname: "lp64d".into(),
max_atomic_width: Some(64),
supported_split_debuginfo: Cow::Borrowed(&[SplitDebuginfo::Off]),
..base::linux_musl::opts()
},
}
}
}
pub(crate) mod riscv64a23_unknown_linux_gnu {
use std::borrow::Cow;
use crate::spec::{
Arch, CodeModel, SplitDebuginfo, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "riscv64-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: Some("RISC-V Linux (kernel 6.8.0, glibc 2.39)".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::RiscV64,
options: TargetOptions {
code_model: Some(CodeModel::Medium),
cpu: "generic-rv64".into(),
features: "+rva23u64".into(),
llvm_abiname: "lp64d".into(),
max_atomic_width: Some(64),
supported_split_debuginfo: Cow::Borrowed(&[SplitDebuginfo::Off]),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod sparc_unknown_none_elf {
use rustc_abi::Endian;
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel, Target,
TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
let options =
TargetOptions {
linker_flavor: LinkerFlavor::Gnu(Cc::Yes, Lld::No),
linker: Some("sparc-elf-gcc".into()),
endian: Endian::Big,
cpu: "v7".into(),
max_atomic_width: Some(32),
atomic_cas: true,
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
no_default_libraries: false,
emit_debug_gdb_scripts: false,
eh_frame_header: false,
..Default::default()
};
Target {
data_layout: "E-m:e-p:32:32-i64:64-i128:128-f128:64-n32-S64".into(),
llvm_target: "sparc-unknown-none-elf".into(),
metadata: TargetMetadata {
description: Some("Bare 32-bit SPARC V7+".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
arch: Arch::Sparc,
options,
}
}
}
pub(crate) mod loongarch32_unknown_none {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel, Target,
TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "loongarch32-unknown-none".into(),
metadata: TargetMetadata {
description: Some("Freestanding/bare-metal LoongArch32".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-i64:64-n32-S128".into(),
arch: Arch::LoongArch32,
options: TargetOptions {
cpu: "generic".into(),
features: "+f,+d".into(),
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
llvm_abiname: "ilp32d".into(),
max_atomic_width: Some(32),
relocation_model: RelocModel::Static,
panic_strategy: PanicStrategy::Abort,
..Default::default()
},
}
}
}
pub(crate) mod loongarch32_unknown_none_softfloat {
use crate::spec::{
Abi, Arch, Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel,
Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "loongarch32-unknown-none".into(),
metadata: TargetMetadata {
description: Some("Freestanding/bare-metal LoongArch32 softfloat".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-i64:64-n32-S128".into(),
arch: Arch::LoongArch32,
options: TargetOptions {
cpu: "generic".into(),
features: "-f,-d".into(),
abi: Abi::SoftFloat,
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
llvm_abiname: "ilp32s".into(),
max_atomic_width: Some(32),
relocation_model: RelocModel::Static,
panic_strategy: PanicStrategy::Abort,
..Default::default()
},
}
}
}
pub(crate) mod loongarch64_unknown_none {
use crate::spec::{
Arch, Cc, CodeModel, LinkerFlavor, Lld, PanicStrategy, RelocModel,
Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "loongarch64-unknown-none".into(),
metadata: TargetMetadata {
description: Some("Freestanding/bare-metal LoongArch64".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 64,
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::LoongArch64,
options: TargetOptions {
cpu: "generic".into(),
features: "+f,+d,-lsx".into(),
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
llvm_abiname: "lp64d".into(),
max_atomic_width: Some(64),
relocation_model: RelocModel::Static,
panic_strategy: PanicStrategy::Abort,
code_model: Some(CodeModel::Medium),
..Default::default()
},
}
}
}
pub(crate) mod loongarch64_unknown_none_softfloat {
use crate::spec::{
Abi, Arch, Cc, CodeModel, LinkerFlavor, Lld, PanicStrategy,
RelocModel, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "loongarch64-unknown-none".into(),
metadata: TargetMetadata {
description: Some("Freestanding/bare-metal LoongArch64 softfloat".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 64,
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::LoongArch64,
options: TargetOptions {
cpu: "generic".into(),
features: "-f,-d".into(),
abi: Abi::SoftFloat,
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
llvm_abiname: "lp64s".into(),
max_atomic_width: Some(64),
relocation_model: RelocModel::Static,
panic_strategy: PanicStrategy::Abort,
code_model: Some(CodeModel::Medium),
..Default::default()
},
}
}
}
pub(crate) mod aarch64_unknown_none {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel,
SanitizerSet, StackProbeType, Target, TargetMetadata,
TargetOptions,
};
pub(crate) fn target() -> Target {
let opts =
TargetOptions {
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
pre_link_args: TargetOptions::link_args(LinkerFlavor::Gnu(Cc::No,
Lld::No), &["--fix-cortex-a53-843419"]),
features: "+v8a,+strict-align,+neon".into(),
supported_sanitizers: SanitizerSet::KCFI |
SanitizerSet::KERNELADDRESS,
relocation_model: RelocModel::Static,
disable_redzone: true,
max_atomic_width: Some(128),
stack_probes: StackProbeType::Inline,
panic_strategy: PanicStrategy::Abort,
default_uwtable: true,
..Default::default()
};
Target {
llvm_target: "aarch64-unknown-none".into(),
metadata: TargetMetadata {
description: Some("Bare ARM64, hardfloat".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: opts,
}
}
}
pub(crate) mod aarch64_unknown_none_softfloat {
use crate::spec::{
Abi, Arch, Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel,
SanitizerSet, StackProbeType, Target, TargetMetadata,
TargetOptions,
};
pub(crate) fn target() -> Target {
let opts =
TargetOptions {
abi: Abi::SoftFloat,
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
features: "+v8a,+strict-align,-neon".into(),
relocation_model: RelocModel::Static,
disable_redzone: true,
max_atomic_width: Some(128),
supported_sanitizers: SanitizerSet::KCFI |
SanitizerSet::KERNELADDRESS,
stack_probes: StackProbeType::Inline,
panic_strategy: PanicStrategy::Abort,
default_uwtable: true,
..Default::default()
};
Target {
llvm_target: "aarch64-unknown-none".into(),
metadata: TargetMetadata {
description: Some("Bare ARM64, softfloat".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: opts,
}
}
}
pub(crate) mod aarch64_be_unknown_none_softfloat {
use rustc_abi::Endian;
use crate::spec::{
Abi, Arch, Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel,
SanitizerSet, StackProbeType, Target, TargetMetadata,
TargetOptions,
};
pub(crate) fn target() -> Target {
let opts =
TargetOptions {
abi: Abi::SoftFloat,
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
features: "+v8a,+strict-align,-neon".into(),
relocation_model: RelocModel::Static,
disable_redzone: true,
max_atomic_width: Some(128),
supported_sanitizers: SanitizerSet::KCFI |
SanitizerSet::KERNELADDRESS,
stack_probes: StackProbeType::Inline,
panic_strategy: PanicStrategy::Abort,
endian: Endian::Big,
..Default::default()
};
Target {
llvm_target: "aarch64_be-unknown-none".into(),
metadata: TargetMetadata {
description: Some("Bare ARM64 (big-endian), softfloat".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 64,
data_layout: "E-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: opts,
}
}
}
pub(crate) mod aarch64_unknown_nuttx {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, Os, PanicStrategy, RelocModel,
SanitizerSet, StackProbeType, Target, TargetMetadata,
TargetOptions, cvs,
};
pub(crate) fn target() -> Target {
let opts =
TargetOptions {
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
pre_link_args: TargetOptions::link_args(LinkerFlavor::Gnu(Cc::No,
Lld::No), &["--fix-cortex-a53-843419"]),
features: "+v8a,+strict-align,+neon".into(),
supported_sanitizers: SanitizerSet::KCFI |
SanitizerSet::KERNELADDRESS,
relocation_model: RelocModel::Static,
disable_redzone: true,
max_atomic_width: Some(128),
stack_probes: StackProbeType::Inline,
panic_strategy: PanicStrategy::Abort,
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
os: Os::NuttX,
..Default::default()
};
Target {
llvm_target: "aarch64-unknown-none".into(),
metadata: TargetMetadata {
description: Some("AArch64 NuttX".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: opts,
}
}
}
pub(crate) mod x86_64_fortanix_unknown_sgx {
use std::borrow::Cow;
use crate::spec::{
Abi, Arch, Cc, Env, LinkerFlavor, Lld, Os, Target, TargetMetadata,
TargetOptions, cvs,
};
pub(crate) fn target() -> Target {
let pre_link_args =
TargetOptions::link_args(LinkerFlavor::Gnu(Cc::No, Lld::No),
&["-e", "elf_entry", "-Bstatic", "--gc-sections", "-z",
"text", "-z", "norelro", "--no-undefined",
"--error-unresolved-symbols", "--no-undefined-version",
"-Bsymbolic", "--export-dynamic", "-u", "__rust_abort",
"-u", "__rust_c_alloc", "-u", "__rust_c_dealloc", "-u",
"__rust_print_err", "-u", "__rust_rwlock_rdlock", "-u",
"__rust_rwlock_unlock", "-u", "__rust_rwlock_wrlock"]);
const EXPORT_SYMBOLS: &[&str] =
&["sgx_entry", "HEAP_BASE", "HEAP_SIZE", "RELA", "RELACOUNT",
"ENCLAVE_SIZE", "CFGDATA_BASE", "DEBUG",
"EH_FRM_HDR_OFFSET", "EH_FRM_HDR_LEN", "EH_FRM_OFFSET",
"EH_FRM_LEN", "TEXT_BASE", "TEXT_SIZE"];
let opts =
TargetOptions {
os: Os::Unknown,
env: Env::Sgx,
vendor: "fortanix".into(),
abi: Abi::Fortanix,
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
max_atomic_width: Some(64),
cpu: "x86-64".into(),
plt_by_default: false,
features: "+rdrand,+rdseed,+lvi-cfi,+lvi-load-hardening".into(),
llvm_args: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("--x86-experimental-lvi-inline-asm-hardening")]),
position_independent_executables: true,
pre_link_args,
override_export_symbols: Some(EXPORT_SYMBOLS.iter().cloned().map(Cow::from).collect()),
relax_elf_relocations: true,
..Default::default()
};
Target {
llvm_target: "x86_64-elf".into(),
metadata: TargetMetadata {
description: Some("Fortanix ABI for 64-bit Intel SGX".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: opts,
}
}
}
pub(crate) mod x86_64_unknown_uefi {
use rustc_abi::{CanonAbi, X86Call};
use crate::spec::{Arch, RustcAbi, Target, TargetMetadata, base};
pub(crate) fn target() -> Target {
let mut base = base::uefi_msvc::opts();
base.cpu = "x86-64".into();
base.plt_by_default = false;
base.max_atomic_width = Some(64);
base.entry_abi = CanonAbi::X86(X86Call::Win64);
base.features = "-mmx,-sse,+soft-float".into();
base.rustc_abi = Some(RustcAbi::X86Softfloat);
Target {
llvm_target: "x86_64-unknown-windows".into(),
metadata: TargetMetadata {
description: Some("64-bit UEFI".into()),
tier: Some(2),
host_tools: Some(false),
std: None,
},
pointer_width: 64,
data_layout: "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod i686_unknown_uefi {
use crate::spec::{
Arch, LinkerFlavor, Lld, RustcAbi, Target, TargetMetadata,
add_link_args, base,
};
pub(crate) fn target() -> Target {
let mut base = base::uefi_msvc::opts();
base.cpu = "pentium4".into();
base.max_atomic_width = Some(64);
base.features = "-mmx,-sse,+soft-float".into();
base.rustc_abi = Some(RustcAbi::X86Softfloat);
add_link_args(&mut base.post_link_args,
LinkerFlavor::Msvc(Lld::No), &["/DEBUG:NODWARF"]);
Target {
llvm_target: "i686-unknown-windows-gnu".into(),
metadata: TargetMetadata {
description: Some("32-bit UEFI".into()),
tier: Some(2),
host_tools: Some(false),
std: None,
},
pointer_width: 32,
data_layout: "e-m:x-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i64:64-i128:128-f80:32-n8:16:32-a:0:32-S32".into(),
arch: Arch::X86,
options: base,
}
}
}
pub(crate) mod aarch64_unknown_uefi {
use crate::spec::{
Arch, LinkerFlavor, Lld, Target, TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::uefi_msvc::opts();
base.max_atomic_width = Some(128);
base.add_pre_link_args(LinkerFlavor::Msvc(Lld::No),
&["/machine:arm64"]);
base.features = "+v8a".into();
Target {
llvm_target: "aarch64-unknown-windows".into(),
metadata: TargetMetadata {
description: Some("ARM64 UEFI".into()),
tier: Some(2),
host_tools: Some(false),
std: None,
},
pointer_width: 64,
data_layout: "e-m:w-p270:32:32-p271:32:32-p272:64:64-p:64:64-i32:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: base,
}
}
}
pub(crate) mod nvptx64_nvidia_cuda {
use crate::spec::{
Arch, LinkSelfContainedDefault, LinkerFlavor, MergeFunctions, Os,
PanicStrategy, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
arch: Arch::Nvptx64,
data_layout: "e-p6:32:32-i64:64-i128:128-i256:256-v16:16-v32:32-n16:32:64".into(),
llvm_target: "nvptx64-nvidia-cuda".into(),
metadata: TargetMetadata {
description: Some("--emit=asm generates PTX code that runs on NVIDIA GPUs".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 64,
options: TargetOptions {
os: Os::Cuda,
vendor: "nvidia".into(),
linker_flavor: LinkerFlavor::Llbc,
cpu: "sm_30".into(),
max_atomic_width: Some(64),
panic_strategy: PanicStrategy::Abort,
dynamic_linking: true,
only_cdylib: true,
obj_is_bitcode: true,
is_like_gpu: true,
dll_prefix: "".into(),
dll_suffix: ".ptx".into(),
exe_suffix: ".ptx".into(),
merge_functions: MergeFunctions::Disabled,
supports_stack_protector: false,
link_self_contained: LinkSelfContainedDefault::True,
static_initializer_must_be_acyclic: true,
..Default::default()
},
}
}
}
pub(crate) mod amdgcn_amd_amdhsa {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, Os, PanicStrategy, Target,
TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
arch: Arch::AmdGpu,
data_layout: "e-p:64:64-p1:64:64-p2:32:32-p3:32:32-p4:64:64-p5:32:32-p6:32:32-p7:160:256:256:32-p8:128:128:128:48-p9:192:256:256:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64-S32-A5-G1-ni:7:8:9".into(),
llvm_target: "amdgcn-amd-amdhsa".into(),
metadata: TargetMetadata {
description: Some("AMD GPU".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 64,
options: TargetOptions {
os: Os::AmdHsa,
vendor: "amd".into(),
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
need_explicit_cpu: true,
max_atomic_width: Some(64),
panic_strategy: PanicStrategy::Abort,
no_builtins: true,
simd_types_indirect: false,
is_like_gpu: true,
dynamic_linking: true,
only_cdylib: true,
executables: false,
dll_prefix: "".into(),
dll_suffix: ".elf".into(),
supports_stack_protector: false,
requires_lto: true,
..Default::default()
},
}
}
}
pub(crate) mod xtensa_esp32_none_elf {
use crate::spec::base::xtensa;
use crate::spec::{Arch, Target, TargetMetadata, TargetOptions};
pub(crate) fn target() -> Target {
Target {
llvm_target: "xtensa-none-elf".into(),
pointer_width: 32,
data_layout: "e-m:e-p:32:32-v1:8:8-i64:64-i128:128-n32".into(),
arch: Arch::Xtensa,
metadata: TargetMetadata {
description: Some("Xtensa ESP32".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
options: TargetOptions {
vendor: "espressif".into(),
cpu: "esp32".into(),
linker: Some("xtensa-esp32-elf-gcc".into()),
max_atomic_width: Some(32),
atomic_cas: true,
..xtensa::opts()
},
}
}
}
pub(crate) mod xtensa_esp32_espidf {
use rustc_abi::Endian;
use crate::spec::base::xtensa;
use crate::spec::{
Arch, Env, Os, Target, TargetMetadata, TargetOptions, cvs,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "xtensa-none-elf".into(),
pointer_width: 32,
data_layout: "e-m:e-p:32:32-v1:8:8-i64:64-i128:128-n32".into(),
arch: Arch::Xtensa,
metadata: TargetMetadata {
description: None,
tier: None,
host_tools: None,
std: None,
},
options: TargetOptions {
endian: Endian::Little,
c_int_width: 32,
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
os: Os::EspIdf,
env: Env::Newlib,
vendor: "espressif".into(),
executables: true,
cpu: "esp32".into(),
linker: Some("xtensa-esp32-elf-gcc".into()),
max_atomic_width: Some(32),
atomic_cas: true,
..xtensa::opts()
},
}
}
}
pub(crate) mod xtensa_esp32s2_none_elf {
use crate::spec::base::xtensa;
use crate::spec::{Arch, Target, TargetMetadata, TargetOptions};
pub(crate) fn target() -> Target {
Target {
llvm_target: "xtensa-none-elf".into(),
pointer_width: 32,
data_layout: "e-m:e-p:32:32-v1:8:8-i64:64-i128:128-n32".into(),
arch: Arch::Xtensa,
metadata: TargetMetadata {
description: Some("Xtensa ESP32-S2".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
options: TargetOptions {
vendor: "espressif".into(),
cpu: "esp32s2".into(),
linker: Some("xtensa-esp32s2-elf-gcc".into()),
max_atomic_width: Some(32),
features: "+forced-atomics".into(),
..xtensa::opts()
},
}
}
}
pub(crate) mod xtensa_esp32s2_espidf {
use rustc_abi::Endian;
use crate::spec::base::xtensa;
use crate::spec::{
Arch, Env, Os, Target, TargetMetadata, TargetOptions, cvs,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "xtensa-none-elf".into(),
pointer_width: 32,
data_layout: "e-m:e-p:32:32-v1:8:8-i64:64-i128:128-n32".into(),
arch: Arch::Xtensa,
metadata: TargetMetadata {
description: None,
tier: None,
host_tools: None,
std: None,
},
options: TargetOptions {
endian: Endian::Little,
c_int_width: 32,
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
os: Os::EspIdf,
env: Env::Newlib,
vendor: "espressif".into(),
executables: true,
cpu: "esp32s2".into(),
linker: Some("xtensa-esp32s2-elf-gcc".into()),
max_atomic_width: Some(32),
atomic_cas: true,
..xtensa::opts()
},
}
}
}
pub(crate) mod xtensa_esp32s3_none_elf {
use crate::spec::base::xtensa;
use crate::spec::{Arch, Target, TargetMetadata, TargetOptions};
pub(crate) fn target() -> Target {
Target {
llvm_target: "xtensa-none-elf".into(),
pointer_width: 32,
data_layout: "e-m:e-p:32:32-v1:8:8-i64:64-i128:128-n32".into(),
arch: Arch::Xtensa,
metadata: TargetMetadata {
description: Some("Xtensa ESP32-S3".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
options: TargetOptions {
vendor: "espressif".into(),
cpu: "esp32s3".into(),
linker: Some("xtensa-esp32s3-elf-gcc".into()),
max_atomic_width: Some(32),
atomic_cas: true,
..xtensa::opts()
},
}
}
}
pub(crate) mod xtensa_esp32s3_espidf {
use rustc_abi::Endian;
use crate::spec::base::xtensa;
use crate::spec::{
Arch, Env, Os, Target, TargetMetadata, TargetOptions, cvs,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "xtensa-none-elf".into(),
pointer_width: 32,
data_layout: "e-m:e-p:32:32-v1:8:8-i64:64-i128:128-n32".into(),
arch: Arch::Xtensa,
metadata: TargetMetadata {
description: None,
tier: None,
host_tools: None,
std: None,
},
options: TargetOptions {
endian: Endian::Little,
c_int_width: 32,
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
os: Os::EspIdf,
env: Env::Newlib,
vendor: "espressif".into(),
executables: true,
cpu: "esp32s3".into(),
linker: Some("xtensa-esp32s3-elf-gcc".into()),
max_atomic_width: Some(32),
atomic_cas: true,
..xtensa::opts()
},
}
}
}
pub(crate) mod i686_wrs_vxworks {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, RustcAbi, StackProbeType, Target,
TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::vxworks::opts();
base.rustc_abi = Some(RustcAbi::X86Sse2);
base.cpu = "pentium4".into();
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m32"]);
base.stack_probes = StackProbeType::Inline;
Target {
llvm_target: "i686-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i128:128-f64:32:64-f80:32-n8:16:32-S128".into(),
arch: Arch::X86,
options: base,
}
}
}
pub(crate) mod x86_64_wrs_vxworks {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::vxworks::opts();
base.cpu = "x86-64".into();
base.plt_by_default = false;
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.stack_probes = StackProbeType::Inline;
base.disable_redzone = true;
Target {
llvm_target: "x86_64-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod armv7_wrs_vxworks_eabihf {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv7-unknown-linux-gnueabihf".into(),
metadata: TargetMetadata {
description: Some("Armv7-A for VxWorks".into()),
tier: Some(3),
host_tools: Some(false),
std: None,
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
features: "+v7,+vfp3d16,+thumb2,-neon".into(),
max_atomic_width: Some(64),
..base::vxworks::opts()
},
}
}
}
pub(crate) mod aarch64_wrs_vxworks {
use crate::spec::{
Arch, StackProbeType, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "aarch64-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: TargetOptions {
features: "+v8a,+reserve-x18".into(),
max_atomic_width: Some(128),
stack_probes: StackProbeType::Inline,
..base::vxworks::opts()
},
}
}
}
pub(crate) mod powerpc_wrs_vxworks {
use rustc_abi::Endian;
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::vxworks::opts();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m32", "--secure-plt"]);
base.max_atomic_width = Some(32);
base.stack_probes = StackProbeType::Inline;
Target {
llvm_target: "powerpc-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "E-m:e-p:32:32-Fn32-i64:64-n32".into(),
arch: Arch::PowerPC,
options: TargetOptions {
endian: Endian::Big,
features: "+secure-plt".into(),
..base
},
}
}
}
pub(crate) mod powerpc_wrs_vxworks_spe {
use rustc_abi::Endian;
use crate::spec::{
Abi, Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::vxworks::opts();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-mspe", "--secure-plt"]);
base.max_atomic_width = Some(32);
base.stack_probes = StackProbeType::Inline;
Target {
llvm_target: "powerpc-unknown-linux-gnuspe".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: Some(false),
std: None,
},
pointer_width: 32,
data_layout: "E-m:e-p:32:32-Fn32-i64:64-n32".into(),
arch: Arch::PowerPC,
options: TargetOptions {
abi: Abi::Spe,
endian: Endian::Big,
features: "+secure-plt,+msync".into(),
..base
},
}
}
}
pub(crate) mod powerpc64_wrs_vxworks {
use rustc_abi::Endian;
use crate::spec::{
Abi, Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::vxworks::opts();
base.cpu = "ppc64".into();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.max_atomic_width = Some(64);
base.stack_probes = StackProbeType::Inline;
base.abi = Abi::ElfV1;
base.llvm_abiname = "elfv1".into();
Target {
llvm_target: "powerpc64-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "E-m:e-Fi64-i64:64-i128:128-n32:64-S128-v256:256:256-v512:512:512".into(),
arch: Arch::PowerPC64,
options: TargetOptions { endian: Endian::Big, ..base },
}
}
}
pub(crate) mod riscv32_wrs_vxworks {
use crate::spec::{
Arch, StackProbeType, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "riscv32-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-i64:64-n32-S128".into(),
arch: Arch::RiscV32,
options: TargetOptions {
cpu: "generic-rv32".into(),
llvm_abiname: "ilp32d".into(),
max_atomic_width: Some(32),
features: "+m,+a,+f,+d,+c,+zicsr,+zifencei".into(),
stack_probes: StackProbeType::Inline,
..base::vxworks::opts()
},
}
}
}
pub(crate) mod riscv64_wrs_vxworks {
use crate::spec::{
Arch, StackProbeType, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "riscv64-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::RiscV64,
options: TargetOptions {
cpu: "generic-rv64".into(),
llvm_abiname: "lp64d".into(),
max_atomic_width: Some(64),
features: "+m,+a,+f,+d,+c,+zicsr,+zifencei".into(),
stack_probes: StackProbeType::Inline,
..base::vxworks::opts()
},
}
}
}
pub(crate) mod aarch64_kmc_solid_asp3 {
use crate::spec::{
Arch, RelocModel, StackProbeType, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
let base = base::solid::opts();
Target {
llvm_target: "aarch64-unknown-none".into(),
metadata: TargetMetadata {
description: Some("ARM64 SOLID with TOPPERS/ASP3".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: TargetOptions {
linker: Some("aarch64-kmc-elf-gcc".into()),
features: "+v8a,+neon".into(),
relocation_model: RelocModel::Static,
disable_redzone: true,
max_atomic_width: Some(128),
stack_probes: StackProbeType::Inline,
..base
},
}
}
}
pub(crate) mod armv7a_kmc_solid_asp3_eabi {
use crate::spec::{
Abi, Arch, FloatAbi, RelocModel, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
let base = base::solid::opts();
Target {
llvm_target: "armv7a-none-eabi".into(),
metadata: TargetMetadata {
description: Some("Arm SOLID with TOPPERS/ASP3".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
linker: Some("arm-kmc-eabi-gcc".into()),
features: "+v7,+soft-float,+thumb2,-neon".into(),
relocation_model: RelocModel::Static,
disable_redzone: true,
max_atomic_width: Some(64),
..base
},
}
}
}
pub(crate) mod armv7a_kmc_solid_asp3_eabihf {
use crate::spec::{
Abi, Arch, FloatAbi, RelocModel, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
let base = base::solid::opts();
Target {
llvm_target: "armv7a-none-eabihf".into(),
metadata: TargetMetadata {
description: Some("Arm SOLID with TOPPERS/ASP3, hardfloat".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
linker: Some("arm-kmc-eabi-gcc".into()),
features: "+v7,+vfp3d16,+thumb2,-neon".into(),
relocation_model: RelocModel::Static,
disable_redzone: true,
max_atomic_width: Some(64),
..base
},
}
}
}
pub(crate) mod mipsel_sony_psp {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, Os, RelocModel, Target,
TargetMetadata, TargetOptions, cvs,
};
const LINKER_SCRIPT: &str =
"ENTRY(module_start)\nSECTIONS\n{\n /* PRX format requires text to begin at 0 */\n .text 0 : { *(.text .text.*) }\n\n /* Sort stubs for convenient ordering */\n .sceStub.text : { *(.sceStub.text) *(SORT(.sceStub.text.*)) }\n\n /* PSP import library stub sections. Bundles together `.lib.stub.entry.*`\n * sections for better `--gc-sections` support. */\n .lib.stub.top : { *(.lib.stub.top) }\n .lib.stub : { *(.lib.stub) *(.lib.stub.entry.*) }\n .lib.stub.btm : { *(.lib.stub.btm) }\n\n /* Keep these sections around, even though they may appear unused to the linker */\n .lib.ent.top : { KEEP(*(.lib.ent.top)) }\n .lib.ent : { KEEP(*(.lib.ent)) }\n .lib.ent.btm : { KEEP(*(.lib.ent.btm)) }\n\n .eh_frame_hdr : { *(.eh_frame_hdr) }\n\n /* Add symbols for LLVM\'s libunwind */\n __eh_frame_hdr_start = SIZEOF(.eh_frame_hdr) > 0 ? ADDR(.eh_frame_hdr) : 0;\n __eh_frame_hdr_end = SIZEOF(.eh_frame_hdr) > 0 ? . : 0;\n .eh_frame :\n {\n __eh_frame_start = .;\n KEEP(*(.eh_frame))\n __eh_frame_end = .;\n }\n\n /* These are explicitly listed to avoid being merged into .rodata */\n .rodata.sceResident : { *(.rodata.sceResident) *(.rodata.sceResident.*) }\n .rodata.sceModuleInfo : { *(.rodata.sceModuleInfo) }\n /* Sort NIDs for convenient ordering */\n .rodata.sceNid : { *(.rodata.sceNid) *(SORT(.rodata.sceNid.*)) }\n\n .rodata : { *(.rodata .rodata.*) }\n .data : { *(.data .data.*) }\n .gcc_except_table : { *(.gcc_except_table .gcc_except_table.*) }\n .bss : { *(.bss .bss.*) }\n\n /DISCARD/ : { *(.rel.sceStub.text .MIPS.abiflags .reginfo) }\n}\n";
pub(crate) fn target() -> Target {
let pre_link_args =
TargetOptions::link_args(LinkerFlavor::Gnu(Cc::No, Lld::No),
&["--emit-relocs", "--nmagic"]);
Target {
llvm_target: "mipsel-sony-psp".into(),
metadata: TargetMetadata {
description: Some("MIPS (LE) Sony PlatStation Portable (PSP)".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
data_layout: "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64".into(),
arch: Arch::Mips,
options: TargetOptions {
os: Os::Psp,
vendor: "sony".into(),
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
cpu: "mips2".into(),
linker: Some("rust-lld".into()),
relocation_model: RelocModel::Static,
features: "+single-float".into(),
llvm_args: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("-mno-check-zero-division")]),
pre_link_args,
link_script: Some(LINKER_SCRIPT.into()),
..Default::default()
},
}
}
}
pub(crate) mod mipsel_sony_psx {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, Os, PanicStrategy, RelocModel,
Target, TargetMetadata, TargetOptions, cvs,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "mipsel-sony-psx".into(),
metadata: TargetMetadata {
description: Some("MIPS (LE) Sony PlayStation 1 (PSX)".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
data_layout: "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64".into(),
arch: Arch::Mips,
options: TargetOptions {
os: Os::Psx,
vendor: "sony".into(),
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
cpu: "mips1".into(),
executables: true,
linker: Some("rust-lld".into()),
relocation_model: RelocModel::Static,
exe_suffix: ".exe".into(),
features: "+soft-float".into(),
max_atomic_width: Some(0),
llvm_args: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("-mno-check-zero-division")]),
llvm_abiname: "o32".into(),
panic_strategy: PanicStrategy::Abort,
..Default::default()
},
}
}
}
pub(crate) mod mipsel_unknown_none {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel, Target,
TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "mipsel-unknown-none".into(),
metadata: TargetMetadata {
description: Some("Bare MIPS (LE) softfloat".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
data_layout: "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64".into(),
arch: Arch::Mips,
options: TargetOptions {
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
cpu: "mips32r2".into(),
features: "+mips32r2,+soft-float,+noabicalls".into(),
max_atomic_width: Some(32),
linker: Some("rust-lld".into()),
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
emit_debug_gdb_scripts: false,
..Default::default()
},
}
}
}
pub(crate) mod mips_mti_none_elf {
use rustc_abi::Endian;
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel, Target,
TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64".into(),
llvm_target: "mips".into(),
metadata: TargetMetadata {
description: Some("MIPS32r2 BE Baremetal Softfloat".into()),
tier: Some(3),
host_tools: Some(false),
std: None,
},
pointer_width: 32,
arch: Arch::Mips,
options: TargetOptions {
vendor: "mti".into(),
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
endian: Endian::Big,
cpu: "mips32r2".into(),
max_atomic_width: Some(32),
features: "+mips32r2,+soft-float,+noabicalls".into(),
executables: true,
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
emit_debug_gdb_scripts: false,
eh_frame_header: false,
singlethread: true,
..Default::default()
},
}
}
}
pub(crate) mod mipsel_mti_none_elf {
use rustc_abi::Endian;
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel, Target,
TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64".into(),
llvm_target: "mipsel".into(),
metadata: TargetMetadata {
description: Some("MIPS32r2 LE Baremetal Softfloat".into()),
tier: Some(3),
host_tools: Some(false),
std: None,
},
pointer_width: 32,
arch: Arch::Mips,
options: TargetOptions {
vendor: "mti".into(),
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
endian: Endian::Little,
cpu: "mips32r2".into(),
max_atomic_width: Some(32),
features: "+mips32r2,+soft-float,+noabicalls".into(),
executables: true,
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
emit_debug_gdb_scripts: false,
eh_frame_header: false,
singlethread: true,
..Default::default()
},
}
}
}
pub(crate) mod thumbv4t_none_eabi {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
cvs,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv4t-none-eabi".into(),
metadata: TargetMetadata {
description: Some("Thumb-mode Bare ARMv4T".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
arch: Arch::Arm,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
asm_args: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("-mthumb-interwork"),
::std::borrow::Cow::Borrowed("-march=armv4t"),
::std::borrow::Cow::Borrowed("-mlittle-endian")]),
features: "+soft-float,+strict-align".into(),
atomic_cas: false,
max_atomic_width: Some(0),
has_thumb_interworking: true,
..base::arm_none::opts()
},
}
}
}
pub(crate) mod armv4t_none_eabi {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
cvs,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv4t-none-eabi".into(),
metadata: TargetMetadata {
description: Some("Bare Armv4T".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
arch: Arch::Arm,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
asm_args: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("-mthumb-interwork"),
::std::borrow::Cow::Borrowed("-march=armv4t"),
::std::borrow::Cow::Borrowed("-mlittle-endian")]),
features: "+soft-float,+strict-align".into(),
atomic_cas: false,
max_atomic_width: Some(0),
has_thumb_interworking: true,
..base::arm_none::opts()
},
}
}
}
pub(crate) mod thumbv5te_none_eabi {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
cvs,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv5te-none-eabi".into(),
metadata: TargetMetadata {
description: Some("Thumb-mode Bare ARMv5TE".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
arch: Arch::Arm,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
asm_args: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("-mthumb-interwork"),
::std::borrow::Cow::Borrowed("-march=armv5te"),
::std::borrow::Cow::Borrowed("-mlittle-endian")]),
features: "+soft-float,+strict-align".into(),
atomic_cas: false,
max_atomic_width: Some(0),
has_thumb_interworking: true,
..base::arm_none::opts()
},
}
}
}
pub(crate) mod armv5te_none_eabi {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
cvs,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv5te-none-eabi".into(),
metadata: TargetMetadata {
description: Some("Bare Armv5TE".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
arch: Arch::Arm,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
asm_args: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("-mthumb-interwork"),
::std::borrow::Cow::Borrowed("-march=armv5te"),
::std::borrow::Cow::Borrowed("-mlittle-endian")]),
features: "+soft-float,+strict-align".into(),
atomic_cas: false,
max_atomic_width: Some(0),
has_thumb_interworking: true,
..base::arm_none::opts()
},
}
}
}
pub(crate) mod aarch64_be_unknown_linux_gnu {
use rustc_abi::Endian;
use crate::spec::{
Arch, FramePointer, StackProbeType, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "aarch64_be-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: Some("ARM64 Linux (big-endian)".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "E-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: TargetOptions {
features: "+v8a,+outline-atomics".into(),
frame_pointer: FramePointer::NonLeaf,
max_atomic_width: Some(128),
stack_probes: StackProbeType::Inline,
mcount: "\u{1}_mcount".into(),
endian: Endian::Big,
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod aarch64_unknown_linux_gnu_ilp32 {
use crate::spec::{
Abi, Arch, FramePointer, StackProbeType, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "aarch64-unknown-linux-gnu_ilp32".into(),
metadata: TargetMetadata {
description: Some("ARM64 Linux (ILP32 ABI)".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: TargetOptions {
abi: Abi::Ilp32,
features: "+v8a,+outline-atomics".into(),
frame_pointer: FramePointer::NonLeaf,
max_atomic_width: Some(128),
stack_probes: StackProbeType::Inline,
mcount: "\u{1}_mcount".into(),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod aarch64_be_unknown_linux_gnu_ilp32 {
use rustc_abi::Endian;
use crate::spec::{
Abi, Arch, FramePointer, StackProbeType, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_gnu::opts();
base.max_atomic_width = Some(128);
Target {
llvm_target: "aarch64_be-unknown-linux-gnu_ilp32".into(),
metadata: TargetMetadata {
description: Some("ARM64 Linux (big-endian, ILP32 ABI)".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "E-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: TargetOptions {
abi: Abi::Ilp32,
features: "+v8a,+outline-atomics".into(),
frame_pointer: FramePointer::NonLeaf,
stack_probes: StackProbeType::Inline,
mcount: "\u{1}_mcount".into(),
endian: Endian::Big,
..base
},
}
}
}
pub(crate) mod bpfeb_unknown_none {
use rustc_abi::Endian;
use crate::spec::{Arch, Target, TargetMetadata, base};
pub(crate) fn target() -> Target {
Target {
llvm_target: "bpfeb".into(),
metadata: TargetMetadata {
description: Some("BPF (big endian)".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
data_layout: "E-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
pointer_width: 64,
arch: Arch::Bpf,
options: base::bpf::opts(Endian::Big),
}
}
}
pub(crate) mod bpfel_unknown_none {
use rustc_abi::Endian;
use crate::spec::{Arch, Target, TargetMetadata, base};
pub(crate) fn target() -> Target {
Target {
llvm_target: "bpfel".into(),
metadata: TargetMetadata {
description: Some("BPF (little endian)".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
pointer_width: 64,
arch: Arch::Bpf,
options: base::bpf::opts(Endian::Little),
}
}
}
pub(crate) mod armv6k_nintendo_3ds {
use crate::spec::{
Abi, Arch, Cc, Env, FloatAbi, LinkerFlavor, Lld, Os, RelocModel,
Target, TargetMetadata, TargetOptions, cvs,
};
pub(crate) fn target() -> Target {
let pre_link_args =
TargetOptions::link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-specs=3dsx.specs", "-mtune=mpcore", "-mfloat-abi=hard",
"-mtp=soft"]);
Target {
llvm_target: "armv6k-none-eabihf".into(),
metadata: TargetMetadata {
description: Some("Armv6K Nintendo 3DS, Horizon (Requires devkitARM toolchain)".into()),
tier: Some(3),
host_tools: Some(false),
std: None,
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
os: Os::Horizon,
env: Env::Newlib,
vendor: "nintendo".into(),
cpu: "mpcore".into(),
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
linker: Some("arm-none-eabi-gcc".into()),
relocation_model: RelocModel::Static,
features: "+vfp2".into(),
pre_link_args,
exe_suffix: ".elf".into(),
no_default_libraries: false,
has_thread_local: true,
..Default::default()
},
}
}
}
pub(crate) mod aarch64_nintendo_switch_freestanding {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, Os, PanicStrategy, RelroLevel,
StackProbeType, Target, TargetMetadata, TargetOptions,
};
const LINKER_SCRIPT: &str =
"OUTPUT_FORMAT(elf64-littleaarch64)\nOUTPUT_ARCH(aarch64)\nENTRY(_start)\n\nPHDRS\n{\n text PT_LOAD FLAGS(5);\n rodata PT_LOAD FLAGS(4);\n data PT_LOAD FLAGS(6);\n bss PT_LOAD FLAGS(6);\n dynamic PT_DYNAMIC;\n}\n\nSECTIONS\n{\n . = 0;\n\n .text : ALIGN(0x1000) {\n HIDDEN(__text_start = .);\n KEEP(*(.text.jmp))\n\n . = 0x80;\n\n *(.text .text.*)\n *(.plt .plt.*)\n }\n\n /* Read-only sections */\n\n . = ALIGN(0x1000);\n\n .module_name : { *(.module_name) } :rodata\n\n .rodata : { *(.rodata .rodata.*) } :rodata\n .hash : { *(.hash) }\n .dynsym : { *(.dynsym .dynsym.*) }\n .dynstr : { *(.dynstr .dynstr.*) }\n .rela.dyn : { *(.rela.dyn) }\n\n .eh_frame : {\n HIDDEN(__eh_frame_start = .);\n *(.eh_frame .eh_frame.*)\n HIDDEN(__eh_frame_end = .);\n }\n\n .eh_frame_hdr : {\n HIDDEN(__eh_frame_hdr_start = .);\n *(.eh_frame_hdr .eh_frame_hdr.*)\n HIDDEN(__eh_frame_hdr_end = .);\n }\n\n /* Read-write sections */\n\n . = ALIGN(0x1000);\n\n .data : {\n *(.data .data.*)\n *(.got .got.*)\n *(.got.plt .got.plt.*)\n } :data\n\n .dynamic : {\n HIDDEN(__dynamic_start = .);\n *(.dynamic)\n }\n\n /* BSS section */\n\n . = ALIGN(0x1000);\n\n .bss : {\n HIDDEN(__bss_start = .);\n *(.bss .bss.*)\n *(COMMON)\n . = ALIGN(8);\n HIDDEN(__bss_end = .);\n } :bss\n}\n";
pub(crate) fn target() -> Target {
Target {
llvm_target: "aarch64-unknown-none".into(),
metadata: TargetMetadata {
description: Some("ARM64 Nintendo Switch, Horizon".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: TargetOptions {
features: "+v8a,+neon,+crypto,+crc".into(),
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
link_script: Some(LINKER_SCRIPT.into()),
os: Os::Horizon,
vendor: "nintendo".into(),
max_atomic_width: Some(128),
stack_probes: StackProbeType::Inline,
panic_strategy: PanicStrategy::Abort,
position_independent_executables: true,
dynamic_linking: true,
relro_level: RelroLevel::Off,
..Default::default()
},
}
}
}
pub(crate) mod armv7_sony_vita_newlibeabihf {
use rustc_abi::Endian;
use crate::spec::{
Abi, Arch, Cc, Env, FloatAbi, LinkerFlavor, Lld, Os, RelocModel,
Target, TargetMetadata, TargetOptions, cvs,
};
pub(crate) fn target() -> Target {
let pre_link_args =
TargetOptions::link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-Wl,-q", "-Wl,--pic-veneer"]);
Target {
llvm_target: "thumbv7a-sony-vita-eabihf".into(),
metadata: TargetMetadata {
description: Some("Armv7-A Cortex-A9 Sony PlayStation Vita (requires VITASDK toolchain)".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
os: Os::Vita,
endian: Endian::Little,
c_int_width: 32,
env: Env::Newlib,
vendor: "sony".into(),
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
linker_flavor: LinkerFlavor::Gnu(Cc::Yes, Lld::No),
no_default_libraries: false,
cpu: "cortex-a9".into(),
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
linker: Some("arm-vita-eabi-gcc".into()),
relocation_model: RelocModel::Static,
features: "+v7,+neon,+vfp3,+thumb2,+thumb-mode".into(),
pre_link_args,
exe_suffix: ".elf".into(),
has_thumb_interworking: true,
max_atomic_width: Some(64),
..Default::default()
},
}
}
}
pub(crate) mod armv7_unknown_linux_uclibceabi {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let base = base::linux_uclibc::opts();
Target {
llvm_target: "armv7-unknown-linux-gnueabi".into(),
metadata: TargetMetadata {
description: Some("Armv7-A Linux with uClibc, softfloat".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
features: "+v7,+thumb2,+soft-float,-neon".into(),
cpu: "generic".into(),
max_atomic_width: Some(64),
mcount: "_mcount".into(),
..base
},
}
}
}
pub(crate) mod armv7_unknown_linux_uclibceabihf {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let base = base::linux_uclibc::opts();
Target {
llvm_target: "armv7-unknown-linux-gnueabihf".into(),
metadata: TargetMetadata {
description: Some("Armv7-A Linux with uClibc, hardfloat".into()),
tier: Some(3),
host_tools: None,
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
features: "+v7,+vfp3d16,+thumb2,-neon".into(),
cpu: "generic".into(),
max_atomic_width: Some(64),
mcount: "_mcount".into(),
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
..base
},
}
}
}
pub(crate) mod x86_64_unknown_none {
use crate::spec::{
Arch, Cc, CodeModel, LinkerFlavor, Lld, PanicStrategy, RelroLevel,
RustcAbi, SanitizerSet, StackProbeType, Target, TargetMetadata,
TargetOptions,
};
pub(crate) fn target() -> Target {
let opts =
TargetOptions {
cpu: "x86-64".into(),
plt_by_default: false,
max_atomic_width: Some(64),
stack_probes: StackProbeType::Inline,
position_independent_executables: true,
static_position_independent_executables: true,
relro_level: RelroLevel::Full,
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
rustc_abi: Some(RustcAbi::X86Softfloat),
features: "-mmx,-sse,-sse2,-sse3,-ssse3,-sse4.1,-sse4.2,-avx,-avx2,+soft-float".into(),
supported_sanitizers: SanitizerSet::KCFI |
SanitizerSet::KERNELADDRESS,
disable_redzone: true,
panic_strategy: PanicStrategy::Abort,
code_model: Some(CodeModel::Kernel),
..Default::default()
};
Target {
llvm_target: "x86_64-unknown-none-elf".into(),
metadata: TargetMetadata {
description: Some("Freestanding/bare-metal x86_64 softfloat".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: opts,
}
}
}
pub(crate) mod aarch64_unknown_teeos {
use crate::spec::{Arch, StackProbeType, Target, TargetMetadata, base};
pub(crate) fn target() -> Target {
let mut base = base::teeos::opts();
base.features = "+strict-align,+neon".into();
base.max_atomic_width = Some(128);
base.stack_probes = StackProbeType::Inline;
Target {
llvm_target: "aarch64-unknown-none".into(),
metadata: TargetMetadata {
description: Some("ARM64 TEEOS".into()),
tier: Some(3),
host_tools: Some(false),
std: None,
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: base,
}
}
}
pub(crate) mod mips64_openwrt_linux_musl {
use rustc_abi::Endian;
use crate::spec::{
Abi, Arch, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_musl::opts();
base.cpu = "mips64r2".into();
base.features = "+mips64r2,+soft-float".into();
base.max_atomic_width = Some(64);
Target {
llvm_target: "mips64-unknown-linux-musl".into(),
metadata: TargetMetadata {
description: Some("MIPS64 for OpenWrt Linux musl 1.2.5".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::Mips64,
options: TargetOptions {
vendor: "openwrt".into(),
abi: Abi::Abi64,
endian: Endian::Big,
mcount: "_mcount".into(),
llvm_abiname: "n64".into(),
..base
},
}
}
}
pub(crate) mod aarch64_unknown_nto_qnx700 {
use crate::spec::base::nto_qnx;
use crate::spec::{Env, Target};
pub(crate) fn target() -> Target {
let mut target = nto_qnx::aarch64();
target.metadata.description =
Some("ARM64 QNX Neutrino 7.0 RTOS".into());
target.options.pre_link_args =
nto_qnx::pre_link_args(nto_qnx::ApiVariant::Default,
nto_qnx::Arch::Aarch64);
target.options.env = Env::Nto70;
target
}
}
pub(crate) mod aarch64_unknown_nto_qnx710 {
use crate::spec::base::nto_qnx;
use crate::spec::{Env, Target};
pub(crate) fn target() -> Target {
let mut target = nto_qnx::aarch64();
target.metadata.description =
Some("ARM64 QNX Neutrino 7.1 RTOS with io-pkt network stack".into());
target.options.pre_link_args =
nto_qnx::pre_link_args(nto_qnx::ApiVariant::Default,
nto_qnx::Arch::Aarch64);
target.options.env = Env::Nto71;
target
}
}
pub(crate) mod aarch64_unknown_nto_qnx710_iosock {
use crate::spec::base::nto_qnx;
use crate::spec::{Env, Target};
pub(crate) fn target() -> Target {
let mut target = nto_qnx::aarch64();
target.metadata.description =
Some("ARM64 QNX Neutrino 7.1 RTOS with io-sock network stack".into());
target.options.pre_link_args =
nto_qnx::pre_link_args(nto_qnx::ApiVariant::IoSock,
nto_qnx::Arch::Aarch64);
target.options.env = Env::Nto71IoSock;
target
}
}
pub(crate) mod aarch64_unknown_nto_qnx800 {
use crate::spec::base::nto_qnx;
use crate::spec::{Env, Target};
pub(crate) fn target() -> Target {
let mut target = nto_qnx::aarch64();
target.metadata.description =
Some("ARM64 QNX Neutrino 8.0 RTOS".into());
target.options.pre_link_args =
nto_qnx::pre_link_args(nto_qnx::ApiVariant::Default,
nto_qnx::Arch::Aarch64);
target.options.env = Env::Nto80;
target
}
}
pub(crate) mod x86_64_pc_nto_qnx710 {
use crate::spec::base::nto_qnx;
use crate::spec::{Env, Target};
pub(crate) fn target() -> Target {
let mut target = nto_qnx::x86_64();
target.metadata.description =
Some("x86 64-bit QNX Neutrino 7.1 RTOS with io-pkt network stack".into());
target.options.pre_link_args =
nto_qnx::pre_link_args(nto_qnx::ApiVariant::Default,
nto_qnx::Arch::X86_64);
target.options.env = Env::Nto71;
target
}
}
pub(crate) mod x86_64_pc_nto_qnx710_iosock {
use crate::spec::base::nto_qnx;
use crate::spec::{Env, Target};
pub(crate) fn target() -> Target {
let mut target = nto_qnx::x86_64();
target.metadata.description =
Some("x86 64-bit QNX Neutrino 7.1 RTOS with io-sock network stack".into());
target.options.pre_link_args =
nto_qnx::pre_link_args(nto_qnx::ApiVariant::IoSock,
nto_qnx::Arch::X86_64);
target.options.env = Env::Nto71IoSock;
target
}
}
pub(crate) mod x86_64_pc_nto_qnx800 {
use crate::spec::base::nto_qnx;
use crate::spec::{Env, Target};
pub(crate) fn target() -> Target {
let mut target = nto_qnx::x86_64();
target.metadata.description =
Some("x86 64-bit QNX Neutrino 8.0 RTOS".into());
target.options.pre_link_args =
nto_qnx::pre_link_args(nto_qnx::ApiVariant::Default,
nto_qnx::Arch::X86_64);
target.options.env = Env::Nto80;
target
}
}
pub(crate) mod i686_pc_nto_qnx700 {
use crate::spec::base::nto_qnx;
use crate::spec::{
Arch, Env, RustcAbi, StackProbeType, Target, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut meta = nto_qnx::meta();
meta.description =
Some("32-bit x86 QNX Neutrino 7.0 RTOS".into());
meta.std = Some(false);
Target {
llvm_target: "i586-pc-unknown".into(),
metadata: meta,
pointer_width: 32,
data_layout: "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i128:128-f64:32:64-f80:32-n8:16:32-S128".into(),
arch: Arch::X86,
options: TargetOptions {
rustc_abi: Some(RustcAbi::X86Sse2),
cpu: "pentium4".into(),
max_atomic_width: Some(64),
pre_link_args: nto_qnx::pre_link_args(nto_qnx::ApiVariant::Default,
nto_qnx::Arch::I586),
env: Env::Nto70,
vendor: "pc".into(),
stack_probes: StackProbeType::Inline,
..base::nto_qnx::opts()
},
}
}
}
pub(crate) mod aarch64_unknown_linux_ohos {
use crate::spec::{
Arch, FramePointer, SanitizerSet, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_ohos::opts();
base.max_atomic_width = Some(128);
Target {
llvm_target: "aarch64-unknown-linux-ohos".into(),
metadata: TargetMetadata {
description: Some("ARM64 OpenHarmony".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: TargetOptions {
frame_pointer: FramePointer::NonLeaf,
mcount: "\u{1}_mcount".into(),
stack_probes: StackProbeType::Inline,
supported_sanitizers: SanitizerSet::ADDRESS |
SanitizerSet::CFI | SanitizerSet::LEAK |
SanitizerSet::MEMORY | SanitizerSet::MEMTAG |
SanitizerSet::THREAD | SanitizerSet::HWADDRESS,
..base
},
}
}
}
pub(crate) mod armv7_unknown_linux_ohos {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv7-unknown-linux-ohos".into(),
metadata: TargetMetadata {
description: Some("Armv7-A OpenHarmony".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
features: "+v7,+thumb2,+soft-float,-neon".into(),
max_atomic_width: Some(64),
mcount: "\u{1}mcount".into(),
..base::linux_ohos::opts()
},
}
}
}
pub(crate) mod loongarch64_unknown_linux_ohos {
use crate::spec::{
Arch, CodeModel, SanitizerSet, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "loongarch64-unknown-linux-ohos".into(),
metadata: TargetMetadata {
description: Some("LoongArch64 OpenHarmony".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::LoongArch64,
options: TargetOptions {
code_model: Some(CodeModel::Medium),
cpu: "generic".into(),
features: "+f,+d,+lsx".into(),
llvm_abiname: "lp64d".into(),
max_atomic_width: Some(64),
supported_sanitizers: SanitizerSet::ADDRESS |
SanitizerSet::CFI | SanitizerSet::LEAK |
SanitizerSet::MEMORY | SanitizerSet::THREAD,
supports_xray: true,
direct_access_external_data: Some(false),
..base::linux_ohos::opts()
},
}
}
}
pub(crate) mod x86_64_unknown_linux_ohos {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, SanitizerSet, StackProbeType, Target,
TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_ohos::opts();
base.cpu = "x86-64".into();
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.stack_probes = StackProbeType::Inline;
base.static_position_independent_executables = true;
base.supported_sanitizers =
SanitizerSet::ADDRESS | SanitizerSet::CFI | SanitizerSet::LEAK
| SanitizerSet::MEMORY | SanitizerSet::THREAD;
base.supports_xray = true;
Target {
llvm_target: "x86_64-unknown-linux-ohos".into(),
metadata: TargetMetadata {
description: Some("x86_64 OpenHarmony".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod x86_64_unknown_linux_none {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, PanicStrategy, StackProbeType,
Target, TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux::opts();
base.cpu = "x86-64".into();
base.max_atomic_width = Some(64);
base.stack_probes = StackProbeType::Inline;
base.linker_flavor = LinkerFlavor::Gnu(Cc::No, Lld::Yes);
base.linker = Some("rust-lld".into());
base.panic_strategy = PanicStrategy::Abort;
Target {
llvm_target: "x86_64-unknown-linux-none".into(),
metadata: TargetMetadata {
description: None,
tier: None,
host_tools: None,
std: Some(false),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod thumbv6m_nuttx_eabi {
use crate::spec::{
Abi, Arch, FloatAbi, Os, Target, TargetMetadata, TargetOptions,
base, cvs,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv6m-none-eabi".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: None,
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
os: Os::NuttX,
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
features: "+strict-align".into(),
max_atomic_width: Some(32),
..base::arm_none::opts()
},
}
}
}
pub(crate) mod thumbv7a_nuttx_eabi {
use crate::spec::{
Abi, Arch, FloatAbi, Os, Target, TargetMetadata, TargetOptions,
base, cvs,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv7a-none-eabi".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: None,
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
os: Os::NuttX,
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
features: "+soft-float,-neon".into(),
max_atomic_width: Some(64),
..base::arm_none::opts()
},
}
}
}
pub(crate) mod thumbv7a_nuttx_eabihf {
use crate::spec::{
Abi, Arch, FloatAbi, Os, Target, TargetMetadata, TargetOptions,
base, cvs,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv7a-none-eabihf".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: None,
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
os: Os::NuttX,
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
features: "+vfp3,+neon".into(),
max_atomic_width: Some(64),
..base::arm_none::opts()
},
}
}
}
pub(crate) mod thumbv7m_nuttx_eabi {
use crate::spec::{
Abi, Arch, FloatAbi, Os, Target, TargetMetadata, TargetOptions,
base, cvs,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv7m-none-eabi".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: None,
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
os: Os::NuttX,
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
max_atomic_width: Some(32),
..base::arm_none::opts()
},
}
}
}
pub(crate) mod thumbv7em_nuttx_eabi {
use crate::spec::{
Abi, Arch, FloatAbi, Os, Target, TargetMetadata, TargetOptions,
base, cvs,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv7em-none-eabi".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: None,
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
os: Os::NuttX,
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
max_atomic_width: Some(32),
..base::arm_none::opts()
},
}
}
}
pub(crate) mod thumbv7em_nuttx_eabihf {
use crate::spec::{
Abi, Arch, FloatAbi, Os, Target, TargetMetadata, TargetOptions,
base, cvs,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv7em-none-eabihf".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: None,
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
os: Os::NuttX,
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
features: "+vfp4d16sp".into(),
max_atomic_width: Some(32),
..base::arm_none::opts()
},
}
}
}
pub(crate) mod thumbv8m_base_nuttx_eabi {
use crate::spec::{
Abi, Arch, FloatAbi, Os, Target, TargetMetadata, TargetOptions,
base, cvs,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv8m.base-none-eabi".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: None,
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
os: Os::NuttX,
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
features: "+strict-align".into(),
max_atomic_width: Some(32),
..base::arm_none::opts()
},
}
}
}
pub(crate) mod thumbv8m_main_nuttx_eabi {
use crate::spec::{
Abi, Arch, FloatAbi, Os, Target, TargetMetadata, TargetOptions,
base, cvs,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv8m.main-none-eabi".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: None,
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
os: Os::NuttX,
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
max_atomic_width: Some(32),
..base::arm_none::opts()
},
}
}
}
pub(crate) mod thumbv8m_main_nuttx_eabihf {
use crate::spec::{
Abi, Arch, FloatAbi, Os, Target, TargetMetadata, TargetOptions,
base, cvs,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv8m.main-none-eabihf".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: None,
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
os: Os::NuttX,
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
features: "+fp-armv8d16sp".into(),
max_atomic_width: Some(32),
..base::arm_none::opts()
},
}
}
}
pub(crate) mod riscv32imc_unknown_nuttx_elf {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, Os, PanicStrategy, RelocModel,
Target, TargetMetadata, TargetOptions, cvs,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:e-p:32:32-i64:64-n32-S128".into(),
llvm_target: "riscv32".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: None,
std: Some(true),
},
pointer_width: 32,
arch: Arch::RiscV32,
options: TargetOptions {
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
os: Os::NuttX,
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
cpu: "generic-rv32".into(),
max_atomic_width: Some(32),
features: "+m,+c".into(),
llvm_abiname: "ilp32".into(),
panic_strategy: PanicStrategy::Unwind,
relocation_model: RelocModel::Static,
..Default::default()
},
}
}
}
pub(crate) mod riscv32imac_unknown_nuttx_elf {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, Os, PanicStrategy, RelocModel,
Target, TargetMetadata, TargetOptions, cvs,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:e-p:32:32-i64:64-n32-S128".into(),
llvm_target: "riscv32".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: None,
std: Some(true),
},
pointer_width: 32,
arch: Arch::RiscV32,
options: TargetOptions {
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
os: Os::NuttX,
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
cpu: "generic-rv32".into(),
max_atomic_width: Some(32),
features: "+m,+a,+c".into(),
llvm_abiname: "ilp32".into(),
panic_strategy: PanicStrategy::Unwind,
relocation_model: RelocModel::Static,
..Default::default()
},
}
}
}
pub(crate) mod riscv32imafc_unknown_nuttx_elf {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, Os, PanicStrategy, RelocModel,
Target, TargetMetadata, TargetOptions, cvs,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:e-p:32:32-i64:64-n32-S128".into(),
llvm_target: "riscv32".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: None,
std: Some(true),
},
pointer_width: 32,
arch: Arch::RiscV32,
options: TargetOptions {
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
os: Os::NuttX,
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
cpu: "generic-rv32".into(),
max_atomic_width: Some(32),
llvm_abiname: "ilp32f".into(),
features: "+m,+a,+c,+f".into(),
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
emit_debug_gdb_scripts: false,
eh_frame_header: false,
..Default::default()
},
}
}
}
pub(crate) mod riscv64imac_unknown_nuttx_elf {
use crate::spec::{
Arch, Cc, CodeModel, LinkerFlavor, Lld, Os, PanicStrategy,
RelocModel, SanitizerSet, Target, TargetMetadata, TargetOptions,
cvs,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: None,
std: Some(true),
},
llvm_target: "riscv64".into(),
pointer_width: 64,
arch: Arch::RiscV64,
options: TargetOptions {
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
os: Os::NuttX,
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
cpu: "generic-rv64".into(),
max_atomic_width: Some(64),
features: "+m,+a,+c".into(),
llvm_abiname: "lp64".into(),
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
code_model: Some(CodeModel::Medium),
emit_debug_gdb_scripts: false,
eh_frame_header: false,
supported_sanitizers: SanitizerSet::KERNELADDRESS,
..Default::default()
},
}
}
}
pub(crate) mod riscv64gc_unknown_nuttx_elf {
use crate::spec::{
Arch, Cc, CodeModel, LinkerFlavor, Lld, Os, PanicStrategy,
RelocModel, SanitizerSet, Target, TargetMetadata, TargetOptions,
cvs,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: None,
std: Some(true),
},
llvm_target: "riscv64".into(),
pointer_width: 64,
arch: Arch::RiscV64,
options: TargetOptions {
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
os: Os::NuttX,
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
llvm_abiname: "lp64d".into(),
cpu: "generic-rv64".into(),
max_atomic_width: Some(64),
features: "+m,+a,+f,+d,+c,+zicsr,+zifencei".into(),
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
code_model: Some(CodeModel::Medium),
emit_debug_gdb_scripts: false,
eh_frame_header: false,
supported_sanitizers: SanitizerSet::KERNELADDRESS,
..Default::default()
},
}
}
}
pub(crate) mod x86_64_lynx_lynxos178 {
use crate::spec::{Arch, SanitizerSet, StackProbeType, Target, base};
pub(crate) fn target() -> Target {
let mut base = base::lynxos178::opts();
base.cpu = "x86-64".into();
base.plt_by_default = false;
base.max_atomic_width = Some(64);
base.stack_probes = StackProbeType::Inline;
base.static_position_independent_executables = false;
base.supported_sanitizers =
SanitizerSet::ADDRESS | SanitizerSet::CFI | SanitizerSet::KCFI
| SanitizerSet::DATAFLOW | SanitizerSet::LEAK |
SanitizerSet::MEMORY | SanitizerSet::SAFESTACK |
SanitizerSet::THREAD;
base.supports_xray = true;
Target {
llvm_target: "x86_64-unknown-unknown-gnu".into(),
metadata: crate::spec::TargetMetadata {
description: Some("LynxOS-178".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod x86_64_pc_cygwin {
use crate::spec::{Arch, Cc, LinkerFlavor, Lld, Target, base};
pub(crate) fn target() -> Target {
let mut base = base::cygwin::opts();
base.cpu = "x86-64".into();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::No, Lld::No),
&["-m", "i386pep"]);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.max_atomic_width = Some(64);
base.linker = Some("x86_64-pc-cygwin-gcc".into());
Target {
llvm_target: "x86_64-pc-cygwin".into(),
pointer_width: 64,
data_layout: "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
metadata: crate::spec::TargetMetadata {
description: Some("64-bit x86 Cygwin".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
}
}
}
}
pub static TARGETS: &[&str] =
&["x86_64-unknown-linux-gnu", "x86_64-unknown-linux-gnux32",
"i686-unknown-linux-gnu", "i586-unknown-linux-gnu",
"loongarch64-unknown-linux-gnu",
"loongarch64-unknown-linux-musl", "m68k-unknown-linux-gnu",
"m68k-unknown-none-elf", "csky-unknown-linux-gnuabiv2",
"csky-unknown-linux-gnuabiv2hf", "mips-unknown-linux-gnu",
"mips64-unknown-linux-gnuabi64",
"mips64el-unknown-linux-gnuabi64",
"mipsisa32r6-unknown-linux-gnu",
"mipsisa32r6el-unknown-linux-gnu",
"mipsisa64r6-unknown-linux-gnuabi64",
"mipsisa64r6el-unknown-linux-gnuabi64",
"mipsel-unknown-linux-gnu", "powerpc-unknown-linux-gnu",
"powerpc-unknown-linux-gnuspe", "powerpc-unknown-linux-musl",
"powerpc-unknown-linux-muslspe", "powerpc64-ibm-aix",
"powerpc64-unknown-linux-gnu", "powerpc64-unknown-linux-musl",
"powerpc64le-unknown-linux-gnu",
"powerpc64le-unknown-linux-musl", "s390x-unknown-linux-gnu",
"s390x-unknown-linux-musl", "sparc-unknown-linux-gnu",
"sparc64-unknown-linux-gnu", "arm-unknown-linux-gnueabi",
"arm-unknown-linux-gnueabihf", "armeb-unknown-linux-gnueabi",
"arm-unknown-linux-musleabi", "arm-unknown-linux-musleabihf",
"armv4t-unknown-linux-gnueabi",
"armv5te-unknown-linux-gnueabi",
"armv5te-unknown-linux-musleabi",
"armv5te-unknown-linux-uclibceabi",
"armv7-unknown-linux-gnueabi",
"armv7-unknown-linux-gnueabihf",
"thumbv7neon-unknown-linux-gnueabihf",
"thumbv7neon-unknown-linux-musleabihf",
"armv7-unknown-linux-musleabi",
"armv7-unknown-linux-musleabihf", "aarch64-unknown-linux-gnu",
"aarch64-unknown-linux-musl", "aarch64_be-unknown-linux-musl",
"x86_64-unknown-linux-musl", "i686-unknown-linux-musl",
"i586-unknown-linux-musl", "mips-unknown-linux-musl",
"mipsel-unknown-linux-musl", "mips64-unknown-linux-muslabi64",
"mips64el-unknown-linux-muslabi64",
"hexagon-unknown-linux-musl", "hexagon-unknown-none-elf",
"hexagon-unknown-qurt", "mips-unknown-linux-uclibc",
"mipsel-unknown-linux-uclibc", "i686-linux-android",
"x86_64-linux-android", "arm-linux-androideabi",
"armv7-linux-androideabi", "thumbv7neon-linux-androideabi",
"aarch64-linux-android", "riscv64-linux-android",
"aarch64-unknown-freebsd", "armv6-unknown-freebsd",
"armv7-unknown-freebsd", "i686-unknown-freebsd",
"powerpc-unknown-freebsd", "powerpc64-unknown-freebsd",
"powerpc64le-unknown-freebsd", "riscv64gc-unknown-freebsd",
"x86_64-unknown-freebsd", "x86_64-unknown-dragonfly",
"aarch64-unknown-openbsd", "i686-unknown-openbsd",
"powerpc-unknown-openbsd", "powerpc64-unknown-openbsd",
"riscv64gc-unknown-openbsd", "sparc64-unknown-openbsd",
"x86_64-unknown-openbsd", "aarch64-unknown-netbsd",
"aarch64_be-unknown-netbsd", "armv6-unknown-netbsd-eabihf",
"armv7-unknown-netbsd-eabihf", "i586-unknown-netbsd",
"i686-unknown-netbsd", "mipsel-unknown-netbsd",
"powerpc-unknown-netbsd", "riscv64gc-unknown-netbsd",
"sparc64-unknown-netbsd", "x86_64-unknown-netbsd",
"i686-unknown-haiku", "x86_64-unknown-haiku",
"aarch64-unknown-helenos", "i686-unknown-helenos",
"powerpc-unknown-helenos", "sparc64-unknown-helenos",
"x86_64-unknown-helenos", "i686-unknown-hurd-gnu",
"x86_64-unknown-hurd-gnu", "aarch64-apple-darwin",
"arm64e-apple-darwin", "x86_64-apple-darwin",
"x86_64h-apple-darwin", "i686-apple-darwin",
"aarch64-unknown-fuchsia", "riscv64gc-unknown-fuchsia",
"x86_64-unknown-fuchsia", "avr-none",
"x86_64-unknown-l4re-uclibc", "aarch64-unknown-redox",
"i586-unknown-redox", "riscv64gc-unknown-redox",
"x86_64-unknown-redox", "x86_64-unknown-managarm-mlibc",
"aarch64-unknown-managarm-mlibc",
"riscv64gc-unknown-managarm-mlibc", "i386-apple-ios",
"x86_64-apple-ios", "aarch64-apple-ios", "arm64e-apple-ios",
"armv7s-apple-ios", "x86_64-apple-ios-macabi",
"aarch64-apple-ios-macabi", "aarch64-apple-ios-sim",
"aarch64-apple-tvos", "aarch64-apple-tvos-sim",
"arm64e-apple-tvos", "x86_64-apple-tvos",
"armv7k-apple-watchos", "arm64_32-apple-watchos",
"x86_64-apple-watchos-sim", "aarch64-apple-watchos",
"aarch64-apple-watchos-sim", "aarch64-apple-visionos",
"aarch64-apple-visionos-sim", "armebv7r-none-eabi",
"armebv7r-none-eabihf", "armv7r-none-eabi",
"armv7r-none-eabihf", "armv8r-none-eabihf",
"armv7-rtems-eabihf", "x86_64-pc-solaris",
"sparcv9-sun-solaris", "x86_64-unknown-illumos",
"aarch64-unknown-illumos", "x86_64-pc-windows-gnu",
"x86_64-uwp-windows-gnu", "x86_64-win7-windows-gnu",
"i686-pc-windows-gnu", "i686-uwp-windows-gnu",
"i686-win7-windows-gnu", "aarch64-pc-windows-gnullvm",
"i686-pc-windows-gnullvm", "x86_64-pc-windows-gnullvm",
"aarch64-pc-windows-msvc", "aarch64-uwp-windows-msvc",
"arm64ec-pc-windows-msvc", "x86_64-pc-windows-msvc",
"x86_64-uwp-windows-msvc", "x86_64-win7-windows-msvc",
"i686-pc-windows-msvc", "i686-uwp-windows-msvc",
"i686-win7-windows-msvc", "thumbv7a-pc-windows-msvc",
"thumbv7a-uwp-windows-msvc", "wasm32-unknown-emscripten",
"wasm32-unknown-unknown", "wasm32v1-none", "wasm32-wasip1",
"wasm32-wasip2", "wasm32-wasip3", "wasm32-wasip1-threads",
"wasm32-wali-linux-musl", "wasm64-unknown-unknown",
"thumbv6m-none-eabi", "thumbv7m-none-eabi",
"thumbv7em-none-eabi", "thumbv7em-none-eabihf",
"thumbv8m.base-none-eabi", "thumbv8m.main-none-eabi",
"thumbv8m.main-none-eabihf", "armv7a-none-eabi",
"armv7a-none-eabihf", "armv7a-nuttx-eabi",
"armv7a-nuttx-eabihf", "armv7a-vex-v5", "msp430-none-elf",
"aarch64_be-unknown-hermit", "aarch64-unknown-hermit",
"riscv64gc-unknown-hermit", "x86_64-unknown-hermit",
"x86_64-unknown-motor", "x86_64-unikraft-linux-musl",
"armv7-unknown-trusty", "aarch64-unknown-trusty",
"x86_64-unknown-trusty", "riscv32i-unknown-none-elf",
"riscv32im-risc0-zkvm-elf", "riscv32im-unknown-none-elf",
"riscv32ima-unknown-none-elf", "riscv32imc-unknown-none-elf",
"riscv32imc-esp-espidf", "riscv32imac-esp-espidf",
"riscv32imafc-esp-espidf", "riscv32e-unknown-none-elf",
"riscv32em-unknown-none-elf", "riscv32emc-unknown-none-elf",
"riscv32imac-unknown-none-elf",
"riscv32imafc-unknown-none-elf",
"riscv32imac-unknown-xous-elf", "riscv32gc-unknown-linux-gnu",
"riscv32gc-unknown-linux-musl", "riscv64im-unknown-none-elf",
"riscv64imac-unknown-none-elf", "riscv64gc-unknown-none-elf",
"riscv64gc-unknown-linux-gnu", "riscv64gc-unknown-linux-musl",
"riscv64a23-unknown-linux-gnu", "sparc-unknown-none-elf",
"loongarch32-unknown-none",
"loongarch32-unknown-none-softfloat",
"loongarch64-unknown-none",
"loongarch64-unknown-none-softfloat", "aarch64-unknown-none",
"aarch64-unknown-none-softfloat",
"aarch64_be-unknown-none-softfloat", "aarch64-unknown-nuttx",
"x86_64-fortanix-unknown-sgx", "x86_64-unknown-uefi",
"i686-unknown-uefi", "aarch64-unknown-uefi",
"nvptx64-nvidia-cuda", "amdgcn-amd-amdhsa",
"xtensa-esp32-none-elf", "xtensa-esp32-espidf",
"xtensa-esp32s2-none-elf", "xtensa-esp32s2-espidf",
"xtensa-esp32s3-none-elf", "xtensa-esp32s3-espidf",
"i686-wrs-vxworks", "x86_64-wrs-vxworks",
"armv7-wrs-vxworks-eabihf", "aarch64-wrs-vxworks",
"powerpc-wrs-vxworks", "powerpc-wrs-vxworks-spe",
"powerpc64-wrs-vxworks", "riscv32-wrs-vxworks",
"riscv64-wrs-vxworks", "aarch64-kmc-solid_asp3",
"armv7a-kmc-solid_asp3-eabi", "armv7a-kmc-solid_asp3-eabihf",
"mipsel-sony-psp", "mipsel-sony-psx", "mipsel-unknown-none",
"mips-mti-none-elf", "mipsel-mti-none-elf",
"thumbv4t-none-eabi", "armv4t-none-eabi",
"thumbv5te-none-eabi", "armv5te-none-eabi",
"aarch64_be-unknown-linux-gnu",
"aarch64-unknown-linux-gnu_ilp32",
"aarch64_be-unknown-linux-gnu_ilp32", "bpfeb-unknown-none",
"bpfel-unknown-none", "armv6k-nintendo-3ds",
"aarch64-nintendo-switch-freestanding",
"armv7-sony-vita-newlibeabihf",
"armv7-unknown-linux-uclibceabi",
"armv7-unknown-linux-uclibceabihf", "x86_64-unknown-none",
"aarch64-unknown-teeos", "mips64-openwrt-linux-musl",
"aarch64-unknown-nto-qnx700", "aarch64-unknown-nto-qnx710",
"aarch64-unknown-nto-qnx710_iosock",
"aarch64-unknown-nto-qnx800", "x86_64-pc-nto-qnx710",
"x86_64-pc-nto-qnx710_iosock", "x86_64-pc-nto-qnx800",
"i686-pc-nto-qnx700", "aarch64-unknown-linux-ohos",
"armv7-unknown-linux-ohos", "loongarch64-unknown-linux-ohos",
"x86_64-unknown-linux-ohos", "x86_64-unknown-linux-none",
"thumbv6m-nuttx-eabi", "thumbv7a-nuttx-eabi",
"thumbv7a-nuttx-eabihf", "thumbv7m-nuttx-eabi",
"thumbv7em-nuttx-eabi", "thumbv7em-nuttx-eabihf",
"thumbv8m.base-nuttx-eabi", "thumbv8m.main-nuttx-eabi",
"thumbv8m.main-nuttx-eabihf", "riscv32imc-unknown-nuttx-elf",
"riscv32imac-unknown-nuttx-elf",
"riscv32imafc-unknown-nuttx-elf",
"riscv64imac-unknown-nuttx-elf",
"riscv64gc-unknown-nuttx-elf", "x86_64-lynx-lynxos178",
"x86_64-pc-cygwin"];
fn load_builtin(target: &str) -> Option<Target> {
let t =
match target {
"x86_64-unknown-linux-gnu" =>
targets::x86_64_unknown_linux_gnu::target(),
"x86_64-unknown-linux-gnux32" =>
targets::x86_64_unknown_linux_gnux32::target(),
"i686-unknown-linux-gnu" =>
targets::i686_unknown_linux_gnu::target(),
"i586-unknown-linux-gnu" =>
targets::i586_unknown_linux_gnu::target(),
"loongarch64-unknown-linux-gnu" =>
targets::loongarch64_unknown_linux_gnu::target(),
"loongarch64-unknown-linux-musl" =>
targets::loongarch64_unknown_linux_musl::target(),
"m68k-unknown-linux-gnu" =>
targets::m68k_unknown_linux_gnu::target(),
"m68k-unknown-none-elf" =>
targets::m68k_unknown_none_elf::target(),
"csky-unknown-linux-gnuabiv2" =>
targets::csky_unknown_linux_gnuabiv2::target(),
"csky-unknown-linux-gnuabiv2hf" =>
targets::csky_unknown_linux_gnuabiv2hf::target(),
"mips-unknown-linux-gnu" =>
targets::mips_unknown_linux_gnu::target(),
"mips64-unknown-linux-gnuabi64" =>
targets::mips64_unknown_linux_gnuabi64::target(),
"mips64el-unknown-linux-gnuabi64" =>
targets::mips64el_unknown_linux_gnuabi64::target(),
"mipsisa32r6-unknown-linux-gnu" =>
targets::mipsisa32r6_unknown_linux_gnu::target(),
"mipsisa32r6el-unknown-linux-gnu" =>
targets::mipsisa32r6el_unknown_linux_gnu::target(),
"mipsisa64r6-unknown-linux-gnuabi64" =>
targets::mipsisa64r6_unknown_linux_gnuabi64::target(),
"mipsisa64r6el-unknown-linux-gnuabi64" =>
targets::mipsisa64r6el_unknown_linux_gnuabi64::target(),
"mipsel-unknown-linux-gnu" =>
targets::mipsel_unknown_linux_gnu::target(),
"powerpc-unknown-linux-gnu" =>
targets::powerpc_unknown_linux_gnu::target(),
"powerpc-unknown-linux-gnuspe" =>
targets::powerpc_unknown_linux_gnuspe::target(),
"powerpc-unknown-linux-musl" =>
targets::powerpc_unknown_linux_musl::target(),
"powerpc-unknown-linux-muslspe" =>
targets::powerpc_unknown_linux_muslspe::target(),
"powerpc64-ibm-aix" => targets::powerpc64_ibm_aix::target(),
"powerpc64-unknown-linux-gnu" =>
targets::powerpc64_unknown_linux_gnu::target(),
"powerpc64-unknown-linux-musl" =>
targets::powerpc64_unknown_linux_musl::target(),
"powerpc64le-unknown-linux-gnu" =>
targets::powerpc64le_unknown_linux_gnu::target(),
"powerpc64le-unknown-linux-musl" =>
targets::powerpc64le_unknown_linux_musl::target(),
"s390x-unknown-linux-gnu" =>
targets::s390x_unknown_linux_gnu::target(),
"s390x-unknown-linux-musl" =>
targets::s390x_unknown_linux_musl::target(),
"sparc-unknown-linux-gnu" =>
targets::sparc_unknown_linux_gnu::target(),
"sparc64-unknown-linux-gnu" =>
targets::sparc64_unknown_linux_gnu::target(),
"arm-unknown-linux-gnueabi" =>
targets::arm_unknown_linux_gnueabi::target(),
"arm-unknown-linux-gnueabihf" =>
targets::arm_unknown_linux_gnueabihf::target(),
"armeb-unknown-linux-gnueabi" =>
targets::armeb_unknown_linux_gnueabi::target(),
"arm-unknown-linux-musleabi" =>
targets::arm_unknown_linux_musleabi::target(),
"arm-unknown-linux-musleabihf" =>
targets::arm_unknown_linux_musleabihf::target(),
"armv4t-unknown-linux-gnueabi" =>
targets::armv4t_unknown_linux_gnueabi::target(),
"armv5te-unknown-linux-gnueabi" =>
targets::armv5te_unknown_linux_gnueabi::target(),
"armv5te-unknown-linux-musleabi" =>
targets::armv5te_unknown_linux_musleabi::target(),
"armv5te-unknown-linux-uclibceabi" =>
targets::armv5te_unknown_linux_uclibceabi::target(),
"armv7-unknown-linux-gnueabi" =>
targets::armv7_unknown_linux_gnueabi::target(),
"armv7-unknown-linux-gnueabihf" =>
targets::armv7_unknown_linux_gnueabihf::target(),
"thumbv7neon-unknown-linux-gnueabihf" =>
targets::thumbv7neon_unknown_linux_gnueabihf::target(),
"thumbv7neon-unknown-linux-musleabihf" =>
targets::thumbv7neon_unknown_linux_musleabihf::target(),
"armv7-unknown-linux-musleabi" =>
targets::armv7_unknown_linux_musleabi::target(),
"armv7-unknown-linux-musleabihf" =>
targets::armv7_unknown_linux_musleabihf::target(),
"aarch64-unknown-linux-gnu" =>
targets::aarch64_unknown_linux_gnu::target(),
"aarch64-unknown-linux-musl" =>
targets::aarch64_unknown_linux_musl::target(),
"aarch64_be-unknown-linux-musl" =>
targets::aarch64_be_unknown_linux_musl::target(),
"x86_64-unknown-linux-musl" =>
targets::x86_64_unknown_linux_musl::target(),
"i686-unknown-linux-musl" =>
targets::i686_unknown_linux_musl::target(),
"i586-unknown-linux-musl" =>
targets::i586_unknown_linux_musl::target(),
"mips-unknown-linux-musl" =>
targets::mips_unknown_linux_musl::target(),
"mipsel-unknown-linux-musl" =>
targets::mipsel_unknown_linux_musl::target(),
"mips64-unknown-linux-muslabi64" =>
targets::mips64_unknown_linux_muslabi64::target(),
"mips64el-unknown-linux-muslabi64" =>
targets::mips64el_unknown_linux_muslabi64::target(),
"hexagon-unknown-linux-musl" =>
targets::hexagon_unknown_linux_musl::target(),
"hexagon-unknown-none-elf" =>
targets::hexagon_unknown_none_elf::target(),
"hexagon-unknown-qurt" => targets::hexagon_unknown_qurt::target(),
"mips-unknown-linux-uclibc" =>
targets::mips_unknown_linux_uclibc::target(),
"mipsel-unknown-linux-uclibc" =>
targets::mipsel_unknown_linux_uclibc::target(),
"i686-linux-android" => targets::i686_linux_android::target(),
"x86_64-linux-android" => targets::x86_64_linux_android::target(),
"arm-linux-androideabi" =>
targets::arm_linux_androideabi::target(),
"armv7-linux-androideabi" =>
targets::armv7_linux_androideabi::target(),
"thumbv7neon-linux-androideabi" =>
targets::thumbv7neon_linux_androideabi::target(),
"aarch64-linux-android" =>
targets::aarch64_linux_android::target(),
"riscv64-linux-android" =>
targets::riscv64_linux_android::target(),
"aarch64-unknown-freebsd" =>
targets::aarch64_unknown_freebsd::target(),
"armv6-unknown-freebsd" =>
targets::armv6_unknown_freebsd::target(),
"armv7-unknown-freebsd" =>
targets::armv7_unknown_freebsd::target(),
"i686-unknown-freebsd" => targets::i686_unknown_freebsd::target(),
"powerpc-unknown-freebsd" =>
targets::powerpc_unknown_freebsd::target(),
"powerpc64-unknown-freebsd" =>
targets::powerpc64_unknown_freebsd::target(),
"powerpc64le-unknown-freebsd" =>
targets::powerpc64le_unknown_freebsd::target(),
"riscv64gc-unknown-freebsd" =>
targets::riscv64gc_unknown_freebsd::target(),
"x86_64-unknown-freebsd" =>
targets::x86_64_unknown_freebsd::target(),
"x86_64-unknown-dragonfly" =>
targets::x86_64_unknown_dragonfly::target(),
"aarch64-unknown-openbsd" =>
targets::aarch64_unknown_openbsd::target(),
"i686-unknown-openbsd" => targets::i686_unknown_openbsd::target(),
"powerpc-unknown-openbsd" =>
targets::powerpc_unknown_openbsd::target(),
"powerpc64-unknown-openbsd" =>
targets::powerpc64_unknown_openbsd::target(),
"riscv64gc-unknown-openbsd" =>
targets::riscv64gc_unknown_openbsd::target(),
"sparc64-unknown-openbsd" =>
targets::sparc64_unknown_openbsd::target(),
"x86_64-unknown-openbsd" =>
targets::x86_64_unknown_openbsd::target(),
"aarch64-unknown-netbsd" =>
targets::aarch64_unknown_netbsd::target(),
"aarch64_be-unknown-netbsd" =>
targets::aarch64_be_unknown_netbsd::target(),
"armv6-unknown-netbsd-eabihf" =>
targets::armv6_unknown_netbsd_eabihf::target(),
"armv7-unknown-netbsd-eabihf" =>
targets::armv7_unknown_netbsd_eabihf::target(),
"i586-unknown-netbsd" => targets::i586_unknown_netbsd::target(),
"i686-unknown-netbsd" => targets::i686_unknown_netbsd::target(),
"mipsel-unknown-netbsd" =>
targets::mipsel_unknown_netbsd::target(),
"powerpc-unknown-netbsd" =>
targets::powerpc_unknown_netbsd::target(),
"riscv64gc-unknown-netbsd" =>
targets::riscv64gc_unknown_netbsd::target(),
"sparc64-unknown-netbsd" =>
targets::sparc64_unknown_netbsd::target(),
"x86_64-unknown-netbsd" =>
targets::x86_64_unknown_netbsd::target(),
"i686-unknown-haiku" => targets::i686_unknown_haiku::target(),
"x86_64-unknown-haiku" => targets::x86_64_unknown_haiku::target(),
"aarch64-unknown-helenos" =>
targets::aarch64_unknown_helenos::target(),
"i686-unknown-helenos" => targets::i686_unknown_helenos::target(),
"powerpc-unknown-helenos" =>
targets::powerpc_unknown_helenos::target(),
"sparc64-unknown-helenos" =>
targets::sparc64_unknown_helenos::target(),
"x86_64-unknown-helenos" =>
targets::x86_64_unknown_helenos::target(),
"i686-unknown-hurd-gnu" =>
targets::i686_unknown_hurd_gnu::target(),
"x86_64-unknown-hurd-gnu" =>
targets::x86_64_unknown_hurd_gnu::target(),
"aarch64-apple-darwin" => targets::aarch64_apple_darwin::target(),
"arm64e-apple-darwin" => targets::arm64e_apple_darwin::target(),
"x86_64-apple-darwin" => targets::x86_64_apple_darwin::target(),
"x86_64h-apple-darwin" => targets::x86_64h_apple_darwin::target(),
"i686-apple-darwin" => targets::i686_apple_darwin::target(),
"aarch64-unknown-fuchsia" =>
targets::aarch64_unknown_fuchsia::target(),
"riscv64gc-unknown-fuchsia" =>
targets::riscv64gc_unknown_fuchsia::target(),
"x86_64-unknown-fuchsia" =>
targets::x86_64_unknown_fuchsia::target(),
"avr-none" => targets::avr_none::target(),
"x86_64-unknown-l4re-uclibc" =>
targets::x86_64_unknown_l4re_uclibc::target(),
"aarch64-unknown-redox" =>
targets::aarch64_unknown_redox::target(),
"i586-unknown-redox" => targets::i586_unknown_redox::target(),
"riscv64gc-unknown-redox" =>
targets::riscv64gc_unknown_redox::target(),
"x86_64-unknown-redox" => targets::x86_64_unknown_redox::target(),
"x86_64-unknown-managarm-mlibc" =>
targets::x86_64_unknown_managarm_mlibc::target(),
"aarch64-unknown-managarm-mlibc" =>
targets::aarch64_unknown_managarm_mlibc::target(),
"riscv64gc-unknown-managarm-mlibc" =>
targets::riscv64gc_unknown_managarm_mlibc::target(),
"i386-apple-ios" => targets::i386_apple_ios::target(),
"x86_64-apple-ios" => targets::x86_64_apple_ios::target(),
"aarch64-apple-ios" => targets::aarch64_apple_ios::target(),
"arm64e-apple-ios" => targets::arm64e_apple_ios::target(),
"armv7s-apple-ios" => targets::armv7s_apple_ios::target(),
"x86_64-apple-ios-macabi" =>
targets::x86_64_apple_ios_macabi::target(),
"aarch64-apple-ios-macabi" =>
targets::aarch64_apple_ios_macabi::target(),
"aarch64-apple-ios-sim" =>
targets::aarch64_apple_ios_sim::target(),
"aarch64-apple-tvos" => targets::aarch64_apple_tvos::target(),
"aarch64-apple-tvos-sim" =>
targets::aarch64_apple_tvos_sim::target(),
"arm64e-apple-tvos" => targets::arm64e_apple_tvos::target(),
"x86_64-apple-tvos" => targets::x86_64_apple_tvos::target(),
"armv7k-apple-watchos" => targets::armv7k_apple_watchos::target(),
"arm64_32-apple-watchos" =>
targets::arm64_32_apple_watchos::target(),
"x86_64-apple-watchos-sim" =>
targets::x86_64_apple_watchos_sim::target(),
"aarch64-apple-watchos" =>
targets::aarch64_apple_watchos::target(),
"aarch64-apple-watchos-sim" =>
targets::aarch64_apple_watchos_sim::target(),
"aarch64-apple-visionos" =>
targets::aarch64_apple_visionos::target(),
"aarch64-apple-visionos-sim" =>
targets::aarch64_apple_visionos_sim::target(),
"armebv7r-none-eabi" => targets::armebv7r_none_eabi::target(),
"armebv7r-none-eabihf" => targets::armebv7r_none_eabihf::target(),
"armv7r-none-eabi" => targets::armv7r_none_eabi::target(),
"armv7r-none-eabihf" => targets::armv7r_none_eabihf::target(),
"armv8r-none-eabihf" => targets::armv8r_none_eabihf::target(),
"armv7-rtems-eabihf" => targets::armv7_rtems_eabihf::target(),
"x86_64-pc-solaris" => targets::x86_64_pc_solaris::target(),
"sparcv9-sun-solaris" => targets::sparcv9_sun_solaris::target(),
"x86_64-unknown-illumos" =>
targets::x86_64_unknown_illumos::target(),
"aarch64-unknown-illumos" =>
targets::aarch64_unknown_illumos::target(),
"x86_64-pc-windows-gnu" =>
targets::x86_64_pc_windows_gnu::target(),
"x86_64-uwp-windows-gnu" =>
targets::x86_64_uwp_windows_gnu::target(),
"x86_64-win7-windows-gnu" =>
targets::x86_64_win7_windows_gnu::target(),
"i686-pc-windows-gnu" => targets::i686_pc_windows_gnu::target(),
"i686-uwp-windows-gnu" => targets::i686_uwp_windows_gnu::target(),
"i686-win7-windows-gnu" =>
targets::i686_win7_windows_gnu::target(),
"aarch64-pc-windows-gnullvm" =>
targets::aarch64_pc_windows_gnullvm::target(),
"i686-pc-windows-gnullvm" =>
targets::i686_pc_windows_gnullvm::target(),
"x86_64-pc-windows-gnullvm" =>
targets::x86_64_pc_windows_gnullvm::target(),
"aarch64-pc-windows-msvc" =>
targets::aarch64_pc_windows_msvc::target(),
"aarch64-uwp-windows-msvc" =>
targets::aarch64_uwp_windows_msvc::target(),
"arm64ec-pc-windows-msvc" =>
targets::arm64ec_pc_windows_msvc::target(),
"x86_64-pc-windows-msvc" =>
targets::x86_64_pc_windows_msvc::target(),
"x86_64-uwp-windows-msvc" =>
targets::x86_64_uwp_windows_msvc::target(),
"x86_64-win7-windows-msvc" =>
targets::x86_64_win7_windows_msvc::target(),
"i686-pc-windows-msvc" => targets::i686_pc_windows_msvc::target(),
"i686-uwp-windows-msvc" =>
targets::i686_uwp_windows_msvc::target(),
"i686-win7-windows-msvc" =>
targets::i686_win7_windows_msvc::target(),
"thumbv7a-pc-windows-msvc" =>
targets::thumbv7a_pc_windows_msvc::target(),
"thumbv7a-uwp-windows-msvc" =>
targets::thumbv7a_uwp_windows_msvc::target(),
"wasm32-unknown-emscripten" =>
targets::wasm32_unknown_emscripten::target(),
"wasm32-unknown-unknown" =>
targets::wasm32_unknown_unknown::target(),
"wasm32v1-none" => targets::wasm32v1_none::target(),
"wasm32-wasip1" => targets::wasm32_wasip1::target(),
"wasm32-wasip2" => targets::wasm32_wasip2::target(),
"wasm32-wasip3" => targets::wasm32_wasip3::target(),
"wasm32-wasip1-threads" =>
targets::wasm32_wasip1_threads::target(),
"wasm32-wali-linux-musl" =>
targets::wasm32_wali_linux_musl::target(),
"wasm64-unknown-unknown" =>
targets::wasm64_unknown_unknown::target(),
"thumbv6m-none-eabi" => targets::thumbv6m_none_eabi::target(),
"thumbv7m-none-eabi" => targets::thumbv7m_none_eabi::target(),
"thumbv7em-none-eabi" => targets::thumbv7em_none_eabi::target(),
"thumbv7em-none-eabihf" =>
targets::thumbv7em_none_eabihf::target(),
"thumbv8m.base-none-eabi" =>
targets::thumbv8m_base_none_eabi::target(),
"thumbv8m.main-none-eabi" =>
targets::thumbv8m_main_none_eabi::target(),
"thumbv8m.main-none-eabihf" =>
targets::thumbv8m_main_none_eabihf::target(),
"armv7a-none-eabi" => targets::armv7a_none_eabi::target(),
"armv7a-none-eabihf" => targets::armv7a_none_eabihf::target(),
"armv7a-nuttx-eabi" => targets::armv7a_nuttx_eabi::target(),
"armv7a-nuttx-eabihf" => targets::armv7a_nuttx_eabihf::target(),
"armv7a-vex-v5" => targets::armv7a_vex_v5::target(),
"msp430-none-elf" => targets::msp430_none_elf::target(),
"aarch64_be-unknown-hermit" =>
targets::aarch64_be_unknown_hermit::target(),
"aarch64-unknown-hermit" =>
targets::aarch64_unknown_hermit::target(),
"riscv64gc-unknown-hermit" =>
targets::riscv64gc_unknown_hermit::target(),
"x86_64-unknown-hermit" =>
targets::x86_64_unknown_hermit::target(),
"x86_64-unknown-motor" => targets::x86_64_unknown_motor::target(),
"x86_64-unikraft-linux-musl" =>
targets::x86_64_unikraft_linux_musl::target(),
"armv7-unknown-trusty" => targets::armv7_unknown_trusty::target(),
"aarch64-unknown-trusty" =>
targets::aarch64_unknown_trusty::target(),
"x86_64-unknown-trusty" =>
targets::x86_64_unknown_trusty::target(),
"riscv32i-unknown-none-elf" =>
targets::riscv32i_unknown_none_elf::target(),
"riscv32im-risc0-zkvm-elf" =>
targets::riscv32im_risc0_zkvm_elf::target(),
"riscv32im-unknown-none-elf" =>
targets::riscv32im_unknown_none_elf::target(),
"riscv32ima-unknown-none-elf" =>
targets::riscv32ima_unknown_none_elf::target(),
"riscv32imc-unknown-none-elf" =>
targets::riscv32imc_unknown_none_elf::target(),
"riscv32imc-esp-espidf" =>
targets::riscv32imc_esp_espidf::target(),
"riscv32imac-esp-espidf" =>
targets::riscv32imac_esp_espidf::target(),
"riscv32imafc-esp-espidf" =>
targets::riscv32imafc_esp_espidf::target(),
"riscv32e-unknown-none-elf" =>
targets::riscv32e_unknown_none_elf::target(),
"riscv32em-unknown-none-elf" =>
targets::riscv32em_unknown_none_elf::target(),
"riscv32emc-unknown-none-elf" =>
targets::riscv32emc_unknown_none_elf::target(),
"riscv32imac-unknown-none-elf" =>
targets::riscv32imac_unknown_none_elf::target(),
"riscv32imafc-unknown-none-elf" =>
targets::riscv32imafc_unknown_none_elf::target(),
"riscv32imac-unknown-xous-elf" =>
targets::riscv32imac_unknown_xous_elf::target(),
"riscv32gc-unknown-linux-gnu" =>
targets::riscv32gc_unknown_linux_gnu::target(),
"riscv32gc-unknown-linux-musl" =>
targets::riscv32gc_unknown_linux_musl::target(),
"riscv64im-unknown-none-elf" =>
targets::riscv64im_unknown_none_elf::target(),
"riscv64imac-unknown-none-elf" =>
targets::riscv64imac_unknown_none_elf::target(),
"riscv64gc-unknown-none-elf" =>
targets::riscv64gc_unknown_none_elf::target(),
"riscv64gc-unknown-linux-gnu" =>
targets::riscv64gc_unknown_linux_gnu::target(),
"riscv64gc-unknown-linux-musl" =>
targets::riscv64gc_unknown_linux_musl::target(),
"riscv64a23-unknown-linux-gnu" =>
targets::riscv64a23_unknown_linux_gnu::target(),
"sparc-unknown-none-elf" =>
targets::sparc_unknown_none_elf::target(),
"loongarch32-unknown-none" =>
targets::loongarch32_unknown_none::target(),
"loongarch32-unknown-none-softfloat" =>
targets::loongarch32_unknown_none_softfloat::target(),
"loongarch64-unknown-none" =>
targets::loongarch64_unknown_none::target(),
"loongarch64-unknown-none-softfloat" =>
targets::loongarch64_unknown_none_softfloat::target(),
"aarch64-unknown-none" => targets::aarch64_unknown_none::target(),
"aarch64-unknown-none-softfloat" =>
targets::aarch64_unknown_none_softfloat::target(),
"aarch64_be-unknown-none-softfloat" =>
targets::aarch64_be_unknown_none_softfloat::target(),
"aarch64-unknown-nuttx" =>
targets::aarch64_unknown_nuttx::target(),
"x86_64-fortanix-unknown-sgx" =>
targets::x86_64_fortanix_unknown_sgx::target(),
"x86_64-unknown-uefi" => targets::x86_64_unknown_uefi::target(),
"i686-unknown-uefi" => targets::i686_unknown_uefi::target(),
"aarch64-unknown-uefi" => targets::aarch64_unknown_uefi::target(),
"nvptx64-nvidia-cuda" => targets::nvptx64_nvidia_cuda::target(),
"amdgcn-amd-amdhsa" => targets::amdgcn_amd_amdhsa::target(),
"xtensa-esp32-none-elf" =>
targets::xtensa_esp32_none_elf::target(),
"xtensa-esp32-espidf" => targets::xtensa_esp32_espidf::target(),
"xtensa-esp32s2-none-elf" =>
targets::xtensa_esp32s2_none_elf::target(),
"xtensa-esp32s2-espidf" =>
targets::xtensa_esp32s2_espidf::target(),
"xtensa-esp32s3-none-elf" =>
targets::xtensa_esp32s3_none_elf::target(),
"xtensa-esp32s3-espidf" =>
targets::xtensa_esp32s3_espidf::target(),
"i686-wrs-vxworks" => targets::i686_wrs_vxworks::target(),
"x86_64-wrs-vxworks" => targets::x86_64_wrs_vxworks::target(),
"armv7-wrs-vxworks-eabihf" =>
targets::armv7_wrs_vxworks_eabihf::target(),
"aarch64-wrs-vxworks" => targets::aarch64_wrs_vxworks::target(),
"powerpc-wrs-vxworks" => targets::powerpc_wrs_vxworks::target(),
"powerpc-wrs-vxworks-spe" =>
targets::powerpc_wrs_vxworks_spe::target(),
"powerpc64-wrs-vxworks" =>
targets::powerpc64_wrs_vxworks::target(),
"riscv32-wrs-vxworks" => targets::riscv32_wrs_vxworks::target(),
"riscv64-wrs-vxworks" => targets::riscv64_wrs_vxworks::target(),
"aarch64-kmc-solid_asp3" =>
targets::aarch64_kmc_solid_asp3::target(),
"armv7a-kmc-solid_asp3-eabi" =>
targets::armv7a_kmc_solid_asp3_eabi::target(),
"armv7a-kmc-solid_asp3-eabihf" =>
targets::armv7a_kmc_solid_asp3_eabihf::target(),
"mipsel-sony-psp" => targets::mipsel_sony_psp::target(),
"mipsel-sony-psx" => targets::mipsel_sony_psx::target(),
"mipsel-unknown-none" => targets::mipsel_unknown_none::target(),
"mips-mti-none-elf" => targets::mips_mti_none_elf::target(),
"mipsel-mti-none-elf" => targets::mipsel_mti_none_elf::target(),
"thumbv4t-none-eabi" => targets::thumbv4t_none_eabi::target(),
"armv4t-none-eabi" => targets::armv4t_none_eabi::target(),
"thumbv5te-none-eabi" => targets::thumbv5te_none_eabi::target(),
"armv5te-none-eabi" => targets::armv5te_none_eabi::target(),
"aarch64_be-unknown-linux-gnu" =>
targets::aarch64_be_unknown_linux_gnu::target(),
"aarch64-unknown-linux-gnu_ilp32" =>
targets::aarch64_unknown_linux_gnu_ilp32::target(),
"aarch64_be-unknown-linux-gnu_ilp32" =>
targets::aarch64_be_unknown_linux_gnu_ilp32::target(),
"bpfeb-unknown-none" => targets::bpfeb_unknown_none::target(),
"bpfel-unknown-none" => targets::bpfel_unknown_none::target(),
"armv6k-nintendo-3ds" => targets::armv6k_nintendo_3ds::target(),
"aarch64-nintendo-switch-freestanding" =>
targets::aarch64_nintendo_switch_freestanding::target(),
"armv7-sony-vita-newlibeabihf" =>
targets::armv7_sony_vita_newlibeabihf::target(),
"armv7-unknown-linux-uclibceabi" =>
targets::armv7_unknown_linux_uclibceabi::target(),
"armv7-unknown-linux-uclibceabihf" =>
targets::armv7_unknown_linux_uclibceabihf::target(),
"x86_64-unknown-none" => targets::x86_64_unknown_none::target(),
"aarch64-unknown-teeos" =>
targets::aarch64_unknown_teeos::target(),
"mips64-openwrt-linux-musl" =>
targets::mips64_openwrt_linux_musl::target(),
"aarch64-unknown-nto-qnx700" =>
targets::aarch64_unknown_nto_qnx700::target(),
"aarch64-unknown-nto-qnx710" =>
targets::aarch64_unknown_nto_qnx710::target(),
"aarch64-unknown-nto-qnx710_iosock" =>
targets::aarch64_unknown_nto_qnx710_iosock::target(),
"aarch64-unknown-nto-qnx800" =>
targets::aarch64_unknown_nto_qnx800::target(),
"x86_64-pc-nto-qnx710" => targets::x86_64_pc_nto_qnx710::target(),
"x86_64-pc-nto-qnx710_iosock" =>
targets::x86_64_pc_nto_qnx710_iosock::target(),
"x86_64-pc-nto-qnx800" => targets::x86_64_pc_nto_qnx800::target(),
"i686-pc-nto-qnx700" => targets::i686_pc_nto_qnx700::target(),
"aarch64-unknown-linux-ohos" =>
targets::aarch64_unknown_linux_ohos::target(),
"armv7-unknown-linux-ohos" =>
targets::armv7_unknown_linux_ohos::target(),
"loongarch64-unknown-linux-ohos" =>
targets::loongarch64_unknown_linux_ohos::target(),
"x86_64-unknown-linux-ohos" =>
targets::x86_64_unknown_linux_ohos::target(),
"x86_64-unknown-linux-none" =>
targets::x86_64_unknown_linux_none::target(),
"thumbv6m-nuttx-eabi" => targets::thumbv6m_nuttx_eabi::target(),
"thumbv7a-nuttx-eabi" => targets::thumbv7a_nuttx_eabi::target(),
"thumbv7a-nuttx-eabihf" =>
targets::thumbv7a_nuttx_eabihf::target(),
"thumbv7m-nuttx-eabi" => targets::thumbv7m_nuttx_eabi::target(),
"thumbv7em-nuttx-eabi" => targets::thumbv7em_nuttx_eabi::target(),
"thumbv7em-nuttx-eabihf" =>
targets::thumbv7em_nuttx_eabihf::target(),
"thumbv8m.base-nuttx-eabi" =>
targets::thumbv8m_base_nuttx_eabi::target(),
"thumbv8m.main-nuttx-eabi" =>
targets::thumbv8m_main_nuttx_eabi::target(),
"thumbv8m.main-nuttx-eabihf" =>
targets::thumbv8m_main_nuttx_eabihf::target(),
"riscv32imc-unknown-nuttx-elf" =>
targets::riscv32imc_unknown_nuttx_elf::target(),
"riscv32imac-unknown-nuttx-elf" =>
targets::riscv32imac_unknown_nuttx_elf::target(),
"riscv32imafc-unknown-nuttx-elf" =>
targets::riscv32imafc_unknown_nuttx_elf::target(),
"riscv64imac-unknown-nuttx-elf" =>
targets::riscv64imac_unknown_nuttx_elf::target(),
"riscv64gc-unknown-nuttx-elf" =>
targets::riscv64gc_unknown_nuttx_elf::target(),
"x86_64-lynx-lynxos178" =>
targets::x86_64_lynx_lynxos178::target(),
"x86_64-pc-cygwin" => targets::x86_64_pc_cygwin::target(),
_ => return None,
};
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_target/src/spec/mod.rs:1434",
"rustc_target::spec", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_target/src/spec/mod.rs"),
::tracing_core::__macro_support::Option::Some(1434u32),
::tracing_core::__macro_support::Option::Some("rustc_target::spec"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("got builtin target: {0:?}",
t) as &dyn Value))])
});
} else { ; }
};
Some(t)
}
fn load_all_builtins() -> impl Iterator<Item = Target> {
[targets::x86_64_unknown_linux_gnu::target,
targets::x86_64_unknown_linux_gnux32::target,
targets::i686_unknown_linux_gnu::target,
targets::i586_unknown_linux_gnu::target,
targets::loongarch64_unknown_linux_gnu::target,
targets::loongarch64_unknown_linux_musl::target,
targets::m68k_unknown_linux_gnu::target,
targets::m68k_unknown_none_elf::target,
targets::csky_unknown_linux_gnuabiv2::target,
targets::csky_unknown_linux_gnuabiv2hf::target,
targets::mips_unknown_linux_gnu::target,
targets::mips64_unknown_linux_gnuabi64::target,
targets::mips64el_unknown_linux_gnuabi64::target,
targets::mipsisa32r6_unknown_linux_gnu::target,
targets::mipsisa32r6el_unknown_linux_gnu::target,
targets::mipsisa64r6_unknown_linux_gnuabi64::target,
targets::mipsisa64r6el_unknown_linux_gnuabi64::target,
targets::mipsel_unknown_linux_gnu::target,
targets::powerpc_unknown_linux_gnu::target,
targets::powerpc_unknown_linux_gnuspe::target,
targets::powerpc_unknown_linux_musl::target,
targets::powerpc_unknown_linux_muslspe::target,
targets::powerpc64_ibm_aix::target,
targets::powerpc64_unknown_linux_gnu::target,
targets::powerpc64_unknown_linux_musl::target,
targets::powerpc64le_unknown_linux_gnu::target,
targets::powerpc64le_unknown_linux_musl::target,
targets::s390x_unknown_linux_gnu::target,
targets::s390x_unknown_linux_musl::target,
targets::sparc_unknown_linux_gnu::target,
targets::sparc64_unknown_linux_gnu::target,
targets::arm_unknown_linux_gnueabi::target,
targets::arm_unknown_linux_gnueabihf::target,
targets::armeb_unknown_linux_gnueabi::target,
targets::arm_unknown_linux_musleabi::target,
targets::arm_unknown_linux_musleabihf::target,
targets::armv4t_unknown_linux_gnueabi::target,
targets::armv5te_unknown_linux_gnueabi::target,
targets::armv5te_unknown_linux_musleabi::target,
targets::armv5te_unknown_linux_uclibceabi::target,
targets::armv7_unknown_linux_gnueabi::target,
targets::armv7_unknown_linux_gnueabihf::target,
targets::thumbv7neon_unknown_linux_gnueabihf::target,
targets::thumbv7neon_unknown_linux_musleabihf::target,
targets::armv7_unknown_linux_musleabi::target,
targets::armv7_unknown_linux_musleabihf::target,
targets::aarch64_unknown_linux_gnu::target,
targets::aarch64_unknown_linux_musl::target,
targets::aarch64_be_unknown_linux_musl::target,
targets::x86_64_unknown_linux_musl::target,
targets::i686_unknown_linux_musl::target,
targets::i586_unknown_linux_musl::target,
targets::mips_unknown_linux_musl::target,
targets::mipsel_unknown_linux_musl::target,
targets::mips64_unknown_linux_muslabi64::target,
targets::mips64el_unknown_linux_muslabi64::target,
targets::hexagon_unknown_linux_musl::target,
targets::hexagon_unknown_none_elf::target,
targets::hexagon_unknown_qurt::target,
targets::mips_unknown_linux_uclibc::target,
targets::mipsel_unknown_linux_uclibc::target,
targets::i686_linux_android::target,
targets::x86_64_linux_android::target,
targets::arm_linux_androideabi::target,
targets::armv7_linux_androideabi::target,
targets::thumbv7neon_linux_androideabi::target,
targets::aarch64_linux_android::target,
targets::riscv64_linux_android::target,
targets::aarch64_unknown_freebsd::target,
targets::armv6_unknown_freebsd::target,
targets::armv7_unknown_freebsd::target,
targets::i686_unknown_freebsd::target,
targets::powerpc_unknown_freebsd::target,
targets::powerpc64_unknown_freebsd::target,
targets::powerpc64le_unknown_freebsd::target,
targets::riscv64gc_unknown_freebsd::target,
targets::x86_64_unknown_freebsd::target,
targets::x86_64_unknown_dragonfly::target,
targets::aarch64_unknown_openbsd::target,
targets::i686_unknown_openbsd::target,
targets::powerpc_unknown_openbsd::target,
targets::powerpc64_unknown_openbsd::target,
targets::riscv64gc_unknown_openbsd::target,
targets::sparc64_unknown_openbsd::target,
targets::x86_64_unknown_openbsd::target,
targets::aarch64_unknown_netbsd::target,
targets::aarch64_be_unknown_netbsd::target,
targets::armv6_unknown_netbsd_eabihf::target,
targets::armv7_unknown_netbsd_eabihf::target,
targets::i586_unknown_netbsd::target,
targets::i686_unknown_netbsd::target,
targets::mipsel_unknown_netbsd::target,
targets::powerpc_unknown_netbsd::target,
targets::riscv64gc_unknown_netbsd::target,
targets::sparc64_unknown_netbsd::target,
targets::x86_64_unknown_netbsd::target,
targets::i686_unknown_haiku::target,
targets::x86_64_unknown_haiku::target,
targets::aarch64_unknown_helenos::target,
targets::i686_unknown_helenos::target,
targets::powerpc_unknown_helenos::target,
targets::sparc64_unknown_helenos::target,
targets::x86_64_unknown_helenos::target,
targets::i686_unknown_hurd_gnu::target,
targets::x86_64_unknown_hurd_gnu::target,
targets::aarch64_apple_darwin::target,
targets::arm64e_apple_darwin::target,
targets::x86_64_apple_darwin::target,
targets::x86_64h_apple_darwin::target,
targets::i686_apple_darwin::target,
targets::aarch64_unknown_fuchsia::target,
targets::riscv64gc_unknown_fuchsia::target,
targets::x86_64_unknown_fuchsia::target,
targets::avr_none::target,
targets::x86_64_unknown_l4re_uclibc::target,
targets::aarch64_unknown_redox::target,
targets::i586_unknown_redox::target,
targets::riscv64gc_unknown_redox::target,
targets::x86_64_unknown_redox::target,
targets::x86_64_unknown_managarm_mlibc::target,
targets::aarch64_unknown_managarm_mlibc::target,
targets::riscv64gc_unknown_managarm_mlibc::target,
targets::i386_apple_ios::target,
targets::x86_64_apple_ios::target,
targets::aarch64_apple_ios::target,
targets::arm64e_apple_ios::target,
targets::armv7s_apple_ios::target,
targets::x86_64_apple_ios_macabi::target,
targets::aarch64_apple_ios_macabi::target,
targets::aarch64_apple_ios_sim::target,
targets::aarch64_apple_tvos::target,
targets::aarch64_apple_tvos_sim::target,
targets::arm64e_apple_tvos::target,
targets::x86_64_apple_tvos::target,
targets::armv7k_apple_watchos::target,
targets::arm64_32_apple_watchos::target,
targets::x86_64_apple_watchos_sim::target,
targets::aarch64_apple_watchos::target,
targets::aarch64_apple_watchos_sim::target,
targets::aarch64_apple_visionos::target,
targets::aarch64_apple_visionos_sim::target,
targets::armebv7r_none_eabi::target,
targets::armebv7r_none_eabihf::target,
targets::armv7r_none_eabi::target,
targets::armv7r_none_eabihf::target,
targets::armv8r_none_eabihf::target,
targets::armv7_rtems_eabihf::target,
targets::x86_64_pc_solaris::target,
targets::sparcv9_sun_solaris::target,
targets::x86_64_unknown_illumos::target,
targets::aarch64_unknown_illumos::target,
targets::x86_64_pc_windows_gnu::target,
targets::x86_64_uwp_windows_gnu::target,
targets::x86_64_win7_windows_gnu::target,
targets::i686_pc_windows_gnu::target,
targets::i686_uwp_windows_gnu::target,
targets::i686_win7_windows_gnu::target,
targets::aarch64_pc_windows_gnullvm::target,
targets::i686_pc_windows_gnullvm::target,
targets::x86_64_pc_windows_gnullvm::target,
targets::aarch64_pc_windows_msvc::target,
targets::aarch64_uwp_windows_msvc::target,
targets::arm64ec_pc_windows_msvc::target,
targets::x86_64_pc_windows_msvc::target,
targets::x86_64_uwp_windows_msvc::target,
targets::x86_64_win7_windows_msvc::target,
targets::i686_pc_windows_msvc::target,
targets::i686_uwp_windows_msvc::target,
targets::i686_win7_windows_msvc::target,
targets::thumbv7a_pc_windows_msvc::target,
targets::thumbv7a_uwp_windows_msvc::target,
targets::wasm32_unknown_emscripten::target,
targets::wasm32_unknown_unknown::target,
targets::wasm32v1_none::target,
targets::wasm32_wasip1::target,
targets::wasm32_wasip2::target,
targets::wasm32_wasip3::target,
targets::wasm32_wasip1_threads::target,
targets::wasm32_wali_linux_musl::target,
targets::wasm64_unknown_unknown::target,
targets::thumbv6m_none_eabi::target,
targets::thumbv7m_none_eabi::target,
targets::thumbv7em_none_eabi::target,
targets::thumbv7em_none_eabihf::target,
targets::thumbv8m_base_none_eabi::target,
targets::thumbv8m_main_none_eabi::target,
targets::thumbv8m_main_none_eabihf::target,
targets::armv7a_none_eabi::target,
targets::armv7a_none_eabihf::target,
targets::armv7a_nuttx_eabi::target,
targets::armv7a_nuttx_eabihf::target,
targets::armv7a_vex_v5::target,
targets::msp430_none_elf::target,
targets::aarch64_be_unknown_hermit::target,
targets::aarch64_unknown_hermit::target,
targets::riscv64gc_unknown_hermit::target,
targets::x86_64_unknown_hermit::target,
targets::x86_64_unknown_motor::target,
targets::x86_64_unikraft_linux_musl::target,
targets::armv7_unknown_trusty::target,
targets::aarch64_unknown_trusty::target,
targets::x86_64_unknown_trusty::target,
targets::riscv32i_unknown_none_elf::target,
targets::riscv32im_risc0_zkvm_elf::target,
targets::riscv32im_unknown_none_elf::target,
targets::riscv32ima_unknown_none_elf::target,
targets::riscv32imc_unknown_none_elf::target,
targets::riscv32imc_esp_espidf::target,
targets::riscv32imac_esp_espidf::target,
targets::riscv32imafc_esp_espidf::target,
targets::riscv32e_unknown_none_elf::target,
targets::riscv32em_unknown_none_elf::target,
targets::riscv32emc_unknown_none_elf::target,
targets::riscv32imac_unknown_none_elf::target,
targets::riscv32imafc_unknown_none_elf::target,
targets::riscv32imac_unknown_xous_elf::target,
targets::riscv32gc_unknown_linux_gnu::target,
targets::riscv32gc_unknown_linux_musl::target,
targets::riscv64im_unknown_none_elf::target,
targets::riscv64imac_unknown_none_elf::target,
targets::riscv64gc_unknown_none_elf::target,
targets::riscv64gc_unknown_linux_gnu::target,
targets::riscv64gc_unknown_linux_musl::target,
targets::riscv64a23_unknown_linux_gnu::target,
targets::sparc_unknown_none_elf::target,
targets::loongarch32_unknown_none::target,
targets::loongarch32_unknown_none_softfloat::target,
targets::loongarch64_unknown_none::target,
targets::loongarch64_unknown_none_softfloat::target,
targets::aarch64_unknown_none::target,
targets::aarch64_unknown_none_softfloat::target,
targets::aarch64_be_unknown_none_softfloat::target,
targets::aarch64_unknown_nuttx::target,
targets::x86_64_fortanix_unknown_sgx::target,
targets::x86_64_unknown_uefi::target,
targets::i686_unknown_uefi::target,
targets::aarch64_unknown_uefi::target,
targets::nvptx64_nvidia_cuda::target,
targets::amdgcn_amd_amdhsa::target,
targets::xtensa_esp32_none_elf::target,
targets::xtensa_esp32_espidf::target,
targets::xtensa_esp32s2_none_elf::target,
targets::xtensa_esp32s2_espidf::target,
targets::xtensa_esp32s3_none_elf::target,
targets::xtensa_esp32s3_espidf::target,
targets::i686_wrs_vxworks::target,
targets::x86_64_wrs_vxworks::target,
targets::armv7_wrs_vxworks_eabihf::target,
targets::aarch64_wrs_vxworks::target,
targets::powerpc_wrs_vxworks::target,
targets::powerpc_wrs_vxworks_spe::target,
targets::powerpc64_wrs_vxworks::target,
targets::riscv32_wrs_vxworks::target,
targets::riscv64_wrs_vxworks::target,
targets::aarch64_kmc_solid_asp3::target,
targets::armv7a_kmc_solid_asp3_eabi::target,
targets::armv7a_kmc_solid_asp3_eabihf::target,
targets::mipsel_sony_psp::target,
targets::mipsel_sony_psx::target,
targets::mipsel_unknown_none::target,
targets::mips_mti_none_elf::target,
targets::mipsel_mti_none_elf::target,
targets::thumbv4t_none_eabi::target,
targets::armv4t_none_eabi::target,
targets::thumbv5te_none_eabi::target,
targets::armv5te_none_eabi::target,
targets::aarch64_be_unknown_linux_gnu::target,
targets::aarch64_unknown_linux_gnu_ilp32::target,
targets::aarch64_be_unknown_linux_gnu_ilp32::target,
targets::bpfeb_unknown_none::target,
targets::bpfel_unknown_none::target,
targets::armv6k_nintendo_3ds::target,
targets::aarch64_nintendo_switch_freestanding::target,
targets::armv7_sony_vita_newlibeabihf::target,
targets::armv7_unknown_linux_uclibceabi::target,
targets::armv7_unknown_linux_uclibceabihf::target,
targets::x86_64_unknown_none::target,
targets::aarch64_unknown_teeos::target,
targets::mips64_openwrt_linux_musl::target,
targets::aarch64_unknown_nto_qnx700::target,
targets::aarch64_unknown_nto_qnx710::target,
targets::aarch64_unknown_nto_qnx710_iosock::target,
targets::aarch64_unknown_nto_qnx800::target,
targets::x86_64_pc_nto_qnx710::target,
targets::x86_64_pc_nto_qnx710_iosock::target,
targets::x86_64_pc_nto_qnx800::target,
targets::i686_pc_nto_qnx700::target,
targets::aarch64_unknown_linux_ohos::target,
targets::armv7_unknown_linux_ohos::target,
targets::loongarch64_unknown_linux_ohos::target,
targets::x86_64_unknown_linux_ohos::target,
targets::x86_64_unknown_linux_none::target,
targets::thumbv6m_nuttx_eabi::target,
targets::thumbv7a_nuttx_eabi::target,
targets::thumbv7a_nuttx_eabihf::target,
targets::thumbv7m_nuttx_eabi::target,
targets::thumbv7em_nuttx_eabi::target,
targets::thumbv7em_nuttx_eabihf::target,
targets::thumbv8m_base_nuttx_eabi::target,
targets::thumbv8m_main_nuttx_eabi::target,
targets::thumbv8m_main_nuttx_eabihf::target,
targets::riscv32imc_unknown_nuttx_elf::target,
targets::riscv32imac_unknown_nuttx_elf::target,
targets::riscv32imafc_unknown_nuttx_elf::target,
targets::riscv64imac_unknown_nuttx_elf::target,
targets::riscv64gc_unknown_nuttx_elf::target,
targets::x86_64_lynx_lynxos178::target,
targets::x86_64_pc_cygwin::target].into_iter().map(|f| f())
}supported_targets! {
1435 ("x86_64-unknown-linux-gnu", x86_64_unknown_linux_gnu),
1436 ("x86_64-unknown-linux-gnux32", x86_64_unknown_linux_gnux32),
1437 ("i686-unknown-linux-gnu", i686_unknown_linux_gnu),
1438 ("i586-unknown-linux-gnu", i586_unknown_linux_gnu),
1439 ("loongarch64-unknown-linux-gnu", loongarch64_unknown_linux_gnu),
1440 ("loongarch64-unknown-linux-musl", loongarch64_unknown_linux_musl),
1441 ("m68k-unknown-linux-gnu", m68k_unknown_linux_gnu),
1442 ("m68k-unknown-none-elf", m68k_unknown_none_elf),
1443 ("csky-unknown-linux-gnuabiv2", csky_unknown_linux_gnuabiv2),
1444 ("csky-unknown-linux-gnuabiv2hf", csky_unknown_linux_gnuabiv2hf),
1445 ("mips-unknown-linux-gnu", mips_unknown_linux_gnu),
1446 ("mips64-unknown-linux-gnuabi64", mips64_unknown_linux_gnuabi64),
1447 ("mips64el-unknown-linux-gnuabi64", mips64el_unknown_linux_gnuabi64),
1448 ("mipsisa32r6-unknown-linux-gnu", mipsisa32r6_unknown_linux_gnu),
1449 ("mipsisa32r6el-unknown-linux-gnu", mipsisa32r6el_unknown_linux_gnu),
1450 ("mipsisa64r6-unknown-linux-gnuabi64", mipsisa64r6_unknown_linux_gnuabi64),
1451 ("mipsisa64r6el-unknown-linux-gnuabi64", mipsisa64r6el_unknown_linux_gnuabi64),
1452 ("mipsel-unknown-linux-gnu", mipsel_unknown_linux_gnu),
1453 ("powerpc-unknown-linux-gnu", powerpc_unknown_linux_gnu),
1454 ("powerpc-unknown-linux-gnuspe", powerpc_unknown_linux_gnuspe),
1455 ("powerpc-unknown-linux-musl", powerpc_unknown_linux_musl),
1456 ("powerpc-unknown-linux-muslspe", powerpc_unknown_linux_muslspe),
1457 ("powerpc64-ibm-aix", powerpc64_ibm_aix),
1458 ("powerpc64-unknown-linux-gnu", powerpc64_unknown_linux_gnu),
1459 ("powerpc64-unknown-linux-musl", powerpc64_unknown_linux_musl),
1460 ("powerpc64le-unknown-linux-gnu", powerpc64le_unknown_linux_gnu),
1461 ("powerpc64le-unknown-linux-musl", powerpc64le_unknown_linux_musl),
1462 ("s390x-unknown-linux-gnu", s390x_unknown_linux_gnu),
1463 ("s390x-unknown-linux-musl", s390x_unknown_linux_musl),
1464 ("sparc-unknown-linux-gnu", sparc_unknown_linux_gnu),
1465 ("sparc64-unknown-linux-gnu", sparc64_unknown_linux_gnu),
1466 ("arm-unknown-linux-gnueabi", arm_unknown_linux_gnueabi),
1467 ("arm-unknown-linux-gnueabihf", arm_unknown_linux_gnueabihf),
1468 ("armeb-unknown-linux-gnueabi", armeb_unknown_linux_gnueabi),
1469 ("arm-unknown-linux-musleabi", arm_unknown_linux_musleabi),
1470 ("arm-unknown-linux-musleabihf", arm_unknown_linux_musleabihf),
1471 ("armv4t-unknown-linux-gnueabi", armv4t_unknown_linux_gnueabi),
1472 ("armv5te-unknown-linux-gnueabi", armv5te_unknown_linux_gnueabi),
1473 ("armv5te-unknown-linux-musleabi", armv5te_unknown_linux_musleabi),
1474 ("armv5te-unknown-linux-uclibceabi", armv5te_unknown_linux_uclibceabi),
1475 ("armv7-unknown-linux-gnueabi", armv7_unknown_linux_gnueabi),
1476 ("armv7-unknown-linux-gnueabihf", armv7_unknown_linux_gnueabihf),
1477 ("thumbv7neon-unknown-linux-gnueabihf", thumbv7neon_unknown_linux_gnueabihf),
1478 ("thumbv7neon-unknown-linux-musleabihf", thumbv7neon_unknown_linux_musleabihf),
1479 ("armv7-unknown-linux-musleabi", armv7_unknown_linux_musleabi),
1480 ("armv7-unknown-linux-musleabihf", armv7_unknown_linux_musleabihf),
1481 ("aarch64-unknown-linux-gnu", aarch64_unknown_linux_gnu),
1482 ("aarch64-unknown-linux-musl", aarch64_unknown_linux_musl),
1483 ("aarch64_be-unknown-linux-musl", aarch64_be_unknown_linux_musl),
1484 ("x86_64-unknown-linux-musl", x86_64_unknown_linux_musl),
1485 ("i686-unknown-linux-musl", i686_unknown_linux_musl),
1486 ("i586-unknown-linux-musl", i586_unknown_linux_musl),
1487 ("mips-unknown-linux-musl", mips_unknown_linux_musl),
1488 ("mipsel-unknown-linux-musl", mipsel_unknown_linux_musl),
1489 ("mips64-unknown-linux-muslabi64", mips64_unknown_linux_muslabi64),
1490 ("mips64el-unknown-linux-muslabi64", mips64el_unknown_linux_muslabi64),
1491 ("hexagon-unknown-linux-musl", hexagon_unknown_linux_musl),
1492 ("hexagon-unknown-none-elf", hexagon_unknown_none_elf),
1493 ("hexagon-unknown-qurt", hexagon_unknown_qurt),
1494
1495 ("mips-unknown-linux-uclibc", mips_unknown_linux_uclibc),
1496 ("mipsel-unknown-linux-uclibc", mipsel_unknown_linux_uclibc),
1497
1498 ("i686-linux-android", i686_linux_android),
1499 ("x86_64-linux-android", x86_64_linux_android),
1500 ("arm-linux-androideabi", arm_linux_androideabi),
1501 ("armv7-linux-androideabi", armv7_linux_androideabi),
1502 ("thumbv7neon-linux-androideabi", thumbv7neon_linux_androideabi),
1503 ("aarch64-linux-android", aarch64_linux_android),
1504 ("riscv64-linux-android", riscv64_linux_android),
1505
1506 ("aarch64-unknown-freebsd", aarch64_unknown_freebsd),
1507 ("armv6-unknown-freebsd", armv6_unknown_freebsd),
1508 ("armv7-unknown-freebsd", armv7_unknown_freebsd),
1509 ("i686-unknown-freebsd", i686_unknown_freebsd),
1510 ("powerpc-unknown-freebsd", powerpc_unknown_freebsd),
1511 ("powerpc64-unknown-freebsd", powerpc64_unknown_freebsd),
1512 ("powerpc64le-unknown-freebsd", powerpc64le_unknown_freebsd),
1513 ("riscv64gc-unknown-freebsd", riscv64gc_unknown_freebsd),
1514 ("x86_64-unknown-freebsd", x86_64_unknown_freebsd),
1515
1516 ("x86_64-unknown-dragonfly", x86_64_unknown_dragonfly),
1517
1518 ("aarch64-unknown-openbsd", aarch64_unknown_openbsd),
1519 ("i686-unknown-openbsd", i686_unknown_openbsd),
1520 ("powerpc-unknown-openbsd", powerpc_unknown_openbsd),
1521 ("powerpc64-unknown-openbsd", powerpc64_unknown_openbsd),
1522 ("riscv64gc-unknown-openbsd", riscv64gc_unknown_openbsd),
1523 ("sparc64-unknown-openbsd", sparc64_unknown_openbsd),
1524 ("x86_64-unknown-openbsd", x86_64_unknown_openbsd),
1525
1526 ("aarch64-unknown-netbsd", aarch64_unknown_netbsd),
1527 ("aarch64_be-unknown-netbsd", aarch64_be_unknown_netbsd),
1528 ("armv6-unknown-netbsd-eabihf", armv6_unknown_netbsd_eabihf),
1529 ("armv7-unknown-netbsd-eabihf", armv7_unknown_netbsd_eabihf),
1530 ("i586-unknown-netbsd", i586_unknown_netbsd),
1531 ("i686-unknown-netbsd", i686_unknown_netbsd),
1532 ("mipsel-unknown-netbsd", mipsel_unknown_netbsd),
1533 ("powerpc-unknown-netbsd", powerpc_unknown_netbsd),
1534 ("riscv64gc-unknown-netbsd", riscv64gc_unknown_netbsd),
1535 ("sparc64-unknown-netbsd", sparc64_unknown_netbsd),
1536 ("x86_64-unknown-netbsd", x86_64_unknown_netbsd),
1537
1538 ("i686-unknown-haiku", i686_unknown_haiku),
1539 ("x86_64-unknown-haiku", x86_64_unknown_haiku),
1540
1541 ("aarch64-unknown-helenos", aarch64_unknown_helenos),
1542 ("i686-unknown-helenos", i686_unknown_helenos),
1543 ("powerpc-unknown-helenos", powerpc_unknown_helenos),
1544 ("sparc64-unknown-helenos", sparc64_unknown_helenos),
1545 ("x86_64-unknown-helenos", x86_64_unknown_helenos),
1546
1547 ("i686-unknown-hurd-gnu", i686_unknown_hurd_gnu),
1548 ("x86_64-unknown-hurd-gnu", x86_64_unknown_hurd_gnu),
1549
1550 ("aarch64-apple-darwin", aarch64_apple_darwin),
1551 ("arm64e-apple-darwin", arm64e_apple_darwin),
1552 ("x86_64-apple-darwin", x86_64_apple_darwin),
1553 ("x86_64h-apple-darwin", x86_64h_apple_darwin),
1554 ("i686-apple-darwin", i686_apple_darwin),
1555
1556 ("aarch64-unknown-fuchsia", aarch64_unknown_fuchsia),
1557 ("riscv64gc-unknown-fuchsia", riscv64gc_unknown_fuchsia),
1558 ("x86_64-unknown-fuchsia", x86_64_unknown_fuchsia),
1559
1560 ("avr-none", avr_none),
1561
1562 ("x86_64-unknown-l4re-uclibc", x86_64_unknown_l4re_uclibc),
1563
1564 ("aarch64-unknown-redox", aarch64_unknown_redox),
1565 ("i586-unknown-redox", i586_unknown_redox),
1566 ("riscv64gc-unknown-redox", riscv64gc_unknown_redox),
1567 ("x86_64-unknown-redox", x86_64_unknown_redox),
1568
1569 ("x86_64-unknown-managarm-mlibc", x86_64_unknown_managarm_mlibc),
1570 ("aarch64-unknown-managarm-mlibc", aarch64_unknown_managarm_mlibc),
1571 ("riscv64gc-unknown-managarm-mlibc", riscv64gc_unknown_managarm_mlibc),
1572
1573 ("i386-apple-ios", i386_apple_ios),
1574 ("x86_64-apple-ios", x86_64_apple_ios),
1575 ("aarch64-apple-ios", aarch64_apple_ios),
1576 ("arm64e-apple-ios", arm64e_apple_ios),
1577 ("armv7s-apple-ios", armv7s_apple_ios),
1578 ("x86_64-apple-ios-macabi", x86_64_apple_ios_macabi),
1579 ("aarch64-apple-ios-macabi", aarch64_apple_ios_macabi),
1580 ("aarch64-apple-ios-sim", aarch64_apple_ios_sim),
1581
1582 ("aarch64-apple-tvos", aarch64_apple_tvos),
1583 ("aarch64-apple-tvos-sim", aarch64_apple_tvos_sim),
1584 ("arm64e-apple-tvos", arm64e_apple_tvos),
1585 ("x86_64-apple-tvos", x86_64_apple_tvos),
1586
1587 ("armv7k-apple-watchos", armv7k_apple_watchos),
1588 ("arm64_32-apple-watchos", arm64_32_apple_watchos),
1589 ("x86_64-apple-watchos-sim", x86_64_apple_watchos_sim),
1590 ("aarch64-apple-watchos", aarch64_apple_watchos),
1591 ("aarch64-apple-watchos-sim", aarch64_apple_watchos_sim),
1592
1593 ("aarch64-apple-visionos", aarch64_apple_visionos),
1594 ("aarch64-apple-visionos-sim", aarch64_apple_visionos_sim),
1595
1596 ("armebv7r-none-eabi", armebv7r_none_eabi),
1597 ("armebv7r-none-eabihf", armebv7r_none_eabihf),
1598 ("armv7r-none-eabi", armv7r_none_eabi),
1599 ("armv7r-none-eabihf", armv7r_none_eabihf),
1600 ("armv8r-none-eabihf", armv8r_none_eabihf),
1601
1602 ("armv7-rtems-eabihf", armv7_rtems_eabihf),
1603
1604 ("x86_64-pc-solaris", x86_64_pc_solaris),
1605 ("sparcv9-sun-solaris", sparcv9_sun_solaris),
1606
1607 ("x86_64-unknown-illumos", x86_64_unknown_illumos),
1608 ("aarch64-unknown-illumos", aarch64_unknown_illumos),
1609
1610 ("x86_64-pc-windows-gnu", x86_64_pc_windows_gnu),
1611 ("x86_64-uwp-windows-gnu", x86_64_uwp_windows_gnu),
1612 ("x86_64-win7-windows-gnu", x86_64_win7_windows_gnu),
1613 ("i686-pc-windows-gnu", i686_pc_windows_gnu),
1614 ("i686-uwp-windows-gnu", i686_uwp_windows_gnu),
1615 ("i686-win7-windows-gnu", i686_win7_windows_gnu),
1616
1617 ("aarch64-pc-windows-gnullvm", aarch64_pc_windows_gnullvm),
1618 ("i686-pc-windows-gnullvm", i686_pc_windows_gnullvm),
1619 ("x86_64-pc-windows-gnullvm", x86_64_pc_windows_gnullvm),
1620
1621 ("aarch64-pc-windows-msvc", aarch64_pc_windows_msvc),
1622 ("aarch64-uwp-windows-msvc", aarch64_uwp_windows_msvc),
1623 ("arm64ec-pc-windows-msvc", arm64ec_pc_windows_msvc),
1624 ("x86_64-pc-windows-msvc", x86_64_pc_windows_msvc),
1625 ("x86_64-uwp-windows-msvc", x86_64_uwp_windows_msvc),
1626 ("x86_64-win7-windows-msvc", x86_64_win7_windows_msvc),
1627 ("i686-pc-windows-msvc", i686_pc_windows_msvc),
1628 ("i686-uwp-windows-msvc", i686_uwp_windows_msvc),
1629 ("i686-win7-windows-msvc", i686_win7_windows_msvc),
1630 ("thumbv7a-pc-windows-msvc", thumbv7a_pc_windows_msvc),
1631 ("thumbv7a-uwp-windows-msvc", thumbv7a_uwp_windows_msvc),
1632
1633 ("wasm32-unknown-emscripten", wasm32_unknown_emscripten),
1634 ("wasm32-unknown-unknown", wasm32_unknown_unknown),
1635 ("wasm32v1-none", wasm32v1_none),
1636 ("wasm32-wasip1", wasm32_wasip1),
1637 ("wasm32-wasip2", wasm32_wasip2),
1638 ("wasm32-wasip3", wasm32_wasip3),
1639 ("wasm32-wasip1-threads", wasm32_wasip1_threads),
1640 ("wasm32-wali-linux-musl", wasm32_wali_linux_musl),
1641 ("wasm64-unknown-unknown", wasm64_unknown_unknown),
1642
1643 ("thumbv6m-none-eabi", thumbv6m_none_eabi),
1644 ("thumbv7m-none-eabi", thumbv7m_none_eabi),
1645 ("thumbv7em-none-eabi", thumbv7em_none_eabi),
1646 ("thumbv7em-none-eabihf", thumbv7em_none_eabihf),
1647 ("thumbv8m.base-none-eabi", thumbv8m_base_none_eabi),
1648 ("thumbv8m.main-none-eabi", thumbv8m_main_none_eabi),
1649 ("thumbv8m.main-none-eabihf", thumbv8m_main_none_eabihf),
1650
1651 ("armv7a-none-eabi", armv7a_none_eabi),
1652 ("armv7a-none-eabihf", armv7a_none_eabihf),
1653 ("armv7a-nuttx-eabi", armv7a_nuttx_eabi),
1654 ("armv7a-nuttx-eabihf", armv7a_nuttx_eabihf),
1655 ("armv7a-vex-v5", armv7a_vex_v5),
1656
1657 ("msp430-none-elf", msp430_none_elf),
1658
1659 ("aarch64_be-unknown-hermit", aarch64_be_unknown_hermit),
1660 ("aarch64-unknown-hermit", aarch64_unknown_hermit),
1661 ("riscv64gc-unknown-hermit", riscv64gc_unknown_hermit),
1662 ("x86_64-unknown-hermit", x86_64_unknown_hermit),
1663 ("x86_64-unknown-motor", x86_64_unknown_motor),
1664
1665 ("x86_64-unikraft-linux-musl", x86_64_unikraft_linux_musl),
1666
1667 ("armv7-unknown-trusty", armv7_unknown_trusty),
1668 ("aarch64-unknown-trusty", aarch64_unknown_trusty),
1669 ("x86_64-unknown-trusty", x86_64_unknown_trusty),
1670
1671 ("riscv32i-unknown-none-elf", riscv32i_unknown_none_elf),
1672 ("riscv32im-risc0-zkvm-elf", riscv32im_risc0_zkvm_elf),
1673 ("riscv32im-unknown-none-elf", riscv32im_unknown_none_elf),
1674 ("riscv32ima-unknown-none-elf", riscv32ima_unknown_none_elf),
1675 ("riscv32imc-unknown-none-elf", riscv32imc_unknown_none_elf),
1676 ("riscv32imc-esp-espidf", riscv32imc_esp_espidf),
1677 ("riscv32imac-esp-espidf", riscv32imac_esp_espidf),
1678 ("riscv32imafc-esp-espidf", riscv32imafc_esp_espidf),
1679
1680 ("riscv32e-unknown-none-elf", riscv32e_unknown_none_elf),
1681 ("riscv32em-unknown-none-elf", riscv32em_unknown_none_elf),
1682 ("riscv32emc-unknown-none-elf", riscv32emc_unknown_none_elf),
1683
1684 ("riscv32imac-unknown-none-elf", riscv32imac_unknown_none_elf),
1685 ("riscv32imafc-unknown-none-elf", riscv32imafc_unknown_none_elf),
1686 ("riscv32imac-unknown-xous-elf", riscv32imac_unknown_xous_elf),
1687 ("riscv32gc-unknown-linux-gnu", riscv32gc_unknown_linux_gnu),
1688 ("riscv32gc-unknown-linux-musl", riscv32gc_unknown_linux_musl),
1689 ("riscv64im-unknown-none-elf", riscv64im_unknown_none_elf),
1690 ("riscv64imac-unknown-none-elf", riscv64imac_unknown_none_elf),
1691 ("riscv64gc-unknown-none-elf", riscv64gc_unknown_none_elf),
1692 ("riscv64gc-unknown-linux-gnu", riscv64gc_unknown_linux_gnu),
1693 ("riscv64gc-unknown-linux-musl", riscv64gc_unknown_linux_musl),
1694 ("riscv64a23-unknown-linux-gnu", riscv64a23_unknown_linux_gnu),
1695
1696 ("sparc-unknown-none-elf", sparc_unknown_none_elf),
1697
1698 ("loongarch32-unknown-none", loongarch32_unknown_none),
1699 ("loongarch32-unknown-none-softfloat", loongarch32_unknown_none_softfloat),
1700 ("loongarch64-unknown-none", loongarch64_unknown_none),
1701 ("loongarch64-unknown-none-softfloat", loongarch64_unknown_none_softfloat),
1702
1703 ("aarch64-unknown-none", aarch64_unknown_none),
1704 ("aarch64-unknown-none-softfloat", aarch64_unknown_none_softfloat),
1705 ("aarch64_be-unknown-none-softfloat", aarch64_be_unknown_none_softfloat),
1706 ("aarch64-unknown-nuttx", aarch64_unknown_nuttx),
1707
1708 ("x86_64-fortanix-unknown-sgx", x86_64_fortanix_unknown_sgx),
1709
1710 ("x86_64-unknown-uefi", x86_64_unknown_uefi),
1711 ("i686-unknown-uefi", i686_unknown_uefi),
1712 ("aarch64-unknown-uefi", aarch64_unknown_uefi),
1713
1714 ("nvptx64-nvidia-cuda", nvptx64_nvidia_cuda),
1715
1716 ("amdgcn-amd-amdhsa", amdgcn_amd_amdhsa),
1717
1718 ("xtensa-esp32-none-elf", xtensa_esp32_none_elf),
1719 ("xtensa-esp32-espidf", xtensa_esp32_espidf),
1720 ("xtensa-esp32s2-none-elf", xtensa_esp32s2_none_elf),
1721 ("xtensa-esp32s2-espidf", xtensa_esp32s2_espidf),
1722 ("xtensa-esp32s3-none-elf", xtensa_esp32s3_none_elf),
1723 ("xtensa-esp32s3-espidf", xtensa_esp32s3_espidf),
1724
1725 ("i686-wrs-vxworks", i686_wrs_vxworks),
1726 ("x86_64-wrs-vxworks", x86_64_wrs_vxworks),
1727 ("armv7-wrs-vxworks-eabihf", armv7_wrs_vxworks_eabihf),
1728 ("aarch64-wrs-vxworks", aarch64_wrs_vxworks),
1729 ("powerpc-wrs-vxworks", powerpc_wrs_vxworks),
1730 ("powerpc-wrs-vxworks-spe", powerpc_wrs_vxworks_spe),
1731 ("powerpc64-wrs-vxworks", powerpc64_wrs_vxworks),
1732 ("riscv32-wrs-vxworks", riscv32_wrs_vxworks),
1733 ("riscv64-wrs-vxworks", riscv64_wrs_vxworks),
1734
1735 ("aarch64-kmc-solid_asp3", aarch64_kmc_solid_asp3),
1736 ("armv7a-kmc-solid_asp3-eabi", armv7a_kmc_solid_asp3_eabi),
1737 ("armv7a-kmc-solid_asp3-eabihf", armv7a_kmc_solid_asp3_eabihf),
1738
1739 ("mipsel-sony-psp", mipsel_sony_psp),
1740 ("mipsel-sony-psx", mipsel_sony_psx),
1741 ("mipsel-unknown-none", mipsel_unknown_none),
1742 ("mips-mti-none-elf", mips_mti_none_elf),
1743 ("mipsel-mti-none-elf", mipsel_mti_none_elf),
1744 ("thumbv4t-none-eabi", thumbv4t_none_eabi),
1745 ("armv4t-none-eabi", armv4t_none_eabi),
1746 ("thumbv5te-none-eabi", thumbv5te_none_eabi),
1747 ("armv5te-none-eabi", armv5te_none_eabi),
1748
1749 ("aarch64_be-unknown-linux-gnu", aarch64_be_unknown_linux_gnu),
1750 ("aarch64-unknown-linux-gnu_ilp32", aarch64_unknown_linux_gnu_ilp32),
1751 ("aarch64_be-unknown-linux-gnu_ilp32", aarch64_be_unknown_linux_gnu_ilp32),
1752
1753 ("bpfeb-unknown-none", bpfeb_unknown_none),
1754 ("bpfel-unknown-none", bpfel_unknown_none),
1755
1756 ("armv6k-nintendo-3ds", armv6k_nintendo_3ds),
1757
1758 ("aarch64-nintendo-switch-freestanding", aarch64_nintendo_switch_freestanding),
1759
1760 ("armv7-sony-vita-newlibeabihf", armv7_sony_vita_newlibeabihf),
1761
1762 ("armv7-unknown-linux-uclibceabi", armv7_unknown_linux_uclibceabi),
1763 ("armv7-unknown-linux-uclibceabihf", armv7_unknown_linux_uclibceabihf),
1764
1765 ("x86_64-unknown-none", x86_64_unknown_none),
1766
1767 ("aarch64-unknown-teeos", aarch64_unknown_teeos),
1768
1769 ("mips64-openwrt-linux-musl", mips64_openwrt_linux_musl),
1770
1771 ("aarch64-unknown-nto-qnx700", aarch64_unknown_nto_qnx700),
1772 ("aarch64-unknown-nto-qnx710", aarch64_unknown_nto_qnx710),
1773 ("aarch64-unknown-nto-qnx710_iosock", aarch64_unknown_nto_qnx710_iosock),
1774 ("aarch64-unknown-nto-qnx800", aarch64_unknown_nto_qnx800),
1775 ("x86_64-pc-nto-qnx710", x86_64_pc_nto_qnx710),
1776 ("x86_64-pc-nto-qnx710_iosock", x86_64_pc_nto_qnx710_iosock),
1777 ("x86_64-pc-nto-qnx800", x86_64_pc_nto_qnx800),
1778 ("i686-pc-nto-qnx700", i686_pc_nto_qnx700),
1779
1780 ("aarch64-unknown-linux-ohos", aarch64_unknown_linux_ohos),
1781 ("armv7-unknown-linux-ohos", armv7_unknown_linux_ohos),
1782 ("loongarch64-unknown-linux-ohos", loongarch64_unknown_linux_ohos),
1783 ("x86_64-unknown-linux-ohos", x86_64_unknown_linux_ohos),
1784
1785 ("x86_64-unknown-linux-none", x86_64_unknown_linux_none),
1786
1787 ("thumbv6m-nuttx-eabi", thumbv6m_nuttx_eabi),
1788 ("thumbv7a-nuttx-eabi", thumbv7a_nuttx_eabi),
1789 ("thumbv7a-nuttx-eabihf", thumbv7a_nuttx_eabihf),
1790 ("thumbv7m-nuttx-eabi", thumbv7m_nuttx_eabi),
1791 ("thumbv7em-nuttx-eabi", thumbv7em_nuttx_eabi),
1792 ("thumbv7em-nuttx-eabihf", thumbv7em_nuttx_eabihf),
1793 ("thumbv8m.base-nuttx-eabi", thumbv8m_base_nuttx_eabi),
1794 ("thumbv8m.main-nuttx-eabi", thumbv8m_main_nuttx_eabi),
1795 ("thumbv8m.main-nuttx-eabihf", thumbv8m_main_nuttx_eabihf),
1796 ("riscv32imc-unknown-nuttx-elf", riscv32imc_unknown_nuttx_elf),
1797 ("riscv32imac-unknown-nuttx-elf", riscv32imac_unknown_nuttx_elf),
1798 ("riscv32imafc-unknown-nuttx-elf", riscv32imafc_unknown_nuttx_elf),
1799 ("riscv64imac-unknown-nuttx-elf", riscv64imac_unknown_nuttx_elf),
1800 ("riscv64gc-unknown-nuttx-elf", riscv64gc_unknown_nuttx_elf),
1801 ("x86_64-lynx-lynxos178", x86_64_lynx_lynxos178),
1802
1803 ("x86_64-pc-cygwin", x86_64_pc_cygwin),
1804}
1805
1806macro_rules! cvs {
1808 () => {
1809 ::std::borrow::Cow::Borrowed(&[])
1810 };
1811 ($($x:expr),+ $(,)?) => {
1812 ::std::borrow::Cow::Borrowed(&[
1813 $(
1814 ::std::borrow::Cow::Borrowed($x),
1815 )*
1816 ])
1817 };
1818}
1819
1820pub(crate) use cvs;
1821
1822#[derive(#[automatically_derived]
impl ::core::fmt::Debug for TargetWarnings {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f,
"TargetWarnings", "unused_fields", &&self.unused_fields)
}
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for TargetWarnings {
#[inline]
fn eq(&self, other: &TargetWarnings) -> bool {
self.unused_fields == other.unused_fields
}
}PartialEq)]
1826pub struct TargetWarnings {
1827 unused_fields: Vec<String>,
1828}
1829
1830impl TargetWarnings {
1831 pub fn empty() -> Self {
1832 Self { unused_fields: Vec::new() }
1833 }
1834
1835 pub fn warning_messages(&self) -> Vec<String> {
1836 let mut warnings = ::alloc::vec::Vec::new()vec![];
1837 if !self.unused_fields.is_empty() {
1838 warnings.push(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("target json file contains unused fields: {0}",
self.unused_fields.join(", ")))
})format!(
1839 "target json file contains unused fields: {}",
1840 self.unused_fields.join(", ")
1841 ));
1842 }
1843 warnings
1844 }
1845}
1846
1847#[derive(#[automatically_derived]
impl ::core::marker::Copy for TargetKind { }Copy, #[automatically_derived]
impl ::core::clone::Clone for TargetKind {
#[inline]
fn clone(&self) -> TargetKind { *self }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for TargetKind {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
TargetKind::Json => "Json",
TargetKind::Builtin => "Builtin",
})
}
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for TargetKind {
#[inline]
fn eq(&self, other: &TargetKind) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}PartialEq)]
1850enum TargetKind {
1851 Json,
1852 Builtin,
1853}
1854
1855pub enum Arch {
AArch64,
AmdGpu,
Arm,
Arm64EC,
Avr,
Bpf,
CSky,
Hexagon,
LoongArch32,
LoongArch64,
M68k,
Mips,
Mips32r6,
Mips64,
Mips64r6,
Msp430,
Nvptx64,
PowerPC,
PowerPC64,
RiscV32,
RiscV64,
S390x,
Sparc,
Sparc64,
SpirV,
Wasm32,
Wasm64,
X86,
X86_64,
Xtensa,
Other(crate::spec::StaticCow<str>),
}
#[automatically_derived]
impl ::core::clone::Clone for Arch {
#[inline]
fn clone(&self) -> Arch {
match self {
Arch::AArch64 => Arch::AArch64,
Arch::AmdGpu => Arch::AmdGpu,
Arch::Arm => Arch::Arm,
Arch::Arm64EC => Arch::Arm64EC,
Arch::Avr => Arch::Avr,
Arch::Bpf => Arch::Bpf,
Arch::CSky => Arch::CSky,
Arch::Hexagon => Arch::Hexagon,
Arch::LoongArch32 => Arch::LoongArch32,
Arch::LoongArch64 => Arch::LoongArch64,
Arch::M68k => Arch::M68k,
Arch::Mips => Arch::Mips,
Arch::Mips32r6 => Arch::Mips32r6,
Arch::Mips64 => Arch::Mips64,
Arch::Mips64r6 => Arch::Mips64r6,
Arch::Msp430 => Arch::Msp430,
Arch::Nvptx64 => Arch::Nvptx64,
Arch::PowerPC => Arch::PowerPC,
Arch::PowerPC64 => Arch::PowerPC64,
Arch::RiscV32 => Arch::RiscV32,
Arch::RiscV64 => Arch::RiscV64,
Arch::S390x => Arch::S390x,
Arch::Sparc => Arch::Sparc,
Arch::Sparc64 => Arch::Sparc64,
Arch::SpirV => Arch::SpirV,
Arch::Wasm32 => Arch::Wasm32,
Arch::Wasm64 => Arch::Wasm64,
Arch::X86 => Arch::X86,
Arch::X86_64 => Arch::X86_64,
Arch::Xtensa => Arch::Xtensa,
Arch::Other(__self_0) =>
Arch::Other(::core::clone::Clone::clone(__self_0)),
}
}
}
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for Arch { }
#[automatically_derived]
impl ::core::cmp::PartialEq for Arch {
#[inline]
fn eq(&self, other: &Arch) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(Arch::Other(__self_0), Arch::Other(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}
#[automatically_derived]
impl ::core::cmp::Eq for Arch {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) -> () {
let _: ::core::cmp::AssertParamIsEq<crate::spec::StaticCow<str>>;
}
}
#[automatically_derived]
impl ::core::hash::Hash for Arch {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state);
match self {
Arch::Other(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}
#[automatically_derived]
impl ::core::fmt::Debug for Arch {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Arch::AArch64 => ::core::fmt::Formatter::write_str(f, "AArch64"),
Arch::AmdGpu => ::core::fmt::Formatter::write_str(f, "AmdGpu"),
Arch::Arm => ::core::fmt::Formatter::write_str(f, "Arm"),
Arch::Arm64EC => ::core::fmt::Formatter::write_str(f, "Arm64EC"),
Arch::Avr => ::core::fmt::Formatter::write_str(f, "Avr"),
Arch::Bpf => ::core::fmt::Formatter::write_str(f, "Bpf"),
Arch::CSky => ::core::fmt::Formatter::write_str(f, "CSky"),
Arch::Hexagon => ::core::fmt::Formatter::write_str(f, "Hexagon"),
Arch::LoongArch32 =>
::core::fmt::Formatter::write_str(f, "LoongArch32"),
Arch::LoongArch64 =>
::core::fmt::Formatter::write_str(f, "LoongArch64"),
Arch::M68k => ::core::fmt::Formatter::write_str(f, "M68k"),
Arch::Mips => ::core::fmt::Formatter::write_str(f, "Mips"),
Arch::Mips32r6 =>
::core::fmt::Formatter::write_str(f, "Mips32r6"),
Arch::Mips64 => ::core::fmt::Formatter::write_str(f, "Mips64"),
Arch::Mips64r6 =>
::core::fmt::Formatter::write_str(f, "Mips64r6"),
Arch::Msp430 => ::core::fmt::Formatter::write_str(f, "Msp430"),
Arch::Nvptx64 => ::core::fmt::Formatter::write_str(f, "Nvptx64"),
Arch::PowerPC => ::core::fmt::Formatter::write_str(f, "PowerPC"),
Arch::PowerPC64 =>
::core::fmt::Formatter::write_str(f, "PowerPC64"),
Arch::RiscV32 => ::core::fmt::Formatter::write_str(f, "RiscV32"),
Arch::RiscV64 => ::core::fmt::Formatter::write_str(f, "RiscV64"),
Arch::S390x => ::core::fmt::Formatter::write_str(f, "S390x"),
Arch::Sparc => ::core::fmt::Formatter::write_str(f, "Sparc"),
Arch::Sparc64 => ::core::fmt::Formatter::write_str(f, "Sparc64"),
Arch::SpirV => ::core::fmt::Formatter::write_str(f, "SpirV"),
Arch::Wasm32 => ::core::fmt::Formatter::write_str(f, "Wasm32"),
Arch::Wasm64 => ::core::fmt::Formatter::write_str(f, "Wasm64"),
Arch::X86 => ::core::fmt::Formatter::write_str(f, "X86"),
Arch::X86_64 => ::core::fmt::Formatter::write_str(f, "X86_64"),
Arch::Xtensa => ::core::fmt::Formatter::write_str(f, "Xtensa"),
Arch::Other(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Other",
&__self_0),
}
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for Arch {
#[inline]
fn partial_cmp(&self, other: &Arch)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
match (self, other) {
(Arch::Other(__self_0), Arch::Other(__arg1_0)) =>
::core::cmp::PartialOrd::partial_cmp(__self_0, __arg1_0),
_ =>
::core::cmp::PartialOrd::partial_cmp(&__self_discr,
&__arg1_discr),
}
}
}
#[automatically_derived]
impl ::core::cmp::Ord for Arch {
#[inline]
fn cmp(&self, other: &Arch) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
match ::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr) {
::core::cmp::Ordering::Equal =>
match (self, other) {
(Arch::Other(__self_0), Arch::Other(__arg1_0)) =>
::core::cmp::Ord::cmp(__self_0, __arg1_0),
_ => ::core::cmp::Ordering::Equal,
},
cmp => cmp,
}
}
}
impl schemars::JsonSchema for Arch {
fn schema_name() -> std::borrow::Cow<'static, str> {
std::borrow::Cow::Borrowed("Arch")
}
fn json_schema(_: &mut schemars::SchemaGenerator) -> schemars::Schema {
<::schemars::Schema as
::core::convert::TryFrom<_>>::try_from(::serde_json::Value::Object({
let mut object = ::serde_json::Map::new();
let _ =
object.insert(("type").into(),
::serde_json::to_value(&"string").unwrap());
object
})).unwrap()
}
}
impl FromStr for Arch {
type Err = core::convert::Infallible;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"aarch64" => Self::AArch64,
"amdgpu" => Self::AmdGpu,
"arm" => Self::Arm,
"arm64ec" => Self::Arm64EC,
"avr" => Self::Avr,
"bpf" => Self::Bpf,
"csky" => Self::CSky,
"hexagon" => Self::Hexagon,
"loongarch32" => Self::LoongArch32,
"loongarch64" => Self::LoongArch64,
"m68k" => Self::M68k,
"mips" => Self::Mips,
"mips32r6" => Self::Mips32r6,
"mips64" => Self::Mips64,
"mips64r6" => Self::Mips64r6,
"msp430" => Self::Msp430,
"nvptx64" => Self::Nvptx64,
"powerpc" => Self::PowerPC,
"powerpc64" => Self::PowerPC64,
"riscv32" => Self::RiscV32,
"riscv64" => Self::RiscV64,
"s390x" => Self::S390x,
"sparc" => Self::Sparc,
"sparc64" => Self::Sparc64,
"spirv" => Self::SpirV,
"wasm32" => Self::Wasm32,
"wasm64" => Self::Wasm64,
"x86" => Self::X86,
"x86_64" => Self::X86_64,
"xtensa" => Self::Xtensa,
_ => Self::Other(s.to_owned().into()),
})
}
}
impl Arch {
pub fn desc(&self) -> &str {
match self {
Self::AArch64 => "aarch64",
Self::AmdGpu => "amdgpu",
Self::Arm => "arm",
Self::Arm64EC => "arm64ec",
Self::Avr => "avr",
Self::Bpf => "bpf",
Self::CSky => "csky",
Self::Hexagon => "hexagon",
Self::LoongArch32 => "loongarch32",
Self::LoongArch64 => "loongarch64",
Self::M68k => "m68k",
Self::Mips => "mips",
Self::Mips32r6 => "mips32r6",
Self::Mips64 => "mips64",
Self::Mips64r6 => "mips64r6",
Self::Msp430 => "msp430",
Self::Nvptx64 => "nvptx64",
Self::PowerPC => "powerpc",
Self::PowerPC64 => "powerpc64",
Self::RiscV32 => "riscv32",
Self::RiscV64 => "riscv64",
Self::S390x => "s390x",
Self::Sparc => "sparc",
Self::Sparc64 => "sparc64",
Self::SpirV => "spirv",
Self::Wasm32 => "wasm32",
Self::Wasm64 => "wasm64",
Self::X86 => "x86",
Self::X86_64 => "x86_64",
Self::Xtensa => "xtensa",
Self::Other(name) => name.as_ref(),
}
}
}
impl crate::json::ToJson for Arch {
fn to_json(&self) -> crate::json::Json { self.desc().to_json() }
}
impl<'de> serde::Deserialize<'de> for Arch {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}
impl std::fmt::Display for Arch {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.desc())
}
}crate::target_spec_enum! {
1856 pub enum Arch {
1857 AArch64 = "aarch64",
1858 AmdGpu = "amdgpu",
1859 Arm = "arm",
1860 Arm64EC = "arm64ec",
1861 Avr = "avr",
1862 Bpf = "bpf",
1863 CSky = "csky",
1864 Hexagon = "hexagon",
1865 LoongArch32 = "loongarch32",
1866 LoongArch64 = "loongarch64",
1867 M68k = "m68k",
1868 Mips = "mips",
1869 Mips32r6 = "mips32r6",
1870 Mips64 = "mips64",
1871 Mips64r6 = "mips64r6",
1872 Msp430 = "msp430",
1873 Nvptx64 = "nvptx64",
1874 PowerPC = "powerpc",
1875 PowerPC64 = "powerpc64",
1876 RiscV32 = "riscv32",
1877 RiscV64 = "riscv64",
1878 S390x = "s390x",
1879 Sparc = "sparc",
1880 Sparc64 = "sparc64",
1881 SpirV = "spirv",
1882 Wasm32 = "wasm32",
1883 Wasm64 = "wasm64",
1884 X86 = "x86",
1885 X86_64 = "x86_64",
1886 Xtensa = "xtensa",
1887 }
1888 other_variant = Other;
1889}
1890
1891impl Arch {
1892 pub fn desc_symbol(&self) -> Symbol {
1893 match self {
1894 Self::AArch64 => sym::aarch64,
1895 Self::AmdGpu => sym::amdgpu,
1896 Self::Arm => sym::arm,
1897 Self::Arm64EC => sym::arm64ec,
1898 Self::Avr => sym::avr,
1899 Self::Bpf => sym::bpf,
1900 Self::CSky => sym::csky,
1901 Self::Hexagon => sym::hexagon,
1902 Self::LoongArch32 => sym::loongarch32,
1903 Self::LoongArch64 => sym::loongarch64,
1904 Self::M68k => sym::m68k,
1905 Self::Mips => sym::mips,
1906 Self::Mips32r6 => sym::mips32r6,
1907 Self::Mips64 => sym::mips64,
1908 Self::Mips64r6 => sym::mips64r6,
1909 Self::Msp430 => sym::msp430,
1910 Self::Nvptx64 => sym::nvptx64,
1911 Self::PowerPC => sym::powerpc,
1912 Self::PowerPC64 => sym::powerpc64,
1913 Self::RiscV32 => sym::riscv32,
1914 Self::RiscV64 => sym::riscv64,
1915 Self::S390x => sym::s390x,
1916 Self::Sparc => sym::sparc,
1917 Self::Sparc64 => sym::sparc64,
1918 Self::SpirV => sym::spirv,
1919 Self::Wasm32 => sym::wasm32,
1920 Self::Wasm64 => sym::wasm64,
1921 Self::X86 => sym::x86,
1922 Self::X86_64 => sym::x86_64,
1923 Self::Xtensa => sym::xtensa,
1924 Self::Other(name) => rustc_span::Symbol::intern(name),
1925 }
1926 }
1927
1928 pub fn supports_c_variadic_definitions(&self) -> bool {
1929 use Arch::*;
1930
1931 match self {
1932 Bpf | SpirV => false,
1934
1935 Other(_) => true,
1938
1939 AArch64 | AmdGpu | Arm | Arm64EC | Avr | CSky | Hexagon | LoongArch32 | LoongArch64
1940 | M68k | Mips | Mips32r6 | Mips64 | Mips64r6 | Msp430 | Nvptx64 | PowerPC
1941 | PowerPC64 | RiscV32 | RiscV64 | S390x | Sparc | Sparc64 | Wasm32 | Wasm64 | X86
1942 | X86_64 | Xtensa => true,
1943 }
1944 }
1945}
1946
1947pub enum Os {
Aix,
AmdHsa,
Android,
Cuda,
Cygwin,
Dragonfly,
Emscripten,
EspIdf,
FreeBsd,
Fuchsia,
Haiku,
HelenOs,
Hermit,
Horizon,
Hurd,
Illumos,
IOs,
L4Re,
Linux,
LynxOs178,
MacOs,
Managarm,
Motor,
NetBsd,
None,
Nto,
NuttX,
OpenBsd,
Psp,
Psx,
Qurt,
Redox,
Rtems,
Solaris,
SolidAsp3,
TeeOs,
Trusty,
TvOs,
Uefi,
VexOs,
VisionOs,
Vita,
VxWorks,
Wasi,
WatchOs,
Windows,
Xous,
Zkvm,
Unknown,
Other(crate::spec::StaticCow<str>),
}
#[automatically_derived]
impl ::core::clone::Clone for Os {
#[inline]
fn clone(&self) -> Os {
match self {
Os::Aix => Os::Aix,
Os::AmdHsa => Os::AmdHsa,
Os::Android => Os::Android,
Os::Cuda => Os::Cuda,
Os::Cygwin => Os::Cygwin,
Os::Dragonfly => Os::Dragonfly,
Os::Emscripten => Os::Emscripten,
Os::EspIdf => Os::EspIdf,
Os::FreeBsd => Os::FreeBsd,
Os::Fuchsia => Os::Fuchsia,
Os::Haiku => Os::Haiku,
Os::HelenOs => Os::HelenOs,
Os::Hermit => Os::Hermit,
Os::Horizon => Os::Horizon,
Os::Hurd => Os::Hurd,
Os::Illumos => Os::Illumos,
Os::IOs => Os::IOs,
Os::L4Re => Os::L4Re,
Os::Linux => Os::Linux,
Os::LynxOs178 => Os::LynxOs178,
Os::MacOs => Os::MacOs,
Os::Managarm => Os::Managarm,
Os::Motor => Os::Motor,
Os::NetBsd => Os::NetBsd,
Os::None => Os::None,
Os::Nto => Os::Nto,
Os::NuttX => Os::NuttX,
Os::OpenBsd => Os::OpenBsd,
Os::Psp => Os::Psp,
Os::Psx => Os::Psx,
Os::Qurt => Os::Qurt,
Os::Redox => Os::Redox,
Os::Rtems => Os::Rtems,
Os::Solaris => Os::Solaris,
Os::SolidAsp3 => Os::SolidAsp3,
Os::TeeOs => Os::TeeOs,
Os::Trusty => Os::Trusty,
Os::TvOs => Os::TvOs,
Os::Uefi => Os::Uefi,
Os::VexOs => Os::VexOs,
Os::VisionOs => Os::VisionOs,
Os::Vita => Os::Vita,
Os::VxWorks => Os::VxWorks,
Os::Wasi => Os::Wasi,
Os::WatchOs => Os::WatchOs,
Os::Windows => Os::Windows,
Os::Xous => Os::Xous,
Os::Zkvm => Os::Zkvm,
Os::Unknown => Os::Unknown,
Os::Other(__self_0) =>
Os::Other(::core::clone::Clone::clone(__self_0)),
}
}
}
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for Os { }
#[automatically_derived]
impl ::core::cmp::PartialEq for Os {
#[inline]
fn eq(&self, other: &Os) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(Os::Other(__self_0), Os::Other(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}
#[automatically_derived]
impl ::core::cmp::Eq for Os {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) -> () {
let _: ::core::cmp::AssertParamIsEq<crate::spec::StaticCow<str>>;
}
}
#[automatically_derived]
impl ::core::hash::Hash for Os {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state);
match self {
Os::Other(__self_0) => ::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}
#[automatically_derived]
impl ::core::fmt::Debug for Os {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Os::Aix => ::core::fmt::Formatter::write_str(f, "Aix"),
Os::AmdHsa => ::core::fmt::Formatter::write_str(f, "AmdHsa"),
Os::Android => ::core::fmt::Formatter::write_str(f, "Android"),
Os::Cuda => ::core::fmt::Formatter::write_str(f, "Cuda"),
Os::Cygwin => ::core::fmt::Formatter::write_str(f, "Cygwin"),
Os::Dragonfly =>
::core::fmt::Formatter::write_str(f, "Dragonfly"),
Os::Emscripten =>
::core::fmt::Formatter::write_str(f, "Emscripten"),
Os::EspIdf => ::core::fmt::Formatter::write_str(f, "EspIdf"),
Os::FreeBsd => ::core::fmt::Formatter::write_str(f, "FreeBsd"),
Os::Fuchsia => ::core::fmt::Formatter::write_str(f, "Fuchsia"),
Os::Haiku => ::core::fmt::Formatter::write_str(f, "Haiku"),
Os::HelenOs => ::core::fmt::Formatter::write_str(f, "HelenOs"),
Os::Hermit => ::core::fmt::Formatter::write_str(f, "Hermit"),
Os::Horizon => ::core::fmt::Formatter::write_str(f, "Horizon"),
Os::Hurd => ::core::fmt::Formatter::write_str(f, "Hurd"),
Os::Illumos => ::core::fmt::Formatter::write_str(f, "Illumos"),
Os::IOs => ::core::fmt::Formatter::write_str(f, "IOs"),
Os::L4Re => ::core::fmt::Formatter::write_str(f, "L4Re"),
Os::Linux => ::core::fmt::Formatter::write_str(f, "Linux"),
Os::LynxOs178 =>
::core::fmt::Formatter::write_str(f, "LynxOs178"),
Os::MacOs => ::core::fmt::Formatter::write_str(f, "MacOs"),
Os::Managarm => ::core::fmt::Formatter::write_str(f, "Managarm"),
Os::Motor => ::core::fmt::Formatter::write_str(f, "Motor"),
Os::NetBsd => ::core::fmt::Formatter::write_str(f, "NetBsd"),
Os::None => ::core::fmt::Formatter::write_str(f, "None"),
Os::Nto => ::core::fmt::Formatter::write_str(f, "Nto"),
Os::NuttX => ::core::fmt::Formatter::write_str(f, "NuttX"),
Os::OpenBsd => ::core::fmt::Formatter::write_str(f, "OpenBsd"),
Os::Psp => ::core::fmt::Formatter::write_str(f, "Psp"),
Os::Psx => ::core::fmt::Formatter::write_str(f, "Psx"),
Os::Qurt => ::core::fmt::Formatter::write_str(f, "Qurt"),
Os::Redox => ::core::fmt::Formatter::write_str(f, "Redox"),
Os::Rtems => ::core::fmt::Formatter::write_str(f, "Rtems"),
Os::Solaris => ::core::fmt::Formatter::write_str(f, "Solaris"),
Os::SolidAsp3 =>
::core::fmt::Formatter::write_str(f, "SolidAsp3"),
Os::TeeOs => ::core::fmt::Formatter::write_str(f, "TeeOs"),
Os::Trusty => ::core::fmt::Formatter::write_str(f, "Trusty"),
Os::TvOs => ::core::fmt::Formatter::write_str(f, "TvOs"),
Os::Uefi => ::core::fmt::Formatter::write_str(f, "Uefi"),
Os::VexOs => ::core::fmt::Formatter::write_str(f, "VexOs"),
Os::VisionOs => ::core::fmt::Formatter::write_str(f, "VisionOs"),
Os::Vita => ::core::fmt::Formatter::write_str(f, "Vita"),
Os::VxWorks => ::core::fmt::Formatter::write_str(f, "VxWorks"),
Os::Wasi => ::core::fmt::Formatter::write_str(f, "Wasi"),
Os::WatchOs => ::core::fmt::Formatter::write_str(f, "WatchOs"),
Os::Windows => ::core::fmt::Formatter::write_str(f, "Windows"),
Os::Xous => ::core::fmt::Formatter::write_str(f, "Xous"),
Os::Zkvm => ::core::fmt::Formatter::write_str(f, "Zkvm"),
Os::Unknown => ::core::fmt::Formatter::write_str(f, "Unknown"),
Os::Other(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Other",
&__self_0),
}
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for Os {
#[inline]
fn partial_cmp(&self, other: &Os)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
match (self, other) {
(Os::Other(__self_0), Os::Other(__arg1_0)) =>
::core::cmp::PartialOrd::partial_cmp(__self_0, __arg1_0),
_ =>
::core::cmp::PartialOrd::partial_cmp(&__self_discr,
&__arg1_discr),
}
}
}
#[automatically_derived]
impl ::core::cmp::Ord for Os {
#[inline]
fn cmp(&self, other: &Os) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
match ::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr) {
::core::cmp::Ordering::Equal =>
match (self, other) {
(Os::Other(__self_0), Os::Other(__arg1_0)) =>
::core::cmp::Ord::cmp(__self_0, __arg1_0),
_ => ::core::cmp::Ordering::Equal,
},
cmp => cmp,
}
}
}
impl schemars::JsonSchema for Os {
fn schema_name() -> std::borrow::Cow<'static, str> {
std::borrow::Cow::Borrowed("Os")
}
fn json_schema(_: &mut schemars::SchemaGenerator) -> schemars::Schema {
<::schemars::Schema as
::core::convert::TryFrom<_>>::try_from(::serde_json::Value::Object({
let mut object = ::serde_json::Map::new();
let _ =
object.insert(("type").into(),
::serde_json::to_value(&"string").unwrap());
object
})).unwrap()
}
}
impl FromStr for Os {
type Err = core::convert::Infallible;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"aix" => Self::Aix,
"amdhsa" => Self::AmdHsa,
"android" => Self::Android,
"cuda" => Self::Cuda,
"cygwin" => Self::Cygwin,
"dragonfly" => Self::Dragonfly,
"emscripten" => Self::Emscripten,
"espidf" => Self::EspIdf,
"freebsd" => Self::FreeBsd,
"fuchsia" => Self::Fuchsia,
"haiku" => Self::Haiku,
"helenos" => Self::HelenOs,
"hermit" => Self::Hermit,
"horizon" => Self::Horizon,
"hurd" => Self::Hurd,
"illumos" => Self::Illumos,
"ios" => Self::IOs,
"l4re" => Self::L4Re,
"linux" => Self::Linux,
"lynxos178" => Self::LynxOs178,
"macos" => Self::MacOs,
"managarm" => Self::Managarm,
"motor" => Self::Motor,
"netbsd" => Self::NetBsd,
"none" => Self::None,
"nto" => Self::Nto,
"nuttx" => Self::NuttX,
"openbsd" => Self::OpenBsd,
"psp" => Self::Psp,
"psx" => Self::Psx,
"qurt" => Self::Qurt,
"redox" => Self::Redox,
"rtems" => Self::Rtems,
"solaris" => Self::Solaris,
"solid_asp3" => Self::SolidAsp3,
"teeos" => Self::TeeOs,
"trusty" => Self::Trusty,
"tvos" => Self::TvOs,
"uefi" => Self::Uefi,
"vexos" => Self::VexOs,
"visionos" => Self::VisionOs,
"vita" => Self::Vita,
"vxworks" => Self::VxWorks,
"wasi" => Self::Wasi,
"watchos" => Self::WatchOs,
"windows" => Self::Windows,
"xous" => Self::Xous,
"zkvm" => Self::Zkvm,
"unknown" => Self::Unknown,
_ => Self::Other(s.to_owned().into()),
})
}
}
impl Os {
pub fn desc(&self) -> &str {
match self {
Self::Aix => "aix",
Self::AmdHsa => "amdhsa",
Self::Android => "android",
Self::Cuda => "cuda",
Self::Cygwin => "cygwin",
Self::Dragonfly => "dragonfly",
Self::Emscripten => "emscripten",
Self::EspIdf => "espidf",
Self::FreeBsd => "freebsd",
Self::Fuchsia => "fuchsia",
Self::Haiku => "haiku",
Self::HelenOs => "helenos",
Self::Hermit => "hermit",
Self::Horizon => "horizon",
Self::Hurd => "hurd",
Self::Illumos => "illumos",
Self::IOs => "ios",
Self::L4Re => "l4re",
Self::Linux => "linux",
Self::LynxOs178 => "lynxos178",
Self::MacOs => "macos",
Self::Managarm => "managarm",
Self::Motor => "motor",
Self::NetBsd => "netbsd",
Self::None => "none",
Self::Nto => "nto",
Self::NuttX => "nuttx",
Self::OpenBsd => "openbsd",
Self::Psp => "psp",
Self::Psx => "psx",
Self::Qurt => "qurt",
Self::Redox => "redox",
Self::Rtems => "rtems",
Self::Solaris => "solaris",
Self::SolidAsp3 => "solid_asp3",
Self::TeeOs => "teeos",
Self::Trusty => "trusty",
Self::TvOs => "tvos",
Self::Uefi => "uefi",
Self::VexOs => "vexos",
Self::VisionOs => "visionos",
Self::Vita => "vita",
Self::VxWorks => "vxworks",
Self::Wasi => "wasi",
Self::WatchOs => "watchos",
Self::Windows => "windows",
Self::Xous => "xous",
Self::Zkvm => "zkvm",
Self::Unknown => "unknown",
Self::Other(name) => name.as_ref(),
}
}
}
impl crate::json::ToJson for Os {
fn to_json(&self) -> crate::json::Json { self.desc().to_json() }
}
impl<'de> serde::Deserialize<'de> for Os {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}
impl std::fmt::Display for Os {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.desc())
}
}crate::target_spec_enum! {
1948 pub enum Os {
1949 Aix = "aix",
1950 AmdHsa = "amdhsa",
1951 Android = "android",
1952 Cuda = "cuda",
1953 Cygwin = "cygwin",
1954 Dragonfly = "dragonfly",
1955 Emscripten = "emscripten",
1956 EspIdf = "espidf",
1957 FreeBsd = "freebsd",
1958 Fuchsia = "fuchsia",
1959 Haiku = "haiku",
1960 HelenOs = "helenos",
1961 Hermit = "hermit",
1962 Horizon = "horizon",
1963 Hurd = "hurd",
1964 Illumos = "illumos",
1965 IOs = "ios",
1966 L4Re = "l4re",
1967 Linux = "linux",
1968 LynxOs178 = "lynxos178",
1969 MacOs = "macos",
1970 Managarm = "managarm",
1971 Motor = "motor",
1972 NetBsd = "netbsd",
1973 None = "none",
1974 Nto = "nto",
1975 NuttX = "nuttx",
1976 OpenBsd = "openbsd",
1977 Psp = "psp",
1978 Psx = "psx",
1979 Qurt = "qurt",
1980 Redox = "redox",
1981 Rtems = "rtems",
1982 Solaris = "solaris",
1983 SolidAsp3 = "solid_asp3",
1984 TeeOs = "teeos",
1985 Trusty = "trusty",
1986 TvOs = "tvos",
1987 Uefi = "uefi",
1988 VexOs = "vexos",
1989 VisionOs = "visionos",
1990 Vita = "vita",
1991 VxWorks = "vxworks",
1992 Wasi = "wasi",
1993 WatchOs = "watchos",
1994 Windows = "windows",
1995 Xous = "xous",
1996 Zkvm = "zkvm",
1997 Unknown = "unknown",
1998 }
1999 other_variant = Other;
2000}
2001
2002impl Os {
2003 pub fn desc_symbol(&self) -> Symbol {
2004 Symbol::intern(self.desc())
2005 }
2006}
2007
2008pub enum Env {
Gnu,
MacAbi,
Mlibc,
Msvc,
Musl,
Newlib,
Nto70,
Nto71,
Nto71IoSock,
Nto80,
Ohos,
Relibc,
Sgx,
Sim,
P1,
P2,
P3,
Uclibc,
V5,
Unspecified,
Other(crate::spec::StaticCow<str>),
}
#[automatically_derived]
impl ::core::clone::Clone for Env {
#[inline]
fn clone(&self) -> Env {
match self {
Env::Gnu => Env::Gnu,
Env::MacAbi => Env::MacAbi,
Env::Mlibc => Env::Mlibc,
Env::Msvc => Env::Msvc,
Env::Musl => Env::Musl,
Env::Newlib => Env::Newlib,
Env::Nto70 => Env::Nto70,
Env::Nto71 => Env::Nto71,
Env::Nto71IoSock => Env::Nto71IoSock,
Env::Nto80 => Env::Nto80,
Env::Ohos => Env::Ohos,
Env::Relibc => Env::Relibc,
Env::Sgx => Env::Sgx,
Env::Sim => Env::Sim,
Env::P1 => Env::P1,
Env::P2 => Env::P2,
Env::P3 => Env::P3,
Env::Uclibc => Env::Uclibc,
Env::V5 => Env::V5,
Env::Unspecified => Env::Unspecified,
Env::Other(__self_0) =>
Env::Other(::core::clone::Clone::clone(__self_0)),
}
}
}
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for Env { }
#[automatically_derived]
impl ::core::cmp::PartialEq for Env {
#[inline]
fn eq(&self, other: &Env) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(Env::Other(__self_0), Env::Other(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}
#[automatically_derived]
impl ::core::cmp::Eq for Env {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) -> () {
let _: ::core::cmp::AssertParamIsEq<crate::spec::StaticCow<str>>;
}
}
#[automatically_derived]
impl ::core::hash::Hash for Env {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state);
match self {
Env::Other(__self_0) => ::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}
#[automatically_derived]
impl ::core::fmt::Debug for Env {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Env::Gnu => ::core::fmt::Formatter::write_str(f, "Gnu"),
Env::MacAbi => ::core::fmt::Formatter::write_str(f, "MacAbi"),
Env::Mlibc => ::core::fmt::Formatter::write_str(f, "Mlibc"),
Env::Msvc => ::core::fmt::Formatter::write_str(f, "Msvc"),
Env::Musl => ::core::fmt::Formatter::write_str(f, "Musl"),
Env::Newlib => ::core::fmt::Formatter::write_str(f, "Newlib"),
Env::Nto70 => ::core::fmt::Formatter::write_str(f, "Nto70"),
Env::Nto71 => ::core::fmt::Formatter::write_str(f, "Nto71"),
Env::Nto71IoSock =>
::core::fmt::Formatter::write_str(f, "Nto71IoSock"),
Env::Nto80 => ::core::fmt::Formatter::write_str(f, "Nto80"),
Env::Ohos => ::core::fmt::Formatter::write_str(f, "Ohos"),
Env::Relibc => ::core::fmt::Formatter::write_str(f, "Relibc"),
Env::Sgx => ::core::fmt::Formatter::write_str(f, "Sgx"),
Env::Sim => ::core::fmt::Formatter::write_str(f, "Sim"),
Env::P1 => ::core::fmt::Formatter::write_str(f, "P1"),
Env::P2 => ::core::fmt::Formatter::write_str(f, "P2"),
Env::P3 => ::core::fmt::Formatter::write_str(f, "P3"),
Env::Uclibc => ::core::fmt::Formatter::write_str(f, "Uclibc"),
Env::V5 => ::core::fmt::Formatter::write_str(f, "V5"),
Env::Unspecified =>
::core::fmt::Formatter::write_str(f, "Unspecified"),
Env::Other(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Other",
&__self_0),
}
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for Env {
#[inline]
fn partial_cmp(&self, other: &Env)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
match (self, other) {
(Env::Other(__self_0), Env::Other(__arg1_0)) =>
::core::cmp::PartialOrd::partial_cmp(__self_0, __arg1_0),
_ =>
::core::cmp::PartialOrd::partial_cmp(&__self_discr,
&__arg1_discr),
}
}
}
#[automatically_derived]
impl ::core::cmp::Ord for Env {
#[inline]
fn cmp(&self, other: &Env) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
match ::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr) {
::core::cmp::Ordering::Equal =>
match (self, other) {
(Env::Other(__self_0), Env::Other(__arg1_0)) =>
::core::cmp::Ord::cmp(__self_0, __arg1_0),
_ => ::core::cmp::Ordering::Equal,
},
cmp => cmp,
}
}
}
impl schemars::JsonSchema for Env {
fn schema_name() -> std::borrow::Cow<'static, str> {
std::borrow::Cow::Borrowed("Env")
}
fn json_schema(_: &mut schemars::SchemaGenerator) -> schemars::Schema {
<::schemars::Schema as
::core::convert::TryFrom<_>>::try_from(::serde_json::Value::Object({
let mut object = ::serde_json::Map::new();
let _ =
object.insert(("type").into(),
::serde_json::to_value(&"string").unwrap());
object
})).unwrap()
}
}
impl FromStr for Env {
type Err = core::convert::Infallible;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"gnu" => Self::Gnu,
"macabi" => Self::MacAbi,
"mlibc" => Self::Mlibc,
"msvc" => Self::Msvc,
"musl" => Self::Musl,
"newlib" => Self::Newlib,
"nto70" => Self::Nto70,
"nto71" => Self::Nto71,
"nto71_iosock" => Self::Nto71IoSock,
"nto80" => Self::Nto80,
"ohos" => Self::Ohos,
"relibc" => Self::Relibc,
"sgx" => Self::Sgx,
"sim" => Self::Sim,
"p1" => Self::P1,
"p2" => Self::P2,
"p3" => Self::P3,
"uclibc" => Self::Uclibc,
"v5" => Self::V5,
"" => Self::Unspecified,
_ => Self::Other(s.to_owned().into()),
})
}
}
impl Env {
pub fn desc(&self) -> &str {
match self {
Self::Gnu => "gnu",
Self::MacAbi => "macabi",
Self::Mlibc => "mlibc",
Self::Msvc => "msvc",
Self::Musl => "musl",
Self::Newlib => "newlib",
Self::Nto70 => "nto70",
Self::Nto71 => "nto71",
Self::Nto71IoSock => "nto71_iosock",
Self::Nto80 => "nto80",
Self::Ohos => "ohos",
Self::Relibc => "relibc",
Self::Sgx => "sgx",
Self::Sim => "sim",
Self::P1 => "p1",
Self::P2 => "p2",
Self::P3 => "p3",
Self::Uclibc => "uclibc",
Self::V5 => "v5",
Self::Unspecified => "",
Self::Other(name) => name.as_ref(),
}
}
}
impl crate::json::ToJson for Env {
fn to_json(&self) -> crate::json::Json { self.desc().to_json() }
}
impl<'de> serde::Deserialize<'de> for Env {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}
impl std::fmt::Display for Env {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.desc())
}
}crate::target_spec_enum! {
2009 pub enum Env {
2010 Gnu = "gnu",
2011 MacAbi = "macabi",
2012 Mlibc = "mlibc",
2013 Msvc = "msvc",
2014 Musl = "musl",
2015 Newlib = "newlib",
2016 Nto70 = "nto70",
2017 Nto71 = "nto71",
2018 Nto71IoSock = "nto71_iosock",
2019 Nto80 = "nto80",
2020 Ohos = "ohos",
2021 Relibc = "relibc",
2022 Sgx = "sgx",
2023 Sim = "sim",
2024 P1 = "p1",
2025 P2 = "p2",
2026 P3 = "p3",
2027 Uclibc = "uclibc",
2028 V5 = "v5",
2029 Unspecified = "",
2030 }
2031 other_variant = Other;
2032}
2033
2034impl Env {
2035 pub fn desc_symbol(&self) -> Symbol {
2036 Symbol::intern(self.desc())
2037 }
2038}
2039
2040pub enum Abi {
Abi64,
AbiV2,
AbiV2Hf,
Eabi,
EabiHf,
ElfV1,
ElfV2,
Fortanix,
Ilp32,
Ilp32e,
Llvm,
MacAbi,
Sim,
SoftFloat,
Spe,
Uwp,
VecDefault,
VecExtAbi,
X32,
Unspecified,
Other(crate::spec::StaticCow<str>),
}
#[automatically_derived]
impl ::core::clone::Clone for Abi {
#[inline]
fn clone(&self) -> Abi {
match self {
Abi::Abi64 => Abi::Abi64,
Abi::AbiV2 => Abi::AbiV2,
Abi::AbiV2Hf => Abi::AbiV2Hf,
Abi::Eabi => Abi::Eabi,
Abi::EabiHf => Abi::EabiHf,
Abi::ElfV1 => Abi::ElfV1,
Abi::ElfV2 => Abi::ElfV2,
Abi::Fortanix => Abi::Fortanix,
Abi::Ilp32 => Abi::Ilp32,
Abi::Ilp32e => Abi::Ilp32e,
Abi::Llvm => Abi::Llvm,
Abi::MacAbi => Abi::MacAbi,
Abi::Sim => Abi::Sim,
Abi::SoftFloat => Abi::SoftFloat,
Abi::Spe => Abi::Spe,
Abi::Uwp => Abi::Uwp,
Abi::VecDefault => Abi::VecDefault,
Abi::VecExtAbi => Abi::VecExtAbi,
Abi::X32 => Abi::X32,
Abi::Unspecified => Abi::Unspecified,
Abi::Other(__self_0) =>
Abi::Other(::core::clone::Clone::clone(__self_0)),
}
}
}
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for Abi { }
#[automatically_derived]
impl ::core::cmp::PartialEq for Abi {
#[inline]
fn eq(&self, other: &Abi) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(Abi::Other(__self_0), Abi::Other(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}
#[automatically_derived]
impl ::core::cmp::Eq for Abi {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) -> () {
let _: ::core::cmp::AssertParamIsEq<crate::spec::StaticCow<str>>;
}
}
#[automatically_derived]
impl ::core::hash::Hash for Abi {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state);
match self {
Abi::Other(__self_0) => ::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}
#[automatically_derived]
impl ::core::fmt::Debug for Abi {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Abi::Abi64 => ::core::fmt::Formatter::write_str(f, "Abi64"),
Abi::AbiV2 => ::core::fmt::Formatter::write_str(f, "AbiV2"),
Abi::AbiV2Hf => ::core::fmt::Formatter::write_str(f, "AbiV2Hf"),
Abi::Eabi => ::core::fmt::Formatter::write_str(f, "Eabi"),
Abi::EabiHf => ::core::fmt::Formatter::write_str(f, "EabiHf"),
Abi::ElfV1 => ::core::fmt::Formatter::write_str(f, "ElfV1"),
Abi::ElfV2 => ::core::fmt::Formatter::write_str(f, "ElfV2"),
Abi::Fortanix => ::core::fmt::Formatter::write_str(f, "Fortanix"),
Abi::Ilp32 => ::core::fmt::Formatter::write_str(f, "Ilp32"),
Abi::Ilp32e => ::core::fmt::Formatter::write_str(f, "Ilp32e"),
Abi::Llvm => ::core::fmt::Formatter::write_str(f, "Llvm"),
Abi::MacAbi => ::core::fmt::Formatter::write_str(f, "MacAbi"),
Abi::Sim => ::core::fmt::Formatter::write_str(f, "Sim"),
Abi::SoftFloat =>
::core::fmt::Formatter::write_str(f, "SoftFloat"),
Abi::Spe => ::core::fmt::Formatter::write_str(f, "Spe"),
Abi::Uwp => ::core::fmt::Formatter::write_str(f, "Uwp"),
Abi::VecDefault =>
::core::fmt::Formatter::write_str(f, "VecDefault"),
Abi::VecExtAbi =>
::core::fmt::Formatter::write_str(f, "VecExtAbi"),
Abi::X32 => ::core::fmt::Formatter::write_str(f, "X32"),
Abi::Unspecified =>
::core::fmt::Formatter::write_str(f, "Unspecified"),
Abi::Other(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Other",
&__self_0),
}
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for Abi {
#[inline]
fn partial_cmp(&self, other: &Abi)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
match (self, other) {
(Abi::Other(__self_0), Abi::Other(__arg1_0)) =>
::core::cmp::PartialOrd::partial_cmp(__self_0, __arg1_0),
_ =>
::core::cmp::PartialOrd::partial_cmp(&__self_discr,
&__arg1_discr),
}
}
}
#[automatically_derived]
impl ::core::cmp::Ord for Abi {
#[inline]
fn cmp(&self, other: &Abi) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
match ::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr) {
::core::cmp::Ordering::Equal =>
match (self, other) {
(Abi::Other(__self_0), Abi::Other(__arg1_0)) =>
::core::cmp::Ord::cmp(__self_0, __arg1_0),
_ => ::core::cmp::Ordering::Equal,
},
cmp => cmp,
}
}
}
impl schemars::JsonSchema for Abi {
fn schema_name() -> std::borrow::Cow<'static, str> {
std::borrow::Cow::Borrowed("Abi")
}
fn json_schema(_: &mut schemars::SchemaGenerator) -> schemars::Schema {
<::schemars::Schema as
::core::convert::TryFrom<_>>::try_from(::serde_json::Value::Object({
let mut object = ::serde_json::Map::new();
let _ =
object.insert(("type").into(),
::serde_json::to_value(&"string").unwrap());
object
})).unwrap()
}
}
impl FromStr for Abi {
type Err = core::convert::Infallible;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"abi64" => Self::Abi64,
"abiv2" => Self::AbiV2,
"abiv2hf" => Self::AbiV2Hf,
"eabi" => Self::Eabi,
"eabihf" => Self::EabiHf,
"elfv1" => Self::ElfV1,
"elfv2" => Self::ElfV2,
"fortanix" => Self::Fortanix,
"ilp32" => Self::Ilp32,
"ilp32e" => Self::Ilp32e,
"llvm" => Self::Llvm,
"macabi" => Self::MacAbi,
"sim" => Self::Sim,
"softfloat" => Self::SoftFloat,
"spe" => Self::Spe,
"uwp" => Self::Uwp,
"vec-default" => Self::VecDefault,
"vec-extabi" => Self::VecExtAbi,
"x32" => Self::X32,
"" => Self::Unspecified,
_ => Self::Other(s.to_owned().into()),
})
}
}
impl Abi {
pub fn desc(&self) -> &str {
match self {
Self::Abi64 => "abi64",
Self::AbiV2 => "abiv2",
Self::AbiV2Hf => "abiv2hf",
Self::Eabi => "eabi",
Self::EabiHf => "eabihf",
Self::ElfV1 => "elfv1",
Self::ElfV2 => "elfv2",
Self::Fortanix => "fortanix",
Self::Ilp32 => "ilp32",
Self::Ilp32e => "ilp32e",
Self::Llvm => "llvm",
Self::MacAbi => "macabi",
Self::Sim => "sim",
Self::SoftFloat => "softfloat",
Self::Spe => "spe",
Self::Uwp => "uwp",
Self::VecDefault => "vec-default",
Self::VecExtAbi => "vec-extabi",
Self::X32 => "x32",
Self::Unspecified => "",
Self::Other(name) => name.as_ref(),
}
}
}
impl crate::json::ToJson for Abi {
fn to_json(&self) -> crate::json::Json { self.desc().to_json() }
}
impl<'de> serde::Deserialize<'de> for Abi {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}
impl std::fmt::Display for Abi {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.desc())
}
}crate::target_spec_enum! {
2041 pub enum Abi {
2042 Abi64 = "abi64",
2043 AbiV2 = "abiv2",
2044 AbiV2Hf = "abiv2hf",
2045 Eabi = "eabi",
2046 EabiHf = "eabihf",
2047 ElfV1 = "elfv1",
2048 ElfV2 = "elfv2",
2049 Fortanix = "fortanix",
2050 Ilp32 = "ilp32",
2051 Ilp32e = "ilp32e",
2052 Llvm = "llvm",
2053 MacAbi = "macabi",
2054 Sim = "sim",
2055 SoftFloat = "softfloat",
2056 Spe = "spe",
2057 Uwp = "uwp",
2058 VecDefault = "vec-default",
2059 VecExtAbi = "vec-extabi",
2060 X32 = "x32",
2061 Unspecified = "",
2062 }
2063 other_variant = Other;
2064}
2065
2066impl Abi {
2067 pub fn desc_symbol(&self) -> Symbol {
2068 Symbol::intern(self.desc())
2069 }
2070}
2071
2072#[derive(#[automatically_derived]
impl ::core::cmp::PartialEq for Target {
#[inline]
fn eq(&self, other: &Target) -> bool {
self.pointer_width == other.pointer_width &&
self.llvm_target == other.llvm_target &&
self.metadata == other.metadata && self.arch == other.arch
&& self.data_layout == other.data_layout &&
self.options == other.options
}
}PartialEq, #[automatically_derived]
impl ::core::clone::Clone for Target {
#[inline]
fn clone(&self) -> Target {
Target {
llvm_target: ::core::clone::Clone::clone(&self.llvm_target),
metadata: ::core::clone::Clone::clone(&self.metadata),
pointer_width: ::core::clone::Clone::clone(&self.pointer_width),
arch: ::core::clone::Clone::clone(&self.arch),
data_layout: ::core::clone::Clone::clone(&self.data_layout),
options: ::core::clone::Clone::clone(&self.options),
}
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for Target {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
&["llvm_target", "metadata", "pointer_width", "arch",
"data_layout", "options"];
let values: &[&dyn ::core::fmt::Debug] =
&[&self.llvm_target, &self.metadata, &self.pointer_width,
&self.arch, &self.data_layout, &&self.options];
::core::fmt::Formatter::debug_struct_fields_finish(f, "Target", names,
values)
}
}Debug)]
2076pub struct Target {
2077 pub llvm_target: StaticCow<str>,
2084 pub metadata: TargetMetadata,
2087 pub pointer_width: u16,
2089 pub arch: Arch,
2092 pub data_layout: StaticCow<str>,
2094 pub options: TargetOptions,
2096}
2097
2098#[derive(#[automatically_derived]
impl ::core::default::Default for TargetMetadata {
#[inline]
fn default() -> TargetMetadata {
TargetMetadata {
description: ::core::default::Default::default(),
tier: ::core::default::Default::default(),
host_tools: ::core::default::Default::default(),
std: ::core::default::Default::default(),
}
}
}Default, #[automatically_derived]
impl ::core::cmp::PartialEq for TargetMetadata {
#[inline]
fn eq(&self, other: &TargetMetadata) -> bool {
self.description == other.description && self.tier == other.tier &&
self.host_tools == other.host_tools && self.std == other.std
}
}PartialEq, #[automatically_derived]
impl ::core::clone::Clone for TargetMetadata {
#[inline]
fn clone(&self) -> TargetMetadata {
TargetMetadata {
description: ::core::clone::Clone::clone(&self.description),
tier: ::core::clone::Clone::clone(&self.tier),
host_tools: ::core::clone::Clone::clone(&self.host_tools),
std: ::core::clone::Clone::clone(&self.std),
}
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for TargetMetadata {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field4_finish(f,
"TargetMetadata", "description", &self.description, "tier",
&self.tier, "host_tools", &self.host_tools, "std", &&self.std)
}
}Debug)]
2102pub struct TargetMetadata {
2103 pub description: Option<StaticCow<str>>,
2106 pub tier: Option<u64>,
2108 pub host_tools: Option<bool>,
2110 pub std: Option<bool>,
2113}
2114
2115impl Target {
2116 pub fn parse_data_layout(&self) -> Result<TargetDataLayout, TargetDataLayoutErrors<'_>> {
2117 let mut dl = TargetDataLayout::parse_from_llvm_datalayout_string(
2118 &self.data_layout,
2119 self.options.default_address_space,
2120 )?;
2121
2122 if dl.endian != self.endian {
2124 return Err(TargetDataLayoutErrors::InconsistentTargetArchitecture {
2125 dl: dl.endian.as_str(),
2126 target: self.endian.as_str(),
2127 });
2128 }
2129
2130 let target_pointer_width: u64 = self.pointer_width.into();
2131 let dl_pointer_size: u64 = dl.pointer_size().bits();
2132 if dl_pointer_size != target_pointer_width {
2133 return Err(TargetDataLayoutErrors::InconsistentTargetPointerWidth {
2134 pointer_size: dl_pointer_size,
2135 target: self.pointer_width,
2136 });
2137 }
2138
2139 dl.c_enum_min_size = Integer::from_size(Size::from_bits(
2140 self.c_enum_min_bits.unwrap_or(self.c_int_width as _),
2141 ))
2142 .map_err(|err| TargetDataLayoutErrors::InvalidBitsSize { err })?;
2143
2144 Ok(dl)
2145 }
2146}
2147
2148pub trait HasTargetSpec {
2149 fn target_spec(&self) -> &Target;
2150}
2151
2152impl HasTargetSpec for Target {
2153 #[inline]
2154 fn target_spec(&self) -> &Target {
2155 self
2156 }
2157}
2158
2159#[derive(#[automatically_derived]
impl ::core::fmt::Debug for X86Abi {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f, "X86Abi",
"regparm", &self.regparm, "reg_struct_return",
&&self.reg_struct_return)
}
}Debug, #[automatically_derived]
impl ::core::marker::Copy for X86Abi { }Copy, #[automatically_derived]
impl ::core::clone::Clone for X86Abi {
#[inline]
fn clone(&self) -> X86Abi {
let _: ::core::clone::AssertParamIsClone<Option<u32>>;
let _: ::core::clone::AssertParamIsClone<bool>;
*self
}
}Clone, #[automatically_derived]
impl ::core::hash::Hash for X86Abi {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () {
::core::hash::Hash::hash(&self.regparm, state);
::core::hash::Hash::hash(&self.reg_struct_return, state)
}
}Hash, #[automatically_derived]
impl ::core::cmp::PartialEq for X86Abi {
#[inline]
fn eq(&self, other: &X86Abi) -> bool {
self.reg_struct_return == other.reg_struct_return &&
self.regparm == other.regparm
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for X86Abi {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) -> () {
let _: ::core::cmp::AssertParamIsEq<Option<u32>>;
let _: ::core::cmp::AssertParamIsEq<bool>;
}
}Eq)]
2161pub struct X86Abi {
2162 pub regparm: Option<u32>,
2165 pub reg_struct_return: bool,
2167}
2168
2169pub trait HasX86AbiOpt {
2170 fn x86_abi_opt(&self) -> X86Abi;
2171}
2172
2173type StaticCow<T> = Cow<'static, T>;
2174
2175#[derive(#[automatically_derived]
impl ::core::cmp::PartialEq for TargetOptions {
#[inline]
fn eq(&self, other: &TargetOptions) -> bool {
self.c_int_width == other.c_int_width &&
self.linker_is_gnu_json == other.linker_is_gnu_json &&
self.need_explicit_cpu == other.need_explicit_cpu &&
self.dynamic_linking == other.dynamic_linking &&
self.dll_tls_export == other.dll_tls_export &&
self.only_cdylib == other.only_cdylib &&
self.executables == other.executables &&
self.disable_redzone == other.disable_redzone &&
self.function_sections == other.function_sections &&
self.abi_return_struct_as_int ==
other.abi_return_struct_as_int &&
self.is_like_aix == other.is_like_aix &&
self.is_like_darwin == other.is_like_darwin &&
self.is_like_gpu == other.is_like_gpu &&
self.is_like_solaris == other.is_like_solaris &&
self.is_like_windows == other.is_like_windows &&
self.is_like_msvc == other.is_like_msvc &&
self.is_like_wasm == other.is_like_wasm &&
self.is_like_android == other.is_like_android &&
self.is_like_vexos == other.is_like_vexos &&
self.default_dwarf_version == other.default_dwarf_version &&
self.allows_weak_linkage == other.allows_weak_linkage &&
self.has_rpath == other.has_rpath &&
self.no_default_libraries == other.no_default_libraries &&
self.position_independent_executables ==
other.position_independent_executables &&
self.static_position_independent_executables ==
other.static_position_independent_executables &&
self.plt_by_default == other.plt_by_default &&
self.allow_asm == other.allow_asm &&
self.static_initializer_must_be_acyclic ==
other.static_initializer_must_be_acyclic &&
self.main_needs_argc_argv == other.main_needs_argc_argv &&
self.has_thread_local == other.has_thread_local &&
self.obj_is_bitcode == other.obj_is_bitcode &&
self.atomic_cas == other.atomic_cas &&
self.crt_static_allows_dylibs ==
other.crt_static_allows_dylibs &&
self.crt_static_default == other.crt_static_default &&
self.crt_static_respected == other.crt_static_respected &&
self.trap_unreachable == other.trap_unreachable &&
self.requires_lto == other.requires_lto &&
self.singlethread == other.singlethread &&
self.no_builtins == other.no_builtins &&
self.emit_debug_gdb_scripts == other.emit_debug_gdb_scripts
&& self.requires_uwtable == other.requires_uwtable &&
self.default_uwtable == other.default_uwtable &&
self.simd_types_indirect == other.simd_types_indirect &&
self.limit_rdylib_exports == other.limit_rdylib_exports &&
self.relax_elf_relocations == other.relax_elf_relocations &&
self.use_ctors_section == other.use_ctors_section &&
self.eh_frame_header == other.eh_frame_header &&
self.has_thumb_interworking == other.has_thumb_interworking
&&
self.generate_arange_section ==
other.generate_arange_section &&
self.supports_stack_protector ==
other.supports_stack_protector &&
self.supports_xray == other.supports_xray &&
self.endian == other.endian && self.os == other.os &&
self.env == other.env && self.abi == other.abi &&
self.vendor == other.vendor && self.linker == other.linker
&& self.linker_flavor == other.linker_flavor &&
self.linker_flavor_json == other.linker_flavor_json &&
self.lld_flavor_json == other.lld_flavor_json &&
self.pre_link_objects == other.pre_link_objects &&
self.post_link_objects == other.post_link_objects &&
self.pre_link_objects_self_contained ==
other.pre_link_objects_self_contained &&
self.post_link_objects_self_contained ==
other.post_link_objects_self_contained &&
self.link_self_contained == other.link_self_contained &&
self.pre_link_args == other.pre_link_args &&
self.pre_link_args_json == other.pre_link_args_json &&
self.late_link_args == other.late_link_args &&
self.late_link_args_json == other.late_link_args_json &&
self.late_link_args_dynamic == other.late_link_args_dynamic
&&
self.late_link_args_dynamic_json ==
other.late_link_args_dynamic_json &&
self.late_link_args_static == other.late_link_args_static &&
self.late_link_args_static_json ==
other.late_link_args_static_json &&
self.post_link_args == other.post_link_args &&
self.post_link_args_json == other.post_link_args_json &&
self.link_script == other.link_script &&
self.link_env == other.link_env &&
self.link_env_remove == other.link_env_remove &&
self.asm_args == other.asm_args && self.cpu == other.cpu &&
self.features == other.features &&
self.direct_access_external_data ==
other.direct_access_external_data &&
self.relocation_model == other.relocation_model &&
self.code_model == other.code_model &&
self.tls_model == other.tls_model &&
self.frame_pointer == other.frame_pointer &&
self.dll_prefix == other.dll_prefix &&
self.dll_suffix == other.dll_suffix &&
self.exe_suffix == other.exe_suffix &&
self.staticlib_prefix == other.staticlib_prefix &&
self.staticlib_suffix == other.staticlib_suffix &&
self.families == other.families &&
self.binary_format == other.binary_format &&
self.relro_level == other.relro_level &&
self.archive_format == other.archive_format &&
self.min_atomic_width == other.min_atomic_width &&
self.max_atomic_width == other.max_atomic_width &&
self.panic_strategy == other.panic_strategy &&
self.stack_probes == other.stack_probes &&
self.min_global_align == other.min_global_align &&
self.default_codegen_units == other.default_codegen_units &&
self.default_codegen_backend ==
other.default_codegen_backend &&
self.default_visibility == other.default_visibility &&
self.override_export_symbols ==
other.override_export_symbols &&
self.merge_functions == other.merge_functions &&
self.mcount == other.mcount &&
self.llvm_mcount_intrinsic == other.llvm_mcount_intrinsic &&
self.llvm_abiname == other.llvm_abiname &&
self.llvm_floatabi == other.llvm_floatabi &&
self.rustc_abi == other.rustc_abi &&
self.llvm_args == other.llvm_args &&
self.debuginfo_kind == other.debuginfo_kind &&
self.split_debuginfo == other.split_debuginfo &&
self.supported_split_debuginfo ==
other.supported_split_debuginfo &&
self.supported_sanitizers == other.supported_sanitizers &&
self.default_sanitizers == other.default_sanitizers &&
self.c_enum_min_bits == other.c_enum_min_bits &&
self.entry_name == other.entry_name &&
self.entry_abi == other.entry_abi &&
self.default_address_space == other.default_address_space &&
self.small_data_threshold_support ==
other.small_data_threshold_support
}
}PartialEq, #[automatically_derived]
impl ::core::clone::Clone for TargetOptions {
#[inline]
fn clone(&self) -> TargetOptions {
TargetOptions {
endian: ::core::clone::Clone::clone(&self.endian),
c_int_width: ::core::clone::Clone::clone(&self.c_int_width),
os: ::core::clone::Clone::clone(&self.os),
env: ::core::clone::Clone::clone(&self.env),
abi: ::core::clone::Clone::clone(&self.abi),
vendor: ::core::clone::Clone::clone(&self.vendor),
linker: ::core::clone::Clone::clone(&self.linker),
linker_flavor: ::core::clone::Clone::clone(&self.linker_flavor),
linker_flavor_json: ::core::clone::Clone::clone(&self.linker_flavor_json),
lld_flavor_json: ::core::clone::Clone::clone(&self.lld_flavor_json),
linker_is_gnu_json: ::core::clone::Clone::clone(&self.linker_is_gnu_json),
pre_link_objects: ::core::clone::Clone::clone(&self.pre_link_objects),
post_link_objects: ::core::clone::Clone::clone(&self.post_link_objects),
pre_link_objects_self_contained: ::core::clone::Clone::clone(&self.pre_link_objects_self_contained),
post_link_objects_self_contained: ::core::clone::Clone::clone(&self.post_link_objects_self_contained),
link_self_contained: ::core::clone::Clone::clone(&self.link_self_contained),
pre_link_args: ::core::clone::Clone::clone(&self.pre_link_args),
pre_link_args_json: ::core::clone::Clone::clone(&self.pre_link_args_json),
late_link_args: ::core::clone::Clone::clone(&self.late_link_args),
late_link_args_json: ::core::clone::Clone::clone(&self.late_link_args_json),
late_link_args_dynamic: ::core::clone::Clone::clone(&self.late_link_args_dynamic),
late_link_args_dynamic_json: ::core::clone::Clone::clone(&self.late_link_args_dynamic_json),
late_link_args_static: ::core::clone::Clone::clone(&self.late_link_args_static),
late_link_args_static_json: ::core::clone::Clone::clone(&self.late_link_args_static_json),
post_link_args: ::core::clone::Clone::clone(&self.post_link_args),
post_link_args_json: ::core::clone::Clone::clone(&self.post_link_args_json),
link_script: ::core::clone::Clone::clone(&self.link_script),
link_env: ::core::clone::Clone::clone(&self.link_env),
link_env_remove: ::core::clone::Clone::clone(&self.link_env_remove),
asm_args: ::core::clone::Clone::clone(&self.asm_args),
cpu: ::core::clone::Clone::clone(&self.cpu),
need_explicit_cpu: ::core::clone::Clone::clone(&self.need_explicit_cpu),
features: ::core::clone::Clone::clone(&self.features),
direct_access_external_data: ::core::clone::Clone::clone(&self.direct_access_external_data),
dynamic_linking: ::core::clone::Clone::clone(&self.dynamic_linking),
dll_tls_export: ::core::clone::Clone::clone(&self.dll_tls_export),
only_cdylib: ::core::clone::Clone::clone(&self.only_cdylib),
executables: ::core::clone::Clone::clone(&self.executables),
relocation_model: ::core::clone::Clone::clone(&self.relocation_model),
code_model: ::core::clone::Clone::clone(&self.code_model),
tls_model: ::core::clone::Clone::clone(&self.tls_model),
disable_redzone: ::core::clone::Clone::clone(&self.disable_redzone),
frame_pointer: ::core::clone::Clone::clone(&self.frame_pointer),
function_sections: ::core::clone::Clone::clone(&self.function_sections),
dll_prefix: ::core::clone::Clone::clone(&self.dll_prefix),
dll_suffix: ::core::clone::Clone::clone(&self.dll_suffix),
exe_suffix: ::core::clone::Clone::clone(&self.exe_suffix),
staticlib_prefix: ::core::clone::Clone::clone(&self.staticlib_prefix),
staticlib_suffix: ::core::clone::Clone::clone(&self.staticlib_suffix),
families: ::core::clone::Clone::clone(&self.families),
abi_return_struct_as_int: ::core::clone::Clone::clone(&self.abi_return_struct_as_int),
is_like_aix: ::core::clone::Clone::clone(&self.is_like_aix),
is_like_darwin: ::core::clone::Clone::clone(&self.is_like_darwin),
is_like_gpu: ::core::clone::Clone::clone(&self.is_like_gpu),
is_like_solaris: ::core::clone::Clone::clone(&self.is_like_solaris),
is_like_windows: ::core::clone::Clone::clone(&self.is_like_windows),
is_like_msvc: ::core::clone::Clone::clone(&self.is_like_msvc),
is_like_wasm: ::core::clone::Clone::clone(&self.is_like_wasm),
is_like_android: ::core::clone::Clone::clone(&self.is_like_android),
is_like_vexos: ::core::clone::Clone::clone(&self.is_like_vexos),
binary_format: ::core::clone::Clone::clone(&self.binary_format),
default_dwarf_version: ::core::clone::Clone::clone(&self.default_dwarf_version),
allows_weak_linkage: ::core::clone::Clone::clone(&self.allows_weak_linkage),
has_rpath: ::core::clone::Clone::clone(&self.has_rpath),
no_default_libraries: ::core::clone::Clone::clone(&self.no_default_libraries),
position_independent_executables: ::core::clone::Clone::clone(&self.position_independent_executables),
static_position_independent_executables: ::core::clone::Clone::clone(&self.static_position_independent_executables),
plt_by_default: ::core::clone::Clone::clone(&self.plt_by_default),
relro_level: ::core::clone::Clone::clone(&self.relro_level),
archive_format: ::core::clone::Clone::clone(&self.archive_format),
allow_asm: ::core::clone::Clone::clone(&self.allow_asm),
static_initializer_must_be_acyclic: ::core::clone::Clone::clone(&self.static_initializer_must_be_acyclic),
main_needs_argc_argv: ::core::clone::Clone::clone(&self.main_needs_argc_argv),
has_thread_local: ::core::clone::Clone::clone(&self.has_thread_local),
obj_is_bitcode: ::core::clone::Clone::clone(&self.obj_is_bitcode),
min_atomic_width: ::core::clone::Clone::clone(&self.min_atomic_width),
max_atomic_width: ::core::clone::Clone::clone(&self.max_atomic_width),
atomic_cas: ::core::clone::Clone::clone(&self.atomic_cas),
panic_strategy: ::core::clone::Clone::clone(&self.panic_strategy),
crt_static_allows_dylibs: ::core::clone::Clone::clone(&self.crt_static_allows_dylibs),
crt_static_default: ::core::clone::Clone::clone(&self.crt_static_default),
crt_static_respected: ::core::clone::Clone::clone(&self.crt_static_respected),
stack_probes: ::core::clone::Clone::clone(&self.stack_probes),
min_global_align: ::core::clone::Clone::clone(&self.min_global_align),
default_codegen_units: ::core::clone::Clone::clone(&self.default_codegen_units),
default_codegen_backend: ::core::clone::Clone::clone(&self.default_codegen_backend),
trap_unreachable: ::core::clone::Clone::clone(&self.trap_unreachable),
requires_lto: ::core::clone::Clone::clone(&self.requires_lto),
singlethread: ::core::clone::Clone::clone(&self.singlethread),
no_builtins: ::core::clone::Clone::clone(&self.no_builtins),
default_visibility: ::core::clone::Clone::clone(&self.default_visibility),
emit_debug_gdb_scripts: ::core::clone::Clone::clone(&self.emit_debug_gdb_scripts),
requires_uwtable: ::core::clone::Clone::clone(&self.requires_uwtable),
default_uwtable: ::core::clone::Clone::clone(&self.default_uwtable),
simd_types_indirect: ::core::clone::Clone::clone(&self.simd_types_indirect),
limit_rdylib_exports: ::core::clone::Clone::clone(&self.limit_rdylib_exports),
override_export_symbols: ::core::clone::Clone::clone(&self.override_export_symbols),
merge_functions: ::core::clone::Clone::clone(&self.merge_functions),
mcount: ::core::clone::Clone::clone(&self.mcount),
llvm_mcount_intrinsic: ::core::clone::Clone::clone(&self.llvm_mcount_intrinsic),
llvm_abiname: ::core::clone::Clone::clone(&self.llvm_abiname),
llvm_floatabi: ::core::clone::Clone::clone(&self.llvm_floatabi),
rustc_abi: ::core::clone::Clone::clone(&self.rustc_abi),
relax_elf_relocations: ::core::clone::Clone::clone(&self.relax_elf_relocations),
llvm_args: ::core::clone::Clone::clone(&self.llvm_args),
use_ctors_section: ::core::clone::Clone::clone(&self.use_ctors_section),
eh_frame_header: ::core::clone::Clone::clone(&self.eh_frame_header),
has_thumb_interworking: ::core::clone::Clone::clone(&self.has_thumb_interworking),
debuginfo_kind: ::core::clone::Clone::clone(&self.debuginfo_kind),
split_debuginfo: ::core::clone::Clone::clone(&self.split_debuginfo),
supported_split_debuginfo: ::core::clone::Clone::clone(&self.supported_split_debuginfo),
supported_sanitizers: ::core::clone::Clone::clone(&self.supported_sanitizers),
default_sanitizers: ::core::clone::Clone::clone(&self.default_sanitizers),
c_enum_min_bits: ::core::clone::Clone::clone(&self.c_enum_min_bits),
generate_arange_section: ::core::clone::Clone::clone(&self.generate_arange_section),
supports_stack_protector: ::core::clone::Clone::clone(&self.supports_stack_protector),
entry_name: ::core::clone::Clone::clone(&self.entry_name),
entry_abi: ::core::clone::Clone::clone(&self.entry_abi),
supports_xray: ::core::clone::Clone::clone(&self.supports_xray),
default_address_space: ::core::clone::Clone::clone(&self.default_address_space),
small_data_threshold_support: ::core::clone::Clone::clone(&self.small_data_threshold_support),
}
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for TargetOptions {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
&["endian", "c_int_width", "os", "env", "abi", "vendor", "linker",
"linker_flavor", "linker_flavor_json", "lld_flavor_json",
"linker_is_gnu_json", "pre_link_objects",
"post_link_objects", "pre_link_objects_self_contained",
"post_link_objects_self_contained", "link_self_contained",
"pre_link_args", "pre_link_args_json", "late_link_args",
"late_link_args_json", "late_link_args_dynamic",
"late_link_args_dynamic_json", "late_link_args_static",
"late_link_args_static_json", "post_link_args",
"post_link_args_json", "link_script", "link_env",
"link_env_remove", "asm_args", "cpu", "need_explicit_cpu",
"features", "direct_access_external_data",
"dynamic_linking", "dll_tls_export", "only_cdylib",
"executables", "relocation_model", "code_model",
"tls_model", "disable_redzone", "frame_pointer",
"function_sections", "dll_prefix", "dll_suffix",
"exe_suffix", "staticlib_prefix", "staticlib_suffix",
"families", "abi_return_struct_as_int", "is_like_aix",
"is_like_darwin", "is_like_gpu", "is_like_solaris",
"is_like_windows", "is_like_msvc", "is_like_wasm",
"is_like_android", "is_like_vexos", "binary_format",
"default_dwarf_version", "allows_weak_linkage", "has_rpath",
"no_default_libraries", "position_independent_executables",
"static_position_independent_executables", "plt_by_default",
"relro_level", "archive_format", "allow_asm",
"static_initializer_must_be_acyclic",
"main_needs_argc_argv", "has_thread_local",
"obj_is_bitcode", "min_atomic_width", "max_atomic_width",
"atomic_cas", "panic_strategy", "crt_static_allows_dylibs",
"crt_static_default", "crt_static_respected",
"stack_probes", "min_global_align", "default_codegen_units",
"default_codegen_backend", "trap_unreachable",
"requires_lto", "singlethread", "no_builtins",
"default_visibility", "emit_debug_gdb_scripts",
"requires_uwtable", "default_uwtable",
"simd_types_indirect", "limit_rdylib_exports",
"override_export_symbols", "merge_functions", "mcount",
"llvm_mcount_intrinsic", "llvm_abiname", "llvm_floatabi",
"rustc_abi", "relax_elf_relocations", "llvm_args",
"use_ctors_section", "eh_frame_header",
"has_thumb_interworking", "debuginfo_kind",
"split_debuginfo", "supported_split_debuginfo",
"supported_sanitizers", "default_sanitizers",
"c_enum_min_bits", "generate_arange_section",
"supports_stack_protector", "entry_name", "entry_abi",
"supports_xray", "default_address_space",
"small_data_threshold_support"];
let values: &[&dyn ::core::fmt::Debug] =
&[&self.endian, &self.c_int_width, &self.os, &self.env, &self.abi,
&self.vendor, &self.linker, &self.linker_flavor,
&self.linker_flavor_json, &self.lld_flavor_json,
&self.linker_is_gnu_json, &self.pre_link_objects,
&self.post_link_objects,
&self.pre_link_objects_self_contained,
&self.post_link_objects_self_contained,
&self.link_self_contained, &self.pre_link_args,
&self.pre_link_args_json, &self.late_link_args,
&self.late_link_args_json, &self.late_link_args_dynamic,
&self.late_link_args_dynamic_json,
&self.late_link_args_static,
&self.late_link_args_static_json, &self.post_link_args,
&self.post_link_args_json, &self.link_script,
&self.link_env, &self.link_env_remove, &self.asm_args,
&self.cpu, &self.need_explicit_cpu, &self.features,
&self.direct_access_external_data, &self.dynamic_linking,
&self.dll_tls_export, &self.only_cdylib, &self.executables,
&self.relocation_model, &self.code_model, &self.tls_model,
&self.disable_redzone, &self.frame_pointer,
&self.function_sections, &self.dll_prefix, &self.dll_suffix,
&self.exe_suffix, &self.staticlib_prefix,
&self.staticlib_suffix, &self.families,
&self.abi_return_struct_as_int, &self.is_like_aix,
&self.is_like_darwin, &self.is_like_gpu,
&self.is_like_solaris, &self.is_like_windows,
&self.is_like_msvc, &self.is_like_wasm,
&self.is_like_android, &self.is_like_vexos,
&self.binary_format, &self.default_dwarf_version,
&self.allows_weak_linkage, &self.has_rpath,
&self.no_default_libraries,
&self.position_independent_executables,
&self.static_position_independent_executables,
&self.plt_by_default, &self.relro_level,
&self.archive_format, &self.allow_asm,
&self.static_initializer_must_be_acyclic,
&self.main_needs_argc_argv, &self.has_thread_local,
&self.obj_is_bitcode, &self.min_atomic_width,
&self.max_atomic_width, &self.atomic_cas,
&self.panic_strategy, &self.crt_static_allows_dylibs,
&self.crt_static_default, &self.crt_static_respected,
&self.stack_probes, &self.min_global_align,
&self.default_codegen_units, &self.default_codegen_backend,
&self.trap_unreachable, &self.requires_lto,
&self.singlethread, &self.no_builtins,
&self.default_visibility, &self.emit_debug_gdb_scripts,
&self.requires_uwtable, &self.default_uwtable,
&self.simd_types_indirect, &self.limit_rdylib_exports,
&self.override_export_symbols, &self.merge_functions,
&self.mcount, &self.llvm_mcount_intrinsic,
&self.llvm_abiname, &self.llvm_floatabi, &self.rustc_abi,
&self.relax_elf_relocations, &self.llvm_args,
&self.use_ctors_section, &self.eh_frame_header,
&self.has_thumb_interworking, &self.debuginfo_kind,
&self.split_debuginfo, &self.supported_split_debuginfo,
&self.supported_sanitizers, &self.default_sanitizers,
&self.c_enum_min_bits, &self.generate_arange_section,
&self.supports_stack_protector, &self.entry_name,
&self.entry_abi, &self.supports_xray,
&self.default_address_space,
&&self.small_data_threshold_support];
::core::fmt::Formatter::debug_struct_fields_finish(f, "TargetOptions",
names, values)
}
}Debug)]
2184#[rustc_lint_opt_ty]
2185pub struct TargetOptions {
2186 pub endian: Endian,
2188 pub c_int_width: u16,
2190 pub os: Os,
2195 pub env: Env,
2197 pub abi: Abi,
2202 #[rustc_lint_opt_deny_field_access(
2204 "use `Target::is_like_*` instead of this field; see https://github.com/rust-lang/rust/issues/100343 for rationale"
2205 )]
2206 vendor: StaticCow<str>,
2207
2208 pub linker: Option<StaticCow<str>>,
2210 pub linker_flavor: LinkerFlavor,
2213 linker_flavor_json: LinkerFlavorCli,
2214 lld_flavor_json: LldFlavor,
2215 linker_is_gnu_json: bool,
2216
2217 pub pre_link_objects: CrtObjects,
2219 pub post_link_objects: CrtObjects,
2220 pub pre_link_objects_self_contained: CrtObjects,
2222 pub post_link_objects_self_contained: CrtObjects,
2223 pub link_self_contained: LinkSelfContainedDefault,
2226
2227 pub pre_link_args: LinkArgs,
2229 pre_link_args_json: LinkArgsCli,
2230 pub late_link_args: LinkArgs,
2234 late_link_args_json: LinkArgsCli,
2235 pub late_link_args_dynamic: LinkArgs,
2238 late_link_args_dynamic_json: LinkArgsCli,
2239 pub late_link_args_static: LinkArgs,
2242 late_link_args_static_json: LinkArgsCli,
2243 pub post_link_args: LinkArgs,
2246 post_link_args_json: LinkArgsCli,
2247
2248 pub link_script: Option<StaticCow<str>>,
2252 pub link_env: StaticCow<[(StaticCow<str>, StaticCow<str>)]>,
2254 pub link_env_remove: StaticCow<[StaticCow<str>]>,
2256
2257 pub asm_args: StaticCow<[StaticCow<str>]>,
2259
2260 pub cpu: StaticCow<str>,
2263 pub need_explicit_cpu: bool,
2266 pub features: StaticCow<str>,
2275 pub direct_access_external_data: Option<bool>,
2277 pub dynamic_linking: bool,
2279 pub dll_tls_export: bool,
2281 pub only_cdylib: bool,
2283 pub executables: bool,
2285 pub relocation_model: RelocModel,
2288 pub code_model: Option<CodeModel>,
2291 pub tls_model: TlsModel,
2294 pub disable_redzone: bool,
2296 pub frame_pointer: FramePointer,
2298 pub function_sections: bool,
2300 pub dll_prefix: StaticCow<str>,
2302 pub dll_suffix: StaticCow<str>,
2304 pub exe_suffix: StaticCow<str>,
2306 pub staticlib_prefix: StaticCow<str>,
2308 pub staticlib_suffix: StaticCow<str>,
2310 pub families: StaticCow<[StaticCow<str>]>,
2316 pub abi_return_struct_as_int: bool,
2318 pub is_like_aix: bool,
2321 pub is_like_darwin: bool,
2326 pub is_like_gpu: bool,
2328 pub is_like_solaris: bool,
2332 pub is_like_windows: bool,
2340 pub is_like_msvc: bool,
2350 pub is_like_wasm: bool,
2352 pub is_like_android: bool,
2354 pub is_like_vexos: bool,
2356 pub binary_format: BinaryFormat,
2358 pub default_dwarf_version: u32,
2361 pub allows_weak_linkage: bool,
2368 pub has_rpath: bool,
2370 pub no_default_libraries: bool,
2373 pub position_independent_executables: bool,
2379 pub static_position_independent_executables: bool,
2381 pub plt_by_default: bool,
2384 pub relro_level: RelroLevel,
2388 pub archive_format: StaticCow<str>,
2393 pub allow_asm: bool,
2395 pub static_initializer_must_be_acyclic: bool,
2398 pub main_needs_argc_argv: bool,
2401
2402 pub has_thread_local: bool,
2404 pub obj_is_bitcode: bool,
2408
2409 pub min_atomic_width: Option<u64>,
2411
2412 pub max_atomic_width: Option<u64>,
2414
2415 pub atomic_cas: bool,
2417
2418 pub panic_strategy: PanicStrategy,
2420
2421 pub crt_static_allows_dylibs: bool,
2423 pub crt_static_default: bool,
2425 pub crt_static_respected: bool,
2427
2428 pub stack_probes: StackProbeType,
2430
2431 pub min_global_align: Option<Align>,
2433
2434 pub default_codegen_units: Option<u64>,
2436
2437 pub default_codegen_backend: Option<StaticCow<str>>,
2447
2448 pub trap_unreachable: bool,
2451
2452 pub requires_lto: bool,
2455
2456 pub singlethread: bool,
2458
2459 pub no_builtins: bool,
2462
2463 pub default_visibility: Option<SymbolVisibility>,
2469
2470 pub emit_debug_gdb_scripts: bool,
2472
2473 pub requires_uwtable: bool,
2477
2478 pub default_uwtable: bool,
2481
2482 pub simd_types_indirect: bool,
2487
2488 pub limit_rdylib_exports: bool,
2490
2491 pub override_export_symbols: Option<StaticCow<[StaticCow<str>]>>,
2494
2495 pub merge_functions: MergeFunctions,
2502
2503 pub mcount: StaticCow<str>,
2505
2506 pub llvm_mcount_intrinsic: Option<StaticCow<str>>,
2508
2509 pub llvm_abiname: StaticCow<str>,
2512
2513 pub llvm_floatabi: Option<FloatAbi>,
2520
2521 pub rustc_abi: Option<RustcAbi>,
2526
2527 pub relax_elf_relocations: bool,
2529
2530 pub llvm_args: StaticCow<[StaticCow<str>]>,
2532
2533 pub use_ctors_section: bool,
2536
2537 pub eh_frame_header: bool,
2541
2542 pub has_thumb_interworking: bool,
2545
2546 pub debuginfo_kind: DebuginfoKind,
2548 pub split_debuginfo: SplitDebuginfo,
2551 pub supported_split_debuginfo: StaticCow<[SplitDebuginfo]>,
2553
2554 pub supported_sanitizers: SanitizerSet,
2560
2561 pub default_sanitizers: SanitizerSet,
2567
2568 pub c_enum_min_bits: Option<u64>,
2570
2571 pub generate_arange_section: bool,
2573
2574 pub supports_stack_protector: bool,
2577
2578 pub entry_name: StaticCow<str>,
2581
2582 pub entry_abi: CanonAbi,
2585
2586 pub supports_xray: bool,
2588
2589 pub default_address_space: rustc_abi::AddressSpace,
2593
2594 small_data_threshold_support: SmallDataThresholdSupport,
2596}
2597
2598fn add_link_args_iter(
2601 link_args: &mut LinkArgs,
2602 flavor: LinkerFlavor,
2603 args: impl Iterator<Item = StaticCow<str>> + Clone,
2604) {
2605 let mut insert = |flavor| link_args.entry(flavor).or_default().extend(args.clone());
2606 insert(flavor);
2607 match flavor {
2608 LinkerFlavor::Gnu(cc, lld) => {
2609 match (&lld, &Lld::No) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val, &*right_val,
::core::option::Option::None);
}
}
};assert_eq!(lld, Lld::No);
2610 insert(LinkerFlavor::Gnu(cc, Lld::Yes));
2611 }
2612 LinkerFlavor::Darwin(cc, lld) => {
2613 match (&lld, &Lld::No) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val, &*right_val,
::core::option::Option::None);
}
}
};assert_eq!(lld, Lld::No);
2614 insert(LinkerFlavor::Darwin(cc, Lld::Yes));
2615 }
2616 LinkerFlavor::Msvc(lld) => {
2617 match (&lld, &Lld::No) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val, &*right_val,
::core::option::Option::None);
}
}
};assert_eq!(lld, Lld::No);
2618 insert(LinkerFlavor::Msvc(Lld::Yes));
2619 }
2620 LinkerFlavor::WasmLld(..)
2621 | LinkerFlavor::Unix(..)
2622 | LinkerFlavor::EmCc
2623 | LinkerFlavor::Bpf
2624 | LinkerFlavor::Llbc
2625 | LinkerFlavor::Ptx => {}
2626 }
2627}
2628
2629fn add_link_args(link_args: &mut LinkArgs, flavor: LinkerFlavor, args: &[&'static str]) {
2630 add_link_args_iter(link_args, flavor, args.iter().copied().map(Cow::Borrowed))
2631}
2632
2633impl TargetOptions {
2634 pub fn supports_comdat(&self) -> bool {
2635 !self.is_like_aix && !self.is_like_darwin
2637 }
2638
2639 pub fn uses_pdb_debuginfo(&self) -> bool {
2640 self.debuginfo_kind == DebuginfoKind::Pdb
2641 }
2642}
2643
2644impl TargetOptions {
2645 fn link_args(flavor: LinkerFlavor, args: &[&'static str]) -> LinkArgs {
2646 let mut link_args = LinkArgs::new();
2647 add_link_args(&mut link_args, flavor, args);
2648 link_args
2649 }
2650
2651 fn add_pre_link_args(&mut self, flavor: LinkerFlavor, args: &[&'static str]) {
2652 add_link_args(&mut self.pre_link_args, flavor, args);
2653 }
2654
2655 fn update_from_cli(&mut self) {
2656 self.linker_flavor = LinkerFlavor::from_cli_json(
2657 self.linker_flavor_json,
2658 self.lld_flavor_json,
2659 self.linker_is_gnu_json,
2660 );
2661 for (args, args_json) in [
2662 (&mut self.pre_link_args, &self.pre_link_args_json),
2663 (&mut self.late_link_args, &self.late_link_args_json),
2664 (&mut self.late_link_args_dynamic, &self.late_link_args_dynamic_json),
2665 (&mut self.late_link_args_static, &self.late_link_args_static_json),
2666 (&mut self.post_link_args, &self.post_link_args_json),
2667 ] {
2668 args.clear();
2669 for (flavor, args_json) in args_json {
2670 let linker_flavor = self.linker_flavor.with_cli_hints(*flavor);
2671 let linker_flavor = match linker_flavor {
2673 LinkerFlavor::Gnu(cc, _) => LinkerFlavor::Gnu(cc, Lld::No),
2674 LinkerFlavor::Darwin(cc, _) => LinkerFlavor::Darwin(cc, Lld::No),
2675 LinkerFlavor::Msvc(_) => LinkerFlavor::Msvc(Lld::No),
2676 _ => linker_flavor,
2677 };
2678 if !args.contains_key(&linker_flavor) {
2679 add_link_args_iter(args, linker_flavor, args_json.iter().cloned());
2680 }
2681 }
2682 }
2683 }
2684
2685 fn update_to_cli(&mut self) {
2686 self.linker_flavor_json = self.linker_flavor.to_cli_counterpart();
2687 self.lld_flavor_json = self.linker_flavor.lld_flavor();
2688 self.linker_is_gnu_json = self.linker_flavor.is_gnu();
2689 for (args, args_json) in [
2690 (&self.pre_link_args, &mut self.pre_link_args_json),
2691 (&self.late_link_args, &mut self.late_link_args_json),
2692 (&self.late_link_args_dynamic, &mut self.late_link_args_dynamic_json),
2693 (&self.late_link_args_static, &mut self.late_link_args_static_json),
2694 (&self.post_link_args, &mut self.post_link_args_json),
2695 ] {
2696 *args_json = args
2697 .iter()
2698 .map(|(flavor, args)| (flavor.to_cli_counterpart(), args.clone()))
2699 .collect();
2700 }
2701 }
2702}
2703
2704impl Default for TargetOptions {
2705 fn default() -> TargetOptions {
2708 TargetOptions {
2709 endian: Endian::Little,
2710 c_int_width: 32,
2711 os: Os::None,
2712 env: Env::Unspecified,
2713 abi: Abi::Unspecified,
2714 vendor: "unknown".into(),
2715 linker: ::core::option::Option::None::<&'static str>option_env!("CFG_DEFAULT_LINKER").map(|s| s.into()),
2716 linker_flavor: LinkerFlavor::Gnu(Cc::Yes, Lld::No),
2717 linker_flavor_json: LinkerFlavorCli::Gcc,
2718 lld_flavor_json: LldFlavor::Ld,
2719 linker_is_gnu_json: true,
2720 link_script: None,
2721 asm_args: ::std::borrow::Cow::Borrowed(&[])cvs![],
2722 cpu: "generic".into(),
2723 need_explicit_cpu: false,
2724 features: "".into(),
2725 direct_access_external_data: None,
2726 dynamic_linking: false,
2727 dll_tls_export: true,
2728 only_cdylib: false,
2729 executables: true,
2730 relocation_model: RelocModel::Pic,
2731 code_model: None,
2732 tls_model: TlsModel::GeneralDynamic,
2733 disable_redzone: false,
2734 frame_pointer: FramePointer::MayOmit,
2735 function_sections: true,
2736 dll_prefix: "lib".into(),
2737 dll_suffix: ".so".into(),
2738 exe_suffix: "".into(),
2739 staticlib_prefix: "lib".into(),
2740 staticlib_suffix: ".a".into(),
2741 families: ::std::borrow::Cow::Borrowed(&[])cvs![],
2742 abi_return_struct_as_int: false,
2743 is_like_aix: false,
2744 is_like_darwin: false,
2745 is_like_gpu: false,
2746 is_like_solaris: false,
2747 is_like_windows: false,
2748 is_like_msvc: false,
2749 is_like_wasm: false,
2750 is_like_android: false,
2751 is_like_vexos: false,
2752 binary_format: BinaryFormat::Elf,
2753 default_dwarf_version: 4,
2754 allows_weak_linkage: true,
2755 has_rpath: false,
2756 no_default_libraries: true,
2757 position_independent_executables: false,
2758 static_position_independent_executables: false,
2759 plt_by_default: true,
2760 relro_level: RelroLevel::None,
2761 pre_link_objects: Default::default(),
2762 post_link_objects: Default::default(),
2763 pre_link_objects_self_contained: Default::default(),
2764 post_link_objects_self_contained: Default::default(),
2765 link_self_contained: LinkSelfContainedDefault::False,
2766 pre_link_args: LinkArgs::new(),
2767 pre_link_args_json: LinkArgsCli::new(),
2768 late_link_args: LinkArgs::new(),
2769 late_link_args_json: LinkArgsCli::new(),
2770 late_link_args_dynamic: LinkArgs::new(),
2771 late_link_args_dynamic_json: LinkArgsCli::new(),
2772 late_link_args_static: LinkArgs::new(),
2773 late_link_args_static_json: LinkArgsCli::new(),
2774 post_link_args: LinkArgs::new(),
2775 post_link_args_json: LinkArgsCli::new(),
2776 link_env: ::std::borrow::Cow::Borrowed(&[])cvs![],
2777 link_env_remove: ::std::borrow::Cow::Borrowed(&[])cvs![],
2778 archive_format: "gnu".into(),
2779 main_needs_argc_argv: true,
2780 allow_asm: true,
2781 static_initializer_must_be_acyclic: false,
2782 has_thread_local: false,
2783 obj_is_bitcode: false,
2784 min_atomic_width: None,
2785 max_atomic_width: None,
2786 atomic_cas: true,
2787 panic_strategy: PanicStrategy::Unwind,
2788 crt_static_allows_dylibs: false,
2789 crt_static_default: false,
2790 crt_static_respected: false,
2791 stack_probes: StackProbeType::None,
2792 min_global_align: None,
2793 default_codegen_units: None,
2794 default_codegen_backend: None,
2795 trap_unreachable: true,
2796 requires_lto: false,
2797 singlethread: false,
2798 no_builtins: false,
2799 default_visibility: None,
2800 emit_debug_gdb_scripts: true,
2801 requires_uwtable: false,
2802 default_uwtable: false,
2803 simd_types_indirect: true,
2804 limit_rdylib_exports: true,
2805 override_export_symbols: None,
2806 merge_functions: MergeFunctions::Aliases,
2807 mcount: "mcount".into(),
2808 llvm_mcount_intrinsic: None,
2809 llvm_abiname: "".into(),
2810 llvm_floatabi: None,
2811 rustc_abi: None,
2812 relax_elf_relocations: false,
2813 llvm_args: ::std::borrow::Cow::Borrowed(&[])cvs![],
2814 use_ctors_section: false,
2815 eh_frame_header: true,
2816 has_thumb_interworking: false,
2817 debuginfo_kind: Default::default(),
2818 split_debuginfo: Default::default(),
2819 supported_split_debuginfo: Cow::Borrowed(&[SplitDebuginfo::Off]),
2821 supported_sanitizers: SanitizerSet::empty(),
2822 default_sanitizers: SanitizerSet::empty(),
2823 c_enum_min_bits: None,
2824 generate_arange_section: true,
2825 supports_stack_protector: true,
2826 entry_name: "main".into(),
2827 entry_abi: CanonAbi::C,
2828 supports_xray: false,
2829 default_address_space: rustc_abi::AddressSpace::ZERO,
2830 small_data_threshold_support: SmallDataThresholdSupport::DefaultForArch,
2831 }
2832 }
2833}
2834
2835impl Deref for Target {
2839 type Target = TargetOptions;
2840
2841 #[inline]
2842 fn deref(&self) -> &Self::Target {
2843 &self.options
2844 }
2845}
2846impl DerefMut for Target {
2847 #[inline]
2848 fn deref_mut(&mut self) -> &mut Self::Target {
2849 &mut self.options
2850 }
2851}
2852
2853impl Target {
2854 pub fn is_abi_supported(&self, abi: ExternAbi) -> bool {
2855 let abi_map = AbiMap::from_target(self);
2856 abi_map.canonize_abi(abi, false).is_mapped()
2857 }
2858
2859 pub fn min_atomic_width(&self) -> u64 {
2862 self.min_atomic_width.unwrap_or(8)
2863 }
2864
2865 pub fn max_atomic_width(&self) -> u64 {
2868 self.max_atomic_width.unwrap_or_else(|| self.pointer_width.into())
2869 }
2870
2871 fn check_consistency(&self, kind: TargetKind) -> Result<(), String> {
2874 macro_rules! check {
2875 ($b:expr, $($msg:tt)*) => {
2876 if !$b {
2877 return Err(format!($($msg)*));
2878 }
2879 }
2880 }
2881 macro_rules! check_eq {
2882 ($left:expr, $right:expr, $($msg:tt)*) => {
2883 if ($left) != ($right) {
2884 return Err(format!($($msg)*));
2885 }
2886 }
2887 }
2888 macro_rules! check_ne {
2889 ($left:expr, $right:expr, $($msg:tt)*) => {
2890 if ($left) == ($right) {
2891 return Err(format!($($msg)*));
2892 }
2893 }
2894 }
2895 macro_rules! check_matches {
2896 ($left:expr, $right:pat, $($msg:tt)*) => {
2897 if !matches!($left, $right) {
2898 return Err(format!($($msg)*));
2899 }
2900 }
2901 }
2902
2903 if (self.is_like_darwin) != (self.vendor == "apple") {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`is_like_darwin` must be set if and only if `vendor` is `apple`"))
}));
};check_eq!(
2904 self.is_like_darwin,
2905 self.vendor == "apple",
2906 "`is_like_darwin` must be set if and only if `vendor` is `apple`"
2907 );
2908 if (self.is_like_solaris) !=
(#[allow(non_exhaustive_omitted_patterns)] match self.os {
Os::Solaris | Os::Illumos => true,
_ => false,
}) {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`is_like_solaris` must be set if and only if `os` is `solaris` or `illumos`"))
}));
};check_eq!(
2909 self.is_like_solaris,
2910 matches!(self.os, Os::Solaris | Os::Illumos),
2911 "`is_like_solaris` must be set if and only if `os` is `solaris` or `illumos`"
2912 );
2913 if (self.is_like_gpu) !=
(self.arch == Arch::Nvptx64 || self.arch == Arch::AmdGpu) {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`is_like_gpu` must be set if and only if `target` is `nvptx64` or `amdgcn`"))
}));
};check_eq!(
2914 self.is_like_gpu,
2915 self.arch == Arch::Nvptx64 || self.arch == Arch::AmdGpu,
2916 "`is_like_gpu` must be set if and only if `target` is `nvptx64` or `amdgcn`"
2917 );
2918 if (self.is_like_windows) !=
(#[allow(non_exhaustive_omitted_patterns)] match self.os {
Os::Windows | Os::Uefi | Os::Cygwin => true,
_ => false,
}) {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`is_like_windows` must be set if and only if `os` is `windows`, `uefi` or `cygwin`"))
}));
};check_eq!(
2919 self.is_like_windows,
2920 matches!(self.os, Os::Windows | Os::Uefi | Os::Cygwin),
2921 "`is_like_windows` must be set if and only if `os` is `windows`, `uefi` or `cygwin`"
2922 );
2923 if (self.is_like_wasm) !=
(#[allow(non_exhaustive_omitted_patterns)] match self.arch {
Arch::Wasm32 | Arch::Wasm64 => true,
_ => false,
}) {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`is_like_wasm` must be set if and only if `arch` is `wasm32` or `wasm64`"))
}));
};check_eq!(
2924 self.is_like_wasm,
2925 matches!(self.arch, Arch::Wasm32 | Arch::Wasm64),
2926 "`is_like_wasm` must be set if and only if `arch` is `wasm32` or `wasm64`"
2927 );
2928 if self.is_like_msvc {
2929 if !self.is_like_windows {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("if `is_like_msvc` is set, `is_like_windows` must be set"))
}));
};check!(self.is_like_windows, "if `is_like_msvc` is set, `is_like_windows` must be set");
2930 }
2931 if self.os == Os::Emscripten {
2932 if !self.is_like_wasm {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("the `emcscripten` os only makes sense on wasm-like targets"))
}));
};check!(self.is_like_wasm, "the `emcscripten` os only makes sense on wasm-like targets");
2933 }
2934
2935 if (self.is_like_darwin) !=
(#[allow(non_exhaustive_omitted_patterns)] match self.linker_flavor {
LinkerFlavor::Darwin(..) => true,
_ => false,
}) {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`linker_flavor` must be `darwin` if and only if `is_like_darwin` is set"))
}));
};check_eq!(
2937 self.is_like_darwin,
2938 matches!(self.linker_flavor, LinkerFlavor::Darwin(..)),
2939 "`linker_flavor` must be `darwin` if and only if `is_like_darwin` is set"
2940 );
2941 if (self.is_like_msvc) !=
(#[allow(non_exhaustive_omitted_patterns)] match self.linker_flavor {
LinkerFlavor::Msvc(..) => true,
_ => false,
}) {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`linker_flavor` must be `msvc` if and only if `is_like_msvc` is set"))
}));
};check_eq!(
2942 self.is_like_msvc,
2943 matches!(self.linker_flavor, LinkerFlavor::Msvc(..)),
2944 "`linker_flavor` must be `msvc` if and only if `is_like_msvc` is set"
2945 );
2946 if (self.is_like_wasm && self.os != Os::Emscripten) !=
(#[allow(non_exhaustive_omitted_patterns)] match self.linker_flavor {
LinkerFlavor::WasmLld(..) => true,
_ => false,
}) {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`linker_flavor` must be `wasm-lld` if and only if `is_like_wasm` is set and the `os` is not `emscripten`"))
}));
};check_eq!(
2947 self.is_like_wasm && self.os != Os::Emscripten,
2948 matches!(self.linker_flavor, LinkerFlavor::WasmLld(..)),
2949 "`linker_flavor` must be `wasm-lld` if and only if `is_like_wasm` is set and the `os` is not `emscripten`",
2950 );
2951 if (self.os == Os::Emscripten) !=
(#[allow(non_exhaustive_omitted_patterns)] match self.linker_flavor {
LinkerFlavor::EmCc => true,
_ => false,
}) {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`linker_flavor` must be `em-cc` if and only if `os` is `emscripten`"))
}));
};check_eq!(
2952 self.os == Os::Emscripten,
2953 matches!(self.linker_flavor, LinkerFlavor::EmCc),
2954 "`linker_flavor` must be `em-cc` if and only if `os` is `emscripten`"
2955 );
2956 if (self.arch == Arch::Bpf) !=
(#[allow(non_exhaustive_omitted_patterns)] match self.linker_flavor {
LinkerFlavor::Bpf => true,
_ => false,
}) {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`linker_flavor` must be `bpf` if and only if `arch` is `bpf`"))
}));
};check_eq!(
2957 self.arch == Arch::Bpf,
2958 matches!(self.linker_flavor, LinkerFlavor::Bpf),
2959 "`linker_flavor` must be `bpf` if and only if `arch` is `bpf`"
2960 );
2961
2962 for args in [
2963 &self.pre_link_args,
2964 &self.late_link_args,
2965 &self.late_link_args_dynamic,
2966 &self.late_link_args_static,
2967 &self.post_link_args,
2968 ] {
2969 for (&flavor, flavor_args) in args {
2970 if !(!flavor_args.is_empty() || self.arch == Arch::Avr) {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("linker flavor args must not be empty"))
}));
};check!(
2971 !flavor_args.is_empty() || self.arch == Arch::Avr,
2972 "linker flavor args must not be empty"
2973 );
2974 match self.linker_flavor {
2976 LinkerFlavor::Gnu(..) => {
2977 if !#[allow(non_exhaustive_omitted_patterns)] match flavor {
LinkerFlavor::Gnu(..) => true,
_ => false,
} {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("mixing GNU and non-GNU linker flavors"))
}));
};check_matches!(
2978 flavor,
2979 LinkerFlavor::Gnu(..),
2980 "mixing GNU and non-GNU linker flavors"
2981 );
2982 }
2983 LinkerFlavor::Darwin(..) => {
2984 if !#[allow(non_exhaustive_omitted_patterns)] match flavor {
LinkerFlavor::Darwin(..) => true,
_ => false,
} {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("mixing Darwin and non-Darwin linker flavors"))
}));
}check_matches!(
2985 flavor,
2986 LinkerFlavor::Darwin(..),
2987 "mixing Darwin and non-Darwin linker flavors"
2988 )
2989 }
2990 LinkerFlavor::WasmLld(..) => {
2991 if !#[allow(non_exhaustive_omitted_patterns)] match flavor {
LinkerFlavor::WasmLld(..) => true,
_ => false,
} {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("mixing wasm and non-wasm linker flavors"))
}));
}check_matches!(
2992 flavor,
2993 LinkerFlavor::WasmLld(..),
2994 "mixing wasm and non-wasm linker flavors"
2995 )
2996 }
2997 LinkerFlavor::Unix(..) => {
2998 if !#[allow(non_exhaustive_omitted_patterns)] match flavor {
LinkerFlavor::Unix(..) => true,
_ => false,
} {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("mixing unix and non-unix linker flavors"))
}));
};check_matches!(
2999 flavor,
3000 LinkerFlavor::Unix(..),
3001 "mixing unix and non-unix linker flavors"
3002 );
3003 }
3004 LinkerFlavor::Msvc(..) => {
3005 if !#[allow(non_exhaustive_omitted_patterns)] match flavor {
LinkerFlavor::Msvc(..) => true,
_ => false,
} {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("mixing MSVC and non-MSVC linker flavors"))
}));
};check_matches!(
3006 flavor,
3007 LinkerFlavor::Msvc(..),
3008 "mixing MSVC and non-MSVC linker flavors"
3009 );
3010 }
3011 LinkerFlavor::EmCc
3012 | LinkerFlavor::Bpf
3013 | LinkerFlavor::Ptx
3014 | LinkerFlavor::Llbc => {
3015 if (flavor) != (self.linker_flavor) {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("mixing different linker flavors"))
}));
}check_eq!(flavor, self.linker_flavor, "mixing different linker flavors")
3016 }
3017 }
3018
3019 let check_noncc = |noncc_flavor| -> Result<(), String> {
3021 if let Some(noncc_args) = args.get(&noncc_flavor) {
3022 for arg in flavor_args {
3023 if let Some(suffix) = arg.strip_prefix("-Wl,") {
3024 if !noncc_args.iter().any(|a| a == suffix) {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!(" link args for cc and non-cc versions of flavors are not consistent"))
}));
};check!(
3025 noncc_args.iter().any(|a| a == suffix),
3026 " link args for cc and non-cc versions of flavors are not consistent"
3027 );
3028 }
3029 }
3030 }
3031 Ok(())
3032 };
3033
3034 match self.linker_flavor {
3035 LinkerFlavor::Gnu(Cc::Yes, lld) => check_noncc(LinkerFlavor::Gnu(Cc::No, lld))?,
3036 LinkerFlavor::WasmLld(Cc::Yes) => check_noncc(LinkerFlavor::WasmLld(Cc::No))?,
3037 LinkerFlavor::Unix(Cc::Yes) => check_noncc(LinkerFlavor::Unix(Cc::No))?,
3038 _ => {}
3039 }
3040 }
3041
3042 for cc in [Cc::No, Cc::Yes] {
3044 if (args.get(&LinkerFlavor::Gnu(cc, Lld::No))) !=
(args.get(&LinkerFlavor::Gnu(cc, Lld::Yes))) {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("link args for lld and non-lld versions of flavors are not consistent"))
}));
};check_eq!(
3045 args.get(&LinkerFlavor::Gnu(cc, Lld::No)),
3046 args.get(&LinkerFlavor::Gnu(cc, Lld::Yes)),
3047 "link args for lld and non-lld versions of flavors are not consistent",
3048 );
3049 if (args.get(&LinkerFlavor::Darwin(cc, Lld::No))) !=
(args.get(&LinkerFlavor::Darwin(cc, Lld::Yes))) {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("link args for lld and non-lld versions of flavors are not consistent"))
}));
};check_eq!(
3050 args.get(&LinkerFlavor::Darwin(cc, Lld::No)),
3051 args.get(&LinkerFlavor::Darwin(cc, Lld::Yes)),
3052 "link args for lld and non-lld versions of flavors are not consistent",
3053 );
3054 }
3055 if (args.get(&LinkerFlavor::Msvc(Lld::No))) !=
(args.get(&LinkerFlavor::Msvc(Lld::Yes))) {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("link args for lld and non-lld versions of flavors are not consistent"))
}));
};check_eq!(
3056 args.get(&LinkerFlavor::Msvc(Lld::No)),
3057 args.get(&LinkerFlavor::Msvc(Lld::Yes)),
3058 "link args for lld and non-lld versions of flavors are not consistent",
3059 );
3060 }
3061
3062 if self.link_self_contained.is_disabled() {
3063 if !(self.pre_link_objects_self_contained.is_empty() &&
self.post_link_objects_self_contained.is_empty()) {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("if `link_self_contained` is disabled, then `pre_link_objects_self_contained` and `post_link_objects_self_contained` must be empty"))
}));
};check!(
3064 self.pre_link_objects_self_contained.is_empty()
3065 && self.post_link_objects_self_contained.is_empty(),
3066 "if `link_self_contained` is disabled, then `pre_link_objects_self_contained` and `post_link_objects_self_contained` must be empty",
3067 );
3068 }
3069
3070 if (self.vendor) == ("") {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`vendor` cannot be empty"))
}));
};check_ne!(self.vendor, "", "`vendor` cannot be empty");
3074 if let Os::Other(s) = &self.os {
3075 if !!s.is_empty() {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`os` cannot be empty"))
}));
};check!(!s.is_empty(), "`os` cannot be empty");
3076 }
3077 if !self.can_use_os_unknown() {
3078 if (self.os) == (Os::Unknown) {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`unknown` os can only be used on particular targets; use `none` for bare-metal targets"))
}));
};check_ne!(
3080 self.os,
3081 Os::Unknown,
3082 "`unknown` os can only be used on particular targets; use `none` for bare-metal targets"
3083 );
3084 }
3085
3086 if kind == TargetKind::Builtin {
3092 if self.os == Os::None
3096 && !#[allow(non_exhaustive_omitted_patterns)] match self.arch {
Arch::Bpf | Arch::Hexagon | Arch::Wasm32 | Arch::Wasm64 => true,
_ => false,
}matches!(self.arch, Arch::Bpf | Arch::Hexagon | Arch::Wasm32 | Arch::Wasm64)
3097 {
3098 if !!self.dynamic_linking {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("dynamic linking is not supported on this OS/architecture"))
}));
};check!(
3099 !self.dynamic_linking,
3100 "dynamic linking is not supported on this OS/architecture"
3101 );
3102 }
3103 if self.only_cdylib
3104 || self.crt_static_allows_dylibs
3105 || !self.late_link_args_dynamic.is_empty()
3106 {
3107 if !self.dynamic_linking {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("dynamic linking must be allowed when `only_cdylib` or `crt_static_allows_dylibs` or `late_link_args_dynamic` are set"))
}));
};check!(
3108 self.dynamic_linking,
3109 "dynamic linking must be allowed when `only_cdylib` or `crt_static_allows_dylibs` or `late_link_args_dynamic` are set"
3110 );
3111 }
3112 if self.dynamic_linking && !self.is_like_wasm {
3114 if (self.relocation_model) != (RelocModel::Pic) {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("targets that support dynamic linking must use the `pic` relocation model"))
}));
};check_eq!(
3115 self.relocation_model,
3116 RelocModel::Pic,
3117 "targets that support dynamic linking must use the `pic` relocation model"
3118 );
3119 }
3120 if self.position_independent_executables {
3121 if (self.relocation_model) != (RelocModel::Pic) {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("targets that support position-independent executables must use the `pic` relocation model"))
}));
};check_eq!(
3122 self.relocation_model,
3123 RelocModel::Pic,
3124 "targets that support position-independent executables must use the `pic` relocation model"
3125 );
3126 }
3127 if self.relocation_model == RelocModel::Pic && self.os != Os::Uefi {
3129 if !(self.dynamic_linking || self.position_independent_executables) {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("when the relocation model is `pic`, the target must support dynamic linking or use position-independent executables. Set the relocation model to `static` to avoid this requirement"))
}));
};check!(
3130 self.dynamic_linking || self.position_independent_executables,
3131 "when the relocation model is `pic`, the target must support dynamic linking or use position-independent executables. \
3132 Set the relocation model to `static` to avoid this requirement"
3133 );
3134 }
3135 if self.static_position_independent_executables {
3136 if !self.position_independent_executables {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("if `static_position_independent_executables` is set, then `position_independent_executables` must be set"))
}));
};check!(
3137 self.position_independent_executables,
3138 "if `static_position_independent_executables` is set, then `position_independent_executables` must be set"
3139 );
3140 }
3141 if self.position_independent_executables {
3142 if !self.executables {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("if `position_independent_executables` is set then `executables` must be set"))
}));
};check!(
3143 self.executables,
3144 "if `position_independent_executables` is set then `executables` must be set"
3145 );
3146 }
3147 }
3148
3149 if self.crt_static_default || self.crt_static_allows_dylibs {
3151 if !self.crt_static_respected {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("static CRT can be enabled but `crt_static_respected` is not set"))
}));
};check!(
3152 self.crt_static_respected,
3153 "static CRT can be enabled but `crt_static_respected` is not set"
3154 );
3155 }
3156
3157 match self.arch {
3160 Arch::RiscV32 => {
3161 if !#[allow(non_exhaustive_omitted_patterns)] match &*self.llvm_abiname {
"ilp32" | "ilp32f" | "ilp32d" | "ilp32e" => true,
_ => false,
} {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid RISC-V ABI name: {0}",
self.llvm_abiname))
}));
};check_matches!(
3162 &*self.llvm_abiname,
3163 "ilp32" | "ilp32f" | "ilp32d" | "ilp32e",
3164 "invalid RISC-V ABI name: {}",
3165 self.llvm_abiname,
3166 );
3167 }
3168 Arch::RiscV64 => {
3169 if !#[allow(non_exhaustive_omitted_patterns)] match &*self.llvm_abiname {
"lp64" | "lp64f" | "lp64d" | "lp64e" => true,
_ => false,
} {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid RISC-V ABI name: {0}",
self.llvm_abiname))
}));
};check_matches!(
3171 &*self.llvm_abiname,
3172 "lp64" | "lp64f" | "lp64d" | "lp64e",
3173 "invalid RISC-V ABI name: {}",
3174 self.llvm_abiname,
3175 );
3176 }
3177 Arch::Arm => {
3178 if !self.llvm_floatabi.is_some() {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("ARM targets must set `llvm-floatabi` to `hard` or `soft`"))
}));
}check!(
3179 self.llvm_floatabi.is_some(),
3180 "ARM targets must set `llvm-floatabi` to `hard` or `soft`",
3181 )
3182 }
3183 _ => {}
3184 }
3185
3186 if let Some(rust_abi) = self.rustc_abi {
3188 match rust_abi {
3189 RustcAbi::X86Sse2 => if !#[allow(non_exhaustive_omitted_patterns)] match self.arch {
Arch::X86 => true,
_ => false,
} {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`x86-sse2` ABI is only valid for x86-32 targets"))
}));
}check_matches!(
3190 self.arch,
3191 Arch::X86,
3192 "`x86-sse2` ABI is only valid for x86-32 targets"
3193 ),
3194 RustcAbi::X86Softfloat => if !#[allow(non_exhaustive_omitted_patterns)] match self.arch {
Arch::X86 | Arch::X86_64 => true,
_ => false,
} {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`x86-softfloat` ABI is only valid for x86 targets"))
}));
}check_matches!(
3195 self.arch,
3196 Arch::X86 | Arch::X86_64,
3197 "`x86-softfloat` ABI is only valid for x86 targets"
3198 ),
3199 }
3200 }
3201
3202 if !self.features.is_empty() {
3204 let mut features_enabled = FxHashSet::default();
3205 let mut features_disabled = FxHashSet::default();
3206 for feat in self.features.split(',') {
3207 if let Some(feat) = feat.strip_prefix("+") {
3208 features_enabled.insert(feat);
3209 if features_disabled.contains(feat) {
3210 return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("target feature `{0}` is both enabled and disabled",
feat))
})format!(
3211 "target feature `{feat}` is both enabled and disabled"
3212 ));
3213 }
3214 } else if let Some(feat) = feat.strip_prefix("-") {
3215 features_disabled.insert(feat);
3216 if features_enabled.contains(feat) {
3217 return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("target feature `{0}` is both enabled and disabled",
feat))
})format!(
3218 "target feature `{feat}` is both enabled and disabled"
3219 ));
3220 }
3221 } else {
3222 return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("target feature `{0}` is invalid, must start with `+` or `-`",
feat))
})format!(
3223 "target feature `{feat}` is invalid, must start with `+` or `-`"
3224 ));
3225 }
3226 }
3227 let abi_feature_constraints = self.abi_required_features();
3229 for feat in abi_feature_constraints.required {
3230 if features_disabled.contains(feat) {
3233 return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("target feature `{0}` is required by the ABI but gets disabled in target spec",
feat))
})format!(
3234 "target feature `{feat}` is required by the ABI but gets disabled in target spec"
3235 ));
3236 }
3237 }
3238 for feat in abi_feature_constraints.incompatible {
3239 if features_enabled.contains(feat) {
3242 return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("target feature `{0}` is incompatible with the ABI but gets enabled in target spec",
feat))
})format!(
3243 "target feature `{feat}` is incompatible with the ABI but gets enabled in target spec"
3244 ));
3245 }
3246 }
3247 }
3248
3249 Ok(())
3250 }
3251
3252 #[cfg(test)]
3254 fn test_target(mut self) {
3255 let recycled_target =
3256 Target::from_json(&serde_json::to_string(&self.to_json()).unwrap()).map(|(j, _)| j);
3257 self.update_to_cli();
3258 self.check_consistency(TargetKind::Builtin).unwrap();
3259 assert_eq!(recycled_target, Ok(self));
3260 }
3261
3262 fn can_use_os_unknown(&self) -> bool {
3265 self.llvm_target == "wasm32-unknown-unknown"
3266 || self.llvm_target == "wasm64-unknown-unknown"
3267 || (self.env == Env::Sgx && self.vendor == "fortanix")
3268 }
3269
3270 pub fn expect_builtin(target_tuple: &TargetTuple) -> Target {
3272 match *target_tuple {
3273 TargetTuple::TargetTuple(ref target_tuple) => {
3274 load_builtin(target_tuple).expect("built-in target")
3275 }
3276 TargetTuple::TargetJson { .. } => {
3277 {
::core::panicking::panic_fmt(format_args!("built-in targets doesn\'t support target-paths"));
}panic!("built-in targets doesn't support target-paths")
3278 }
3279 }
3280 }
3281
3282 pub fn builtins() -> impl Iterator<Item = Target> {
3284 load_all_builtins()
3285 }
3286
3287 pub fn search(
3297 target_tuple: &TargetTuple,
3298 sysroot: &Path,
3299 unstable_options: bool,
3300 ) -> Result<(Target, TargetWarnings), String> {
3301 use std::{env, fs};
3302
3303 fn load_file(
3304 path: &Path,
3305 unstable_options: bool,
3306 ) -> Result<(Target, TargetWarnings), String> {
3307 if !unstable_options {
3308 return Err(
3309 "custom targets are unstable and require `-Zunstable-options`".to_string()
3310 );
3311 }
3312 let contents = fs::read_to_string(path).map_err(|e| e.to_string())?;
3313 Target::from_json(&contents)
3314 }
3315
3316 match *target_tuple {
3317 TargetTuple::TargetTuple(ref target_tuple) => {
3318 if let Some(t) = load_builtin(target_tuple) {
3320 return Ok((t, TargetWarnings::empty()));
3321 }
3322
3323 let path = {
3325 let mut target = target_tuple.to_string();
3326 target.push_str(".json");
3327 PathBuf::from(target)
3328 };
3329
3330 let target_path = env::var_os("RUST_TARGET_PATH").unwrap_or_default();
3331
3332 for dir in env::split_paths(&target_path) {
3333 let p = dir.join(&path);
3334 if p.is_file() {
3335 return load_file(&p, unstable_options);
3336 }
3337 }
3338
3339 let rustlib_path = crate::relative_target_rustlib_path(sysroot, target_tuple);
3342 let p = PathBuf::from_iter([
3343 Path::new(sysroot),
3344 Path::new(&rustlib_path),
3345 Path::new("target.json"),
3346 ]);
3347 if p.is_file() {
3348 return load_file(&p, unstable_options);
3349 }
3350
3351 Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("could not find specification for target {0:?}",
target_tuple))
})format!("could not find specification for target {target_tuple:?}"))
3352 }
3353 TargetTuple::TargetJson { ref contents, .. } => Target::from_json(contents),
3354 }
3355 }
3356
3357 pub fn small_data_threshold_support(&self) -> SmallDataThresholdSupport {
3360 match &self.options.small_data_threshold_support {
3361 SmallDataThresholdSupport::DefaultForArch => match self.arch {
3365 Arch::Mips | Arch::Mips64 | Arch::Mips32r6 => {
3366 SmallDataThresholdSupport::LlvmArg("mips-ssection-threshold".into())
3367 }
3368 Arch::Hexagon => {
3369 SmallDataThresholdSupport::LlvmArg("hexagon-small-data-threshold".into())
3370 }
3371 Arch::M68k => SmallDataThresholdSupport::LlvmArg("m68k-ssection-threshold".into()),
3372 Arch::RiscV32 | Arch::RiscV64 => {
3373 SmallDataThresholdSupport::LlvmModuleFlag("SmallDataLimit".into())
3374 }
3375 _ => SmallDataThresholdSupport::None,
3376 },
3377 s => s.clone(),
3378 }
3379 }
3380
3381 pub fn object_architecture(
3382 &self,
3383 unstable_target_features: &FxIndexSet<Symbol>,
3384 ) -> Option<(object::Architecture, Option<object::SubArchitecture>)> {
3385 use object::Architecture;
3386 Some(match self.arch {
3387 Arch::Arm => (Architecture::Arm, None),
3388 Arch::AArch64 => (
3389 if self.pointer_width == 32 {
3390 Architecture::Aarch64_Ilp32
3391 } else {
3392 Architecture::Aarch64
3393 },
3394 None,
3395 ),
3396 Arch::X86 => (Architecture::I386, None),
3397 Arch::S390x => (Architecture::S390x, None),
3398 Arch::M68k => (Architecture::M68k, None),
3399 Arch::Mips | Arch::Mips32r6 => (Architecture::Mips, None),
3400 Arch::Mips64 | Arch::Mips64r6 => (
3401 if self.options.llvm_abiname.as_ref() == "n32" {
3407 Architecture::Mips64_N32
3408 } else {
3409 Architecture::Mips64
3410 },
3411 None,
3412 ),
3413 Arch::X86_64 => (
3414 if self.pointer_width == 32 {
3415 Architecture::X86_64_X32
3416 } else {
3417 Architecture::X86_64
3418 },
3419 None,
3420 ),
3421 Arch::PowerPC => (Architecture::PowerPc, None),
3422 Arch::PowerPC64 => (Architecture::PowerPc64, None),
3423 Arch::RiscV32 => (Architecture::Riscv32, None),
3424 Arch::RiscV64 => (Architecture::Riscv64, None),
3425 Arch::Sparc => {
3426 if unstable_target_features.contains(&sym::v8plus) {
3427 (Architecture::Sparc32Plus, None)
3429 } else {
3430 (Architecture::Sparc, None)
3432 }
3433 }
3434 Arch::Sparc64 => (Architecture::Sparc64, None),
3435 Arch::Avr => (Architecture::Avr, None),
3436 Arch::Msp430 => (Architecture::Msp430, None),
3437 Arch::Hexagon => (Architecture::Hexagon, None),
3438 Arch::Xtensa => (Architecture::Xtensa, None),
3439 Arch::Bpf => (Architecture::Bpf, None),
3440 Arch::LoongArch32 => (Architecture::LoongArch32, None),
3441 Arch::LoongArch64 => (Architecture::LoongArch64, None),
3442 Arch::CSky => (Architecture::Csky, None),
3443 Arch::Arm64EC => (Architecture::Aarch64, Some(object::SubArchitecture::Arm64EC)),
3444 Arch::AmdGpu
3445 | Arch::Nvptx64
3446 | Arch::SpirV
3447 | Arch::Wasm32
3448 | Arch::Wasm64
3449 | Arch::Other(_) => return None,
3450 })
3451 }
3452
3453 pub fn max_reliable_alignment(&self) -> Align {
3462 if self.is_like_windows && self.arch == Arch::X86 {
3466 Align::from_bytes(4).unwrap()
3467 } else {
3468 Align::MAX
3469 }
3470 }
3471
3472 pub fn vendor_symbol(&self) -> Symbol {
3473 Symbol::intern(&self.vendor)
3474 }
3475}
3476
3477#[derive(#[automatically_derived]
impl ::core::clone::Clone for TargetTuple {
#[inline]
fn clone(&self) -> TargetTuple {
match self {
TargetTuple::TargetTuple(__self_0) =>
TargetTuple::TargetTuple(::core::clone::Clone::clone(__self_0)),
TargetTuple::TargetJson {
path_for_rustdoc: __self_0,
tuple: __self_1,
contents: __self_2 } =>
TargetTuple::TargetJson {
path_for_rustdoc: ::core::clone::Clone::clone(__self_0),
tuple: ::core::clone::Clone::clone(__self_1),
contents: ::core::clone::Clone::clone(__self_2),
},
}
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for TargetTuple {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
TargetTuple::TargetTuple(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"TargetTuple", &__self_0),
TargetTuple::TargetJson {
path_for_rustdoc: __self_0,
tuple: __self_1,
contents: __self_2 } =>
::core::fmt::Formatter::debug_struct_field3_finish(f,
"TargetJson", "path_for_rustdoc", __self_0, "tuple",
__self_1, "contents", &__self_2),
}
}
}Debug)]
3479pub enum TargetTuple {
3480 TargetTuple(String),
3481 TargetJson {
3482 path_for_rustdoc: PathBuf,
3485 tuple: String,
3486 contents: String,
3487 },
3488}
3489
3490impl PartialEq for TargetTuple {
3492 fn eq(&self, other: &Self) -> bool {
3493 match (self, other) {
3494 (Self::TargetTuple(l0), Self::TargetTuple(r0)) => l0 == r0,
3495 (
3496 Self::TargetJson { path_for_rustdoc: _, tuple: l_tuple, contents: l_contents },
3497 Self::TargetJson { path_for_rustdoc: _, tuple: r_tuple, contents: r_contents },
3498 ) => l_tuple == r_tuple && l_contents == r_contents,
3499 _ => false,
3500 }
3501 }
3502}
3503
3504impl Hash for TargetTuple {
3506 fn hash<H: Hasher>(&self, state: &mut H) -> () {
3507 match self {
3508 TargetTuple::TargetTuple(tuple) => {
3509 0u8.hash(state);
3510 tuple.hash(state)
3511 }
3512 TargetTuple::TargetJson { path_for_rustdoc: _, tuple, contents } => {
3513 1u8.hash(state);
3514 tuple.hash(state);
3515 contents.hash(state)
3516 }
3517 }
3518 }
3519}
3520
3521impl<S: Encoder> Encodable<S> for TargetTuple {
3523 fn encode(&self, s: &mut S) {
3524 match self {
3525 TargetTuple::TargetTuple(tuple) => {
3526 s.emit_u8(0);
3527 s.emit_str(tuple);
3528 }
3529 TargetTuple::TargetJson { path_for_rustdoc: _, tuple, contents } => {
3530 s.emit_u8(1);
3531 s.emit_str(tuple);
3532 s.emit_str(contents);
3533 }
3534 }
3535 }
3536}
3537
3538impl<D: Decoder> Decodable<D> for TargetTuple {
3539 fn decode(d: &mut D) -> Self {
3540 match d.read_u8() {
3541 0 => TargetTuple::TargetTuple(d.read_str().to_owned()),
3542 1 => TargetTuple::TargetJson {
3543 path_for_rustdoc: PathBuf::new(),
3544 tuple: d.read_str().to_owned(),
3545 contents: d.read_str().to_owned(),
3546 },
3547 _ => {
3548 {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `TargetTuple`, expected 0..2"));
};panic!("invalid enum variant tag while decoding `TargetTuple`, expected 0..2");
3549 }
3550 }
3551 }
3552}
3553
3554impl TargetTuple {
3555 pub fn from_tuple(tuple: &str) -> Self {
3557 TargetTuple::TargetTuple(tuple.into())
3558 }
3559
3560 pub fn from_path(path: &Path) -> Result<Self, io::Error> {
3562 let canonicalized_path = try_canonicalize(path)?;
3563 let contents = std::fs::read_to_string(&canonicalized_path).map_err(|err| {
3564 io::Error::new(
3565 io::ErrorKind::InvalidInput,
3566 ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("target path {0:?} is not a valid file: {1}",
canonicalized_path, err))
})format!("target path {canonicalized_path:?} is not a valid file: {err}"),
3567 )
3568 })?;
3569 let tuple = canonicalized_path
3570 .file_stem()
3571 .expect("target path must not be empty")
3572 .to_str()
3573 .expect("target path must be valid unicode")
3574 .to_owned();
3575 Ok(TargetTuple::TargetJson { path_for_rustdoc: canonicalized_path, tuple, contents })
3576 }
3577
3578 pub fn tuple(&self) -> &str {
3582 match *self {
3583 TargetTuple::TargetTuple(ref tuple) | TargetTuple::TargetJson { ref tuple, .. } => {
3584 tuple
3585 }
3586 }
3587 }
3588
3589 pub fn debug_tuple(&self) -> String {
3594 use std::hash::DefaultHasher;
3595
3596 match self {
3597 TargetTuple::TargetTuple(tuple) => tuple.to_owned(),
3598 TargetTuple::TargetJson { path_for_rustdoc: _, tuple, contents: content } => {
3599 let mut hasher = DefaultHasher::new();
3600 content.hash(&mut hasher);
3601 let hash = hasher.finish();
3602 ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0}-{1}", tuple, hash))
})format!("{tuple}-{hash}")
3603 }
3604 }
3605 }
3606}
3607
3608impl fmt::Display for TargetTuple {
3609 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
3610 f.write_fmt(format_args!("{0}", self.debug_tuple()))write!(f, "{}", self.debug_tuple())
3611 }
3612}
3613
3614impl ::rustc_error_messages::IntoDiagArg for &TargetTuple {
fn into_diag_arg(self, path: &mut Option<std::path::PathBuf>)
-> ::rustc_error_messages::DiagArgValue {
self.to_string().into_diag_arg(path)
}
}into_diag_arg_using_display!(&TargetTuple);