1use core::result::Result;
42use std::borrow::Cow;
43use std::collections::BTreeMap;
44use std::hash::Hash;
45use std::ops::{Deref, DerefMut};
46use std::path::{Path, PathBuf};
47use std::str::FromStr;
48
49use rustc_abi::{
50 Align, CVariadicStatus, CanonAbi, Endian, ExternAbi, Integer, Size, TargetDataLayout,
51 TargetDataLayoutError,
52};
53use rustc_data_structures::fx::FxIndexSet;
54use rustc_error_messages::{DiagArgValue, IntoDiagArg, into_diag_arg_using_display};
55use rustc_macros::{BlobDecodable, Decodable, Encodable, StableHash};
56use rustc_span::{Symbol, kw, sym};
57use serde_json::Value;
58use tracing::debug;
59
60use crate::json::{Json, ToJson};
61use crate::spec::crt_objects::CrtObjects;
62
63pub mod crt_objects;
64
65mod abi_map;
66mod base;
67mod consistency;
68mod json;
69mod tuple;
70
71pub use abi_map::{AbiMap, AbiMapping};
72pub use base::apple;
73pub use base::avr::ef_avr_arch;
74pub use json::json_schema;
75pub use rustc_structures::SanitizerSet;
76pub use tuple::TargetTuple;
77
78#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for Cc { }
#[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_fields_are_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::marker::StructuralPartialEq for Cc { }
#[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> {
::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
}
}PartialOrd)]
80pub enum Cc {
81 Yes,
82 No,
83}
84
85#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for Lld { }
#[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_fields_are_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::marker::StructuralPartialEq for Lld { }
#[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> {
::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
}
}PartialOrd)]
87pub enum Lld {
88 Yes,
89 No,
90}
91
92#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for LinkerFlavor { }
#[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::Llbc =>
::core::fmt::Formatter::write_str(f, "Llbc"),
}
}
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for LinkerFlavor {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_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::marker::StructuralPartialEq for LinkerFlavor { }
#[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> {
::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
}
}PartialOrd)]
113pub enum LinkerFlavor {
114 Gnu(Cc, Lld),
118 Darwin(Cc, Lld),
121 WasmLld(Cc),
125 Unix(Cc),
129 Msvc(Lld),
131 EmCc,
134 Bpf,
137 Llbc,
139}
140
141#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for LinkerFlavorCli { }
#[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::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_fields_are_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::marker::StructuralPartialEq for LinkerFlavorCli { }
#[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> {
::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
}
}PartialOrd)]
146pub enum LinkerFlavorCli {
147 Gnu(Cc, Lld),
149 Darwin(Cc, Lld),
150 WasmLld(Cc),
151 Unix(Cc),
152 Msvc(Lld),
154 EmCc,
155 Bpf,
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 => true,
177 LinkerFlavorCli::Gcc
178 | LinkerFlavorCli::Ld
179 | LinkerFlavorCli::Lld(..)
180 | LinkerFlavorCli::Msvc(Lld::No)
181 | LinkerFlavorCli::Em => false,
182 }
183 }
184}
185
186pub enum LldFlavor {
#[serde(rename = "wasm")]
Wasm,
#[serde(rename = "darwin")]
Ld64,
#[serde(rename = "gnu")]
Ld,
#[serde(rename = "link")]
Link,
}
const _: () =
{
#[automatically_derived]
#[allow(unused_braces)]
impl schemars::JsonSchema for LldFlavor {
fn schema_name()
-> schemars::_private::alloc::borrow::Cow<'static, str> {
schemars::_private::alloc::borrow::Cow::Borrowed("LldFlavor")
}
fn schema_id()
-> schemars::_private::alloc::borrow::Cow<'static, str> {
schemars::_private::alloc::borrow::Cow::Borrowed("rustc_target::spec::LldFlavor")
}
fn json_schema(generator: &mut schemars::SchemaGenerator)
-> schemars::Schema {
{
{
let mut map = schemars::_private::serde_json::Map::new();
map.insert("type".into(), "string".into());
map.insert("enum".into(),
schemars::_private::serde_json::Value::Array({
let mut enum_values =
schemars::_private::alloc::vec::Vec::new();
enum_values.push(("wasm").into());
enum_values.push(("darwin").into());
enum_values.push(("gnu").into());
enum_values.push(("link").into());
enum_values
}));
schemars::Schema::from(map)
}
}
}
fn inline_schema() -> bool { false }
}
;
};
#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for LldFlavor { }
#[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_fields_are_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> {
::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
}
}
#[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! {
187 pub enum LldFlavor {
188 Wasm = "wasm",
189 Ld64 = "darwin",
190 Ld = "gnu",
191 Link = "link",
192 }
193
194 parse_error_type = "LLD flavor";
195}
196
197impl LinkerFlavor {
198 fn from_cli_json(cli: LinkerFlavorCli, lld_flavor: LldFlavor, is_gnu: bool) -> LinkerFlavor {
203 match cli {
204 LinkerFlavorCli::Gnu(cc, lld) => LinkerFlavor::Gnu(cc, lld),
205 LinkerFlavorCli::Darwin(cc, lld) => LinkerFlavor::Darwin(cc, lld),
206 LinkerFlavorCli::WasmLld(cc) => LinkerFlavor::WasmLld(cc),
207 LinkerFlavorCli::Unix(cc) => LinkerFlavor::Unix(cc),
208 LinkerFlavorCli::Msvc(lld) => LinkerFlavor::Msvc(lld),
209 LinkerFlavorCli::EmCc => LinkerFlavor::EmCc,
210 LinkerFlavorCli::Bpf => LinkerFlavor::Bpf,
211 LinkerFlavorCli::Llbc => LinkerFlavor::Llbc,
212
213 LinkerFlavorCli::Gcc => match lld_flavor {
215 LldFlavor::Ld if is_gnu => LinkerFlavor::Gnu(Cc::Yes, Lld::No),
216 LldFlavor::Ld64 => LinkerFlavor::Darwin(Cc::Yes, Lld::No),
217 LldFlavor::Wasm => LinkerFlavor::WasmLld(Cc::Yes),
218 LldFlavor::Ld | LldFlavor::Link => LinkerFlavor::Unix(Cc::Yes),
219 },
220 LinkerFlavorCli::Ld => match lld_flavor {
221 LldFlavor::Ld if is_gnu => LinkerFlavor::Gnu(Cc::No, Lld::No),
222 LldFlavor::Ld64 => LinkerFlavor::Darwin(Cc::No, Lld::No),
223 LldFlavor::Ld | LldFlavor::Wasm | LldFlavor::Link => LinkerFlavor::Unix(Cc::No),
224 },
225 LinkerFlavorCli::Lld(LldFlavor::Ld) => LinkerFlavor::Gnu(Cc::No, Lld::Yes),
226 LinkerFlavorCli::Lld(LldFlavor::Ld64) => LinkerFlavor::Darwin(Cc::No, Lld::Yes),
227 LinkerFlavorCli::Lld(LldFlavor::Wasm) => LinkerFlavor::WasmLld(Cc::No),
228 LinkerFlavorCli::Lld(LldFlavor::Link) => LinkerFlavor::Msvc(Lld::Yes),
229 LinkerFlavorCli::Em => LinkerFlavor::EmCc,
230 }
231 }
232
233 fn to_cli(self) -> LinkerFlavorCli {
235 match self {
236 LinkerFlavor::Gnu(Cc::Yes, _)
237 | LinkerFlavor::Darwin(Cc::Yes, _)
238 | LinkerFlavor::WasmLld(Cc::Yes)
239 | LinkerFlavor::Unix(Cc::Yes) => LinkerFlavorCli::Gcc,
240 LinkerFlavor::Gnu(_, Lld::Yes) => LinkerFlavorCli::Lld(LldFlavor::Ld),
241 LinkerFlavor::Darwin(_, Lld::Yes) => LinkerFlavorCli::Lld(LldFlavor::Ld64),
242 LinkerFlavor::WasmLld(..) => LinkerFlavorCli::Lld(LldFlavor::Wasm),
243 LinkerFlavor::Gnu(..) | LinkerFlavor::Darwin(..) | LinkerFlavor::Unix(..) => {
244 LinkerFlavorCli::Ld
245 }
246 LinkerFlavor::Msvc(Lld::Yes) => LinkerFlavorCli::Lld(LldFlavor::Link),
247 LinkerFlavor::Msvc(..) => LinkerFlavorCli::Msvc(Lld::No),
248 LinkerFlavor::EmCc => LinkerFlavorCli::Em,
249 LinkerFlavor::Bpf => LinkerFlavorCli::Bpf,
250 LinkerFlavor::Llbc => LinkerFlavorCli::Llbc,
251 }
252 }
253
254 fn to_cli_counterpart(self) -> LinkerFlavorCli {
256 match self {
257 LinkerFlavor::Gnu(cc, lld) => LinkerFlavorCli::Gnu(cc, lld),
258 LinkerFlavor::Darwin(cc, lld) => LinkerFlavorCli::Darwin(cc, lld),
259 LinkerFlavor::WasmLld(cc) => LinkerFlavorCli::WasmLld(cc),
260 LinkerFlavor::Unix(cc) => LinkerFlavorCli::Unix(cc),
261 LinkerFlavor::Msvc(lld) => LinkerFlavorCli::Msvc(lld),
262 LinkerFlavor::EmCc => LinkerFlavorCli::EmCc,
263 LinkerFlavor::Bpf => LinkerFlavorCli::Bpf,
264 LinkerFlavor::Llbc => LinkerFlavorCli::Llbc,
265 }
266 }
267
268 fn infer_cli_hints(cli: LinkerFlavorCli) -> (Option<Cc>, Option<Lld>) {
269 match cli {
270 LinkerFlavorCli::Gnu(cc, lld) | LinkerFlavorCli::Darwin(cc, lld) => {
271 (Some(cc), Some(lld))
272 }
273 LinkerFlavorCli::WasmLld(cc) => (Some(cc), Some(Lld::Yes)),
274 LinkerFlavorCli::Unix(cc) => (Some(cc), None),
275 LinkerFlavorCli::Msvc(lld) => (Some(Cc::No), Some(lld)),
276 LinkerFlavorCli::EmCc => (Some(Cc::Yes), Some(Lld::Yes)),
277 LinkerFlavorCli::Bpf => (None, None),
278 LinkerFlavorCli::Llbc => (None, None),
279
280 LinkerFlavorCli::Gcc => (Some(Cc::Yes), None),
282 LinkerFlavorCli::Ld => (Some(Cc::No), Some(Lld::No)),
283 LinkerFlavorCli::Lld(_) => (Some(Cc::No), Some(Lld::Yes)),
284 LinkerFlavorCli::Em => (Some(Cc::Yes), Some(Lld::Yes)),
285 }
286 }
287
288 fn infer_linker_hints(linker_stem: &str) -> Result<Self, (Option<Cc>, Option<Lld>)> {
289 let stem = linker_stem
291 .rsplit_once('-')
292 .and_then(|(lhs, rhs)| rhs.chars().all(char::is_numeric).then_some(lhs))
293 .unwrap_or(linker_stem);
294
295 if stem == "llvm-bitcode-linker" {
296 Ok(Self::Llbc)
297 } else if stem == "emcc" || stem == "gcc"
299 || stem.ends_with("-gcc")
300 || stem == "g++"
301 || stem.ends_with("-g++")
302 || stem == "clang"
303 || stem.ends_with("-clang")
304 || stem == "clang++"
305 || stem.ends_with("-clang++")
306 {
307 Err((Some(Cc::Yes), Some(Lld::No)))
308 } else if stem == "wasm-ld"
309 || stem.ends_with("-wasm-ld")
310 || stem == "ld.lld"
311 || stem == "lld"
312 || stem == "rust-lld"
313 || stem == "lld-link"
314 {
315 Err((Some(Cc::No), Some(Lld::Yes)))
316 } else if stem == "ld" || stem.ends_with("-ld") || stem == "link" {
317 Err((Some(Cc::No), Some(Lld::No)))
318 } else {
319 Err((None, None))
320 }
321 }
322
323 fn with_hints(self, (cc_hint, lld_hint): (Option<Cc>, Option<Lld>)) -> LinkerFlavor {
324 match self {
325 LinkerFlavor::Gnu(cc, lld) => {
326 LinkerFlavor::Gnu(cc_hint.unwrap_or(cc), lld_hint.unwrap_or(lld))
327 }
328 LinkerFlavor::Darwin(cc, lld) => {
329 LinkerFlavor::Darwin(cc_hint.unwrap_or(cc), lld_hint.unwrap_or(lld))
330 }
331 LinkerFlavor::WasmLld(cc) => LinkerFlavor::WasmLld(cc_hint.unwrap_or(cc)),
332 LinkerFlavor::Unix(cc) => LinkerFlavor::Unix(cc_hint.unwrap_or(cc)),
333 LinkerFlavor::Msvc(lld) => LinkerFlavor::Msvc(lld_hint.unwrap_or(lld)),
334 LinkerFlavor::EmCc | LinkerFlavor::Bpf | LinkerFlavor::Llbc => self,
335 }
336 }
337
338 pub fn with_cli_hints(self, cli: LinkerFlavorCli) -> LinkerFlavor {
339 self.with_hints(LinkerFlavor::infer_cli_hints(cli))
340 }
341
342 pub fn with_linker_hints(self, linker_stem: &str) -> LinkerFlavor {
343 match LinkerFlavor::infer_linker_hints(linker_stem) {
344 Ok(linker_flavor) => linker_flavor,
345 Err(hints) => self.with_hints(hints),
346 }
347 }
348
349 pub fn check_compatibility(self, cli: LinkerFlavorCli) -> Option<String> {
350 let compatible = |cli| {
351 match (self, cli) {
353 (LinkerFlavor::Gnu(..), LinkerFlavorCli::Gnu(..))
355 | (LinkerFlavor::Darwin(..), LinkerFlavorCli::Darwin(..))
356 | (LinkerFlavor::WasmLld(..), LinkerFlavorCli::WasmLld(..))
357 | (LinkerFlavor::Unix(..), LinkerFlavorCli::Unix(..))
358 | (LinkerFlavor::Msvc(..), LinkerFlavorCli::Msvc(..))
359 | (LinkerFlavor::EmCc, LinkerFlavorCli::EmCc)
360 | (LinkerFlavor::Bpf, LinkerFlavorCli::Bpf)
361 | (LinkerFlavor::Llbc, LinkerFlavorCli::Llbc) => return true,
362 _ => {}
363 }
364
365 cli == self.with_cli_hints(cli).to_cli()
367 };
368 (!compatible(cli)).then(|| {
369 LinkerFlavorCli::all()
370 .iter()
371 .filter(|cli| compatible(**cli))
372 .map(|cli| cli.desc())
373 .intersperse(", ")
374 .collect()
375 })
376 }
377
378 pub fn lld_flavor(self) -> LldFlavor {
379 match self {
380 LinkerFlavor::Gnu(..)
381 | LinkerFlavor::Unix(..)
382 | LinkerFlavor::EmCc
383 | LinkerFlavor::Bpf
384 | LinkerFlavor::Llbc => LldFlavor::Ld,
385 LinkerFlavor::Darwin(..) => LldFlavor::Ld64,
386 LinkerFlavor::WasmLld(..) => LldFlavor::Wasm,
387 LinkerFlavor::Msvc(..) => LldFlavor::Link,
388 }
389 }
390
391 pub fn is_gnu(self) -> bool {
392 #[allow(non_exhaustive_omitted_patterns)] match self {
LinkerFlavor::Gnu(..) => true,
_ => false,
}matches!(self, LinkerFlavor::Gnu(..))
393 }
394
395 pub fn uses_lld(self) -> bool {
397 match self {
399 LinkerFlavor::Gnu(_, Lld::Yes)
400 | LinkerFlavor::Darwin(_, Lld::Yes)
401 | LinkerFlavor::WasmLld(..)
402 | LinkerFlavor::EmCc
403 | LinkerFlavor::Msvc(Lld::Yes) => true,
404 LinkerFlavor::Gnu(..)
405 | LinkerFlavor::Darwin(..)
406 | LinkerFlavor::Msvc(_)
407 | LinkerFlavor::Unix(_)
408 | LinkerFlavor::Bpf
409 | LinkerFlavor::Llbc => false,
410 }
411 }
412
413 pub fn uses_cc(self) -> bool {
415 match self {
417 LinkerFlavor::Gnu(Cc::Yes, _)
418 | LinkerFlavor::Darwin(Cc::Yes, _)
419 | LinkerFlavor::WasmLld(Cc::Yes)
420 | LinkerFlavor::Unix(Cc::Yes)
421 | LinkerFlavor::EmCc => true,
422 LinkerFlavor::Gnu(..)
423 | LinkerFlavor::Darwin(..)
424 | LinkerFlavor::WasmLld(_)
425 | LinkerFlavor::Msvc(_)
426 | LinkerFlavor::Unix(_)
427 | LinkerFlavor::Bpf
428 | LinkerFlavor::Llbc => false,
429 }
430 }
431
432 pub fn with_lld_enabled(self) -> LinkerFlavor {
435 match self {
436 LinkerFlavor::Gnu(cc, Lld::No) => LinkerFlavor::Gnu(cc, Lld::Yes),
437 LinkerFlavor::Darwin(cc, Lld::No) => LinkerFlavor::Darwin(cc, Lld::Yes),
438 LinkerFlavor::Msvc(Lld::No) => LinkerFlavor::Msvc(Lld::Yes),
439 _ => self,
440 }
441 }
442
443 pub fn with_lld_disabled(self) -> LinkerFlavor {
446 match self {
447 LinkerFlavor::Gnu(cc, Lld::Yes) => LinkerFlavor::Gnu(cc, Lld::No),
448 LinkerFlavor::Darwin(cc, Lld::Yes) => LinkerFlavor::Darwin(cc, Lld::No),
449 LinkerFlavor::Msvc(Lld::Yes) => LinkerFlavor::Msvc(Lld::No),
450 _ => self,
451 }
452 }
453}
454
455macro_rules! linker_flavor_cli_impls {
456 ($(($($flavor:tt)*) $string:literal)*) => (
457 impl LinkerFlavorCli {
458 const fn all() -> &'static [LinkerFlavorCli] {
459 &[$($($flavor)*,)*]
460 }
461
462 pub const fn one_of() -> &'static str {
463 concat!("one of: ", $($string, " ",)*)
464 }
465
466 pub fn desc(self) -> &'static str {
467 match self {
468 $($($flavor)* => $string,)*
469 }
470 }
471 }
472
473 impl FromStr for LinkerFlavorCli {
474 type Err = String;
475
476 fn from_str(s: &str) -> Result<LinkerFlavorCli, Self::Err> {
477 Ok(match s {
478 $($string => $($flavor)*,)*
479 _ => return Err(format!("invalid linker flavor, allowed values: {}", Self::one_of())),
480 })
481 }
482 }
483 )
484}
485
486impl 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::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 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::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,
"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! {
487 (LinkerFlavorCli::Gnu(Cc::No, Lld::No)) "gnu"
488 (LinkerFlavorCli::Gnu(Cc::No, Lld::Yes)) "gnu-lld"
489 (LinkerFlavorCli::Gnu(Cc::Yes, Lld::No)) "gnu-cc"
490 (LinkerFlavorCli::Gnu(Cc::Yes, Lld::Yes)) "gnu-lld-cc"
491 (LinkerFlavorCli::Darwin(Cc::No, Lld::No)) "darwin"
492 (LinkerFlavorCli::Darwin(Cc::No, Lld::Yes)) "darwin-lld"
493 (LinkerFlavorCli::Darwin(Cc::Yes, Lld::No)) "darwin-cc"
494 (LinkerFlavorCli::Darwin(Cc::Yes, Lld::Yes)) "darwin-lld-cc"
495 (LinkerFlavorCli::WasmLld(Cc::No)) "wasm-lld"
496 (LinkerFlavorCli::WasmLld(Cc::Yes)) "wasm-lld-cc"
497 (LinkerFlavorCli::Unix(Cc::No)) "unix"
498 (LinkerFlavorCli::Unix(Cc::Yes)) "unix-cc"
499 (LinkerFlavorCli::Msvc(Lld::Yes)) "msvc-lld"
500 (LinkerFlavorCli::Msvc(Lld::No)) "msvc"
501 (LinkerFlavorCli::EmCc) "em-cc"
502 (LinkerFlavorCli::Bpf) "bpf"
503 (LinkerFlavorCli::Llbc) "llbc"
504
505 (LinkerFlavorCli::Gcc) "gcc"
507 (LinkerFlavorCli::Ld) "ld"
508 (LinkerFlavorCli::Lld(LldFlavor::Ld)) "ld.lld"
509 (LinkerFlavorCli::Lld(LldFlavor::Ld64)) "ld64.lld"
510 (LinkerFlavorCli::Lld(LldFlavor::Link)) "lld-link"
511 (LinkerFlavorCli::Lld(LldFlavor::Wasm)) "wasm-ld"
512 (LinkerFlavorCli::Em) "em"
513}
514
515impl<'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);
516impl schemars::JsonSchema for LinkerFlavorCli {
517 fn schema_name() -> std::borrow::Cow<'static, str> {
518 "LinkerFlavor".into()
519 }
520 fn json_schema(_: &mut schemars::SchemaGenerator) -> schemars::Schema {
521 let all: Vec<&'static str> =
522 Self::all().iter().map(|flavor| flavor.desc()).collect::<Vec<_>>();
523 <::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! ({
524 "type": "string",
525 "enum": all
526 })
527 }
528}
529
530impl ToJson for LinkerFlavorCli {
531 fn to_json(&self) -> Json {
532 self.desc().to_json()
533 }
534}
535
536#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for LinkSelfContainedDefault { }
#[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::marker::StructuralPartialEq for LinkSelfContainedDefault { }
#[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)]
543pub enum LinkSelfContainedDefault {
544 True,
546
547 False,
549
550 InferredForMusl,
552
553 InferredForMingw,
555
556 WithComponents(LinkSelfContainedComponents),
559}
560
561impl FromStr for LinkSelfContainedDefault {
563 type Err = String;
564
565 fn from_str(s: &str) -> Result<LinkSelfContainedDefault, Self::Err> {
566 Ok(match s {
567 "false" => LinkSelfContainedDefault::False,
568 "true" | "wasm" => LinkSelfContainedDefault::True,
569 "musl" => LinkSelfContainedDefault::InferredForMusl,
570 "mingw" => LinkSelfContainedDefault::InferredForMingw,
571 _ => {
572 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!(
573 "'{s}' is not a valid `-Clink-self-contained` default. \
574 Use 'false', 'true', 'wasm', 'musl' or 'mingw'",
575 ));
576 }
577 })
578 }
579}
580
581impl<'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);
582impl schemars::JsonSchema for LinkSelfContainedDefault {
583 fn schema_name() -> std::borrow::Cow<'static, str> {
584 "LinkSelfContainedDefault".into()
585 }
586 fn json_schema(_: &mut schemars::SchemaGenerator) -> schemars::Schema {
587 <::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(::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[::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! ({
588 "type": "string",
589 "enum": ["false", "true", "wasm", "musl", "mingw"]
590 })
591 }
592}
593
594impl ToJson for LinkSelfContainedDefault {
595 fn to_json(&self) -> Json {
596 match *self {
597 LinkSelfContainedDefault::WithComponents(components) => {
598 let mut map = BTreeMap::new();
602 map.insert("components", components);
603 map.to_json()
604 }
605
606 LinkSelfContainedDefault::True => "true".to_json(),
608 LinkSelfContainedDefault::False => "false".to_json(),
609 LinkSelfContainedDefault::InferredForMusl => "musl".to_json(),
610 LinkSelfContainedDefault::InferredForMingw => "mingw".to_json(),
611 }
612 }
613}
614
615impl LinkSelfContainedDefault {
616 pub fn is_disabled(self) -> bool {
619 self == LinkSelfContainedDefault::False
620 }
621
622 fn json_key(self) -> &'static str {
626 match self {
627 LinkSelfContainedDefault::WithComponents(_) => "link-self-contained",
628 _ => "crt-objects-fallback",
629 }
630 }
631
632 pub fn with_linker() -> LinkSelfContainedDefault {
635 LinkSelfContainedDefault::WithComponents(LinkSelfContainedComponents::LINKER)
636 }
637}
638
639#[doc =
r" The `-C link-self-contained` components that can individually be enabled or disabled."]
pub struct LinkSelfContainedComponents(<LinkSelfContainedComponents as
::bitflags::__private::PublicFlags>::Internal);
#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for LinkSelfContainedComponents { }
#[automatically_derived]
impl ::core::clone::Clone for LinkSelfContainedComponents {
#[inline]
fn clone(&self) -> LinkSelfContainedComponents {
let _:
::core::clone::AssertParamIsClone<<LinkSelfContainedComponents
as ::bitflags::__private::PublicFlags>::Internal>;
*self
}
}
#[automatically_derived]
impl ::core::marker::Copy for LinkSelfContainedComponents { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for LinkSelfContainedComponents { }
#[automatically_derived]
impl ::core::cmp::PartialEq for LinkSelfContainedComponents {
#[inline]
fn eq(&self, other: &LinkSelfContainedComponents) -> bool {
self.0 == other.0
}
}
#[automatically_derived]
impl ::core::cmp::Eq for LinkSelfContainedComponents {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _:
::core::cmp::AssertParamIsEq<<LinkSelfContainedComponents as
::bitflags::__private::PublicFlags>::Internal>;
}
}
#[automatically_derived]
impl ::core::default::Default for LinkSelfContainedComponents {
#[inline]
fn default() -> LinkSelfContainedComponents {
LinkSelfContainedComponents(::core::default::Default::default())
}
}
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_fields_are_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::option::Option::Some(::core::cmp::Ord::cmp(self,
other))
}
}
#[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() }
}
};bitflags::bitflags! {
640 #[derive(Clone, Copy, PartialEq, Eq, Default)]
641 pub struct LinkSelfContainedComponents: u8 {
643 const CRT_OBJECTS = 1 << 0;
645 const LIBC = 1 << 1;
647 const UNWIND = 1 << 2;
649 const LINKER = 1 << 3;
651 const SANITIZERS = 1 << 4;
653 const MINGW = 1 << 5;
655 }
656}
657impl ::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 }
658
659impl LinkSelfContainedComponents {
660 pub fn as_str(self) -> Option<&'static str> {
664 Some(match self {
665 LinkSelfContainedComponents::CRT_OBJECTS => "crto",
666 LinkSelfContainedComponents::LIBC => "libc",
667 LinkSelfContainedComponents::UNWIND => "unwind",
668 LinkSelfContainedComponents::LINKER => "linker",
669 LinkSelfContainedComponents::SANITIZERS => "sanitizers",
670 LinkSelfContainedComponents::MINGW => "mingw",
671 _ => return None,
672 })
673 }
674
675 fn all_components() -> [LinkSelfContainedComponents; 6] {
677 [
678 LinkSelfContainedComponents::CRT_OBJECTS,
679 LinkSelfContainedComponents::LIBC,
680 LinkSelfContainedComponents::UNWIND,
681 LinkSelfContainedComponents::LINKER,
682 LinkSelfContainedComponents::SANITIZERS,
683 LinkSelfContainedComponents::MINGW,
684 ]
685 }
686
687 pub fn are_any_components_enabled(self) -> bool {
689 !self.is_empty()
690 }
691
692 pub fn is_linker_enabled(self) -> bool {
694 self.contains(LinkSelfContainedComponents::LINKER)
695 }
696
697 pub fn is_crt_objects_enabled(self) -> bool {
699 self.contains(LinkSelfContainedComponents::CRT_OBJECTS)
700 }
701}
702
703impl FromStr for LinkSelfContainedComponents {
704 type Err = String;
705
706 fn from_str(s: &str) -> Result<Self, Self::Err> {
708 Ok(match s {
709 "crto" => LinkSelfContainedComponents::CRT_OBJECTS,
710 "libc" => LinkSelfContainedComponents::LIBC,
711 "unwind" => LinkSelfContainedComponents::UNWIND,
712 "linker" => LinkSelfContainedComponents::LINKER,
713 "sanitizers" => LinkSelfContainedComponents::SANITIZERS,
714 "mingw" => LinkSelfContainedComponents::MINGW,
715 _ => {
716 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!(
717 "'{s}' is not a valid link-self-contained component, expected 'crto', 'libc', 'unwind', 'linker', 'sanitizers', 'mingw'"
718 ));
719 }
720 })
721 }
722}
723
724impl<'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);
725impl schemars::JsonSchema for LinkSelfContainedComponents {
726 fn schema_name() -> std::borrow::Cow<'static, str> {
727 "LinkSelfContainedComponents".into()
728 }
729 fn json_schema(_: &mut schemars::SchemaGenerator) -> schemars::Schema {
730 let all =
731 Self::all_components().iter().map(|component| component.as_str()).collect::<Vec<_>>();
732 <::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! ({
733 "type": "string",
734 "enum": all,
735 })
736 }
737}
738
739impl ToJson for LinkSelfContainedComponents {
740 fn to_json(&self) -> Json {
741 let components: Vec<_> = Self::all_components()
742 .into_iter()
743 .filter(|c| self.contains(*c))
744 .map(|c| {
745 c.as_str().unwrap().to_owned()
748 })
749 .collect();
750
751 components.to_json()
752 }
753}
754
755#[doc =
r" The `-C linker-features` components that can individually be enabled or disabled."]
#[doc = r""]
#[doc =
r" They are feature flags intended to be a more flexible mechanism than linker flavors, and"]
#[doc =
r" also to prevent a combinatorial explosion of flavors whenever a new linker feature is"]
#[doc =
r#" required. These flags are "generic", in the sense that they can work on multiple targets on"#]
#[doc =
r" the CLI. Otherwise, one would have to select different linkers flavors for each target."]
#[doc = r""]
#[doc = r" Here are some examples of the advantages they offer:"]
#[doc =
r" - default feature sets for principal flavors, or for specific targets."]
#[doc =
r" - flavor-specific features: for example, clang offers automatic cross-linking with"]
#[doc =
r" `--target`, which gcc-style compilers don't support. The *flavor* is still a C/C++"]
#[doc =
r" compiler, and we don't need to multiply the number of flavors for this use-case. Instead,"]
#[doc = r" we can have a single `+target` feature."]
#[doc =
r" - umbrella features: for example if clang accumulates more features in the future than just"]
#[doc = r" the `+target` above. That could be modeled as `+clang`."]
#[doc =
r" - niche features for resolving specific issues: for example, on Apple targets the linker"]
#[doc =
r" flag implementing the `as-needed` native link modifier (#99424) is only possible on"]
#[doc = r" sufficiently recent linker versions."]
#[doc =
r" - still allows for discovery and automation, for example via feature detection. This can be"]
#[doc = r" useful in exotic environments/build systems."]
pub struct LinkerFeatures(<LinkerFeatures as
::bitflags::__private::PublicFlags>::Internal);
#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for LinkerFeatures { }
#[automatically_derived]
impl ::core::clone::Clone for LinkerFeatures {
#[inline]
fn clone(&self) -> LinkerFeatures {
let _:
::core::clone::AssertParamIsClone<<LinkerFeatures as
::bitflags::__private::PublicFlags>::Internal>;
*self
}
}
#[automatically_derived]
impl ::core::marker::Copy for LinkerFeatures { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for LinkerFeatures { }
#[automatically_derived]
impl ::core::cmp::PartialEq for LinkerFeatures {
#[inline]
fn eq(&self, other: &LinkerFeatures) -> bool { self.0 == other.0 }
}
#[automatically_derived]
impl ::core::cmp::Eq for LinkerFeatures {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _:
::core::cmp::AssertParamIsEq<<LinkerFeatures as
::bitflags::__private::PublicFlags>::Internal>;
}
}
#[automatically_derived]
impl ::core::default::Default for LinkerFeatures {
#[inline]
fn default() -> LinkerFeatures {
LinkerFeatures(::core::default::Default::default())
}
}
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_fields_are_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::option::Option::Some(::core::cmp::Ord::cmp(self,
other))
}
}
#[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() }
}
};bitflags::bitflags! {
756 #[derive(Clone, Copy, PartialEq, Eq, Default)]
777 pub struct LinkerFeatures: u8 {
778 const CC = 1 << 0;
780 const LLD = 1 << 1;
782 }
783}
784impl ::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 }
785
786impl LinkerFeatures {
787 pub fn from_str(s: &str) -> Option<LinkerFeatures> {
789 Some(match s {
790 "cc" => LinkerFeatures::CC,
791 "lld" => LinkerFeatures::LLD,
792 _ => return None,
793 })
794 }
795
796 pub fn as_str(self) -> Option<&'static str> {
800 Some(match self {
801 LinkerFeatures::CC => "cc",
802 LinkerFeatures::LLD => "lld",
803 _ => return None,
804 })
805 }
806
807 pub fn is_lld_enabled(self) -> bool {
809 self.contains(LinkerFeatures::LLD)
810 }
811
812 pub fn is_cc_enabled(self) -> bool {
814 self.contains(LinkerFeatures::CC)
815 }
816}
817
818pub enum PanicStrategy {
#[serde(rename = "unwind")]
Unwind,
#[serde(rename = "abort")]
Abort,
#[serde(rename = "immediate-abort")]
ImmediateAbort,
}
const _: () =
{
#[automatically_derived]
#[allow(unused_braces)]
impl schemars::JsonSchema for PanicStrategy {
fn schema_name()
-> schemars::_private::alloc::borrow::Cow<'static, str> {
schemars::_private::alloc::borrow::Cow::Borrowed("PanicStrategy")
}
fn schema_id()
-> schemars::_private::alloc::borrow::Cow<'static, str> {
schemars::_private::alloc::borrow::Cow::Borrowed("rustc_target::spec::PanicStrategy")
}
fn json_schema(generator: &mut schemars::SchemaGenerator)
-> schemars::Schema {
{
{
let mut map = schemars::_private::serde_json::Map::new();
map.insert("type".into(), "string".into());
map.insert("enum".into(),
schemars::_private::serde_json::Value::Array({
let mut enum_values =
schemars::_private::alloc::vec::Vec::new();
enum_values.push(("unwind").into());
enum_values.push(("abort").into());
enum_values.push(("immediate-abort").into());
enum_values
}));
schemars::Schema::from(map)
}
}
}
fn inline_schema() -> bool { false }
}
;
};
#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for PanicStrategy { }
#[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_fields_are_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> {
::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
}
}
#[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);
}
}
};
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 ::rustc_data_structures::stable_hash::StableHash for
PanicStrategy {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__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! {
819 #[derive(Encodable, BlobDecodable, StableHash)]
820 pub enum PanicStrategy {
821 Unwind = "unwind",
822 Abort = "abort",
823 ImmediateAbort = "immediate-abort",
824 }
825
826 parse_error_type = "panic strategy";
827}
828
829#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for OnBrokenPipe { }
#[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::marker::StructuralPartialEq for OnBrokenPipe { }
#[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);
}
}
};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 ::rustc_data_structures::stable_hash::StableHash for OnBrokenPipe
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
OnBrokenPipe::Default => {}
OnBrokenPipe::Kill => {}
OnBrokenPipe::Error => {}
OnBrokenPipe::Inherit => {}
}
}
}
};StableHash)]
830pub enum OnBrokenPipe {
831 Default,
832 Kill,
833 Error,
834 Inherit,
835}
836
837impl PanicStrategy {
838 pub const fn desc_symbol(&self) -> Symbol {
839 match *self {
840 PanicStrategy::Unwind => sym::unwind,
841 PanicStrategy::Abort => sym::abort,
842 PanicStrategy::ImmediateAbort => sym::immediate_abort,
843 }
844 }
845
846 pub fn unwinds(self) -> bool {
847 #[allow(non_exhaustive_omitted_patterns)] match self {
PanicStrategy::Unwind => true,
_ => false,
}matches!(self, PanicStrategy::Unwind)
848 }
849}
850
851pub enum RelroLevel {
#[serde(rename = "full")]
Full,
#[serde(rename = "partial")]
Partial,
#[serde(rename = "off")]
Off,
#[serde(rename = "none")]
None,
}
const _: () =
{
#[automatically_derived]
#[allow(unused_braces)]
impl schemars::JsonSchema for RelroLevel {
fn schema_name()
-> schemars::_private::alloc::borrow::Cow<'static, str> {
schemars::_private::alloc::borrow::Cow::Borrowed("RelroLevel")
}
fn schema_id()
-> schemars::_private::alloc::borrow::Cow<'static, str> {
schemars::_private::alloc::borrow::Cow::Borrowed("rustc_target::spec::RelroLevel")
}
fn json_schema(generator: &mut schemars::SchemaGenerator)
-> schemars::Schema {
{
{
let mut map = schemars::_private::serde_json::Map::new();
map.insert("type".into(), "string".into());
map.insert("enum".into(),
schemars::_private::serde_json::Value::Array({
let mut enum_values =
schemars::_private::alloc::vec::Vec::new();
enum_values.push(("full").into());
enum_values.push(("partial").into());
enum_values.push(("off").into());
enum_values.push(("none").into());
enum_values
}));
schemars::Schema::from(map)
}
}
}
fn inline_schema() -> bool { false }
}
;
};
#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for RelroLevel { }
#[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_fields_are_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> {
::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
}
}
#[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! {
852 pub enum RelroLevel {
853 Full = "full",
854 Partial = "partial",
855 Off = "off",
856 None = "none",
857 }
858
859 parse_error_type = "relro level";
860}
861
862impl IntoDiagArg for PanicStrategy {
863 fn into_diag_arg(self, _: &mut Option<std::path::PathBuf>) -> DiagArgValue {
864 DiagArgValue::Str(Cow::Owned(self.desc().to_string()))
865 }
866}
867
868pub enum SymbolVisibility {
#[serde(rename = "hidden")]
Hidden,
#[serde(rename = "protected")]
Protected,
#[serde(rename = "interposable")]
Interposable,
}
const _: () =
{
#[automatically_derived]
#[allow(unused_braces)]
impl schemars::JsonSchema for SymbolVisibility {
fn schema_name()
-> schemars::_private::alloc::borrow::Cow<'static, str> {
schemars::_private::alloc::borrow::Cow::Borrowed("SymbolVisibility")
}
fn schema_id()
-> schemars::_private::alloc::borrow::Cow<'static, str> {
schemars::_private::alloc::borrow::Cow::Borrowed("rustc_target::spec::SymbolVisibility")
}
fn json_schema(generator: &mut schemars::SchemaGenerator)
-> schemars::Schema {
{
{
let mut map = schemars::_private::serde_json::Map::new();
map.insert("type".into(), "string".into());
map.insert("enum".into(),
schemars::_private::serde_json::Value::Array({
let mut enum_values =
schemars::_private::alloc::vec::Vec::new();
enum_values.push(("hidden").into());
enum_values.push(("protected").into());
enum_values.push(("interposable").into());
enum_values
}));
schemars::Schema::from(map)
}
}
}
fn inline_schema() -> bool { false }
}
;
};
#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for SymbolVisibility { }
#[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_fields_are_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> {
::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
}
}
#[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! {
869 pub enum SymbolVisibility {
870 Hidden = "hidden",
871 Protected = "protected",
872 Interposable = "interposable",
873 }
874
875 parse_error_type = "symbol visibility";
876}
877
878#[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::marker::StructuralPartialEq for SmallDataThresholdSupport { }
#[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)]
879pub enum SmallDataThresholdSupport {
880 None,
881 DefaultForArch,
882 LlvmModuleFlag(StaticCow<str>),
883 LlvmArg(StaticCow<str>),
884}
885
886impl FromStr for SmallDataThresholdSupport {
887 type Err = String;
888
889 fn from_str(s: &str) -> Result<Self, Self::Err> {
890 if s == "none" {
891 Ok(Self::None)
892 } else if s == "default-for-arch" {
893 Ok(Self::DefaultForArch)
894 } else if let Some(flag) = s.strip_prefix("llvm-module-flag=") {
895 Ok(Self::LlvmModuleFlag(flag.to_string().into()))
896 } else if let Some(arg) = s.strip_prefix("llvm-arg=") {
897 Ok(Self::LlvmArg(arg.to_string().into()))
898 } else {
899 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."))
900 }
901 }
902}
903
904impl<'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);
905impl schemars::JsonSchema for SmallDataThresholdSupport {
906 fn schema_name() -> std::borrow::Cow<'static, str> {
907 "SmallDataThresholdSupport".into()
908 }
909 fn json_schema(_: &mut schemars::SchemaGenerator) -> schemars::Schema {
910 <::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! ({
911 "type": "string",
912 "pattern": r#"^none|default-for-arch|llvm-module-flag=.+|llvm-arg=.+$"#,
913 })
914 }
915}
916
917impl ToJson for SmallDataThresholdSupport {
918 fn to_json(&self) -> Value {
919 match self {
920 Self::None => "none".to_json(),
921 Self::DefaultForArch => "default-for-arch".to_json(),
922 Self::LlvmModuleFlag(flag) => ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("llvm-module-flag={0}", flag))
})format!("llvm-module-flag={flag}").to_json(),
923 Self::LlvmArg(arg) => ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("llvm-arg={0}", arg))
})format!("llvm-arg={arg}").to_json(),
924 }
925 }
926}
927
928pub enum MergeFunctions {
#[serde(rename = "disabled")]
Disabled,
#[serde(rename = "trampolines")]
Trampolines,
#[serde(rename = "aliases")]
Aliases,
}
const _: () =
{
#[automatically_derived]
#[allow(unused_braces)]
impl schemars::JsonSchema for MergeFunctions {
fn schema_name()
-> schemars::_private::alloc::borrow::Cow<'static, str> {
schemars::_private::alloc::borrow::Cow::Borrowed("MergeFunctions")
}
fn schema_id()
-> schemars::_private::alloc::borrow::Cow<'static, str> {
schemars::_private::alloc::borrow::Cow::Borrowed("rustc_target::spec::MergeFunctions")
}
fn json_schema(generator: &mut schemars::SchemaGenerator)
-> schemars::Schema {
{
{
let mut map = schemars::_private::serde_json::Map::new();
map.insert("type".into(), "string".into());
map.insert("enum".into(),
schemars::_private::serde_json::Value::Array({
let mut enum_values =
schemars::_private::alloc::vec::Vec::new();
enum_values.push(("disabled").into());
enum_values.push(("trampolines").into());
enum_values.push(("aliases").into());
enum_values
}));
schemars::Schema::from(map)
}
}
}
fn inline_schema() -> bool { false }
}
;
};
#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for MergeFunctions { }
#[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_fields_are_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> {
::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
}
}
#[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! {
929 pub enum MergeFunctions {
930 Disabled = "disabled",
931 Trampolines = "trampolines",
932 Aliases = "aliases",
933 }
934
935 parse_error_type = "value for merge-functions";
936}
937
938pub enum RelocModel {
#[serde(rename = "static")]
Static,
#[serde(rename = "pic")]
Pic,
#[serde(rename = "pie")]
Pie,
#[serde(rename = "dynamic-no-pic")]
DynamicNoPic,
#[serde(rename = "ropi")]
Ropi,
#[serde(rename = "rwpi")]
Rwpi,
#[serde(rename = "ropi-rwpi")]
RopiRwpi,
}
const _: () =
{
#[automatically_derived]
#[allow(unused_braces)]
impl schemars::JsonSchema for RelocModel {
fn schema_name()
-> schemars::_private::alloc::borrow::Cow<'static, str> {
schemars::_private::alloc::borrow::Cow::Borrowed("RelocModel")
}
fn schema_id()
-> schemars::_private::alloc::borrow::Cow<'static, str> {
schemars::_private::alloc::borrow::Cow::Borrowed("rustc_target::spec::RelocModel")
}
fn json_schema(generator: &mut schemars::SchemaGenerator)
-> schemars::Schema {
{
{
let mut map = schemars::_private::serde_json::Map::new();
map.insert("type".into(), "string".into());
map.insert("enum".into(),
schemars::_private::serde_json::Value::Array({
let mut enum_values =
schemars::_private::alloc::vec::Vec::new();
enum_values.push(("static").into());
enum_values.push(("pic").into());
enum_values.push(("pie").into());
enum_values.push(("dynamic-no-pic").into());
enum_values.push(("ropi").into());
enum_values.push(("rwpi").into());
enum_values.push(("ropi-rwpi").into());
enum_values
}));
schemars::Schema::from(map)
}
}
}
fn inline_schema() -> bool { false }
}
;
};
#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for RelocModel { }
#[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_fields_are_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> {
::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
}
}
#[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! {
939 pub enum RelocModel {
940 Static = "static",
941 Pic = "pic",
942 Pie = "pie",
943 DynamicNoPic = "dynamic-no-pic",
944 Ropi = "ropi",
945 Rwpi = "rwpi",
946 RopiRwpi = "ropi-rwpi",
947 }
948
949 parse_error_type = "relocation model";
950}
951
952impl RelocModel {
953 pub const fn desc_symbol(&self) -> Symbol {
954 match *self {
955 RelocModel::Static => kw::Static,
956 RelocModel::Pic => sym::pic,
957 RelocModel::Pie => sym::pie,
958 RelocModel::DynamicNoPic => sym::dynamic_no_pic,
959 RelocModel::Ropi => sym::ropi,
960 RelocModel::Rwpi => sym::rwpi,
961 RelocModel::RopiRwpi => sym::ropi_rwpi,
962 }
963 }
964}
965
966pub enum CodeModel {
#[serde(rename = "tiny")]
Tiny,
#[serde(rename = "small")]
Small,
#[serde(rename = "kernel")]
Kernel,
#[serde(rename = "medium")]
Medium,
#[serde(rename = "large")]
Large,
}
const _: () =
{
#[automatically_derived]
#[allow(unused_braces)]
impl schemars::JsonSchema for CodeModel {
fn schema_name()
-> schemars::_private::alloc::borrow::Cow<'static, str> {
schemars::_private::alloc::borrow::Cow::Borrowed("CodeModel")
}
fn schema_id()
-> schemars::_private::alloc::borrow::Cow<'static, str> {
schemars::_private::alloc::borrow::Cow::Borrowed("rustc_target::spec::CodeModel")
}
fn json_schema(generator: &mut schemars::SchemaGenerator)
-> schemars::Schema {
{
{
let mut map = schemars::_private::serde_json::Map::new();
map.insert("type".into(), "string".into());
map.insert("enum".into(),
schemars::_private::serde_json::Value::Array({
let mut enum_values =
schemars::_private::alloc::vec::Vec::new();
enum_values.push(("tiny").into());
enum_values.push(("small").into());
enum_values.push(("kernel").into());
enum_values.push(("medium").into());
enum_values.push(("large").into());
enum_values
}));
schemars::Schema::from(map)
}
}
}
fn inline_schema() -> bool { false }
}
;
};
#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for CodeModel { }
#[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_fields_are_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> {
::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
}
}
#[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! {
967 pub enum CodeModel {
968 Tiny = "tiny",
969 Small = "small",
970 Kernel = "kernel",
971 Medium = "medium",
972 Large = "large",
973 }
974
975 parse_error_type = "code model";
976}
977
978#[doc =
r" The float ABI setting to be configured in the LLVM target machine."]
pub enum FloatAbi {
#[serde(rename = "soft")]
Soft,
#[serde(rename = "hard")]
Hard,
}
const _: () =
{
#[automatically_derived]
#[allow(unused_braces)]
impl schemars::JsonSchema for FloatAbi {
fn schema_name()
-> schemars::_private::alloc::borrow::Cow<'static, str> {
schemars::_private::alloc::borrow::Cow::Borrowed("FloatAbi")
}
fn schema_id()
-> schemars::_private::alloc::borrow::Cow<'static, str> {
schemars::_private::alloc::borrow::Cow::Borrowed("rustc_target::spec::FloatAbi")
}
fn json_schema(generator: &mut schemars::SchemaGenerator)
-> schemars::Schema {
{
let mut schema =
{
let mut map = schemars::_private::serde_json::Map::new();
map.insert("type".into(), "string".into());
map.insert("enum".into(),
schemars::_private::serde_json::Value::Array({
let mut enum_values =
schemars::_private::alloc::vec::Vec::new();
enum_values.push(("soft").into());
enum_values.push(("hard").into());
enum_values
}));
schemars::Schema::from(map)
};
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"title",
{
const TITLE: &str =
schemars::_private::get_title_and_description("The float ABI setting to be configured in the LLVM target machine.").0;
TITLE
});
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"description",
{
const DESCRIPTION: &str =
schemars::_private::get_title_and_description("The float ABI setting to be configured in the LLVM target machine.").1;
DESCRIPTION
});
schema
}
}
fn inline_schema() -> bool { false }
}
;
};
#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for FloatAbi { }
#[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_fields_are_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> {
::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
}
}
#[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! {
979 pub enum FloatAbi {
981 Soft = "soft",
982 Hard = "hard",
983 }
984
985 parse_error_type = "float abi";
986}
987
988#[doc = r" The Rustc-specific variant of the ABI used for this target."]
pub enum RustcAbi {
#[doc =
r" On x86-32/64, aarch64, and S390x: do not use any FPU or SIMD registers for the ABI."]
#[serde(rename = "softfloat")]
Softfloat,
#[doc = r" On x86-32 only: make use of SSE and SSE2 for ABI purposes."]
#[serde(rename = "x86-sse2")]
X86Sse2,
#[doc = r" On PowerPC only: build for SPE."]
#[serde(rename = "powerpc-spe")]
PowerPcSpe,
#[doc = r" On SPARC-32: use the V8+ ABI."]
#[serde(rename = "sparc-v8plus")]
SparcV8Plus,
}
const _: () =
{
#[automatically_derived]
#[allow(unused_braces)]
impl schemars::JsonSchema for RustcAbi {
fn schema_name()
-> schemars::_private::alloc::borrow::Cow<'static, str> {
schemars::_private::alloc::borrow::Cow::Borrowed("RustcAbi")
}
fn schema_id()
-> schemars::_private::alloc::borrow::Cow<'static, str> {
schemars::_private::alloc::borrow::Cow::Borrowed("rustc_target::spec::RustcAbi")
}
fn json_schema(generator: &mut schemars::SchemaGenerator)
-> schemars::Schema {
{
let mut 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 =
schemars::_private::new_unit_enum_variant("softfloat");
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"title",
{
const TITLE: &str =
schemars::_private::get_title_and_description("On x86-32/64, aarch64, and S390x: do not use any FPU or SIMD registers for the ABI.").0;
TITLE
});
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"description",
{
const DESCRIPTION: &str =
schemars::_private::get_title_and_description("On x86-32/64, aarch64, and S390x: do not use any FPU or SIMD registers for the ABI.").1;
DESCRIPTION
});
schema
}.to_value());
enum_values.push({
let mut schema =
schemars::_private::new_unit_enum_variant("x86-sse2");
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"title",
{
const TITLE: &str =
schemars::_private::get_title_and_description("On x86-32 only: make use of SSE and SSE2 for ABI purposes.").0;
TITLE
});
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"description",
{
const DESCRIPTION: &str =
schemars::_private::get_title_and_description("On x86-32 only: make use of SSE and SSE2 for ABI purposes.").1;
DESCRIPTION
});
schema
}.to_value());
enum_values.push({
let mut schema =
schemars::_private::new_unit_enum_variant("powerpc-spe");
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"title",
{
const TITLE: &str =
schemars::_private::get_title_and_description("On PowerPC only: build for SPE.").0;
TITLE
});
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"description",
{
const DESCRIPTION: &str =
schemars::_private::get_title_and_description("On PowerPC only: build for SPE.").1;
DESCRIPTION
});
schema
}.to_value());
enum_values.push({
let mut schema =
schemars::_private::new_unit_enum_variant("sparc-v8plus");
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"title",
{
const TITLE: &str =
schemars::_private::get_title_and_description("On SPARC-32: use the V8+ ABI.").0;
TITLE
});
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"description",
{
const DESCRIPTION: &str =
schemars::_private::get_title_and_description("On SPARC-32: use the V8+ ABI.").1;
DESCRIPTION
});
schema
}.to_value());
enum_values
}));
schemars::Schema::from(map)
};
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"title",
{
const TITLE: &str =
schemars::_private::get_title_and_description("The Rustc-specific variant of the ABI used for this target.").0;
TITLE
});
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"description",
{
const DESCRIPTION: &str =
schemars::_private::get_title_and_description("The Rustc-specific variant of the ABI used for this target.").1;
DESCRIPTION
});
schema
}
}
fn inline_schema() -> bool { false }
}
;
};
#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for RustcAbi { }
#[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_fields_are_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::Softfloat => "Softfloat",
RustcAbi::X86Sse2 => "X86Sse2",
RustcAbi::PowerPcSpe => "PowerPcSpe",
RustcAbi::SparcV8Plus => "SparcV8Plus",
})
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for RustcAbi {
#[inline]
fn partial_cmp(&self, other: &RustcAbi)
-> ::core::option::Option<::core::cmp::Ordering> {
::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
}
}
#[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 {
"softfloat" => Self::Softfloat,
"x86-sse2" => Self::X86Sse2,
"powerpc-spe" => Self::PowerPcSpe,
"sparc-v8plus" => Self::SparcV8Plus,
_ => {
let all =
["\'softfloat\'", "\'x86-sse2\'", "\'powerpc-spe\'",
"\'sparc-v8plus\'"].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::Softfloat, RustcAbi::X86Sse2, RustcAbi::PowerPcSpe,
RustcAbi::SparcV8Plus];
pub fn desc(&self) -> &'static str {
match self {
Self::Softfloat => "softfloat",
Self::X86Sse2 => "x86-sse2",
Self::PowerPcSpe => "powerpc-spe",
Self::SparcV8Plus => "sparc-v8plus",
}
}
}
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! {
989 pub enum RustcAbi {
991 Softfloat = "softfloat",
993 X86Sse2 = "x86-sse2",
995 PowerPcSpe = "powerpc-spe",
997 SparcV8Plus = "sparc-v8plus",
999 }
1000
1001 parse_error_type = "rustc abi";
1002}
1003
1004pub enum TlsModel {
#[serde(rename = "global-dynamic")]
GeneralDynamic,
#[serde(rename = "local-dynamic")]
LocalDynamic,
#[serde(rename = "initial-exec")]
InitialExec,
#[serde(rename = "local-exec")]
LocalExec,
#[serde(rename = "emulated")]
Emulated,
}
const _: () =
{
#[automatically_derived]
#[allow(unused_braces)]
impl schemars::JsonSchema for TlsModel {
fn schema_name()
-> schemars::_private::alloc::borrow::Cow<'static, str> {
schemars::_private::alloc::borrow::Cow::Borrowed("TlsModel")
}
fn schema_id()
-> schemars::_private::alloc::borrow::Cow<'static, str> {
schemars::_private::alloc::borrow::Cow::Borrowed("rustc_target::spec::TlsModel")
}
fn json_schema(generator: &mut schemars::SchemaGenerator)
-> schemars::Schema {
{
{
let mut map = schemars::_private::serde_json::Map::new();
map.insert("type".into(), "string".into());
map.insert("enum".into(),
schemars::_private::serde_json::Value::Array({
let mut enum_values =
schemars::_private::alloc::vec::Vec::new();
enum_values.push(("global-dynamic").into());
enum_values.push(("local-dynamic").into());
enum_values.push(("initial-exec").into());
enum_values.push(("local-exec").into());
enum_values.push(("emulated").into());
enum_values
}));
schemars::Schema::from(map)
}
}
}
fn inline_schema() -> bool { false }
}
;
};
#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for TlsModel { }
#[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_fields_are_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> {
::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
}
}
#[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! {
1005 pub enum TlsModel {
1006 GeneralDynamic = "global-dynamic",
1007 LocalDynamic = "local-dynamic",
1008 InitialExec = "initial-exec",
1009 LocalExec = "local-exec",
1010 Emulated = "emulated",
1011 }
1012
1013 parse_error_type = "TLS model";
1014}
1015
1016#[doc =
r" Everything is flattened to a single enum to make the json encoding/decoding less annoying."]
pub enum LinkOutputKind {
#[doc = r" Dynamically linked non position-independent executable."]
#[serde(rename = "dynamic-nopic-exe")]
DynamicNoPicExe,
#[doc = r" Dynamically linked position-independent executable."]
#[serde(rename = "dynamic-pic-exe")]
DynamicPicExe,
#[doc = r" Statically linked non position-independent executable."]
#[serde(rename = "static-nopic-exe")]
StaticNoPicExe,
#[doc = r" Statically linked position-independent executable."]
#[serde(rename = "static-pic-exe")]
StaticPicExe,
#[doc = r#" Regular dynamic library ("dynamically linked")."#]
#[serde(rename = "dynamic-dylib")]
DynamicDylib,
#[doc = r#" Dynamic library with bundled libc ("statically linked")."#]
#[serde(rename = "static-dylib")]
StaticDylib,
#[doc = r" WASI module with a lifetime past the _initialize entry point"]
#[serde(rename = "wasi-reactor-exe")]
WasiReactorExe,
}
const _: () =
{
#[automatically_derived]
#[allow(unused_braces)]
impl schemars::JsonSchema for LinkOutputKind {
fn schema_name()
-> schemars::_private::alloc::borrow::Cow<'static, str> {
schemars::_private::alloc::borrow::Cow::Borrowed("LinkOutputKind")
}
fn schema_id()
-> schemars::_private::alloc::borrow::Cow<'static, str> {
schemars::_private::alloc::borrow::Cow::Borrowed("rustc_target::spec::LinkOutputKind")
}
fn json_schema(generator: &mut schemars::SchemaGenerator)
-> schemars::Schema {
{
let mut 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 =
schemars::_private::new_unit_enum_variant("dynamic-nopic-exe");
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"title",
{
const TITLE: &str =
schemars::_private::get_title_and_description("Dynamically linked non position-independent executable.").0;
TITLE
});
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"description",
{
const DESCRIPTION: &str =
schemars::_private::get_title_and_description("Dynamically linked non position-independent executable.").1;
DESCRIPTION
});
schema
}.to_value());
enum_values.push({
let mut schema =
schemars::_private::new_unit_enum_variant("dynamic-pic-exe");
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"title",
{
const TITLE: &str =
schemars::_private::get_title_and_description("Dynamically linked position-independent executable.").0;
TITLE
});
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"description",
{
const DESCRIPTION: &str =
schemars::_private::get_title_and_description("Dynamically linked position-independent executable.").1;
DESCRIPTION
});
schema
}.to_value());
enum_values.push({
let mut schema =
schemars::_private::new_unit_enum_variant("static-nopic-exe");
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"title",
{
const TITLE: &str =
schemars::_private::get_title_and_description("Statically linked non position-independent executable.").0;
TITLE
});
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"description",
{
const DESCRIPTION: &str =
schemars::_private::get_title_and_description("Statically linked non position-independent executable.").1;
DESCRIPTION
});
schema
}.to_value());
enum_values.push({
let mut schema =
schemars::_private::new_unit_enum_variant("static-pic-exe");
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"title",
{
const TITLE: &str =
schemars::_private::get_title_and_description("Statically linked position-independent executable.").0;
TITLE
});
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"description",
{
const DESCRIPTION: &str =
schemars::_private::get_title_and_description("Statically linked position-independent executable.").1;
DESCRIPTION
});
schema
}.to_value());
enum_values.push({
let mut schema =
schemars::_private::new_unit_enum_variant("dynamic-dylib");
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"title",
{
const TITLE: &str =
schemars::_private::get_title_and_description("Regular dynamic library (\"dynamically linked\").").0;
TITLE
});
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"description",
{
const DESCRIPTION: &str =
schemars::_private::get_title_and_description("Regular dynamic library (\"dynamically linked\").").1;
DESCRIPTION
});
schema
}.to_value());
enum_values.push({
let mut schema =
schemars::_private::new_unit_enum_variant("static-dylib");
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"title",
{
const TITLE: &str =
schemars::_private::get_title_and_description("Dynamic library with bundled libc (\"statically linked\").").0;
TITLE
});
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"description",
{
const DESCRIPTION: &str =
schemars::_private::get_title_and_description("Dynamic library with bundled libc (\"statically linked\").").1;
DESCRIPTION
});
schema
}.to_value());
enum_values.push({
let mut schema =
schemars::_private::new_unit_enum_variant("wasi-reactor-exe");
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"title",
{
const TITLE: &str =
schemars::_private::get_title_and_description("WASI module with a lifetime past the _initialize entry point").0;
TITLE
});
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"description",
{
const DESCRIPTION: &str =
schemars::_private::get_title_and_description("WASI module with a lifetime past the _initialize entry point").1;
DESCRIPTION
});
schema
}.to_value());
enum_values
}));
schemars::Schema::from(map)
};
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"title",
{
const TITLE: &str =
schemars::_private::get_title_and_description("Everything is flattened to a single enum to make the json encoding/decoding less annoying.").0;
TITLE
});
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"description",
{
const DESCRIPTION: &str =
schemars::_private::get_title_and_description("Everything is flattened to a single enum to make the json encoding/decoding less annoying.").1;
DESCRIPTION
});
schema
}
}
fn inline_schema() -> bool { false }
}
;
};
#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for LinkOutputKind { }
#[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_fields_are_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> {
::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
}
}
#[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! {
1017 pub enum LinkOutputKind {
1019 DynamicNoPicExe = "dynamic-nopic-exe",
1021 DynamicPicExe = "dynamic-pic-exe",
1023 StaticNoPicExe = "static-nopic-exe",
1025 StaticPicExe = "static-pic-exe",
1027 DynamicDylib = "dynamic-dylib",
1029 StaticDylib = "static-dylib",
1031 WasiReactorExe = "wasi-reactor-exe",
1033 }
1034
1035 parse_error_type = "CRT object kind";
1036}
1037
1038impl LinkOutputKind {
1039 pub fn can_link_dylib(self) -> bool {
1040 match self {
1041 LinkOutputKind::StaticNoPicExe | LinkOutputKind::StaticPicExe => false,
1042 LinkOutputKind::DynamicNoPicExe
1043 | LinkOutputKind::DynamicPicExe
1044 | LinkOutputKind::DynamicDylib
1045 | LinkOutputKind::StaticDylib
1046 | LinkOutputKind::WasiReactorExe => true,
1047 }
1048 }
1049}
1050
1051pub type LinkArgs = BTreeMap<LinkerFlavor, Vec<StaticCow<str>>>;
1052pub type LinkArgsCli = BTreeMap<LinkerFlavorCli, Vec<StaticCow<str>>>;
1053
1054#[doc = r" Which kind of debuginfo does the target use?"]
#[doc = r""]
#[doc =
r" Useful in determining whether a target supports Split DWARF (a target with"]
#[doc =
r" `DebuginfoKind::Dwarf` and supporting `SplitDebuginfo::Unpacked` for example)."]
pub enum DebuginfoKind {
#[doc =
r" DWARF debuginfo (such as that used on `x86_64_unknown_linux_gnu`)."]
#[default]
#[serde(rename = "dwarf")]
Dwarf,
#[doc = r" DWARF debuginfo in dSYM files (such as on Apple platforms)."]
#[serde(rename = "dwarf-dsym")]
DwarfDsym,
#[doc = r" Program database files (such as on Windows)."]
#[serde(rename = "pdb")]
Pdb,
}
const _: () =
{
#[automatically_derived]
#[allow(unused_braces)]
impl schemars::JsonSchema for DebuginfoKind {
fn schema_name()
-> schemars::_private::alloc::borrow::Cow<'static, str> {
schemars::_private::alloc::borrow::Cow::Borrowed("DebuginfoKind")
}
fn schema_id()
-> schemars::_private::alloc::borrow::Cow<'static, str> {
schemars::_private::alloc::borrow::Cow::Borrowed("rustc_target::spec::DebuginfoKind")
}
fn json_schema(generator: &mut schemars::SchemaGenerator)
-> schemars::Schema {
{
let mut 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 =
schemars::_private::new_unit_enum_variant("dwarf");
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"title",
{
const TITLE: &str =
schemars::_private::get_title_and_description("DWARF debuginfo (such as that used on `x86_64_unknown_linux_gnu`).").0;
TITLE
});
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"description",
{
const DESCRIPTION: &str =
schemars::_private::get_title_and_description("DWARF debuginfo (such as that used on `x86_64_unknown_linux_gnu`).").1;
DESCRIPTION
});
schema
}.to_value());
enum_values.push({
let mut schema =
schemars::_private::new_unit_enum_variant("dwarf-dsym");
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"title",
{
const TITLE: &str =
schemars::_private::get_title_and_description("DWARF debuginfo in dSYM files (such as on Apple platforms).").0;
TITLE
});
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"description",
{
const DESCRIPTION: &str =
schemars::_private::get_title_and_description("DWARF debuginfo in dSYM files (such as on Apple platforms).").1;
DESCRIPTION
});
schema
}.to_value());
enum_values.push({
let mut schema =
schemars::_private::new_unit_enum_variant("pdb");
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"title",
{
const TITLE: &str =
schemars::_private::get_title_and_description("Program database files (such as on Windows).").0;
TITLE
});
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"description",
{
const DESCRIPTION: &str =
schemars::_private::get_title_and_description("Program database files (such as on Windows).").1;
DESCRIPTION
});
schema
}.to_value());
enum_values
}));
schemars::Schema::from(map)
};
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"title",
{
const TITLE: &str =
schemars::_private::get_title_and_description("Which kind of debuginfo does the target use?\n\nUseful in determining whether a target supports Split DWARF (a target with\n`DebuginfoKind::Dwarf` and supporting `SplitDebuginfo::Unpacked` for example).").0;
TITLE
});
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"description",
{
const DESCRIPTION: &str =
schemars::_private::get_title_and_description("Which kind of debuginfo does the target use?\n\nUseful in determining whether a target supports Split DWARF (a target with\n`DebuginfoKind::Dwarf` and supporting `SplitDebuginfo::Unpacked` for example).").1;
DESCRIPTION
});
schema
}
}
fn inline_schema() -> bool { false }
}
;
};
#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for DebuginfoKind { }
#[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_fields_are_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> {
::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
}
}
#[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! {
1055 #[derive(Default)]
1060 pub enum DebuginfoKind {
1061 #[default]
1063 Dwarf = "dwarf",
1064 DwarfDsym = "dwarf-dsym",
1066 Pdb = "pdb",
1068 }
1069
1070 parse_error_type = "debuginfo kind";
1071}
1072
1073pub enum SplitDebuginfo {
#[doc =
r" Split debug-information is disabled, meaning that on supported platforms"]
#[doc =
r" you can find all debug information in the executable itself. This is"]
#[doc = r" only supported for ELF effectively."]
#[doc = r""]
#[doc = r" * Windows - not supported"]
#[doc = r" * macOS - don't run `dsymutil`"]
#[doc = r" * ELF - `.debug_*` sections"]
#[default]
#[serde(rename = "off")]
Off,
#[doc =
r#" Split debug-information can be found in a "packed" location separate"#]
#[doc = r" from the final artifact. This is supported on all platforms."]
#[doc = r""]
#[doc = r" * Windows - `*.pdb`"]
#[doc = r" * macOS - `*.dSYM` (run `dsymutil`)"]
#[doc = r" * ELF - `*.dwp` (run `thorin`)"]
#[serde(rename = "packed")]
Packed,
#[doc =
r" Split debug-information can be found in individual object files on the"]
#[doc =
r" filesystem. The main executable may point to the object files."]
#[doc = r""]
#[doc = r" * Windows - not supported"]
#[doc = r" * macOS - supported, scattered object files"]
#[doc =
r" * ELF - supported, scattered `*.dwo` or `*.o` files (see `SplitDwarfKind`)"]
#[serde(rename = "unpacked")]
Unpacked,
}
const _: () =
{
#[automatically_derived]
#[allow(unused_braces)]
impl schemars::JsonSchema for SplitDebuginfo {
fn schema_name()
-> schemars::_private::alloc::borrow::Cow<'static, str> {
schemars::_private::alloc::borrow::Cow::Borrowed("SplitDebuginfo")
}
fn schema_id()
-> schemars::_private::alloc::borrow::Cow<'static, str> {
schemars::_private::alloc::borrow::Cow::Borrowed("rustc_target::spec::SplitDebuginfo")
}
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 =
schemars::_private::new_unit_enum_variant("off");
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"title",
{
const TITLE: &str =
schemars::_private::get_title_and_description("Split debug-information is disabled, meaning that on supported platforms\nyou can find all debug information in the executable itself. This is\nonly supported for ELF effectively.\n\n* Windows - not supported\n* macOS - don\'t run `dsymutil`\n* ELF - `.debug_*` sections").0;
TITLE
});
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"description",
{
const DESCRIPTION: &str =
schemars::_private::get_title_and_description("Split debug-information is disabled, meaning that on supported platforms\nyou can find all debug information in the executable itself. This is\nonly supported for ELF effectively.\n\n* Windows - not supported\n* macOS - don\'t run `dsymutil`\n* ELF - `.debug_*` sections").1;
DESCRIPTION
});
schema
}.to_value());
enum_values.push({
let mut schema =
schemars::_private::new_unit_enum_variant("packed");
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"title",
{
const TITLE: &str =
schemars::_private::get_title_and_description("Split debug-information can be found in a \"packed\" location separate\nfrom the final artifact. This is supported on all platforms.\n\n* Windows - `*.pdb`\n* macOS - `*.dSYM` (run `dsymutil`)\n* ELF - `*.dwp` (run `thorin`)").0;
TITLE
});
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"description",
{
const DESCRIPTION: &str =
schemars::_private::get_title_and_description("Split debug-information can be found in a \"packed\" location separate\nfrom the final artifact. This is supported on all platforms.\n\n* Windows - `*.pdb`\n* macOS - `*.dSYM` (run `dsymutil`)\n* ELF - `*.dwp` (run `thorin`)").1;
DESCRIPTION
});
schema
}.to_value());
enum_values.push({
let mut schema =
schemars::_private::new_unit_enum_variant("unpacked");
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"title",
{
const TITLE: &str =
schemars::_private::get_title_and_description("Split debug-information can be found in individual object files on the\nfilesystem. The main executable may point to the object files.\n\n* Windows - not supported\n* macOS - supported, scattered object files\n* ELF - supported, scattered `*.dwo` or `*.o` files (see `SplitDwarfKind`)").0;
TITLE
});
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"description",
{
const DESCRIPTION: &str =
schemars::_private::get_title_and_description("Split debug-information can be found in individual object files on the\nfilesystem. The main executable may point to the object files.\n\n* Windows - not supported\n* macOS - supported, scattered object files\n* ELF - supported, scattered `*.dwo` or `*.o` files (see `SplitDwarfKind`)").1;
DESCRIPTION
});
schema
}.to_value());
enum_values
}));
schemars::Schema::from(map)
}
}
}
fn inline_schema() -> bool { false }
}
;
};
#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for SplitDebuginfo { }
#[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_fields_are_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> {
::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
}
}
#[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 }
}
const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for SplitDebuginfo {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
SplitDebuginfo::Off => { 0usize }
SplitDebuginfo::Packed => { 1usize }
SplitDebuginfo::Unpacked => { 2usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
}
}
};
const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for SplitDebuginfo {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { SplitDebuginfo::Off }
1usize => { SplitDebuginfo::Packed }
2usize => { SplitDebuginfo::Unpacked }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `SplitDebuginfo`, expected 0..3, actual {0}",
n));
}
}
}
}
};
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! {
1074 #[derive(Default, Encodable, Decodable)]
1075 pub enum SplitDebuginfo {
1076 #[default]
1084 Off = "off",
1085
1086 Packed = "packed",
1093
1094 Unpacked = "unpacked",
1101 }
1102
1103 parse_error_type = "split debuginfo";
1104}
1105
1106impl ::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);
1107
1108#[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::marker::StructuralPartialEq for StackProbeType { }
#[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_fields_are_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)]
1109#[serde(tag = "kind")]
1110#[serde(rename_all = "kebab-case")]
1111pub enum StackProbeType {
1112 None,
1114 Inline,
1118 Call,
1120 InlineOrCall {
1123 #[serde(rename = "min-llvm-version-for-inline")]
1124 min_llvm_version_for_inline: (u32, u32, u32),
1125 },
1126}
1127
1128impl ToJson for StackProbeType {
1129 fn to_json(&self) -> Json {
1130 Json::Object(match self {
1131 StackProbeType::None => {
1132 [(String::from("kind"), "none".to_json())].into_iter().collect()
1133 }
1134 StackProbeType::Inline => {
1135 [(String::from("kind"), "inline".to_json())].into_iter().collect()
1136 }
1137 StackProbeType::Call => {
1138 [(String::from("kind"), "call".to_json())].into_iter().collect()
1139 }
1140 StackProbeType::InlineOrCall { min_llvm_version_for_inline: (maj, min, patch) } => [
1141 (String::from("kind"), "inline-or-call".to_json()),
1142 (
1143 String::from("min-llvm-version-for-inline"),
1144 Json::Array(::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[maj.to_json(), min.to_json(), patch.to_json()]))vec![maj.to_json(), min.to_json(), patch.to_json()]),
1145 ),
1146 ]
1147 .into_iter()
1148 .collect(),
1149 })
1150 }
1151}
1152
1153impl ToJson for SanitizerSet {
1154 fn to_json(&self) -> Json {
1155 self.into_iter()
1156 .map(|v| Some(v.as_str()?.to_json()))
1157 .collect::<Option<Vec<_>>>()
1158 .unwrap_or_default()
1159 .to_json()
1160 }
1161}
1162
1163pub enum FramePointer {
#[doc =
r" Forces the machine code generator to always preserve the frame pointers."]
#[serde(rename = "always")]
Always,
#[doc =
r" Forces the machine code generator to preserve the frame pointers except for the leaf"]
#[doc = r" functions (i.e. those that don't call other functions)."]
#[serde(rename = "non-leaf")]
NonLeaf,
#[doc = r" Allows the machine code generator to omit the frame pointers."]
#[doc = r""]
#[doc =
r" This option does not guarantee that the frame pointers will be omitted."]
#[serde(rename = "may-omit")]
MayOmit,
}
const _: () =
{
#[automatically_derived]
#[allow(unused_braces)]
impl schemars::JsonSchema for FramePointer {
fn schema_name()
-> schemars::_private::alloc::borrow::Cow<'static, str> {
schemars::_private::alloc::borrow::Cow::Borrowed("FramePointer")
}
fn schema_id()
-> schemars::_private::alloc::borrow::Cow<'static, str> {
schemars::_private::alloc::borrow::Cow::Borrowed("rustc_target::spec::FramePointer")
}
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 =
schemars::_private::new_unit_enum_variant("always");
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"title",
{
const TITLE: &str =
schemars::_private::get_title_and_description("Forces the machine code generator to always preserve the frame pointers.").0;
TITLE
});
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"description",
{
const DESCRIPTION: &str =
schemars::_private::get_title_and_description("Forces the machine code generator to always preserve the frame pointers.").1;
DESCRIPTION
});
schema
}.to_value());
enum_values.push({
let mut schema =
schemars::_private::new_unit_enum_variant("non-leaf");
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"title",
{
const TITLE: &str =
schemars::_private::get_title_and_description("Forces the machine code generator to preserve the frame pointers except for the leaf\nfunctions (i.e. those that don\'t call other functions).").0;
TITLE
});
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"description",
{
const DESCRIPTION: &str =
schemars::_private::get_title_and_description("Forces the machine code generator to preserve the frame pointers except for the leaf\nfunctions (i.e. those that don\'t call other functions).").1;
DESCRIPTION
});
schema
}.to_value());
enum_values.push({
let mut schema =
schemars::_private::new_unit_enum_variant("may-omit");
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"title",
{
const TITLE: &str =
schemars::_private::get_title_and_description("Allows the machine code generator to omit the frame pointers.\n\nThis option does not guarantee that the frame pointers will be omitted.").0;
TITLE
});
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"description",
{
const DESCRIPTION: &str =
schemars::_private::get_title_and_description("Allows the machine code generator to omit the frame pointers.\n\nThis option does not guarantee that the frame pointers will be omitted.").1;
DESCRIPTION
});
schema
}.to_value());
enum_values
}));
schemars::Schema::from(map)
}
}
}
fn inline_schema() -> bool { false }
}
;
};
#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for FramePointer { }
#[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_fields_are_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> {
::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
}
}
#[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! {
1164 pub enum FramePointer {
1165 Always = "always",
1167 NonLeaf = "non-leaf",
1170 MayOmit = "may-omit",
1174 }
1175
1176 parse_error_type = "frame pointer";
1177}
1178
1179impl FramePointer {
1180 #[inline]
1183 pub fn ratchet(&mut self, rhs: FramePointer) -> FramePointer {
1184 *self = match (*self, rhs) {
1185 (FramePointer::Always, _) | (_, FramePointer::Always) => FramePointer::Always,
1186 (FramePointer::NonLeaf, _) | (_, FramePointer::NonLeaf) => FramePointer::NonLeaf,
1187 _ => FramePointer::MayOmit,
1188 };
1189 *self
1190 }
1191}
1192
1193#[doc = r" Controls use of stack canaries."]
pub enum StackProtector {
#[doc = r" Disable stack canary generation."]
#[serde(rename = "none")]
None,
#[doc =
r" On LLVM, mark all generated LLVM functions with the `ssp` attribute (see"]
#[doc =
r" llvm/docs/LangRef.rst). This triggers stack canary generation in"]
#[doc =
r" functions which contain an array of a byte-sized type with more than"]
#[doc = r" eight elements."]
#[serde(rename = "basic")]
Basic,
#[doc =
r" On LLVM, mark all generated LLVM functions with the `sspstrong`"]
#[doc =
r" attribute (see llvm/docs/LangRef.rst). This triggers stack canary"]
#[doc =
r" generation in functions which either contain an array, or which take"]
#[doc = r" the address of a local variable."]
#[serde(rename = "strong")]
Strong,
#[doc = r" Generate stack canaries in all functions."]
#[serde(rename = "all")]
All,
}
const _: () =
{
#[automatically_derived]
#[allow(unused_braces)]
impl schemars::JsonSchema for StackProtector {
fn schema_name()
-> schemars::_private::alloc::borrow::Cow<'static, str> {
schemars::_private::alloc::borrow::Cow::Borrowed("StackProtector")
}
fn schema_id()
-> schemars::_private::alloc::borrow::Cow<'static, str> {
schemars::_private::alloc::borrow::Cow::Borrowed("rustc_target::spec::StackProtector")
}
fn json_schema(generator: &mut schemars::SchemaGenerator)
-> schemars::Schema {
{
let mut 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 =
schemars::_private::new_unit_enum_variant("none");
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"title",
{
const TITLE: &str =
schemars::_private::get_title_and_description("Disable stack canary generation.").0;
TITLE
});
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"description",
{
const DESCRIPTION: &str =
schemars::_private::get_title_and_description("Disable stack canary generation.").1;
DESCRIPTION
});
schema
}.to_value());
enum_values.push({
let mut schema =
schemars::_private::new_unit_enum_variant("basic");
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"title",
{
const TITLE: &str =
schemars::_private::get_title_and_description("On LLVM, mark all generated LLVM functions with the `ssp` attribute (see\nllvm/docs/LangRef.rst). This triggers stack canary generation in\nfunctions which contain an array of a byte-sized type with more than\neight elements.").0;
TITLE
});
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"description",
{
const DESCRIPTION: &str =
schemars::_private::get_title_and_description("On LLVM, mark all generated LLVM functions with the `ssp` attribute (see\nllvm/docs/LangRef.rst). This triggers stack canary generation in\nfunctions which contain an array of a byte-sized type with more than\neight elements.").1;
DESCRIPTION
});
schema
}.to_value());
enum_values.push({
let mut schema =
schemars::_private::new_unit_enum_variant("strong");
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"title",
{
const TITLE: &str =
schemars::_private::get_title_and_description("On LLVM, mark all generated LLVM functions with the `sspstrong`\nattribute (see llvm/docs/LangRef.rst). This triggers stack canary\ngeneration in functions which either contain an array, or which take\nthe address of a local variable.").0;
TITLE
});
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"description",
{
const DESCRIPTION: &str =
schemars::_private::get_title_and_description("On LLVM, mark all generated LLVM functions with the `sspstrong`\nattribute (see llvm/docs/LangRef.rst). This triggers stack canary\ngeneration in functions which either contain an array, or which take\nthe address of a local variable.").1;
DESCRIPTION
});
schema
}.to_value());
enum_values.push({
let mut schema =
schemars::_private::new_unit_enum_variant("all");
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"title",
{
const TITLE: &str =
schemars::_private::get_title_and_description("Generate stack canaries in all functions.").0;
TITLE
});
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"description",
{
const DESCRIPTION: &str =
schemars::_private::get_title_and_description("Generate stack canaries in all functions.").1;
DESCRIPTION
});
schema
}.to_value());
enum_values
}));
schemars::Schema::from(map)
};
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"title",
{
const TITLE: &str =
schemars::_private::get_title_and_description("Controls use of stack canaries.").0;
TITLE
});
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"description",
{
const DESCRIPTION: &str =
schemars::_private::get_title_and_description("Controls use of stack canaries.").1;
DESCRIPTION
});
schema
}
}
fn inline_schema() -> bool { false }
}
;
};
#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for StackProtector { }
#[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_fields_are_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> {
::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
}
}
#[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)
}
}
const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for StackProtector {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
StackProtector::None => { 0usize }
StackProtector::Basic => { 1usize }
StackProtector::Strong => { 2usize }
StackProtector::All => { 3usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
}
}
};
const _: () =
{
impl<__D: ::rustc_span::BlobDecoder> ::rustc_serialize::Decodable<__D>
for StackProtector {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { StackProtector::None }
1usize => { StackProtector::Basic }
2usize => { StackProtector::Strong }
3usize => { StackProtector::All }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `StackProtector`, expected 0..4, actual {0}",
n));
}
}
}
}
};
const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
StackProtector {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
StackProtector::None => {}
StackProtector::Basic => {}
StackProtector::Strong => {}
StackProtector::All => {}
}
}
}
};
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! {
1194 #[derive(Encodable, BlobDecodable, StableHash)]
1196 pub enum StackProtector {
1197 None = "none",
1199
1200 Basic = "basic",
1205
1206 Strong = "strong",
1211
1212 All = "all",
1214 }
1215
1216 parse_error_type = "stack protector";
1217}
1218
1219impl ::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);
1220
1221pub enum BinaryFormat {
#[serde(rename = "coff")]
Coff,
#[serde(rename = "elf")]
Elf,
#[serde(rename = "mach-o")]
MachO,
#[serde(rename = "wasm")]
Wasm,
#[serde(rename = "xcoff")]
Xcoff,
}
const _: () =
{
#[automatically_derived]
#[allow(unused_braces)]
impl schemars::JsonSchema for BinaryFormat {
fn schema_name()
-> schemars::_private::alloc::borrow::Cow<'static, str> {
schemars::_private::alloc::borrow::Cow::Borrowed("BinaryFormat")
}
fn schema_id()
-> schemars::_private::alloc::borrow::Cow<'static, str> {
schemars::_private::alloc::borrow::Cow::Borrowed("rustc_target::spec::BinaryFormat")
}
fn json_schema(generator: &mut schemars::SchemaGenerator)
-> schemars::Schema {
{
{
let mut map = schemars::_private::serde_json::Map::new();
map.insert("type".into(), "string".into());
map.insert("enum".into(),
schemars::_private::serde_json::Value::Array({
let mut enum_values =
schemars::_private::alloc::vec::Vec::new();
enum_values.push(("coff").into());
enum_values.push(("elf").into());
enum_values.push(("mach-o").into());
enum_values.push(("wasm").into());
enum_values.push(("xcoff").into());
enum_values
}));
schemars::Schema::from(map)
}
}
}
fn inline_schema() -> bool { false }
}
;
};
#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for BinaryFormat { }
#[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_fields_are_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> {
::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
}
}
#[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! {
1222 pub enum BinaryFormat {
1223 Coff = "coff",
1224 Elf = "elf",
1225 MachO = "mach-o",
1226 Wasm = "wasm",
1227 Xcoff = "xcoff",
1228 }
1229
1230 parse_error_type = "binary format";
1231}
1232
1233impl BinaryFormat {
1234 pub fn to_object(&self) -> object::BinaryFormat {
1236 match self {
1237 Self::Coff => object::BinaryFormat::Coff,
1238 Self::Elf => object::BinaryFormat::Elf,
1239 Self::MachO => object::BinaryFormat::MachO,
1240 Self::Wasm => object::BinaryFormat::Wasm,
1241 Self::Xcoff => object::BinaryFormat::Xcoff,
1242 }
1243 }
1244
1245 pub fn desc_symbol(&self) -> Symbol {
1246 match self {
1247 Self::Coff => sym::coff,
1248 Self::Elf => sym::elf,
1249 Self::MachO => sym::macho,
1250 Self::Wasm => sym::wasm,
1251 Self::Xcoff => sym::xcoff,
1252 }
1253 }
1254}
1255
1256impl ToJson for Align {
1257 fn to_json(&self) -> Json {
1258 self.bits().to_json()
1259 }
1260}
1261
1262macro_rules! supported_targets {
1263 ( $(($tuple:literal, $module:ident),)+ ) => {
1264 mod targets {
1265 $(pub(crate) mod $module;)+
1266 }
1267
1268 pub static TARGETS: &[&str] = &[$($tuple),+];
1270
1271 fn load_builtin(target: &str) -> Option<Target> {
1272 let t = match target {
1273 $( $tuple => targets::$module::target(), )+
1274 _ => return None,
1275 };
1276 debug!("got builtin target: {:?}", t);
1277 Some(t)
1278 }
1279
1280 fn load_all_builtins() -> impl Iterator<Item = Target> {
1281 [
1282 $( targets::$module::target, )+
1283 ]
1284 .into_iter()
1285 .map(|f| f())
1286 }
1287
1288 #[cfg(test)]
1289 mod tests {
1290 $(
1292 #[test] fn $module() {
1294 crate::spec::targets::$module::target().test_target()
1295 }
1296 )+
1297 }
1298 };
1299}
1300
1301mod 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.supported_sanitizers =
SanitizerSet::ADDRESS | SanitizerSet::CFI | SanitizerSet::KCFI
| SanitizerSet::DATAFLOW | SanitizerSet::LEAK |
SanitizerSet::MEMORY | SanitizerSet::SAFESTACK |
SanitizerSet::THREAD | SanitizerSet::REALTIME;
base.supports_fentry = true;
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::{
Arch, Cc, CfgAbi, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_gnu::opts();
base.cpu = "x86-64".into();
base.cfg_abi = CfgAbi::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;
base.supports_fentry = true;
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, LlvmAbi, 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,+relax".into(),
llvm_abiname: LlvmAbi::Lp64d,
max_atomic_width: Some(64),
mcount: "_mcount".into(),
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, LlvmAbi, 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,+relax".into(),
llvm_abiname: LlvmAbi::Lp64d,
max_atomic_width: Some(64),
mcount: "_mcount".into(),
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::{
Arch, Cc, CfgAbi, 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 {
cfg_abi: CfgAbi::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::{
Arch, Cc, CfgAbi, 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 {
cfg_abi: CfgAbi::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, LlvmAbi, Target, TargetMetadata, TargetOptions, base, cvs,
};
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(),
llvm_abiname: LlvmAbi::O32,
llvm_args: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("-mno-check-zero-division")]),
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::{
Arch, CfgAbi, LlvmAbi, Target, TargetMetadata, TargetOptions,
base, cvs,
};
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 {
cfg_abi: CfgAbi::Abi64,
endian: Endian::Big,
cpu: "mips64r2".into(),
features: "+mips64r2,+xgot".into(),
max_atomic_width: Some(64),
mcount: "_mcount".into(),
llvm_abiname: LlvmAbi::N64,
llvm_args: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("-mno-check-zero-division")]),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod mips64el_unknown_linux_gnuabi64 {
use crate::spec::{
Arch, CfgAbi, LlvmAbi, Target, TargetMetadata, TargetOptions,
base, cvs,
};
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 {
cfg_abi: CfgAbi::Abi64,
cpu: "mips64r2".into(),
features: "+mips64r2,+xgot".into(),
max_atomic_width: Some(64),
mcount: "_mcount".into(),
llvm_abiname: LlvmAbi::N64,
llvm_args: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("-mno-check-zero-division")]),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod mipsisa32r6_unknown_linux_gnu {
use rustc_abi::Endian;
use crate::spec::{
Arch, LlvmAbi, Target, TargetMetadata, TargetOptions, base, cvs,
};
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(),
llvm_abiname: LlvmAbi::O32,
llvm_args: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("-mno-check-zero-division")]),
max_atomic_width: Some(32),
mcount: "_mcount".into(),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod mipsisa32r6el_unknown_linux_gnu {
use crate::spec::{
Arch, LlvmAbi, Target, TargetMetadata, TargetOptions, base, cvs,
};
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(),
llvm_abiname: LlvmAbi::O32,
llvm_args: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("-mno-check-zero-division")]),
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::{
Arch, CfgAbi, LlvmAbi, Target, TargetMetadata, TargetOptions,
base, cvs,
};
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 {
cfg_abi: CfgAbi::Abi64,
endian: Endian::Big,
cpu: "mips64r6".into(),
features: "+mips64r6".into(),
max_atomic_width: Some(64),
mcount: "_mcount".into(),
llvm_abiname: LlvmAbi::N64,
llvm_args: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("-mno-check-zero-division")]),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod mipsisa64r6el_unknown_linux_gnuabi64 {
use crate::spec::{
Arch, CfgAbi, LlvmAbi, Target, TargetMetadata, TargetOptions,
base, cvs,
};
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 {
cfg_abi: CfgAbi::Abi64,
cpu: "mips64r6".into(),
features: "+mips64r6".into(),
max_atomic_width: Some(64),
mcount: "_mcount".into(),
llvm_abiname: LlvmAbi::N64,
llvm_args: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("-mno-check-zero-division")]),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod mipsel_unknown_linux_gnu {
use crate::spec::{
Arch, LlvmAbi, Target, TargetMetadata, TargetOptions, base, cvs,
};
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(),
llvm_abiname: LlvmAbi::O32,
llvm_args: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("-mno-check-zero-division")]),
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::{
Arch, Cc, CfgAbi, LinkerFlavor, Lld, RustcAbi, 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 {
cfg_abi: CfgAbi::Spe,
rustc_abi: Some(RustcAbi::PowerPcSpe),
endian: Endian::Big,
features: "+secure-plt,+msync,+spe".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::{
Arch, Cc, CfgAbi, LinkerFlavor, Lld, RustcAbi, 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 {
cfg_abi: CfgAbi::Spe,
rustc_abi: Some(RustcAbi::PowerPcSpe),
endian: Endian::Big,
features: "+msync,+spe".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:mbr:0:s", "-bdbg:namedsects:ss"]);
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::{
Arch, Cc, CfgAbi, LinkerFlavor, Lld, LlvmAbi, 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.cfg_abi = CfgAbi::ElfV1;
base.llvm_abiname = LlvmAbi::ElfV1;
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_gnuelfv2 {
use rustc_abi::Endian;
use crate::spec::{
Arch, Cc, CfgAbi, LinkerFlavor, Lld, LlvmAbi, 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.cfg_abi = CfgAbi::ElfV2;
base.llvm_abiname = LlvmAbi::ElfV2;
Target {
llvm_target: "powerpc64-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: Some("PPC64 Linux (ELFv2 ABI, kernel 3.2, glibc 2.17)".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 powerpc64_unknown_linux_musl {
use rustc_abi::Endian;
use crate::spec::{
Arch, Cc, CfgAbi, LinkerFlavor, Lld, LlvmAbi, 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.cfg_abi = CfgAbi::ElfV2;
base.llvm_abiname = LlvmAbi::ElfV2;
Target {
llvm_target: "powerpc64-unknown-linux-musl".into(),
metadata: TargetMetadata {
description: Some("64-bit PowerPC 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-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::{
Arch, Cc, CfgAbi, LinkerFlavor, Lld, LlvmAbi, 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.cfg_abi = CfgAbi::ElfV2;
base.llvm_abiname = LlvmAbi::ElfV2;
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::{
Arch, Cc, CfgAbi, LinkerFlavor, Lld, LlvmAbi, 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.cfg_abi = CfgAbi::ElfV2;
base.llvm_abiname = LlvmAbi::ElfV2;
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;
base.supports_fentry = true;
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-S64-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_none_softfloat {
use rustc_abi::{Align, Endian};
use crate::spec::{
Arch, Cc, CfgAbi, LinkerFlavor, Lld, PanicStrategy, RelocModel,
RustcAbi, SanitizerSet, StackProbeType, Target, TargetMetadata,
TargetOptions,
};
pub(crate) fn target() -> Target {
let opts =
TargetOptions {
cfg_abi: CfgAbi::SoftFloat,
cpu: "z10".into(),
endian: Endian::Big,
features: "+soft-float,-vector".into(),
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
max_atomic_width: Some(128),
min_global_align: Some(Align::from_bits(16).unwrap()),
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
rustc_abi: Some(RustcAbi::Softfloat),
stack_probes: StackProbeType::Inline,
supported_sanitizers: SanitizerSet::KERNELADDRESS,
supports_fentry: true,
..Default::default()
};
Target {
llvm_target: "s390x-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: Some("S390x Linux".into()),
host_tools: Some(false),
std: Some(false),
tier: Some(2),
},
arch: Arch::S390x,
data_layout: "E-S64-m:e-i1:8:16-i8:8:16-i64:64-f128:64-v128:64-a:8:16-n32:64".into(),
options: opts,
pointer_width: 64,
}
}
}
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;
base.supports_fentry = true;
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-S64-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, CfgAbi, LinkerFlavor, Lld, RustcAbi, 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(),
rustc_abi: Some(RustcAbi::SparcV8Plus),
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),
cfg_abi: CfgAbi::V8Plus,
..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::{
Arch, CfgAbi, 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 {
cfg_abi: CfgAbi::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::{
Arch, CfgAbi, FloatAbi, SanitizerSet, 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 {
cfg_abi: CfgAbi::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,
supported_sanitizers: SanitizerSet::ADDRESS,
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod armeb_unknown_linux_gnueabi {
use rustc_abi::Endian;
use crate::spec::{
Arch, CfgAbi, 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 {
cfg_abi: CfgAbi::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::{
Arch, CfgAbi, 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 {
cfg_abi: CfgAbi::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::{
Arch, CfgAbi, 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 {
cfg_abi: CfgAbi::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::{
Arch, CfgAbi, 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 {
cfg_abi: CfgAbi::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::{
Arch, CfgAbi, 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 {
cfg_abi: CfgAbi::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::{
Arch, CfgAbi, 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 {
cfg_abi: CfgAbi::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::{
Arch, CfgAbi, 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 {
cfg_abi: CfgAbi::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::{
Arch, CfgAbi, 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 {
cfg_abi: CfgAbi::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::{
Arch, CfgAbi, FloatAbi, SanitizerSet, 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 {
cfg_abi: CfgAbi::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()),
supported_sanitizers: SanitizerSet::ADDRESS,
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod thumbv7neon_unknown_linux_gnueabihf {
use crate::spec::{
Arch, CfgAbi, 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 {
cfg_abi: CfgAbi::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::{
Arch, CfgAbi, 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 {
cfg_abi: CfgAbi::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::{
Arch, CfgAbi, 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 {
cfg_abi: CfgAbi::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::{
Arch, CfgAbi, 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 {
cfg_abi: CfgAbi::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, Cc, FramePointer, LinkerFlavor, Lld, 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 {
pre_link_args: TargetOptions::link_args(LinkerFlavor::Gnu(Cc::Yes,
Lld::No), &["-Wl,--fix-cortex-a53-843419"]),
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, Cc, FramePointer, LinkerFlavor, Lld, 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 {
pre_link_args: TargetOptions::link_args(LinkerFlavor::Gnu(Cc::Yes,
Lld::No), &["-Wl,--fix-cortex-a53-843419"]),
frame_pointer: FramePointer::NonLeaf,
mcount: "\u{1}_mcount".into(),
..base
},
}
}
}
pub(crate) mod aarch64_unknown_linux_pauthtest {
use crate::spec::{
Arch, CfgAbi, Env, FramePointer, LinkSelfContainedDefault,
LlvmAbi, StackProbeType, Target, TargetMetadata, TargetOptions,
base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "aarch64-unknown-linux-pauthtest".into(),
metadata: TargetMetadata {
description: Some("ARM64 Linux with pauth enabled musl".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 {
env: Env::Musl,
cfg_abi: CfgAbi::Pauthtest,
llvm_abiname: LlvmAbi::Pauthtest,
features: "+v8.3a,+pauth".into(),
max_atomic_width: Some(128),
stack_probes: StackProbeType::Inline,
crt_static_default: false,
crt_static_allows_dylibs: false,
frame_pointer: FramePointer::NonLeaf,
link_self_contained: LinkSelfContainedDefault::False,
mcount: "\u{1}_mcount".into(),
..base::linux::opts()
},
}
}
}
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_fentry = true;
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.supports_fentry = true;
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, LlvmAbi, Target, TargetMetadata, TargetOptions, base, cvs,
};
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,
llvm_abiname: LlvmAbi::O32,
llvm_args: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("-mno-check-zero-division")]),
mcount: "_mcount".into(),
..base
},
}
}
}
pub(crate) mod mipsel_unknown_linux_musl {
use crate::spec::{
Arch, LlvmAbi, Target, TargetMetadata, TargetOptions, base, cvs,
};
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 {
llvm_abiname: LlvmAbi::O32,
llvm_args: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("-mno-check-zero-division")]),
mcount: "_mcount".into(),
..base
},
}
}
}
pub(crate) mod mips64_unknown_linux_muslabi64 {
use rustc_abi::Endian;
use crate::spec::{
Arch, CfgAbi, LlvmAbi, Target, TargetMetadata, TargetOptions,
base, cvs,
};
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 {
cfg_abi: CfgAbi::Abi64,
endian: Endian::Big,
mcount: "_mcount".into(),
llvm_abiname: LlvmAbi::N64,
llvm_args: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("-mno-check-zero-division")]),
..base
},
}
}
}
pub(crate) mod mips64el_unknown_linux_muslabi64 {
use crate::spec::{
Arch, CfgAbi, LlvmAbi, Target, TargetMetadata, TargetOptions,
base, cvs,
};
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 {
cfg_abi: CfgAbi::Abi64,
mcount: "_mcount".into(),
llvm_abiname: LlvmAbi::N64,
llvm_args: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("-mno-check-zero-division")]),
..base
},
}
}
}
pub(crate) mod hexagon_unknown_linux_musl {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, 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("hexagon-unknown-linux-musl-clang".into());
base.linker_flavor = LinkerFlavor::Gnu(Cc::Yes, Lld::No);
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, Cc, LinkerFlavor, Lld, 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()),
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
..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("hexagon-clang".into()),
linker_flavor: LinkerFlavor::Gnu(Cc::Yes, Lld::No),
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, LlvmAbi, Target, TargetMetadata, TargetOptions, base, cvs,
};
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(),
llvm_abiname: LlvmAbi::O32,
llvm_args: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("-mno-check-zero-division")]),
max_atomic_width: Some(32),
mcount: "_mcount".into(),
..base::linux_uclibc::opts()
},
}
}
}
pub(crate) mod mipsel_unknown_linux_uclibc {
use crate::spec::{
Arch, LlvmAbi, Target, TargetMetadata, TargetOptions, base, cvs,
};
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(),
llvm_abiname: LlvmAbi::O32,
llvm_args: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("-mno-check-zero-division")]),
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::{
Arch, CfgAbi, 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 {
cfg_abi: CfgAbi::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::{
Arch, Cc, CfgAbi, 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 {
cfg_abi: CfgAbi::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::{
Arch, Cc, CfgAbi, 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 {
cfg_abi: CfgAbi::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".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, LlvmAbi, 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: LlvmAbi::Lp64d,
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(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 {
features: "+v8a".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::{
Arch, CfgAbi, 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 {
cfg_abi: CfgAbi::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::{
Arch, CfgAbi, 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 {
cfg_abi: CfgAbi::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::{
Arch, Cc, CfgAbi, LinkerFlavor, Lld, LlvmAbi, 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.cfg_abi = CfgAbi::ElfV2;
base.llvm_abiname = LlvmAbi::ElfV2;
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::{
Arch, Cc, CfgAbi, LinkerFlavor, Lld, LlvmAbi, StackProbeType,
Target, TargetMetadata, TargetOptions, add_link_args, 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"]);
add_link_args(&mut base.late_link_args,
LinkerFlavor::Gnu(Cc::Yes, Lld::No), &["-lgcc"]);
base.max_atomic_width = Some(64);
base.stack_probes = StackProbeType::Inline;
base.cfg_abi = CfgAbi::ElfV2;
base.llvm_abiname = LlvmAbi::ElfV2;
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, LlvmAbi, 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: LlvmAbi::Lp64d,
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".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::{
Arch, Cc, CfgAbi, LinkerFlavor, Lld, LlvmAbi, 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.cfg_abi = CfgAbi::ElfV2;
base.llvm_abiname = LlvmAbi::ElfV2;
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, LlvmAbi, 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: LlvmAbi::Lp64d,
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::{
Arch, CfgAbi, 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 {
cfg_abi: CfgAbi::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::{
Arch, CfgAbi, 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 {
cfg_abi: CfgAbi::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, LlvmAbi, Target, TargetMetadata, TargetOptions, base, cvs,
};
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(),
llvm_abiname: LlvmAbi::O32,
llvm_args: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("-mno-check-zero-division")]),
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, LlvmAbi, 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: LlvmAbi::Lp64d,
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,+fix-cortex-a53-835769".into();
base.max_atomic_width = Some(128);
base.stack_probes = StackProbeType::Inline;
base.supported_sanitizers =
SanitizerSet::ADDRESS | SanitizerSet::CFI |
SanitizerSet::HWADDRESS | 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, LlvmAbi, 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,+v,+zicsr,+zifencei".into();
base.llvm_abiname = LlvmAbi::Lp64d;
base.max_atomic_width = Some(64);
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;
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
| SanitizerSet::SAFESTACK;
base.default_sanitizers = SanitizerSet::SAFESTACK;
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,
requires_consistent_cpu: true,
..TargetOptions::default()
},
}
}
}
pub(crate) mod aarch64_unknown_l4re_uclibc {
use crate::spec::{
Arch, Cc, LinkerFlavor, Target, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::l4re::opts();
let extra_link_args =
&["-zmax-page-size=0x1000", "-zcommon-page-size=0x1000"];
base.add_pre_link_args(LinkerFlavor::Unix(Cc::Yes),
extra_link_args);
base.add_pre_link_args(LinkerFlavor::Unix(Cc::No),
extra_link_args);
Target {
llvm_target: "aarch64-unknown-l4re-uclibc".into(),
metadata: crate::spec::TargetMetadata {
description: Some("Arm64 L4Re".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: "+v8a".into(),
mcount: "__mcount".into(),
max_atomic_width: Some(128),
..base
},
}
}
}
pub(crate) mod x86_64_unknown_l4re_uclibc {
use crate::spec::{
Arch, Cc, LinkerFlavor, 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);
let extra_link_args =
&["-zmax-page-size=0x1000", "-zcommon-page-size=0x1000"];
base.add_pre_link_args(LinkerFlavor::Unix(Cc::Yes),
extra_link_args);
base.add_pre_link_args(LinkerFlavor::Unix(Cc::No),
extra_link_args);
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: Some(3),
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, LlvmAbi, 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 = LlvmAbi::Lp64d;
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, LlvmAbi, 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: LlvmAbi::Lp64d,
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(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),
..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(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),
..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(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: "+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(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),
..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(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-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(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-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::{
Arch, Cc, CfgAbi, 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 {
cfg_abi: CfgAbi::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::{
Arch, Cc, CfgAbi, 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 {
cfg_abi: CfgAbi::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::{
Arch, CfgAbi, FloatAbi, Target, TargetMetadata, TargetOptions,
base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv7r-none-eabi".into(),
metadata: TargetMetadata {
description: Some("Bare 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 {
cfg_abi: CfgAbi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
max_atomic_width: Some(64),
has_thumb_interworking: true,
..base::arm_none::opts()
},
}
}
}
pub(crate) mod thumbv7r_none_eabi {
use crate::spec::{
Arch, CfgAbi, FloatAbi, Target, TargetMetadata, TargetOptions,
base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv7r-none-eabi".into(),
metadata: TargetMetadata {
description: Some("Thumb-mode Bare 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 {
cfg_abi: CfgAbi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
max_atomic_width: Some(64),
has_thumb_interworking: true,
..base::arm_none::opts()
},
}
}
}
pub(crate) mod armv7r_none_eabihf {
use crate::spec::{
Arch, CfgAbi, FloatAbi, Target, TargetMetadata, TargetOptions,
base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv7r-none-eabihf".into(),
metadata: TargetMetadata {
description: Some("Bare 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 {
cfg_abi: CfgAbi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
features: "+vfp3d16".into(),
max_atomic_width: Some(64),
has_thumb_interworking: true,
..base::arm_none::opts()
},
}
}
}
pub(crate) mod thumbv7r_none_eabihf {
use crate::spec::{
Arch, CfgAbi, FloatAbi, Target, TargetMetadata, TargetOptions,
base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv7r-none-eabihf".into(),
metadata: TargetMetadata {
description: Some("Thumb-mode Bare 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 {
cfg_abi: CfgAbi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
features: "+vfp3d16".into(),
max_atomic_width: Some(64),
has_thumb_interworking: true,
..base::arm_none::opts()
},
}
}
}
pub(crate) mod armv8r_none_eabihf {
use crate::spec::{
Arch, CfgAbi, FloatAbi, Target, TargetMetadata, TargetOptions,
base,
};
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 {
cfg_abi: CfgAbi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
max_atomic_width: Some(64),
has_thumb_interworking: true,
..base::arm_none::opts()
},
}
}
}
pub(crate) mod thumbv8r_none_eabihf {
use crate::spec::{
Arch, CfgAbi, FloatAbi, Target, TargetMetadata, TargetOptions,
base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv8r-none-eabihf".into(),
metadata: TargetMetadata {
description: Some("Thumb-mode 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 {
cfg_abi: CfgAbi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
max_atomic_width: Some(64),
has_thumb_interworking: true,
..base::arm_none::opts()
},
}
}
}
pub(crate) mod armv7_rtems_eabihf {
use crate::spec::{
Arch, Cc, CfgAbi, 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")]),
cfg_abi: CfgAbi::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".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".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,
crt_static_respected: true,
crt_static_default: true,
crt_static_allows_dylibs: true,
main_needs_argc_argv: true,
entry_name: "__main_argc_argv".into(),
panic_strategy: PanicStrategy::Unwind,
no_default_libraries: false,
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix"),
::std::borrow::Cow::Borrowed("wasm")]),
llvm_args: ::std::borrow::Cow::Borrowed(&[]),
..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.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.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::{Cc, Env, LinkerFlavor, Target, add_link_args};
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(2),
host_tools: Some(false),
std: Some(true),
};
target.options.env = Env::P3;
add_link_args(&mut target.pre_link_args,
LinkerFlavor::WasmLld(Cc::No),
&["--cooperative-threading",
"--export-if-defined=__wasm_task_hook"]);
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.entry_name = "__main_void".into();
options.singlethread = false;
options.features =
"+atomics,+bulk-memory,+mutable-globals".into();
Target {
llvm_target: "wasm32-wasip1-threads".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-linux-muslwali", "-Wl,--export-memory,",
"-Wl,--shared-memory", "-Wl,--max-memory=1073741824"]);
Target {
llvm_target: "wasm32-linux-muslwali".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::{
Arch, CfgAbi, 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 {
cfg_abi: CfgAbi::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::{
Arch, CfgAbi, 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 {
cfg_abi: CfgAbi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
max_atomic_width: Some(32),
..base::arm_none::opts()
},
}
}
}
pub(crate) mod thumbv7em_none_eabi {
use crate::spec::{
Arch, CfgAbi, 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 {
cfg_abi: CfgAbi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
max_atomic_width: Some(32),
..base::arm_none::opts()
},
}
}
}
pub(crate) mod thumbv7em_none_eabihf {
use crate::spec::{
Arch, CfgAbi, 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 {
cfg_abi: CfgAbi::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::{
Arch, CfgAbi, 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 {
cfg_abi: CfgAbi::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::{
Arch, CfgAbi, 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 {
cfg_abi: CfgAbi::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::{
Arch, CfgAbi, 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 {
cfg_abi: CfgAbi::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::{
Arch, CfgAbi, FloatAbi, Target, TargetMetadata, TargetOptions,
base,
};
pub(crate) fn target() -> Target {
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: TargetOptions {
cfg_abi: CfgAbi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
features: "+soft-float,-neon,+strict-align".into(),
max_atomic_width: Some(64),
has_thumb_interworking: true,
..base::arm_none::opts()
},
}
}
}
pub(crate) mod thumbv7a_none_eabi {
use crate::spec::{
Arch, CfgAbi, FloatAbi, Target, TargetMetadata, TargetOptions,
base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv7a-none-eabi".into(),
metadata: TargetMetadata {
description: Some("Thumb-mode 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: TargetOptions {
cfg_abi: CfgAbi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
features: "+soft-float,-neon,+strict-align".into(),
max_atomic_width: Some(64),
has_thumb_interworking: true,
..base::arm_none::opts()
},
}
}
}
pub(crate) mod armv7a_none_eabihf {
use crate::spec::{
Arch, CfgAbi, FloatAbi, Target, TargetMetadata, TargetOptions,
base,
};
pub(crate) fn target() -> Target {
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: TargetOptions {
cfg_abi: CfgAbi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
features: "+vfp3d16,-neon,+strict-align".into(),
max_atomic_width: Some(64),
has_thumb_interworking: true,
..base::arm_none::opts()
},
}
}
}
pub(crate) mod thumbv7a_none_eabihf {
use crate::spec::{
Arch, CfgAbi, FloatAbi, Target, TargetMetadata, TargetOptions,
base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv7a-none-eabihf".into(),
metadata: TargetMetadata {
description: Some("Thumb-mode 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: TargetOptions {
cfg_abi: CfgAbi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
features: "+vfp3d16,-neon,+strict-align".into(),
max_atomic_width: Some(64),
has_thumb_interworking: true,
..base::arm_none::opts()
},
}
}
}
pub(crate) mod armv7a_nuttx_eabi {
use crate::spec::{
Arch, Cc, CfgAbi, FloatAbi, LinkerFlavor, Lld, Os, PanicStrategy,
RelocModel, Target, TargetMetadata, TargetOptions, cvs,
};
pub(crate) fn target() -> Target {
let opts =
TargetOptions {
cfg_abi: CfgAbi::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::{
Arch, Cc, CfgAbi, FloatAbi, LinkerFlavor, Lld, Os, PanicStrategy,
RelocModel, Target, TargetMetadata, TargetOptions, cvs,
};
pub(crate) fn target() -> Target {
let opts =
TargetOptions {
cfg_abi: CfgAbi::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 thumbv7a_vex_v5 {
use crate::spec::{
Arch, Cc, CfgAbi, 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(),
cfg_abi: CfgAbi::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: "thumbv7a-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, LlvmAbi, 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: LlvmAbi::Lp64d,
..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::{
Arch, CfgAbi, 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 {
cfg_abi: CfgAbi::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, LlvmAbi, 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: LlvmAbi::Ilp32,
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, LlvmAbi, 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: LlvmAbi::Ilp32,
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, LlvmAbi, 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: LlvmAbi::Ilp32,
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, LlvmAbi, 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: LlvmAbi::Ilp32,
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, LlvmAbi, 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: LlvmAbi::Ilp32,
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
emit_debug_gdb_scripts: false,
eh_frame_header: false,
..Default::default()
},
}
}
}
pub(crate) mod riscv32imfc_unknown_none_elf {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, LlvmAbi, 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 (RV32IMFC ISA, hardware single-float, no atomics)".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),
atomic_cas: false,
features: "+m,+f,+c,+forced-atomics".into(),
llvm_abiname: LlvmAbi::Ilp32f,
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, LlvmAbi, 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: LlvmAbi::Ilp32,
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, LlvmAbi, 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: LlvmAbi::Ilp32,
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, LlvmAbi, 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: LlvmAbi::Ilp32f,
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::{
Arch, Cc, CfgAbi, LinkerFlavor, Lld, LlvmAbi, 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 {
cfg_abi: CfgAbi::Ilp32e,
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
cpu: "generic-rv32".into(),
llvm_abiname: LlvmAbi::Ilp32e,
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::{
Arch, Cc, CfgAbi, LinkerFlavor, Lld, LlvmAbi, 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 {
cfg_abi: CfgAbi::Ilp32e,
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
cpu: "generic-rv32".into(),
llvm_abiname: LlvmAbi::Ilp32e,
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::{
Arch, Cc, CfgAbi, LinkerFlavor, Lld, LlvmAbi, 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 {
cfg_abi: CfgAbi::Ilp32e,
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
cpu: "generic-rv32".into(),
llvm_abiname: LlvmAbi::Ilp32e,
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, LlvmAbi, 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: LlvmAbi::Ilp32,
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, LlvmAbi, 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: LlvmAbi::Ilp32f,
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, LlvmAbi, 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: LlvmAbi::Ilp32,
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, LlvmAbi, 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: LlvmAbi::Ilp32d,
max_atomic_width: Some(32),
supported_split_debuginfo: Cow::Borrowed(&[SplitDebuginfo::Off]),
mcount: "\u{1}_mcount".into(),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod riscv32gc_unknown_linux_musl {
use std::borrow::Cow;
use crate::spec::{
Arch, CodeModel, LlvmAbi, 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: LlvmAbi::Ilp32d,
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, LlvmAbi, 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: LlvmAbi::Lp64,
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, LlvmAbi, 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: LlvmAbi::Lp64,
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, LlvmAbi, 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: LlvmAbi::Lp64d,
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, LlvmAbi, 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: LlvmAbi::Lp64d,
max_atomic_width: Some(64),
supported_split_debuginfo: Cow::Borrowed(&[SplitDebuginfo::Off]),
mcount: "\u{1}_mcount".into(),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod riscv64gc_unknown_linux_musl {
use std::borrow::Cow;
use crate::spec::{
Arch, CodeModel, LlvmAbi, 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(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: LlvmAbi::Lp64d,
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, LlvmAbi, 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: LlvmAbi::Lp64d,
max_atomic_width: Some(64),
supported_split_debuginfo: Cow::Borrowed(&[SplitDebuginfo::Off]),
mcount: "\u{1}_mcount".into(),
..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, LlvmAbi, 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(2),
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: LlvmAbi::Ilp32d,
max_atomic_width: Some(32),
mcount: "_mcount".into(),
relocation_model: RelocModel::Static,
panic_strategy: PanicStrategy::Abort,
..Default::default()
},
}
}
}
pub(crate) mod loongarch32_unknown_none_softfloat {
use crate::spec::{
Arch, Cc, CfgAbi, LinkerFlavor, Lld, LlvmAbi, 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(2),
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(),
cfg_abi: CfgAbi::SoftFloat,
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
llvm_abiname: LlvmAbi::Ilp32s,
max_atomic_width: Some(32),
mcount: "_mcount".into(),
relocation_model: RelocModel::Static,
panic_strategy: PanicStrategy::Abort,
..Default::default()
},
}
}
}
pub(crate) mod loongarch64_unknown_none {
use crate::spec::{
Arch, Cc, CodeModel, LinkerFlavor, Lld, LlvmAbi, 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: LlvmAbi::Lp64d,
max_atomic_width: Some(64),
mcount: "_mcount".into(),
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::{
Arch, Cc, CfgAbi, CodeModel, LinkerFlavor, Lld, LlvmAbi,
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(),
cfg_abi: CfgAbi::SoftFloat,
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
llvm_abiname: LlvmAbi::Lp64s,
max_atomic_width: Some(64),
mcount: "_mcount".into(),
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 | SanitizerSet::KERNELHWADDRESS,
relocation_model: RelocModel::Static,
disable_redzone: true,
max_atomic_width: Some(128),
stack_probes: StackProbeType::Inline,
panic_strategy: PanicStrategy::Abort,
default_uwtable: true,
supports_xray: 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::{
Arch, Cc, CfgAbi, LinkerFlavor, Lld, PanicStrategy, RelocModel,
RustcAbi, SanitizerSet, StackProbeType, Target, TargetMetadata,
TargetOptions,
};
pub(crate) fn target() -> Target {
let opts =
TargetOptions {
cfg_abi: CfgAbi::SoftFloat,
rustc_abi: Some(RustcAbi::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 | SanitizerSet::KERNELHWADDRESS,
stack_probes: StackProbeType::Inline,
panic_strategy: PanicStrategy::Abort,
default_uwtable: true,
supports_xray: 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::{
Arch, Cc, CfgAbi, LinkerFlavor, Lld, PanicStrategy, RelocModel,
RustcAbi, SanitizerSet, StackProbeType, Target, TargetMetadata,
TargetOptions,
};
pub(crate) fn target() -> Target {
let opts =
TargetOptions {
cfg_abi: CfgAbi::SoftFloat,
rustc_abi: Some(RustcAbi::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 | SanitizerSet::KERNELHWADDRESS,
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 | SanitizerSet::KERNELHWADDRESS,
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 aarch64v8r_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()),
supported_sanitizers: SanitizerSet::KCFI |
SanitizerSet::KERNELADDRESS | SanitizerSet::KERNELHWADDRESS,
relocation_model: RelocModel::Static,
disable_redzone: true,
max_atomic_width: Some(128),
stack_probes: StackProbeType::Inline,
panic_strategy: PanicStrategy::Abort,
default_uwtable: true,
features: "+v8r,+strict-align".into(),
..Default::default()
};
Target {
llvm_target: "aarch64-unknown-none".into(),
metadata: TargetMetadata {
description: Some("Bare Armv8-R AArch64, hardfloat".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 aarch64v8r_unknown_none_softfloat {
use crate::spec::{
Arch, Cc, CfgAbi, LinkerFlavor, Lld, PanicStrategy, RelocModel,
RustcAbi, SanitizerSet, StackProbeType, Target, TargetMetadata,
TargetOptions,
};
pub(crate) fn target() -> Target {
let opts =
TargetOptions {
cfg_abi: CfgAbi::SoftFloat,
rustc_abi: Some(RustcAbi::Softfloat),
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
relocation_model: RelocModel::Static,
disable_redzone: true,
max_atomic_width: Some(128),
supported_sanitizers: SanitizerSet::KCFI |
SanitizerSet::KERNELADDRESS | SanitizerSet::KERNELHWADDRESS,
stack_probes: StackProbeType::Inline,
panic_strategy: PanicStrategy::Abort,
default_uwtable: true,
features: "+v8r,+strict-align,-neon".into(),
..Default::default()
};
Target {
llvm_target: "aarch64-unknown-none".into(),
metadata: TargetMetadata {
description: Some("Bare Armv8-R AArch64, 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 x86_64_fortanix_unknown_sgx {
use std::borrow::Cow;
use crate::spec::{
Arch, Cc, CfgAbi, 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(),
cfg_abi: CfgAbi::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::Softfloat);
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::Softfloat);
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, cvs,
};
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_70".into(),
unsupported_cpus: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("sm_20"),
::std::borrow::Cow::Borrowed("sm_21"),
::std::borrow::Cow::Borrowed("sm_30"),
::std::borrow::Cow::Borrowed("sm_32"),
::std::borrow::Cow::Borrowed("sm_35"),
::std::borrow::Cow::Borrowed("sm_37"),
::std::borrow::Cow::Borrowed("sm_50"),
::std::borrow::Cow::Borrowed("sm_52"),
::std::borrow::Cow::Borrowed("sm_53"),
::std::borrow::Cow::Borrowed("sm_60"),
::std::borrow::Cow::Borrowed("sm_61"),
::std::borrow::Cow::Borrowed("sm_62")]),
requires_consistent_cpu: true,
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-m: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,
requires_consistent_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-i8:8:32-i16:16:32-i64:64-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-i8:8:32-i16:16:32-i64:64-n32".into(),
arch: Arch::Xtensa,
metadata: TargetMetadata {
description: None,
tier: Some(3),
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-i8:8:32-i16:16:32-i64:64-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-i8:8:32-i16:16:32-i64:64-n32".into(),
arch: Arch::Xtensa,
metadata: TargetMetadata {
description: None,
tier: Some(3),
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-i8:8:32-i16:16:32-i64:64-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-i8:8:32-i16:16:32-i64:64-n32".into(),
arch: Arch::Xtensa,
metadata: TargetMetadata {
description: None,
tier: Some(3),
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::{
Arch, CfgAbi, 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 {
cfg_abi: CfgAbi::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::{
Arch, Cc, CfgAbi, LinkerFlavor, Lld, RustcAbi, 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 {
cfg_abi: CfgAbi::Spe,
rustc_abi: Some(RustcAbi::PowerPcSpe),
endian: Endian::Big,
features: "+secure-plt,+msync,+spe".into(),
..base
},
}
}
}
pub(crate) mod powerpc64_wrs_vxworks {
use rustc_abi::Endian;
use crate::spec::{
Arch, Cc, CfgAbi, LinkerFlavor, Lld, LlvmAbi, 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.cfg_abi = CfgAbi::ElfV1;
base.llvm_abiname = LlvmAbi::ElfV1;
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, LlvmAbi, 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: LlvmAbi::Ilp32d,
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, LlvmAbi, 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: LlvmAbi::Lp64d,
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::{
Arch, CfgAbi, 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 {
cfg_abi: CfgAbi::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::{
Arch, CfgAbi, 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 {
cfg_abi: CfgAbi::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 powerpc64_sony_ps3 {
use crate::spec::{
Arch, Cc, CfgAbi, CodeModel, Endian, FramePointer, LinkerFlavor,
Lld, LlvmAbi, Os, PanicStrategy, RelocModel, Target,
TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
let pre_link_args =
TargetOptions::link_args(LinkerFlavor::Gnu(Cc::No, Lld::No),
&["-m", "elf64ppc", "--image-base=0x10000", "-e", "_start",
"--no-rosegment", "-z", "separate-loadable-segments", "-z",
"norelro", "-Bstatic", "-u", "sys_process_param", "-u",
"sys_proc_prx_param", "--undefined-glob=*_prx_header",
"--undefined-glob=*_fnid_table", "--undefined-glob=*_name",
"--undefined-glob=*_fstub_table"]);
Target {
llvm_target: "powerpc64-sony-ps3".into(),
metadata: TargetMetadata {
description: Some("PowerPC64 (big endian) Sony PlayStation 3 (PS3)".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 64,
data_layout: "E-m:e-Fi64-i64:64-i128:128-n32:64".into(),
arch: Arch::PowerPC64,
options: TargetOptions {
vendor: "sony".into(),
endian: Endian::Big,
os: Os::Ps3,
cfg_abi: CfgAbi::ElfV1,
llvm_abiname: LlvmAbi::ElfV1,
features: "+altivec".into(),
linker: Some("mold".into()),
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::No),
exe_suffix: ".ELF".into(),
code_model: Some(CodeModel::Small),
relax_elf_relocations: false,
relocation_model: RelocModel::Static,
c_int_width: 32,
executables: true,
frame_pointer: FramePointer::MayOmit,
disable_redzone: false,
panic_strategy: PanicStrategy::Abort,
pre_link_args,
..Default::default()
},
}
}
}
pub(crate) mod mipsel_sony_psp {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, LlvmAbi, 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 .pdr) }\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")]),
llvm_abiname: LlvmAbi::O32,
pre_link_args,
link_script: Some(LINKER_SCRIPT.into()),
..Default::default()
},
}
}
}
pub(crate) mod mipsel_sony_psx {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, LlvmAbi, 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: LlvmAbi::O32,
panic_strategy: PanicStrategy::Abort,
..Default::default()
},
}
}
}
pub(crate) mod mipsel_unknown_none {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, LlvmAbi, PanicStrategy, RelocModel,
Target, TargetMetadata, TargetOptions, cvs,
};
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(),
llvm_abiname: LlvmAbi::O32,
llvm_args: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("-mno-check-zero-division")]),
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, LlvmAbi, PanicStrategy, RelocModel,
Target, TargetMetadata, TargetOptions, cvs,
};
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(),
llvm_abiname: LlvmAbi::O32,
llvm_args: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("-mno-check-zero-division")]),
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, LlvmAbi, PanicStrategy, RelocModel,
Target, TargetMetadata, TargetOptions, cvs,
};
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(),
llvm_abiname: LlvmAbi::O32,
llvm_args: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("-mno-check-zero-division")]),
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 armv4t_none_eabi {
use crate::spec::{
Arch, CfgAbi, 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 {
cfg_abi: CfgAbi::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 armv5te_none_eabi {
use crate::spec::{
Arch, CfgAbi, 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 {
cfg_abi: CfgAbi::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 armv6_none_eabi {
use crate::spec::{
Arch, CfgAbi, FloatAbi, Target, TargetMetadata, TargetOptions,
base, cvs,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv6-none-eabi".into(),
metadata: TargetMetadata {
description: Some("Bare ARMv6 soft-float".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 {
cfg_abi: CfgAbi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
asm_args: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("-mthumb-interwork"),
::std::borrow::Cow::Borrowed("-march=armv6"),
::std::borrow::Cow::Borrowed("-mlittle-endian")]),
features: "+soft-float,+strict-align,+v6k".into(),
atomic_cas: true,
has_thumb_interworking: true,
max_atomic_width: Some(64),
..base::arm_none::opts()
},
}
}
}
pub(crate) mod armv6_none_eabihf {
use crate::spec::{
Arch, CfgAbi, FloatAbi, Target, TargetMetadata, TargetOptions,
base, cvs,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv6-none-eabihf".into(),
metadata: TargetMetadata {
description: Some("Bare ARMv6 hard-float".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 {
cfg_abi: CfgAbi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
asm_args: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("-mthumb-interwork"),
::std::borrow::Cow::Borrowed("-march=armv6"),
::std::borrow::Cow::Borrowed("-mlittle-endian")]),
features: "+strict-align,+v6k,+vfp2,-d32".into(),
atomic_cas: true,
has_thumb_interworking: true,
max_atomic_width: Some(64),
..base::arm_none::opts()
},
}
}
}
pub(crate) mod thumbv4t_none_eabi {
use crate::spec::{
Arch, CfgAbi, 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 {
cfg_abi: CfgAbi::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::{
Arch, CfgAbi, 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 {
cfg_abi: CfgAbi::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 thumbv6_none_eabi {
use crate::spec::{
Arch, CfgAbi, FloatAbi, Target, TargetMetadata, TargetOptions,
base, cvs,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv6-none-eabi".into(),
metadata: TargetMetadata {
description: Some("Thumb-mode Bare ARMv6 soft-float".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 {
cfg_abi: CfgAbi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
asm_args: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("-mthumb-interwork"),
::std::borrow::Cow::Borrowed("-march=armv6"),
::std::borrow::Cow::Borrowed("-mlittle-endian")]),
features: "+soft-float,+strict-align,+v6k".into(),
atomic_cas: true,
has_thumb_interworking: true,
max_atomic_width: Some(32),
..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::{
Arch, CfgAbi, 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 {
cfg_abi: CfgAbi::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::{
Arch, CfgAbi, 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 {
cfg_abi: CfgAbi::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::{
Arch, Cc, CfgAbi, 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(),
cfg_abi: CfgAbi::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::{
Arch, Cc, CfgAbi, 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(),
cfg_abi: CfgAbi::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::{
Arch, CfgAbi, 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 {
cfg_abi: CfgAbi::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::{
Arch, CfgAbi, 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(),
cfg_abi: CfgAbi::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::Softfloat),
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::{
Arch, CfgAbi, LlvmAbi, Target, TargetMetadata, TargetOptions,
base, cvs,
};
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(),
cfg_abi: CfgAbi::Abi64,
endian: Endian::Big,
mcount: "_mcount".into(),
llvm_abiname: LlvmAbi::N64,
llvm_args: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("-mno-check-zero-division")]),
..base
},
}
}
}
pub(crate) mod aarch64_unknown_nto_qnx700 {
use crate::spec::base::qnx_sdp;
use crate::spec::{Env, Target};
pub(crate) fn target() -> Target {
let mut target = qnx_sdp::aarch64();
target.metadata.description = Some("ARM64 QNX SDP 7.0".into());
target.options.pre_link_args =
qnx_sdp::pre_link_args(qnx_sdp::ApiVariant::Default,
qnx_sdp::Arch::Aarch64);
target.options.env = Env::Nto70;
target
}
}
pub(crate) mod aarch64_unknown_nto_qnx710 {
use crate::spec::base::qnx_sdp;
use crate::spec::{Env, Target};
pub(crate) fn target() -> Target {
let mut target = qnx_sdp::aarch64();
target.metadata.description =
Some("ARM64 QNX SDP 7.1 with io-pkt network stack".into());
target.options.pre_link_args =
qnx_sdp::pre_link_args(qnx_sdp::ApiVariant::Default,
qnx_sdp::Arch::Aarch64);
target.options.env = Env::Nto71;
target
}
}
pub(crate) mod aarch64_unknown_nto_qnx710_iosock {
use crate::spec::base::qnx_sdp;
use crate::spec::{Env, Target};
pub(crate) fn target() -> Target {
let mut target = qnx_sdp::aarch64();
target.metadata.description =
Some("ARM64 QNX SDP 7.1 with io-sock network stack".into());
target.options.pre_link_args =
qnx_sdp::pre_link_args(qnx_sdp::ApiVariant::IoSock,
qnx_sdp::Arch::Aarch64);
target.options.env = Env::Nto71IoSock;
target
}
}
pub(crate) mod aarch64_unknown_qnx {
use crate::spec::base::qnx_sdp;
use crate::spec::{Os, Target};
pub(crate) fn target() -> Target {
let mut target = qnx_sdp::aarch64();
target.metadata.description = Some("ARM64 QNX SDP 8.0+".into());
target.options.pre_link_args =
qnx_sdp::pre_link_args(qnx_sdp::ApiVariant::Default,
qnx_sdp::Arch::Aarch64);
target.options.os = Os::Qnx;
target
}
}
pub(crate) mod x86_64_pc_nto_qnx710 {
use crate::spec::base::qnx_sdp;
use crate::spec::{Env, Target};
pub(crate) fn target() -> Target {
let mut target = qnx_sdp::x86_64();
target.metadata.description =
Some("x86 64-bit QNX SDP 7.1 with io-pkt network stack".into());
target.options.pre_link_args =
qnx_sdp::pre_link_args(qnx_sdp::ApiVariant::Default,
qnx_sdp::Arch::X86_64);
target.options.env = Env::Nto71;
target
}
}
pub(crate) mod x86_64_pc_nto_qnx710_iosock {
use crate::spec::base::qnx_sdp;
use crate::spec::{Env, Target};
pub(crate) fn target() -> Target {
let mut target = qnx_sdp::x86_64();
target.metadata.description =
Some("x86 64-bit QNX SDP 7.1 with io-sock network stack".into());
target.options.pre_link_args =
qnx_sdp::pre_link_args(qnx_sdp::ApiVariant::IoSock,
qnx_sdp::Arch::X86_64);
target.options.env = Env::Nto71IoSock;
target
}
}
pub(crate) mod x86_64_pc_qnx {
use crate::spec::base::qnx_sdp;
use crate::spec::{Os, Target};
pub(crate) fn target() -> Target {
let mut target = qnx_sdp::x86_64();
target.metadata.description =
Some("x86 64-bit QNX SDP 8.0+".into());
target.options.pre_link_args =
qnx_sdp::pre_link_args(qnx_sdp::ApiVariant::Default,
qnx_sdp::Arch::X86_64);
target.options.os = Os::Qnx;
target
}
}
pub(crate) mod i686_pc_nto_qnx700 {
use crate::spec::base::qnx_sdp;
use crate::spec::{
Arch, Env, RustcAbi, StackProbeType, Target, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut meta = qnx_sdp::meta();
meta.description = Some("32-bit x86 QNX SDP 7.0".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: qnx_sdp::pre_link_args(qnx_sdp::ApiVariant::Default,
qnx_sdp::Arch::I586),
env: Env::Nto70,
vendor: "pc".into(),
stack_probes: StackProbeType::Inline,
..base::qnx_sdp::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::{
Arch, CfgAbi, 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 {
cfg_abi: CfgAbi::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, LlvmAbi, 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,+relax".into(),
llvm_abiname: LlvmAbi::Lp64d,
max_atomic_width: Some(64),
mcount: "_mcount".into(),
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;
base.supports_fentry = true;
Target {
llvm_target: "x86_64-unknown-linux-none".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
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::{
Arch, CfgAbi, 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,
cfg_abi: CfgAbi::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::{
Arch, CfgAbi, 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,
cfg_abi: CfgAbi::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::{
Arch, CfgAbi, 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,
cfg_abi: CfgAbi::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::{
Arch, CfgAbi, 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,
cfg_abi: CfgAbi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
max_atomic_width: Some(32),
..base::arm_none::opts()
},
}
}
}
pub(crate) mod thumbv7em_nuttx_eabi {
use crate::spec::{
Arch, CfgAbi, 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,
cfg_abi: CfgAbi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
max_atomic_width: Some(32),
..base::arm_none::opts()
},
}
}
}
pub(crate) mod thumbv7em_nuttx_eabihf {
use crate::spec::{
Arch, CfgAbi, 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,
cfg_abi: CfgAbi::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::{
Arch, CfgAbi, 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,
cfg_abi: CfgAbi::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::{
Arch, CfgAbi, 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,
cfg_abi: CfgAbi::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::{
Arch, CfgAbi, 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,
cfg_abi: CfgAbi::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, LlvmAbi, 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: LlvmAbi::Ilp32,
panic_strategy: PanicStrategy::Unwind,
relocation_model: RelocModel::Static,
..Default::default()
},
}
}
}
pub(crate) mod riscv32imac_unknown_nuttx_elf {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, LlvmAbi, 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: LlvmAbi::Ilp32,
panic_strategy: PanicStrategy::Unwind,
relocation_model: RelocModel::Static,
..Default::default()
},
}
}
}
pub(crate) mod riscv32imafc_unknown_nuttx_elf {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, LlvmAbi, 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: LlvmAbi::Ilp32f,
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, LlvmAbi, 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: LlvmAbi::Lp64,
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, LlvmAbi, 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: LlvmAbi::Lp64d,
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(crate) mod x86_64_unknown_linux_gnuasan {
use crate::spec::{SanitizerSet, Target, TargetMetadata};
pub(crate) fn target() -> Target {
let mut base = super::x86_64_unknown_linux_gnu::target();
base.metadata =
TargetMetadata {
description: Some("64-bit Linux (kernel 3.2+, glibc 2.17+) with ASAN enabled by default".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
};
base.supported_sanitizers = SanitizerSet::ADDRESS;
base.default_sanitizers = SanitizerSet::ADDRESS;
base
}
}
pub(crate) mod x86_64_unknown_linux_gnumsan {
use crate::spec::{SanitizerSet, Target, TargetMetadata};
pub(crate) fn target() -> Target {
let mut base = super::x86_64_unknown_linux_gnu::target();
base.metadata =
TargetMetadata {
description: Some("64-bit Linux (kernel 3.2+, glibc 2.17+) with MSAN enabled by default".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
};
base.supported_sanitizers = SanitizerSet::MEMORY;
base.default_sanitizers = SanitizerSet::MEMORY;
base
}
}
pub(crate) mod x86_64_unknown_linux_gnutsan {
use crate::spec::{SanitizerSet, Target, TargetMetadata};
pub(crate) fn target() -> Target {
let mut base = super::x86_64_unknown_linux_gnu::target();
base.metadata =
TargetMetadata {
description: Some("64-bit Linux (kernel 3.2+, glibc 2.17+) with TSAN enabled by default".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
};
base.supported_sanitizers = SanitizerSet::THREAD;
base.default_sanitizers = SanitizerSet::THREAD;
base
}
}
pub(crate) mod aarch64_oe_linux_gnu {
use crate::spec::{Target, TargetMetadata};
pub(crate) fn target() -> Target {
let mut base = super::aarch64_unknown_linux_gnu::target();
base.metadata =
TargetMetadata {
description: Some("64-bit Linux (kernel 3.2+, glibc 2.17+) for yocto".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
};
base.llvm_target = "aarch64-oe-linux-gnu".into();
base.options.linker = Some("aarch64-oe-linux-gcc".into());
base
}
}
pub(crate) mod armv7_oe_linux_gnueabihf {
use crate::spec::{Target, TargetMetadata};
pub(crate) fn target() -> Target {
let mut base = super::armv7_unknown_linux_gnueabihf::target();
base.metadata =
TargetMetadata {
description: Some("Armv7-A Linux, hardfloat (kernel 3.2, glibc 2.17) for yocto".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
};
base.llvm_target = "armv7-oe-linux-gnueabihf".into();
base.options.linker = Some("arm-oe-linux-gnueabi-gcc".into());
base
}
}
pub(crate) mod i686_oe_linux_gnu {
use crate::spec::{Target, TargetMetadata};
pub(crate) fn target() -> Target {
let mut base = super::i686_unknown_linux_gnu::target();
base.metadata =
TargetMetadata {
description: Some("32-bit Linux (kernel 3.2, glibc 2.17+) for yocto".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
};
base.llvm_target = "i686-oe-linux-gnu".into();
base.options.linker = Some("i686-oe-linux-gcc".into());
base.options.cpu = "core2".into();
base.options.features = "+sse3".into();
base
}
}
pub(crate) mod riscv64_oe_linux_gnu {
use crate::spec::{Target, TargetMetadata};
pub(crate) fn target() -> Target {
let mut base = super::riscv64gc_unknown_linux_gnu::target();
base.metadata =
TargetMetadata {
description: Some("RISC-V Linux (kernel 4.20, glibc 2.29) for yocto".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
};
base.llvm_target = "riscv64-oe-linux-gnu".into();
base.options.linker = Some("riscv64-oe-linux-gcc".into());
base
}
}
pub(crate) mod x86_64_oe_linux_gnu {
use crate::spec::{Target, TargetMetadata};
pub(crate) fn target() -> Target {
let mut base = super::x86_64_unknown_linux_gnu::target();
base.metadata =
TargetMetadata {
description: Some("64-bit Linux (kernel 3.2+, glibc 2.17+) for yocto".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
};
base.llvm_target = "x86_64-oe-linux-gnu".into();
base.options.linker = Some("x86_64-oe-linux-gcc".into());
base
}
}
}
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-gnuelfv2",
"powerpc64-unknown-linux-musl",
"powerpc64le-unknown-linux-gnu",
"powerpc64le-unknown-linux-musl", "s390x-unknown-linux-gnu",
"s390x-unknown-none-softfloat", "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-unknown-linux-pauthtest",
"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",
"aarch64-unknown-l4re-uclibc", "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",
"thumbv7r-none-eabi", "armv7r-none-eabihf",
"thumbv7r-none-eabihf", "armv8r-none-eabihf",
"thumbv8r-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",
"thumbv7a-none-eabi", "armv7a-none-eabihf",
"thumbv7a-none-eabihf", "armv7a-nuttx-eabi",
"armv7a-nuttx-eabihf", "thumbv7a-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",
"riscv32imfc-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",
"aarch64v8r-unknown-none",
"aarch64v8r-unknown-none-softfloat",
"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",
"powerpc64-sony-ps3", "mipsel-sony-psp", "mipsel-sony-psx",
"mipsel-unknown-none", "mips-mti-none-elf",
"mipsel-mti-none-elf", "armv4t-none-eabi",
"armv5te-none-eabi", "armv6-none-eabi", "armv6-none-eabihf",
"thumbv4t-none-eabi", "thumbv5te-none-eabi",
"thumbv6-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-qnx",
"x86_64-pc-nto-qnx710", "x86_64-pc-nto-qnx710_iosock",
"x86_64-pc-qnx", "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", "x86_64-unknown-linux-gnuasan",
"x86_64-unknown-linux-gnumsan",
"x86_64-unknown-linux-gnutsan", "aarch64-oe-linux-gnu",
"armv7-oe-linux-gnueabihf", "i686-oe-linux-gnu",
"riscv64-oe-linux-gnu", "x86_64-oe-linux-gnu"];
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-gnuelfv2" =>
targets::powerpc64_unknown_linux_gnuelfv2::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-none-softfloat" =>
targets::s390x_unknown_none_softfloat::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-unknown-linux-pauthtest" =>
targets::aarch64_unknown_linux_pauthtest::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(),
"aarch64-unknown-l4re-uclibc" =>
targets::aarch64_unknown_l4re_uclibc::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(),
"thumbv7r-none-eabi" => targets::thumbv7r_none_eabi::target(),
"armv7r-none-eabihf" => targets::armv7r_none_eabihf::target(),
"thumbv7r-none-eabihf" => targets::thumbv7r_none_eabihf::target(),
"armv8r-none-eabihf" => targets::armv8r_none_eabihf::target(),
"thumbv8r-none-eabihf" => targets::thumbv8r_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(),
"thumbv7a-none-eabi" => targets::thumbv7a_none_eabi::target(),
"armv7a-none-eabihf" => targets::armv7a_none_eabihf::target(),
"thumbv7a-none-eabihf" => targets::thumbv7a_none_eabihf::target(),
"armv7a-nuttx-eabi" => targets::armv7a_nuttx_eabi::target(),
"armv7a-nuttx-eabihf" => targets::armv7a_nuttx_eabihf::target(),
"thumbv7a-vex-v5" => targets::thumbv7a_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(),
"riscv32imfc-unknown-none-elf" =>
targets::riscv32imfc_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(),
"aarch64v8r-unknown-none" =>
targets::aarch64v8r_unknown_none::target(),
"aarch64v8r-unknown-none-softfloat" =>
targets::aarch64v8r_unknown_none_softfloat::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(),
"powerpc64-sony-ps3" => targets::powerpc64_sony_ps3::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(),
"armv4t-none-eabi" => targets::armv4t_none_eabi::target(),
"armv5te-none-eabi" => targets::armv5te_none_eabi::target(),
"armv6-none-eabi" => targets::armv6_none_eabi::target(),
"armv6-none-eabihf" => targets::armv6_none_eabihf::target(),
"thumbv4t-none-eabi" => targets::thumbv4t_none_eabi::target(),
"thumbv5te-none-eabi" => targets::thumbv5te_none_eabi::target(),
"thumbv6-none-eabi" => targets::thumbv6_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-qnx" => targets::aarch64_unknown_qnx::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-qnx" => targets::x86_64_pc_qnx::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(),
"x86_64-unknown-linux-gnuasan" =>
targets::x86_64_unknown_linux_gnuasan::target(),
"x86_64-unknown-linux-gnumsan" =>
targets::x86_64_unknown_linux_gnumsan::target(),
"x86_64-unknown-linux-gnutsan" =>
targets::x86_64_unknown_linux_gnutsan::target(),
"aarch64-oe-linux-gnu" => targets::aarch64_oe_linux_gnu::target(),
"armv7-oe-linux-gnueabihf" =>
targets::armv7_oe_linux_gnueabihf::target(),
"i686-oe-linux-gnu" => targets::i686_oe_linux_gnu::target(),
"riscv64-oe-linux-gnu" => targets::riscv64_oe_linux_gnu::target(),
"x86_64-oe-linux-gnu" => targets::x86_64_oe_linux_gnu::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 /rustc-dev/4aa1fbcf467cf38ce58abfa8eb9213a789c5381c/compiler/rustc_target/src/spec/mod.rs:1301",
"rustc_target::spec", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/4aa1fbcf467cf38ce58abfa8eb9213a789c5381c/compiler/rustc_target/src/spec/mod.rs"),
::tracing_core::__macro_support::Option::Some(1301u32),
::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};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("got builtin target: {0:?}",
t) as &dyn ::tracing::field::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_gnuelfv2::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_none_softfloat::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_unknown_linux_pauthtest::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::aarch64_unknown_l4re_uclibc::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::thumbv7r_none_eabi::target,
targets::armv7r_none_eabihf::target,
targets::thumbv7r_none_eabihf::target,
targets::armv8r_none_eabihf::target,
targets::thumbv8r_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::thumbv7a_none_eabi::target,
targets::armv7a_none_eabihf::target,
targets::thumbv7a_none_eabihf::target,
targets::armv7a_nuttx_eabi::target,
targets::armv7a_nuttx_eabihf::target,
targets::thumbv7a_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::riscv32imfc_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::aarch64v8r_unknown_none::target,
targets::aarch64v8r_unknown_none_softfloat::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::powerpc64_sony_ps3::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::armv4t_none_eabi::target,
targets::armv5te_none_eabi::target,
targets::armv6_none_eabi::target,
targets::armv6_none_eabihf::target,
targets::thumbv4t_none_eabi::target,
targets::thumbv5te_none_eabi::target,
targets::thumbv6_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_qnx::target,
targets::x86_64_pc_nto_qnx710::target,
targets::x86_64_pc_nto_qnx710_iosock::target,
targets::x86_64_pc_qnx::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,
targets::x86_64_unknown_linux_gnuasan::target,
targets::x86_64_unknown_linux_gnumsan::target,
targets::x86_64_unknown_linux_gnutsan::target,
targets::aarch64_oe_linux_gnu::target,
targets::armv7_oe_linux_gnueabihf::target,
targets::i686_oe_linux_gnu::target,
targets::riscv64_oe_linux_gnu::target,
targets::x86_64_oe_linux_gnu::target].into_iter().map(|f|
f())
}supported_targets! {
1302 ("x86_64-unknown-linux-gnu", x86_64_unknown_linux_gnu),
1303 ("x86_64-unknown-linux-gnux32", x86_64_unknown_linux_gnux32),
1304 ("i686-unknown-linux-gnu", i686_unknown_linux_gnu),
1305 ("i586-unknown-linux-gnu", i586_unknown_linux_gnu),
1306 ("loongarch64-unknown-linux-gnu", loongarch64_unknown_linux_gnu),
1307 ("loongarch64-unknown-linux-musl", loongarch64_unknown_linux_musl),
1308 ("m68k-unknown-linux-gnu", m68k_unknown_linux_gnu),
1309 ("m68k-unknown-none-elf", m68k_unknown_none_elf),
1310 ("csky-unknown-linux-gnuabiv2", csky_unknown_linux_gnuabiv2),
1311 ("csky-unknown-linux-gnuabiv2hf", csky_unknown_linux_gnuabiv2hf),
1312 ("mips-unknown-linux-gnu", mips_unknown_linux_gnu),
1313 ("mips64-unknown-linux-gnuabi64", mips64_unknown_linux_gnuabi64),
1314 ("mips64el-unknown-linux-gnuabi64", mips64el_unknown_linux_gnuabi64),
1315 ("mipsisa32r6-unknown-linux-gnu", mipsisa32r6_unknown_linux_gnu),
1316 ("mipsisa32r6el-unknown-linux-gnu", mipsisa32r6el_unknown_linux_gnu),
1317 ("mipsisa64r6-unknown-linux-gnuabi64", mipsisa64r6_unknown_linux_gnuabi64),
1318 ("mipsisa64r6el-unknown-linux-gnuabi64", mipsisa64r6el_unknown_linux_gnuabi64),
1319 ("mipsel-unknown-linux-gnu", mipsel_unknown_linux_gnu),
1320 ("powerpc-unknown-linux-gnu", powerpc_unknown_linux_gnu),
1321 ("powerpc-unknown-linux-gnuspe", powerpc_unknown_linux_gnuspe),
1322 ("powerpc-unknown-linux-musl", powerpc_unknown_linux_musl),
1323 ("powerpc-unknown-linux-muslspe", powerpc_unknown_linux_muslspe),
1324 ("powerpc64-ibm-aix", powerpc64_ibm_aix),
1325 ("powerpc64-unknown-linux-gnu", powerpc64_unknown_linux_gnu),
1326 ("powerpc64-unknown-linux-gnuelfv2", powerpc64_unknown_linux_gnuelfv2),
1327 ("powerpc64-unknown-linux-musl", powerpc64_unknown_linux_musl),
1328 ("powerpc64le-unknown-linux-gnu", powerpc64le_unknown_linux_gnu),
1329 ("powerpc64le-unknown-linux-musl", powerpc64le_unknown_linux_musl),
1330 ("s390x-unknown-linux-gnu", s390x_unknown_linux_gnu),
1331 ("s390x-unknown-none-softfloat", s390x_unknown_none_softfloat),
1332 ("s390x-unknown-linux-musl", s390x_unknown_linux_musl),
1333 ("sparc-unknown-linux-gnu", sparc_unknown_linux_gnu),
1334 ("sparc64-unknown-linux-gnu", sparc64_unknown_linux_gnu),
1335 ("arm-unknown-linux-gnueabi", arm_unknown_linux_gnueabi),
1336 ("arm-unknown-linux-gnueabihf", arm_unknown_linux_gnueabihf),
1337 ("armeb-unknown-linux-gnueabi", armeb_unknown_linux_gnueabi),
1338 ("arm-unknown-linux-musleabi", arm_unknown_linux_musleabi),
1339 ("arm-unknown-linux-musleabihf", arm_unknown_linux_musleabihf),
1340 ("armv4t-unknown-linux-gnueabi", armv4t_unknown_linux_gnueabi),
1341 ("armv5te-unknown-linux-gnueabi", armv5te_unknown_linux_gnueabi),
1342 ("armv5te-unknown-linux-musleabi", armv5te_unknown_linux_musleabi),
1343 ("armv5te-unknown-linux-uclibceabi", armv5te_unknown_linux_uclibceabi),
1344 ("armv7-unknown-linux-gnueabi", armv7_unknown_linux_gnueabi),
1345 ("armv7-unknown-linux-gnueabihf", armv7_unknown_linux_gnueabihf),
1346 ("thumbv7neon-unknown-linux-gnueabihf", thumbv7neon_unknown_linux_gnueabihf),
1347 ("thumbv7neon-unknown-linux-musleabihf", thumbv7neon_unknown_linux_musleabihf),
1348 ("armv7-unknown-linux-musleabi", armv7_unknown_linux_musleabi),
1349 ("armv7-unknown-linux-musleabihf", armv7_unknown_linux_musleabihf),
1350 ("aarch64-unknown-linux-gnu", aarch64_unknown_linux_gnu),
1351 ("aarch64-unknown-linux-musl", aarch64_unknown_linux_musl),
1352 ("aarch64-unknown-linux-pauthtest", aarch64_unknown_linux_pauthtest),
1353 ("aarch64_be-unknown-linux-musl", aarch64_be_unknown_linux_musl),
1354 ("x86_64-unknown-linux-musl", x86_64_unknown_linux_musl),
1355 ("i686-unknown-linux-musl", i686_unknown_linux_musl),
1356 ("i586-unknown-linux-musl", i586_unknown_linux_musl),
1357 ("mips-unknown-linux-musl", mips_unknown_linux_musl),
1358 ("mipsel-unknown-linux-musl", mipsel_unknown_linux_musl),
1359 ("mips64-unknown-linux-muslabi64", mips64_unknown_linux_muslabi64),
1360 ("mips64el-unknown-linux-muslabi64", mips64el_unknown_linux_muslabi64),
1361 ("hexagon-unknown-linux-musl", hexagon_unknown_linux_musl),
1362 ("hexagon-unknown-none-elf", hexagon_unknown_none_elf),
1363 ("hexagon-unknown-qurt", hexagon_unknown_qurt),
1364
1365 ("mips-unknown-linux-uclibc", mips_unknown_linux_uclibc),
1366 ("mipsel-unknown-linux-uclibc", mipsel_unknown_linux_uclibc),
1367
1368 ("i686-linux-android", i686_linux_android),
1369 ("x86_64-linux-android", x86_64_linux_android),
1370 ("arm-linux-androideabi", arm_linux_androideabi),
1371 ("armv7-linux-androideabi", armv7_linux_androideabi),
1372 ("thumbv7neon-linux-androideabi", thumbv7neon_linux_androideabi),
1373 ("aarch64-linux-android", aarch64_linux_android),
1374 ("riscv64-linux-android", riscv64_linux_android),
1375
1376 ("aarch64-unknown-freebsd", aarch64_unknown_freebsd),
1377 ("armv6-unknown-freebsd", armv6_unknown_freebsd),
1378 ("armv7-unknown-freebsd", armv7_unknown_freebsd),
1379 ("i686-unknown-freebsd", i686_unknown_freebsd),
1380 ("powerpc-unknown-freebsd", powerpc_unknown_freebsd),
1381 ("powerpc64-unknown-freebsd", powerpc64_unknown_freebsd),
1382 ("powerpc64le-unknown-freebsd", powerpc64le_unknown_freebsd),
1383 ("riscv64gc-unknown-freebsd", riscv64gc_unknown_freebsd),
1384 ("x86_64-unknown-freebsd", x86_64_unknown_freebsd),
1385
1386 ("x86_64-unknown-dragonfly", x86_64_unknown_dragonfly),
1387
1388 ("aarch64-unknown-openbsd", aarch64_unknown_openbsd),
1389 ("i686-unknown-openbsd", i686_unknown_openbsd),
1390 ("powerpc-unknown-openbsd", powerpc_unknown_openbsd),
1391 ("powerpc64-unknown-openbsd", powerpc64_unknown_openbsd),
1392 ("riscv64gc-unknown-openbsd", riscv64gc_unknown_openbsd),
1393 ("sparc64-unknown-openbsd", sparc64_unknown_openbsd),
1394 ("x86_64-unknown-openbsd", x86_64_unknown_openbsd),
1395
1396 ("aarch64-unknown-netbsd", aarch64_unknown_netbsd),
1397 ("aarch64_be-unknown-netbsd", aarch64_be_unknown_netbsd),
1398 ("armv6-unknown-netbsd-eabihf", armv6_unknown_netbsd_eabihf),
1399 ("armv7-unknown-netbsd-eabihf", armv7_unknown_netbsd_eabihf),
1400 ("i586-unknown-netbsd", i586_unknown_netbsd),
1401 ("i686-unknown-netbsd", i686_unknown_netbsd),
1402 ("mipsel-unknown-netbsd", mipsel_unknown_netbsd),
1403 ("powerpc-unknown-netbsd", powerpc_unknown_netbsd),
1404 ("riscv64gc-unknown-netbsd", riscv64gc_unknown_netbsd),
1405 ("sparc64-unknown-netbsd", sparc64_unknown_netbsd),
1406 ("x86_64-unknown-netbsd", x86_64_unknown_netbsd),
1407
1408 ("i686-unknown-haiku", i686_unknown_haiku),
1409 ("x86_64-unknown-haiku", x86_64_unknown_haiku),
1410
1411 ("aarch64-unknown-helenos", aarch64_unknown_helenos),
1412 ("i686-unknown-helenos", i686_unknown_helenos),
1413 ("powerpc-unknown-helenos", powerpc_unknown_helenos),
1414 ("sparc64-unknown-helenos", sparc64_unknown_helenos),
1415 ("x86_64-unknown-helenos", x86_64_unknown_helenos),
1416
1417 ("i686-unknown-hurd-gnu", i686_unknown_hurd_gnu),
1418 ("x86_64-unknown-hurd-gnu", x86_64_unknown_hurd_gnu),
1419
1420 ("aarch64-apple-darwin", aarch64_apple_darwin),
1421 ("arm64e-apple-darwin", arm64e_apple_darwin),
1422 ("x86_64-apple-darwin", x86_64_apple_darwin),
1423 ("x86_64h-apple-darwin", x86_64h_apple_darwin),
1424 ("i686-apple-darwin", i686_apple_darwin),
1425
1426 ("aarch64-unknown-fuchsia", aarch64_unknown_fuchsia),
1427 ("riscv64gc-unknown-fuchsia", riscv64gc_unknown_fuchsia),
1428 ("x86_64-unknown-fuchsia", x86_64_unknown_fuchsia),
1429
1430 ("avr-none", avr_none),
1431
1432 ("aarch64-unknown-l4re-uclibc", aarch64_unknown_l4re_uclibc),
1433 ("x86_64-unknown-l4re-uclibc", x86_64_unknown_l4re_uclibc),
1434
1435 ("aarch64-unknown-redox", aarch64_unknown_redox),
1436 ("i586-unknown-redox", i586_unknown_redox),
1437 ("riscv64gc-unknown-redox", riscv64gc_unknown_redox),
1438 ("x86_64-unknown-redox", x86_64_unknown_redox),
1439
1440 ("x86_64-unknown-managarm-mlibc", x86_64_unknown_managarm_mlibc),
1441 ("aarch64-unknown-managarm-mlibc", aarch64_unknown_managarm_mlibc),
1442 ("riscv64gc-unknown-managarm-mlibc", riscv64gc_unknown_managarm_mlibc),
1443
1444 ("i386-apple-ios", i386_apple_ios),
1445 ("x86_64-apple-ios", x86_64_apple_ios),
1446 ("aarch64-apple-ios", aarch64_apple_ios),
1447 ("arm64e-apple-ios", arm64e_apple_ios),
1448 ("armv7s-apple-ios", armv7s_apple_ios),
1449 ("x86_64-apple-ios-macabi", x86_64_apple_ios_macabi),
1450 ("aarch64-apple-ios-macabi", aarch64_apple_ios_macabi),
1451 ("aarch64-apple-ios-sim", aarch64_apple_ios_sim),
1452
1453 ("aarch64-apple-tvos", aarch64_apple_tvos),
1454 ("aarch64-apple-tvos-sim", aarch64_apple_tvos_sim),
1455 ("arm64e-apple-tvos", arm64e_apple_tvos),
1456 ("x86_64-apple-tvos", x86_64_apple_tvos),
1457
1458 ("armv7k-apple-watchos", armv7k_apple_watchos),
1459 ("arm64_32-apple-watchos", arm64_32_apple_watchos),
1460 ("x86_64-apple-watchos-sim", x86_64_apple_watchos_sim),
1461 ("aarch64-apple-watchos", aarch64_apple_watchos),
1462 ("aarch64-apple-watchos-sim", aarch64_apple_watchos_sim),
1463
1464 ("aarch64-apple-visionos", aarch64_apple_visionos),
1465 ("aarch64-apple-visionos-sim", aarch64_apple_visionos_sim),
1466
1467 ("armebv7r-none-eabi", armebv7r_none_eabi),
1468 ("armebv7r-none-eabihf", armebv7r_none_eabihf),
1469 ("armv7r-none-eabi", armv7r_none_eabi),
1470 ("thumbv7r-none-eabi", thumbv7r_none_eabi),
1471 ("armv7r-none-eabihf", armv7r_none_eabihf),
1472 ("thumbv7r-none-eabihf", thumbv7r_none_eabihf),
1473 ("armv8r-none-eabihf", armv8r_none_eabihf),
1474 ("thumbv8r-none-eabihf", thumbv8r_none_eabihf),
1475
1476 ("armv7-rtems-eabihf", armv7_rtems_eabihf),
1477
1478 ("x86_64-pc-solaris", x86_64_pc_solaris),
1479 ("sparcv9-sun-solaris", sparcv9_sun_solaris),
1480
1481 ("x86_64-unknown-illumos", x86_64_unknown_illumos),
1482 ("aarch64-unknown-illumos", aarch64_unknown_illumos),
1483
1484 ("x86_64-pc-windows-gnu", x86_64_pc_windows_gnu),
1485 ("x86_64-uwp-windows-gnu", x86_64_uwp_windows_gnu),
1486 ("x86_64-win7-windows-gnu", x86_64_win7_windows_gnu),
1487 ("i686-pc-windows-gnu", i686_pc_windows_gnu),
1488 ("i686-uwp-windows-gnu", i686_uwp_windows_gnu),
1489 ("i686-win7-windows-gnu", i686_win7_windows_gnu),
1490
1491 ("aarch64-pc-windows-gnullvm", aarch64_pc_windows_gnullvm),
1492 ("i686-pc-windows-gnullvm", i686_pc_windows_gnullvm),
1493 ("x86_64-pc-windows-gnullvm", x86_64_pc_windows_gnullvm),
1494
1495 ("aarch64-pc-windows-msvc", aarch64_pc_windows_msvc),
1496 ("aarch64-uwp-windows-msvc", aarch64_uwp_windows_msvc),
1497 ("arm64ec-pc-windows-msvc", arm64ec_pc_windows_msvc),
1498 ("x86_64-pc-windows-msvc", x86_64_pc_windows_msvc),
1499 ("x86_64-uwp-windows-msvc", x86_64_uwp_windows_msvc),
1500 ("x86_64-win7-windows-msvc", x86_64_win7_windows_msvc),
1501 ("i686-pc-windows-msvc", i686_pc_windows_msvc),
1502 ("i686-uwp-windows-msvc", i686_uwp_windows_msvc),
1503 ("i686-win7-windows-msvc", i686_win7_windows_msvc),
1504 ("thumbv7a-pc-windows-msvc", thumbv7a_pc_windows_msvc),
1505 ("thumbv7a-uwp-windows-msvc", thumbv7a_uwp_windows_msvc),
1506
1507 ("wasm32-unknown-emscripten", wasm32_unknown_emscripten),
1508 ("wasm32-unknown-unknown", wasm32_unknown_unknown),
1509 ("wasm32v1-none", wasm32v1_none),
1510 ("wasm32-wasip1", wasm32_wasip1),
1511 ("wasm32-wasip2", wasm32_wasip2),
1512 ("wasm32-wasip3", wasm32_wasip3),
1513 ("wasm32-wasip1-threads", wasm32_wasip1_threads),
1514 ("wasm32-wali-linux-musl", wasm32_wali_linux_musl),
1515 ("wasm64-unknown-unknown", wasm64_unknown_unknown),
1516
1517 ("thumbv6m-none-eabi", thumbv6m_none_eabi),
1518 ("thumbv7m-none-eabi", thumbv7m_none_eabi),
1519 ("thumbv7em-none-eabi", thumbv7em_none_eabi),
1520 ("thumbv7em-none-eabihf", thumbv7em_none_eabihf),
1521 ("thumbv8m.base-none-eabi", thumbv8m_base_none_eabi),
1522 ("thumbv8m.main-none-eabi", thumbv8m_main_none_eabi),
1523 ("thumbv8m.main-none-eabihf", thumbv8m_main_none_eabihf),
1524
1525 ("armv7a-none-eabi", armv7a_none_eabi),
1526 ("thumbv7a-none-eabi", thumbv7a_none_eabi),
1527 ("armv7a-none-eabihf", armv7a_none_eabihf),
1528 ("thumbv7a-none-eabihf", thumbv7a_none_eabihf),
1529 ("armv7a-nuttx-eabi", armv7a_nuttx_eabi),
1530 ("armv7a-nuttx-eabihf", armv7a_nuttx_eabihf),
1531 ("thumbv7a-vex-v5", thumbv7a_vex_v5),
1532
1533 ("msp430-none-elf", msp430_none_elf),
1534
1535 ("aarch64_be-unknown-hermit", aarch64_be_unknown_hermit),
1536 ("aarch64-unknown-hermit", aarch64_unknown_hermit),
1537 ("riscv64gc-unknown-hermit", riscv64gc_unknown_hermit),
1538 ("x86_64-unknown-hermit", x86_64_unknown_hermit),
1539 ("x86_64-unknown-motor", x86_64_unknown_motor),
1540
1541 ("x86_64-unikraft-linux-musl", x86_64_unikraft_linux_musl),
1542
1543 ("armv7-unknown-trusty", armv7_unknown_trusty),
1544 ("aarch64-unknown-trusty", aarch64_unknown_trusty),
1545 ("x86_64-unknown-trusty", x86_64_unknown_trusty),
1546
1547 ("riscv32i-unknown-none-elf", riscv32i_unknown_none_elf),
1548 ("riscv32im-risc0-zkvm-elf", riscv32im_risc0_zkvm_elf),
1549 ("riscv32im-unknown-none-elf", riscv32im_unknown_none_elf),
1550 ("riscv32ima-unknown-none-elf", riscv32ima_unknown_none_elf),
1551 ("riscv32imc-unknown-none-elf", riscv32imc_unknown_none_elf),
1552 ("riscv32imfc-unknown-none-elf", riscv32imfc_unknown_none_elf),
1553 ("riscv32imc-esp-espidf", riscv32imc_esp_espidf),
1554 ("riscv32imac-esp-espidf", riscv32imac_esp_espidf),
1555 ("riscv32imafc-esp-espidf", riscv32imafc_esp_espidf),
1556
1557 ("riscv32e-unknown-none-elf", riscv32e_unknown_none_elf),
1558 ("riscv32em-unknown-none-elf", riscv32em_unknown_none_elf),
1559 ("riscv32emc-unknown-none-elf", riscv32emc_unknown_none_elf),
1560
1561 ("riscv32imac-unknown-none-elf", riscv32imac_unknown_none_elf),
1562 ("riscv32imafc-unknown-none-elf", riscv32imafc_unknown_none_elf),
1563 ("riscv32imac-unknown-xous-elf", riscv32imac_unknown_xous_elf),
1564 ("riscv32gc-unknown-linux-gnu", riscv32gc_unknown_linux_gnu),
1565 ("riscv32gc-unknown-linux-musl", riscv32gc_unknown_linux_musl),
1566 ("riscv64im-unknown-none-elf", riscv64im_unknown_none_elf),
1567 ("riscv64imac-unknown-none-elf", riscv64imac_unknown_none_elf),
1568 ("riscv64gc-unknown-none-elf", riscv64gc_unknown_none_elf),
1569 ("riscv64gc-unknown-linux-gnu", riscv64gc_unknown_linux_gnu),
1570 ("riscv64gc-unknown-linux-musl", riscv64gc_unknown_linux_musl),
1571 ("riscv64a23-unknown-linux-gnu", riscv64a23_unknown_linux_gnu),
1572
1573 ("sparc-unknown-none-elf", sparc_unknown_none_elf),
1574
1575 ("loongarch32-unknown-none", loongarch32_unknown_none),
1576 ("loongarch32-unknown-none-softfloat", loongarch32_unknown_none_softfloat),
1577 ("loongarch64-unknown-none", loongarch64_unknown_none),
1578 ("loongarch64-unknown-none-softfloat", loongarch64_unknown_none_softfloat),
1579
1580 ("aarch64-unknown-none", aarch64_unknown_none),
1581 ("aarch64-unknown-none-softfloat", aarch64_unknown_none_softfloat),
1582 ("aarch64_be-unknown-none-softfloat", aarch64_be_unknown_none_softfloat),
1583 ("aarch64-unknown-nuttx", aarch64_unknown_nuttx),
1584 ("aarch64v8r-unknown-none", aarch64v8r_unknown_none),
1585 ("aarch64v8r-unknown-none-softfloat", aarch64v8r_unknown_none_softfloat),
1586
1587 ("x86_64-fortanix-unknown-sgx", x86_64_fortanix_unknown_sgx),
1588
1589 ("x86_64-unknown-uefi", x86_64_unknown_uefi),
1590 ("i686-unknown-uefi", i686_unknown_uefi),
1591 ("aarch64-unknown-uefi", aarch64_unknown_uefi),
1592
1593 ("nvptx64-nvidia-cuda", nvptx64_nvidia_cuda),
1594
1595 ("amdgcn-amd-amdhsa", amdgcn_amd_amdhsa),
1596
1597 ("xtensa-esp32-none-elf", xtensa_esp32_none_elf),
1598 ("xtensa-esp32-espidf", xtensa_esp32_espidf),
1599 ("xtensa-esp32s2-none-elf", xtensa_esp32s2_none_elf),
1600 ("xtensa-esp32s2-espidf", xtensa_esp32s2_espidf),
1601 ("xtensa-esp32s3-none-elf", xtensa_esp32s3_none_elf),
1602 ("xtensa-esp32s3-espidf", xtensa_esp32s3_espidf),
1603
1604 ("i686-wrs-vxworks", i686_wrs_vxworks),
1605 ("x86_64-wrs-vxworks", x86_64_wrs_vxworks),
1606 ("armv7-wrs-vxworks-eabihf", armv7_wrs_vxworks_eabihf),
1607 ("aarch64-wrs-vxworks", aarch64_wrs_vxworks),
1608 ("powerpc-wrs-vxworks", powerpc_wrs_vxworks),
1609 ("powerpc-wrs-vxworks-spe", powerpc_wrs_vxworks_spe),
1610 ("powerpc64-wrs-vxworks", powerpc64_wrs_vxworks),
1611 ("riscv32-wrs-vxworks", riscv32_wrs_vxworks),
1612 ("riscv64-wrs-vxworks", riscv64_wrs_vxworks),
1613
1614 ("aarch64-kmc-solid_asp3", aarch64_kmc_solid_asp3),
1615 ("armv7a-kmc-solid_asp3-eabi", armv7a_kmc_solid_asp3_eabi),
1616 ("armv7a-kmc-solid_asp3-eabihf", armv7a_kmc_solid_asp3_eabihf),
1617
1618 ("powerpc64-sony-ps3", powerpc64_sony_ps3),
1619 ("mipsel-sony-psp", mipsel_sony_psp),
1620 ("mipsel-sony-psx", mipsel_sony_psx),
1621 ("mipsel-unknown-none", mipsel_unknown_none),
1622 ("mips-mti-none-elf", mips_mti_none_elf),
1623 ("mipsel-mti-none-elf", mipsel_mti_none_elf),
1624
1625 ("armv4t-none-eabi", armv4t_none_eabi),
1626 ("armv5te-none-eabi", armv5te_none_eabi),
1627 ("armv6-none-eabi", armv6_none_eabi),
1628 ("armv6-none-eabihf", armv6_none_eabihf),
1629 ("thumbv4t-none-eabi", thumbv4t_none_eabi),
1630 ("thumbv5te-none-eabi", thumbv5te_none_eabi),
1631 ("thumbv6-none-eabi", thumbv6_none_eabi),
1632
1633 ("aarch64_be-unknown-linux-gnu", aarch64_be_unknown_linux_gnu),
1634 ("aarch64-unknown-linux-gnu_ilp32", aarch64_unknown_linux_gnu_ilp32),
1635 ("aarch64_be-unknown-linux-gnu_ilp32", aarch64_be_unknown_linux_gnu_ilp32),
1636
1637 ("bpfeb-unknown-none", bpfeb_unknown_none),
1638 ("bpfel-unknown-none", bpfel_unknown_none),
1639
1640 ("armv6k-nintendo-3ds", armv6k_nintendo_3ds),
1641
1642 ("aarch64-nintendo-switch-freestanding", aarch64_nintendo_switch_freestanding),
1643
1644 ("armv7-sony-vita-newlibeabihf", armv7_sony_vita_newlibeabihf),
1645
1646 ("armv7-unknown-linux-uclibceabi", armv7_unknown_linux_uclibceabi),
1647 ("armv7-unknown-linux-uclibceabihf", armv7_unknown_linux_uclibceabihf),
1648
1649 ("x86_64-unknown-none", x86_64_unknown_none),
1650
1651 ("aarch64-unknown-teeos", aarch64_unknown_teeos),
1652
1653 ("mips64-openwrt-linux-musl", mips64_openwrt_linux_musl),
1654
1655 ("aarch64-unknown-nto-qnx700", aarch64_unknown_nto_qnx700),
1656 ("aarch64-unknown-nto-qnx710", aarch64_unknown_nto_qnx710),
1657 ("aarch64-unknown-nto-qnx710_iosock", aarch64_unknown_nto_qnx710_iosock),
1658 ("aarch64-unknown-qnx", aarch64_unknown_qnx),
1659 ("x86_64-pc-nto-qnx710", x86_64_pc_nto_qnx710),
1660 ("x86_64-pc-nto-qnx710_iosock", x86_64_pc_nto_qnx710_iosock),
1661 ("x86_64-pc-qnx", x86_64_pc_qnx),
1662 ("i686-pc-nto-qnx700", i686_pc_nto_qnx700),
1663
1664 ("aarch64-unknown-linux-ohos", aarch64_unknown_linux_ohos),
1665 ("armv7-unknown-linux-ohos", armv7_unknown_linux_ohos),
1666 ("loongarch64-unknown-linux-ohos", loongarch64_unknown_linux_ohos),
1667 ("x86_64-unknown-linux-ohos", x86_64_unknown_linux_ohos),
1668
1669 ("x86_64-unknown-linux-none", x86_64_unknown_linux_none),
1670
1671 ("thumbv6m-nuttx-eabi", thumbv6m_nuttx_eabi),
1672 ("thumbv7a-nuttx-eabi", thumbv7a_nuttx_eabi),
1673 ("thumbv7a-nuttx-eabihf", thumbv7a_nuttx_eabihf),
1674 ("thumbv7m-nuttx-eabi", thumbv7m_nuttx_eabi),
1675 ("thumbv7em-nuttx-eabi", thumbv7em_nuttx_eabi),
1676 ("thumbv7em-nuttx-eabihf", thumbv7em_nuttx_eabihf),
1677 ("thumbv8m.base-nuttx-eabi", thumbv8m_base_nuttx_eabi),
1678 ("thumbv8m.main-nuttx-eabi", thumbv8m_main_nuttx_eabi),
1679 ("thumbv8m.main-nuttx-eabihf", thumbv8m_main_nuttx_eabihf),
1680 ("riscv32imc-unknown-nuttx-elf", riscv32imc_unknown_nuttx_elf),
1681 ("riscv32imac-unknown-nuttx-elf", riscv32imac_unknown_nuttx_elf),
1682 ("riscv32imafc-unknown-nuttx-elf", riscv32imafc_unknown_nuttx_elf),
1683 ("riscv64imac-unknown-nuttx-elf", riscv64imac_unknown_nuttx_elf),
1684 ("riscv64gc-unknown-nuttx-elf", riscv64gc_unknown_nuttx_elf),
1685 ("x86_64-lynx-lynxos178", x86_64_lynx_lynxos178),
1686
1687 ("x86_64-pc-cygwin", x86_64_pc_cygwin),
1688
1689 ("x86_64-unknown-linux-gnuasan", x86_64_unknown_linux_gnuasan),
1690 ("x86_64-unknown-linux-gnumsan", x86_64_unknown_linux_gnumsan),
1691 ("x86_64-unknown-linux-gnutsan", x86_64_unknown_linux_gnutsan),
1692
1693 ("aarch64-oe-linux-gnu", aarch64_oe_linux_gnu),
1694 ("armv7-oe-linux-gnueabihf", armv7_oe_linux_gnueabihf),
1695 ("i686-oe-linux-gnu", i686_oe_linux_gnu),
1696 ("riscv64-oe-linux-gnu", riscv64_oe_linux_gnu),
1697 ("x86_64-oe-linux-gnu", x86_64_oe_linux_gnu),
1698}
1699
1700macro_rules! cvs {
1702 () => {
1703 ::std::borrow::Cow::Borrowed(&[])
1704 };
1705 ($($x:expr),+ $(,)?) => {
1706 ::std::borrow::Cow::Borrowed(&[
1707 $(
1708 ::std::borrow::Cow::Borrowed($x),
1709 )*
1710 ])
1711 };
1712}
1713
1714pub(crate) use cvs;
1715
1716#[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::marker::StructuralPartialEq for TargetWarnings { }
#[automatically_derived]
impl ::core::cmp::PartialEq for TargetWarnings {
#[inline]
fn eq(&self, other: &TargetWarnings) -> bool {
self.unused_fields == other.unused_fields
}
}PartialEq)]
1720pub struct TargetWarnings {
1721 unused_fields: Vec<String>,
1722}
1723
1724impl TargetWarnings {
1725 pub fn empty() -> Self {
1726 Self { unused_fields: Vec::new() }
1727 }
1728
1729 pub fn warning_messages(&self) -> Vec<String> {
1730 let mut warnings = ::alloc::vec::Vec::new()vec![];
1731 if !self.unused_fields.is_empty() {
1732 warnings.push(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("target json file contains unused fields: {0}",
self.unused_fields.join(", ")))
})format!(
1733 "target json file contains unused fields: {}",
1734 self.unused_fields.join(", ")
1735 ));
1736 }
1737 warnings
1738 }
1739}
1740
1741#[derive(#[automatically_derived]
impl ::core::marker::Copy for TargetKind { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for TargetKind { }
#[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::marker::StructuralPartialEq for TargetKind { }
#[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)]
1744enum TargetKind {
1745 Json,
1746 Builtin,
1747}
1748
1749pub 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_fields_are_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> {
::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
}
}
#[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! {
1750 pub enum Arch {
1751 AArch64 = "aarch64",
1752 AmdGpu = "amdgpu",
1753 Arm = "arm",
1754 Arm64EC = "arm64ec",
1755 Avr = "avr",
1756 Bpf = "bpf",
1757 CSky = "csky",
1758 Hexagon = "hexagon",
1759 LoongArch32 = "loongarch32",
1760 LoongArch64 = "loongarch64",
1761 M68k = "m68k",
1762 Mips = "mips",
1763 Mips32r6 = "mips32r6",
1764 Mips64 = "mips64",
1765 Mips64r6 = "mips64r6",
1766 Msp430 = "msp430",
1767 Nvptx64 = "nvptx64",
1768 PowerPC = "powerpc",
1769 PowerPC64 = "powerpc64",
1770 RiscV32 = "riscv32",
1771 RiscV64 = "riscv64",
1772 S390x = "s390x",
1773 Sparc = "sparc",
1774 Sparc64 = "sparc64",
1775 SpirV = "spirv",
1776 Wasm32 = "wasm32",
1777 Wasm64 = "wasm64",
1778 X86 = "x86",
1779 X86_64 = "x86_64",
1780 Xtensa = "xtensa",
1781 }
1782 other_variant = Other;
1783}
1784
1785impl Arch {
1786 pub fn desc_symbol(&self) -> Symbol {
1787 match self {
1788 Self::AArch64 => sym::aarch64,
1789 Self::AmdGpu => sym::amdgpu,
1790 Self::Arm => sym::arm,
1791 Self::Arm64EC => sym::arm64ec,
1792 Self::Avr => sym::avr,
1793 Self::Bpf => sym::bpf,
1794 Self::CSky => sym::csky,
1795 Self::Hexagon => sym::hexagon,
1796 Self::LoongArch32 => sym::loongarch32,
1797 Self::LoongArch64 => sym::loongarch64,
1798 Self::M68k => sym::m68k,
1799 Self::Mips => sym::mips,
1800 Self::Mips32r6 => sym::mips32r6,
1801 Self::Mips64 => sym::mips64,
1802 Self::Mips64r6 => sym::mips64r6,
1803 Self::Msp430 => sym::msp430,
1804 Self::Nvptx64 => sym::nvptx64,
1805 Self::PowerPC => sym::powerpc,
1806 Self::PowerPC64 => sym::powerpc64,
1807 Self::RiscV32 => sym::riscv32,
1808 Self::RiscV64 => sym::riscv64,
1809 Self::S390x => sym::s390x,
1810 Self::Sparc => sym::sparc,
1811 Self::Sparc64 => sym::sparc64,
1812 Self::SpirV => sym::spirv,
1813 Self::Wasm32 => sym::wasm32,
1814 Self::Wasm64 => sym::wasm64,
1815 Self::X86 => sym::x86,
1816 Self::X86_64 => sym::x86_64,
1817 Self::Xtensa => sym::xtensa,
1818 Self::Other(name) => rustc_span::Symbol::intern(name),
1819 }
1820 }
1821
1822 pub fn supports_scalable_vectors(&self) -> bool {
1824 use Arch::*;
1825
1826 match self {
1827 AArch64 | RiscV32 | RiscV64 => true,
1828 AmdGpu | Arm | Arm64EC | Avr | Bpf | CSky | Hexagon | LoongArch32 | LoongArch64
1829 | M68k | Mips | Mips32r6 | Mips64 | Mips64r6 | Msp430 | Nvptx64 | PowerPC
1830 | PowerPC64 | S390x | Sparc | Sparc64 | SpirV | Wasm32 | Wasm64 | X86 | X86_64
1831 | Xtensa | Other(_) => false,
1832 }
1833 }
1834}
1835
1836pub 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,
Ps3,
Psp,
Psx,
Qnx,
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::Ps3 => Os::Ps3,
Os::Psp => Os::Psp,
Os::Psx => Os::Psx,
Os::Qnx => Os::Qnx,
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_fields_are_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::Ps3 => ::core::fmt::Formatter::write_str(f, "Ps3"),
Os::Psp => ::core::fmt::Formatter::write_str(f, "Psp"),
Os::Psx => ::core::fmt::Formatter::write_str(f, "Psx"),
Os::Qnx => ::core::fmt::Formatter::write_str(f, "Qnx"),
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> {
::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
}
}
#[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,
"ps3" => Self::Ps3,
"psp" => Self::Psp,
"psx" => Self::Psx,
"qnx" => Self::Qnx,
"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::Ps3 => "ps3",
Self::Psp => "psp",
Self::Psx => "psx",
Self::Qnx => "qnx",
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! {
1837 pub enum Os {
1838 Aix = "aix",
1839 AmdHsa = "amdhsa",
1840 Android = "android",
1841 Cuda = "cuda",
1842 Cygwin = "cygwin",
1843 Dragonfly = "dragonfly",
1844 Emscripten = "emscripten",
1845 EspIdf = "espidf",
1846 FreeBsd = "freebsd",
1847 Fuchsia = "fuchsia",
1848 Haiku = "haiku",
1849 HelenOs = "helenos",
1850 Hermit = "hermit",
1851 Horizon = "horizon",
1852 Hurd = "hurd",
1853 Illumos = "illumos",
1854 IOs = "ios",
1855 L4Re = "l4re",
1856 Linux = "linux",
1857 LynxOs178 = "lynxos178",
1858 MacOs = "macos",
1859 Managarm = "managarm",
1860 Motor = "motor",
1861 NetBsd = "netbsd",
1862 None = "none",
1863 Nto = "nto",
1864 NuttX = "nuttx",
1865 OpenBsd = "openbsd",
1866 Ps3 = "ps3",
1867 Psp = "psp",
1868 Psx = "psx",
1869 Qnx = "qnx",
1870 Qurt = "qurt",
1871 Redox = "redox",
1872 Rtems = "rtems",
1873 Solaris = "solaris",
1874 SolidAsp3 = "solid_asp3",
1875 TeeOs = "teeos",
1876 Trusty = "trusty",
1877 TvOs = "tvos",
1878 Uefi = "uefi",
1879 VexOs = "vexos",
1880 VisionOs = "visionos",
1881 Vita = "vita",
1882 VxWorks = "vxworks",
1883 Wasi = "wasi",
1884 WatchOs = "watchos",
1885 Windows = "windows",
1886 Xous = "xous",
1887 Zkvm = "zkvm",
1888 Unknown = "unknown",
1889 }
1890 other_variant = Other;
1891}
1892
1893impl Os {
1894 pub fn desc_symbol(&self) -> Symbol {
1895 Symbol::intern(self.desc())
1896 }
1897}
1898
1899pub enum Env {
Gnu,
MacAbi,
Mlibc,
Msvc,
Musl,
Newlib,
Nto70,
Nto71,
Nto71IoSock,
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::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_fields_are_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::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> {
::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
}
}
#[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,
"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::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! {
1900 pub enum Env {
1901 Gnu = "gnu",
1902 MacAbi = "macabi",
1903 Mlibc = "mlibc",
1904 Msvc = "msvc",
1905 Musl = "musl",
1906 Newlib = "newlib",
1907 Nto70 = "nto70",
1908 Nto71 = "nto71",
1909 Nto71IoSock = "nto71_iosock",
1910 Ohos = "ohos",
1911 Relibc = "relibc",
1912 Sgx = "sgx",
1913 Sim = "sim",
1914 P1 = "p1",
1915 P2 = "p2",
1916 P3 = "p3",
1917 Uclibc = "uclibc",
1918 V5 = "v5",
1919 Unspecified = "",
1920 }
1921 other_variant = Other;
1922}
1923
1924impl Env {
1925 pub fn desc_symbol(&self) -> Symbol {
1926 Symbol::intern(self.desc())
1927 }
1928}
1929
1930#[doc = r" An enum representing possible values for `cfg(target_abi)`."]
#[doc =
r" This field is not forwarded to LLVM so it does not by itself affect codegen."]
#[doc = r" See the `cfg_abi` field of [`TargetOptions`] for more details."]
pub enum CfgAbi {
Abi64,
AbiV2,
AbiV2Hf,
Eabi,
EabiHf,
ElfV1,
ElfV2,
Fortanix,
Ilp32,
Ilp32e,
Llvm,
MacAbi,
Pauthtest,
Sim,
SoftFloat,
Spe,
Uwp,
VecDefault,
VecExtAbi,
X32,
V8Plus,
Unspecified,
Other(crate::spec::StaticCow<str>),
}
#[automatically_derived]
impl ::core::clone::Clone for CfgAbi {
#[inline]
fn clone(&self) -> CfgAbi {
match self {
CfgAbi::Abi64 => CfgAbi::Abi64,
CfgAbi::AbiV2 => CfgAbi::AbiV2,
CfgAbi::AbiV2Hf => CfgAbi::AbiV2Hf,
CfgAbi::Eabi => CfgAbi::Eabi,
CfgAbi::EabiHf => CfgAbi::EabiHf,
CfgAbi::ElfV1 => CfgAbi::ElfV1,
CfgAbi::ElfV2 => CfgAbi::ElfV2,
CfgAbi::Fortanix => CfgAbi::Fortanix,
CfgAbi::Ilp32 => CfgAbi::Ilp32,
CfgAbi::Ilp32e => CfgAbi::Ilp32e,
CfgAbi::Llvm => CfgAbi::Llvm,
CfgAbi::MacAbi => CfgAbi::MacAbi,
CfgAbi::Pauthtest => CfgAbi::Pauthtest,
CfgAbi::Sim => CfgAbi::Sim,
CfgAbi::SoftFloat => CfgAbi::SoftFloat,
CfgAbi::Spe => CfgAbi::Spe,
CfgAbi::Uwp => CfgAbi::Uwp,
CfgAbi::VecDefault => CfgAbi::VecDefault,
CfgAbi::VecExtAbi => CfgAbi::VecExtAbi,
CfgAbi::X32 => CfgAbi::X32,
CfgAbi::V8Plus => CfgAbi::V8Plus,
CfgAbi::Unspecified => CfgAbi::Unspecified,
CfgAbi::Other(__self_0) =>
CfgAbi::Other(::core::clone::Clone::clone(__self_0)),
}
}
}
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for CfgAbi { }
#[automatically_derived]
impl ::core::cmp::PartialEq for CfgAbi {
#[inline]
fn eq(&self, other: &CfgAbi) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(CfgAbi::Other(__self_0), CfgAbi::Other(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}
#[automatically_derived]
impl ::core::cmp::Eq for CfgAbi {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<crate::spec::StaticCow<str>>;
}
}
#[automatically_derived]
impl ::core::hash::Hash for CfgAbi {
#[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 {
CfgAbi::Other(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}
#[automatically_derived]
impl ::core::fmt::Debug for CfgAbi {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
CfgAbi::Abi64 => ::core::fmt::Formatter::write_str(f, "Abi64"),
CfgAbi::AbiV2 => ::core::fmt::Formatter::write_str(f, "AbiV2"),
CfgAbi::AbiV2Hf =>
::core::fmt::Formatter::write_str(f, "AbiV2Hf"),
CfgAbi::Eabi => ::core::fmt::Formatter::write_str(f, "Eabi"),
CfgAbi::EabiHf => ::core::fmt::Formatter::write_str(f, "EabiHf"),
CfgAbi::ElfV1 => ::core::fmt::Formatter::write_str(f, "ElfV1"),
CfgAbi::ElfV2 => ::core::fmt::Formatter::write_str(f, "ElfV2"),
CfgAbi::Fortanix =>
::core::fmt::Formatter::write_str(f, "Fortanix"),
CfgAbi::Ilp32 => ::core::fmt::Formatter::write_str(f, "Ilp32"),
CfgAbi::Ilp32e => ::core::fmt::Formatter::write_str(f, "Ilp32e"),
CfgAbi::Llvm => ::core::fmt::Formatter::write_str(f, "Llvm"),
CfgAbi::MacAbi => ::core::fmt::Formatter::write_str(f, "MacAbi"),
CfgAbi::Pauthtest =>
::core::fmt::Formatter::write_str(f, "Pauthtest"),
CfgAbi::Sim => ::core::fmt::Formatter::write_str(f, "Sim"),
CfgAbi::SoftFloat =>
::core::fmt::Formatter::write_str(f, "SoftFloat"),
CfgAbi::Spe => ::core::fmt::Formatter::write_str(f, "Spe"),
CfgAbi::Uwp => ::core::fmt::Formatter::write_str(f, "Uwp"),
CfgAbi::VecDefault =>
::core::fmt::Formatter::write_str(f, "VecDefault"),
CfgAbi::VecExtAbi =>
::core::fmt::Formatter::write_str(f, "VecExtAbi"),
CfgAbi::X32 => ::core::fmt::Formatter::write_str(f, "X32"),
CfgAbi::V8Plus => ::core::fmt::Formatter::write_str(f, "V8Plus"),
CfgAbi::Unspecified =>
::core::fmt::Formatter::write_str(f, "Unspecified"),
CfgAbi::Other(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Other",
&__self_0),
}
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for CfgAbi {
#[inline]
fn partial_cmp(&self, other: &CfgAbi)
-> ::core::option::Option<::core::cmp::Ordering> {
::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
}
}
#[automatically_derived]
impl ::core::cmp::Ord for CfgAbi {
#[inline]
fn cmp(&self, other: &CfgAbi) -> ::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) {
(CfgAbi::Other(__self_0), CfgAbi::Other(__arg1_0)) =>
::core::cmp::Ord::cmp(__self_0, __arg1_0),
_ => ::core::cmp::Ordering::Equal,
},
cmp => cmp,
}
}
}
impl schemars::JsonSchema for CfgAbi {
fn schema_name() -> std::borrow::Cow<'static, str> {
std::borrow::Cow::Borrowed("CfgAbi")
}
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 CfgAbi {
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,
"pauthtest" => Self::Pauthtest,
"sim" => Self::Sim,
"softfloat" => Self::SoftFloat,
"spe" => Self::Spe,
"uwp" => Self::Uwp,
"vec-default" => Self::VecDefault,
"vec-extabi" => Self::VecExtAbi,
"x32" => Self::X32,
"v8plus" => Self::V8Plus,
"" => Self::Unspecified,
_ => Self::Other(s.to_owned().into()),
})
}
}
impl CfgAbi {
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::Pauthtest => "pauthtest",
Self::Sim => "sim",
Self::SoftFloat => "softfloat",
Self::Spe => "spe",
Self::Uwp => "uwp",
Self::VecDefault => "vec-default",
Self::VecExtAbi => "vec-extabi",
Self::X32 => "x32",
Self::V8Plus => "v8plus",
Self::Unspecified => "",
Self::Other(name) => name.as_ref(),
}
}
}
impl crate::json::ToJson for CfgAbi {
fn to_json(&self) -> crate::json::Json { self.desc().to_json() }
}
impl<'de> serde::Deserialize<'de> for CfgAbi {
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 CfgAbi {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.desc())
}
}crate::target_spec_enum! {
1931 pub enum CfgAbi {
1935 Abi64 = "abi64",
1936 AbiV2 = "abiv2",
1937 AbiV2Hf = "abiv2hf",
1938 Eabi = "eabi",
1939 EabiHf = "eabihf",
1940 ElfV1 = "elfv1",
1941 ElfV2 = "elfv2",
1942 Fortanix = "fortanix",
1943 Ilp32 = "ilp32",
1944 Ilp32e = "ilp32e",
1945 Llvm = "llvm",
1946 MacAbi = "macabi",
1947 Pauthtest = "pauthtest",
1948 Sim = "sim",
1949 SoftFloat = "softfloat",
1950 Spe = "spe",
1951 Uwp = "uwp",
1952 VecDefault = "vec-default",
1953 VecExtAbi = "vec-extabi",
1954 X32 = "x32",
1955 V8Plus = "v8plus",
1956 Unspecified = "",
1957 }
1958 other_variant = Other;
1959}
1960
1961impl CfgAbi {
1962 pub fn desc_symbol(&self) -> Symbol {
1963 Symbol::intern(self.desc())
1964 }
1965}
1966
1967#[doc =
r" An enum representing possible values for the `llvm_abiname` field of [`TargetOptions`]."]
#[doc =
r" This field is used by LLVM on some targets to control which ABI to use."]
pub enum LlvmAbi {
Ilp32,
Ilp32f,
Ilp32d,
Ilp32e,
Ilp32s,
Lp64,
Lp64f,
Lp64d,
Lp64e,
Lp64s,
O32,
N32,
N64,
ElfV1,
ElfV2,
Pauthtest,
Unspecified,
Other(crate::spec::StaticCow<str>),
}
#[automatically_derived]
impl ::core::clone::Clone for LlvmAbi {
#[inline]
fn clone(&self) -> LlvmAbi {
match self {
LlvmAbi::Ilp32 => LlvmAbi::Ilp32,
LlvmAbi::Ilp32f => LlvmAbi::Ilp32f,
LlvmAbi::Ilp32d => LlvmAbi::Ilp32d,
LlvmAbi::Ilp32e => LlvmAbi::Ilp32e,
LlvmAbi::Ilp32s => LlvmAbi::Ilp32s,
LlvmAbi::Lp64 => LlvmAbi::Lp64,
LlvmAbi::Lp64f => LlvmAbi::Lp64f,
LlvmAbi::Lp64d => LlvmAbi::Lp64d,
LlvmAbi::Lp64e => LlvmAbi::Lp64e,
LlvmAbi::Lp64s => LlvmAbi::Lp64s,
LlvmAbi::O32 => LlvmAbi::O32,
LlvmAbi::N32 => LlvmAbi::N32,
LlvmAbi::N64 => LlvmAbi::N64,
LlvmAbi::ElfV1 => LlvmAbi::ElfV1,
LlvmAbi::ElfV2 => LlvmAbi::ElfV2,
LlvmAbi::Pauthtest => LlvmAbi::Pauthtest,
LlvmAbi::Unspecified => LlvmAbi::Unspecified,
LlvmAbi::Other(__self_0) =>
LlvmAbi::Other(::core::clone::Clone::clone(__self_0)),
}
}
}
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for LlvmAbi { }
#[automatically_derived]
impl ::core::cmp::PartialEq for LlvmAbi {
#[inline]
fn eq(&self, other: &LlvmAbi) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(LlvmAbi::Other(__self_0), LlvmAbi::Other(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}
#[automatically_derived]
impl ::core::cmp::Eq for LlvmAbi {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<crate::spec::StaticCow<str>>;
}
}
#[automatically_derived]
impl ::core::hash::Hash for LlvmAbi {
#[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 {
LlvmAbi::Other(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}
#[automatically_derived]
impl ::core::fmt::Debug for LlvmAbi {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
LlvmAbi::Ilp32 => ::core::fmt::Formatter::write_str(f, "Ilp32"),
LlvmAbi::Ilp32f => ::core::fmt::Formatter::write_str(f, "Ilp32f"),
LlvmAbi::Ilp32d => ::core::fmt::Formatter::write_str(f, "Ilp32d"),
LlvmAbi::Ilp32e => ::core::fmt::Formatter::write_str(f, "Ilp32e"),
LlvmAbi::Ilp32s => ::core::fmt::Formatter::write_str(f, "Ilp32s"),
LlvmAbi::Lp64 => ::core::fmt::Formatter::write_str(f, "Lp64"),
LlvmAbi::Lp64f => ::core::fmt::Formatter::write_str(f, "Lp64f"),
LlvmAbi::Lp64d => ::core::fmt::Formatter::write_str(f, "Lp64d"),
LlvmAbi::Lp64e => ::core::fmt::Formatter::write_str(f, "Lp64e"),
LlvmAbi::Lp64s => ::core::fmt::Formatter::write_str(f, "Lp64s"),
LlvmAbi::O32 => ::core::fmt::Formatter::write_str(f, "O32"),
LlvmAbi::N32 => ::core::fmt::Formatter::write_str(f, "N32"),
LlvmAbi::N64 => ::core::fmt::Formatter::write_str(f, "N64"),
LlvmAbi::ElfV1 => ::core::fmt::Formatter::write_str(f, "ElfV1"),
LlvmAbi::ElfV2 => ::core::fmt::Formatter::write_str(f, "ElfV2"),
LlvmAbi::Pauthtest =>
::core::fmt::Formatter::write_str(f, "Pauthtest"),
LlvmAbi::Unspecified =>
::core::fmt::Formatter::write_str(f, "Unspecified"),
LlvmAbi::Other(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Other",
&__self_0),
}
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for LlvmAbi {
#[inline]
fn partial_cmp(&self, other: &LlvmAbi)
-> ::core::option::Option<::core::cmp::Ordering> {
::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
}
}
#[automatically_derived]
impl ::core::cmp::Ord for LlvmAbi {
#[inline]
fn cmp(&self, other: &LlvmAbi) -> ::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) {
(LlvmAbi::Other(__self_0), LlvmAbi::Other(__arg1_0)) =>
::core::cmp::Ord::cmp(__self_0, __arg1_0),
_ => ::core::cmp::Ordering::Equal,
},
cmp => cmp,
}
}
}
impl schemars::JsonSchema for LlvmAbi {
fn schema_name() -> std::borrow::Cow<'static, str> {
std::borrow::Cow::Borrowed("LlvmAbi")
}
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 LlvmAbi {
type Err = core::convert::Infallible;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"ilp32" => Self::Ilp32,
"ilp32f" => Self::Ilp32f,
"ilp32d" => Self::Ilp32d,
"ilp32e" => Self::Ilp32e,
"ilp32s" => Self::Ilp32s,
"lp64" => Self::Lp64,
"lp64f" => Self::Lp64f,
"lp64d" => Self::Lp64d,
"lp64e" => Self::Lp64e,
"lp64s" => Self::Lp64s,
"o32" => Self::O32,
"n32" => Self::N32,
"n64" => Self::N64,
"elfv1" => Self::ElfV1,
"elfv2" => Self::ElfV2,
"pauthtest" => Self::Pauthtest,
"" => Self::Unspecified,
_ => Self::Other(s.to_owned().into()),
})
}
}
impl LlvmAbi {
pub fn desc(&self) -> &str {
match self {
Self::Ilp32 => "ilp32",
Self::Ilp32f => "ilp32f",
Self::Ilp32d => "ilp32d",
Self::Ilp32e => "ilp32e",
Self::Ilp32s => "ilp32s",
Self::Lp64 => "lp64",
Self::Lp64f => "lp64f",
Self::Lp64d => "lp64d",
Self::Lp64e => "lp64e",
Self::Lp64s => "lp64s",
Self::O32 => "o32",
Self::N32 => "n32",
Self::N64 => "n64",
Self::ElfV1 => "elfv1",
Self::ElfV2 => "elfv2",
Self::Pauthtest => "pauthtest",
Self::Unspecified => "",
Self::Other(name) => name.as_ref(),
}
}
}
impl crate::json::ToJson for LlvmAbi {
fn to_json(&self) -> crate::json::Json { self.desc().to_json() }
}
impl<'de> serde::Deserialize<'de> for LlvmAbi {
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 LlvmAbi {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.desc())
}
}crate::target_spec_enum! {
1968 pub enum LlvmAbi {
1971 Ilp32 = "ilp32",
1973 Ilp32f = "ilp32f",
1974 Ilp32d = "ilp32d",
1975 Ilp32e = "ilp32e",
1976 Ilp32s = "ilp32s",
1977 Lp64 = "lp64",
1978 Lp64f = "lp64f",
1979 Lp64d = "lp64d",
1980 Lp64e = "lp64e",
1981 Lp64s = "lp64s",
1982 O32 = "o32",
1984 N32 = "n32",
1985 N64 = "n64",
1986 ElfV1 = "elfv1",
1988 ElfV2 = "elfv2",
1989 Pauthtest = "pauthtest",
1991
1992 Unspecified = "",
1993 }
1994 other_variant = Other;
1995}
1996
1997#[derive(#[automatically_derived]
impl ::core::marker::StructuralPartialEq for Target { }
#[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)]
2001pub struct Target {
2002 pub llvm_target: StaticCow<str>,
2009 pub metadata: TargetMetadata,
2012 pub pointer_width: u16,
2014 pub arch: Arch,
2017 pub data_layout: StaticCow<str>,
2019 pub options: TargetOptions,
2021}
2022
2023#[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::marker::StructuralPartialEq for TargetMetadata { }
#[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)]
2027pub struct TargetMetadata {
2028 pub description: Option<StaticCow<str>>,
2031 pub tier: Option<u64>,
2033 pub host_tools: Option<bool>,
2035 pub std: Option<bool>,
2038}
2039
2040impl Target {
2041 pub fn parse_data_layout(&self) -> Result<TargetDataLayout, TargetDataLayoutError<'_>> {
2042 let mut dl = TargetDataLayout::parse_from_llvm_datalayout_string(
2043 &self.data_layout,
2044 self.options.default_address_space,
2045 )?;
2046
2047 if dl.endian != self.endian {
2049 return Err(TargetDataLayoutError::InconsistentTargetArchitecture {
2050 dl: dl.endian.as_str(),
2051 target: self.endian.as_str(),
2052 });
2053 }
2054
2055 let target_pointer_width: u64 = self.pointer_width.into();
2056 let dl_pointer_size: u64 = dl.pointer_size().bits();
2057 if dl_pointer_size != target_pointer_width {
2058 return Err(TargetDataLayoutError::InconsistentTargetPointerWidth {
2059 pointer_size: dl_pointer_size,
2060 target: self.pointer_width,
2061 });
2062 }
2063
2064 dl.c_enum_min_size = Integer::from_size(Size::from_bits(
2065 self.c_enum_min_bits.unwrap_or(self.c_int_width as _),
2066 ))
2067 .map_err(|err| TargetDataLayoutError::InvalidBitsSize { err })?;
2068
2069 Ok(dl)
2070 }
2071
2072 pub fn supports_c_variadic_definitions(&self) -> CVariadicStatus {
2073 use Arch::*;
2074
2075 match self.arch {
2076 Bpf | SpirV => CVariadicStatus::NotSupported,
2078
2079 RiscV32 if self.llvm_abiname == LlvmAbi::Ilp32e => {
2087 CVariadicStatus::Unstable { feature: sym::c_variadic_experimental_arch }
2088 }
2089
2090 Other(_) => CVariadicStatus::Unstable { feature: sym::c_variadic_experimental_arch },
2093
2094 Sparc | Avr | M68k | Msp430 => {
2114 CVariadicStatus::Unstable { feature: sym::c_variadic_experimental_arch }
2115 }
2116
2117 AArch64 | AmdGpu | Arm | Arm64EC | CSky | Hexagon | LoongArch32 | LoongArch64
2118 | Mips | Mips32r6 | Mips64 | Mips64r6 | Nvptx64 | PowerPC | PowerPC64 | RiscV32
2119 | RiscV64 | S390x | Sparc64 | Wasm32 | Wasm64 | X86 | X86_64 | Xtensa => {
2120 CVariadicStatus::Stable
2121 }
2122 }
2123 }
2124
2125 pub fn singlethread(&self, target_features: &FxIndexSet<Symbol>) -> bool {
2130 if self.singlethread && self.is_like_wasm && target_features.contains(&sym::atomics) {
2139 return false;
2140 }
2141
2142 self.singlethread
2143 }
2144}
2145
2146pub trait HasTargetSpec {
2147 fn target_spec(&self) -> &Target;
2148}
2149
2150impl HasTargetSpec for Target {
2151 #[inline]
2152 fn target_spec(&self) -> &Target {
2153 self
2154 }
2155}
2156
2157#[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]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for X86Abi { }
#[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::marker::StructuralPartialEq for X86Abi { }
#[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_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<Option<u32>>;
let _: ::core::cmp::AssertParamIsEq<bool>;
}
}Eq)]
2159pub struct X86Abi {
2160 pub regparm: Option<u32>,
2163 pub reg_struct_return: bool,
2165}
2166
2167pub trait HasX86AbiOpt {
2168 fn x86_abi_opt(&self) -> X86Abi;
2169}
2170
2171type StaticCow<T> = Cow<'static, T>;
2172
2173#[derive(#[automatically_derived]
impl ::core::marker::StructuralPartialEq for TargetOptions { }
#[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.requires_consistent_cpu ==
other.requires_consistent_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.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_fentry == other.supports_fentry &&
self.supports_xray == other.supports_xray &&
self.endian == other.endian && self.os == other.os &&
self.env == other.env && self.cfg_abi == other.cfg_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.unsupported_cpus == other.unsupported_cpus &&
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),
cfg_abi: ::core::clone::Clone::clone(&self.cfg_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),
requires_consistent_cpu: ::core::clone::Clone::clone(&self.requires_consistent_cpu),
unsupported_cpus: ::core::clone::Clone::clone(&self.unsupported_cpus),
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),
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_fentry: ::core::clone::Clone::clone(&self.supports_fentry),
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", "cfg_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",
"requires_consistent_cpu", "unsupported_cpus", "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",
"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_fentry", "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.cfg_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.requires_consistent_cpu, &self.unsupported_cpus,
&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.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_fentry, &self.supports_xray,
&self.default_address_space,
&&self.small_data_threshold_support];
::core::fmt::Formatter::debug_struct_fields_finish(f, "TargetOptions",
names, values)
}
}Debug)]
2182#[rustc_lint_opt_ty]
2183pub struct TargetOptions {
2184 pub endian: Endian,
2186 pub c_int_width: u16,
2188 pub os: Os,
2193 pub env: Env,
2195 pub cfg_abi: CfgAbi,
2207 #[rustc_lint_opt_deny_field_access(
2209 "use `Target::is_like_*` instead of this field; see https://github.com/rust-lang/rust/issues/100343 for rationale"
2210 )]
2211 vendor: StaticCow<str>,
2212
2213 pub linker: Option<StaticCow<str>>,
2215 pub linker_flavor: LinkerFlavor,
2218 linker_flavor_json: LinkerFlavorCli,
2219 lld_flavor_json: LldFlavor,
2220 linker_is_gnu_json: bool,
2221
2222 pub pre_link_objects: CrtObjects,
2224 pub post_link_objects: CrtObjects,
2225 pub pre_link_objects_self_contained: CrtObjects,
2227 pub post_link_objects_self_contained: CrtObjects,
2228 pub link_self_contained: LinkSelfContainedDefault,
2231
2232 pub pre_link_args: LinkArgs,
2234 pre_link_args_json: LinkArgsCli,
2235 pub late_link_args: LinkArgs,
2239 late_link_args_json: LinkArgsCli,
2240 pub late_link_args_dynamic: LinkArgs,
2243 late_link_args_dynamic_json: LinkArgsCli,
2244 pub late_link_args_static: LinkArgs,
2247 late_link_args_static_json: LinkArgsCli,
2248 pub post_link_args: LinkArgs,
2251 post_link_args_json: LinkArgsCli,
2252
2253 pub link_script: Option<StaticCow<str>>,
2257 pub link_env: StaticCow<[(StaticCow<str>, StaticCow<str>)]>,
2259 pub link_env_remove: StaticCow<[StaticCow<str>]>,
2261
2262 pub asm_args: StaticCow<[StaticCow<str>]>,
2264
2265 pub cpu: StaticCow<str>,
2268 pub need_explicit_cpu: bool,
2271 pub requires_consistent_cpu: bool,
2275 pub unsupported_cpus: StaticCow<[StaticCow<str>]>,
2279 pub features: StaticCow<str>,
2288 pub direct_access_external_data: Option<bool>,
2290 pub dynamic_linking: bool,
2292 pub dll_tls_export: bool,
2294 pub only_cdylib: bool,
2296 pub executables: bool,
2298 pub relocation_model: RelocModel,
2301 pub code_model: Option<CodeModel>,
2304 pub tls_model: TlsModel,
2307 pub disable_redzone: bool,
2309 pub frame_pointer: FramePointer,
2311 pub function_sections: bool,
2313 pub dll_prefix: StaticCow<str>,
2315 pub dll_suffix: StaticCow<str>,
2317 pub exe_suffix: StaticCow<str>,
2319 pub staticlib_prefix: StaticCow<str>,
2321 pub staticlib_suffix: StaticCow<str>,
2323 pub families: StaticCow<[StaticCow<str>]>,
2329 pub abi_return_struct_as_int: bool,
2331 pub is_like_aix: bool,
2334 pub is_like_darwin: bool,
2339 pub is_like_gpu: bool,
2341 pub is_like_solaris: bool,
2345 pub is_like_windows: bool,
2353 pub is_like_msvc: bool,
2363 pub is_like_wasm: bool,
2365 pub is_like_android: bool,
2367 pub is_like_vexos: bool,
2369 pub binary_format: BinaryFormat,
2371 pub default_dwarf_version: u32,
2374 pub has_rpath: bool,
2376 pub no_default_libraries: bool,
2379 pub position_independent_executables: bool,
2385 pub static_position_independent_executables: bool,
2387 pub plt_by_default: bool,
2390 pub relro_level: RelroLevel,
2394 pub archive_format: StaticCow<str>,
2399 pub allow_asm: bool,
2401 pub static_initializer_must_be_acyclic: bool,
2404 pub main_needs_argc_argv: bool,
2407
2408 pub has_thread_local: bool,
2410 pub obj_is_bitcode: bool,
2414
2415 pub min_atomic_width: Option<u64>,
2417
2418 pub max_atomic_width: Option<u64>,
2420
2421 pub atomic_cas: bool,
2423
2424 pub panic_strategy: PanicStrategy,
2426
2427 pub crt_static_allows_dylibs: bool,
2429 pub crt_static_default: bool,
2431 pub crt_static_respected: bool,
2433
2434 pub stack_probes: StackProbeType,
2436
2437 pub min_global_align: Option<Align>,
2439
2440 pub default_codegen_units: Option<u64>,
2442
2443 pub default_codegen_backend: Option<StaticCow<str>>,
2453
2454 pub trap_unreachable: bool,
2457
2458 pub requires_lto: bool,
2461
2462 singlethread: bool,
2465
2466 pub no_builtins: bool,
2469
2470 pub default_visibility: Option<SymbolVisibility>,
2476
2477 pub emit_debug_gdb_scripts: bool,
2479
2480 pub requires_uwtable: bool,
2484
2485 pub default_uwtable: bool,
2488
2489 pub simd_types_indirect: bool,
2494
2495 pub limit_rdylib_exports: bool,
2497
2498 pub override_export_symbols: Option<StaticCow<[StaticCow<str>]>>,
2501
2502 pub merge_functions: MergeFunctions,
2509
2510 pub mcount: StaticCow<str>,
2512
2513 pub llvm_mcount_intrinsic: Option<StaticCow<str>>,
2515
2516 pub llvm_abiname: LlvmAbi,
2519
2520 pub llvm_floatabi: Option<FloatAbi>,
2527
2528 pub rustc_abi: Option<RustcAbi>,
2532
2533 pub relax_elf_relocations: bool,
2535
2536 pub llvm_args: StaticCow<[StaticCow<str>]>,
2538
2539 pub use_ctors_section: bool,
2542
2543 pub eh_frame_header: bool,
2547
2548 pub has_thumb_interworking: bool,
2551
2552 pub debuginfo_kind: DebuginfoKind,
2554 pub split_debuginfo: SplitDebuginfo,
2557 pub supported_split_debuginfo: StaticCow<[SplitDebuginfo]>,
2559
2560 pub supported_sanitizers: SanitizerSet,
2566
2567 pub default_sanitizers: SanitizerSet,
2573
2574 pub c_enum_min_bits: Option<u64>,
2576
2577 pub generate_arange_section: bool,
2579
2580 pub supports_stack_protector: bool,
2583
2584 pub entry_name: StaticCow<str>,
2587
2588 pub entry_abi: CanonAbi,
2591
2592 pub supports_fentry: bool,
2594
2595 pub supports_xray: bool,
2597
2598 pub default_address_space: rustc_abi::AddressSpace,
2602
2603 small_data_threshold_support: SmallDataThresholdSupport,
2605}
2606
2607fn add_link_args_iter(
2610 link_args: &mut LinkArgs,
2611 flavor: LinkerFlavor,
2612 args: impl Iterator<Item = StaticCow<str>> + Clone,
2613) {
2614 let mut insert = |flavor| link_args.entry(flavor).or_default().extend(args.clone());
2615 insert(flavor);
2616 match flavor {
2617 LinkerFlavor::Gnu(cc, lld) => {
2618 {
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);
2619 insert(LinkerFlavor::Gnu(cc, Lld::Yes));
2620 }
2621 LinkerFlavor::Darwin(cc, lld) => {
2622 {
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);
2623 insert(LinkerFlavor::Darwin(cc, Lld::Yes));
2624 }
2625 LinkerFlavor::Msvc(lld) => {
2626 {
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);
2627 insert(LinkerFlavor::Msvc(Lld::Yes));
2628 }
2629 LinkerFlavor::WasmLld(..)
2630 | LinkerFlavor::Unix(..)
2631 | LinkerFlavor::EmCc
2632 | LinkerFlavor::Bpf
2633 | LinkerFlavor::Llbc => {}
2634 }
2635}
2636
2637fn add_link_args(link_args: &mut LinkArgs, flavor: LinkerFlavor, args: &[&'static str]) {
2638 add_link_args_iter(link_args, flavor, args.iter().copied().map(Cow::Borrowed))
2639}
2640
2641impl TargetOptions {
2642 pub fn supports_comdat(&self) -> bool {
2643 !self.is_like_aix && !self.is_like_darwin
2645 }
2646
2647 pub fn uses_pdb_debuginfo(&self) -> bool {
2648 self.debuginfo_kind == DebuginfoKind::Pdb
2649 }
2650}
2651
2652impl TargetOptions {
2653 fn link_args(flavor: LinkerFlavor, args: &[&'static str]) -> LinkArgs {
2654 let mut link_args = LinkArgs::new();
2655 add_link_args(&mut link_args, flavor, args);
2656 link_args
2657 }
2658
2659 fn add_pre_link_args(&mut self, flavor: LinkerFlavor, args: &[&'static str]) {
2660 add_link_args(&mut self.pre_link_args, flavor, args);
2661 }
2662
2663 fn update_from_cli(&mut self) {
2664 self.linker_flavor = LinkerFlavor::from_cli_json(
2665 self.linker_flavor_json,
2666 self.lld_flavor_json,
2667 self.linker_is_gnu_json,
2668 );
2669 for (args, args_json) in [
2670 (&mut self.pre_link_args, &self.pre_link_args_json),
2671 (&mut self.late_link_args, &self.late_link_args_json),
2672 (&mut self.late_link_args_dynamic, &self.late_link_args_dynamic_json),
2673 (&mut self.late_link_args_static, &self.late_link_args_static_json),
2674 (&mut self.post_link_args, &self.post_link_args_json),
2675 ] {
2676 args.clear();
2677 for (flavor, args_json) in args_json {
2678 let linker_flavor = self.linker_flavor.with_cli_hints(*flavor);
2679 let linker_flavor = match linker_flavor {
2681 LinkerFlavor::Gnu(cc, _) => LinkerFlavor::Gnu(cc, Lld::No),
2682 LinkerFlavor::Darwin(cc, _) => LinkerFlavor::Darwin(cc, Lld::No),
2683 LinkerFlavor::Msvc(_) => LinkerFlavor::Msvc(Lld::No),
2684 _ => linker_flavor,
2685 };
2686 if !args.contains_key(&linker_flavor) {
2687 add_link_args_iter(args, linker_flavor, args_json.iter().cloned());
2688 }
2689 }
2690 }
2691 }
2692
2693 fn update_to_cli(&mut self) {
2694 self.linker_flavor_json = self.linker_flavor.to_cli_counterpart();
2695 self.lld_flavor_json = self.linker_flavor.lld_flavor();
2696 self.linker_is_gnu_json = self.linker_flavor.is_gnu();
2697 for (args, args_json) in [
2698 (&self.pre_link_args, &mut self.pre_link_args_json),
2699 (&self.late_link_args, &mut self.late_link_args_json),
2700 (&self.late_link_args_dynamic, &mut self.late_link_args_dynamic_json),
2701 (&self.late_link_args_static, &mut self.late_link_args_static_json),
2702 (&self.post_link_args, &mut self.post_link_args_json),
2703 ] {
2704 *args_json = args
2705 .iter()
2706 .map(|(flavor, args)| (flavor.to_cli_counterpart(), args.clone()))
2707 .collect();
2708 }
2709 }
2710}
2711
2712impl Default for TargetOptions {
2713 fn default() -> TargetOptions {
2716 TargetOptions {
2717 endian: Endian::Little,
2718 c_int_width: 32,
2719 os: Os::None,
2720 env: Env::Unspecified,
2721 cfg_abi: CfgAbi::Unspecified,
2722 vendor: "unknown".into(),
2723 linker: ::core::option::Option::None::<&'static str>option_env!("CFG_DEFAULT_LINKER").map(|s| s.into()),
2724 linker_flavor: LinkerFlavor::Gnu(Cc::Yes, Lld::No),
2725 linker_flavor_json: LinkerFlavorCli::Gcc,
2726 lld_flavor_json: LldFlavor::Ld,
2727 linker_is_gnu_json: true,
2728 link_script: None,
2729 asm_args: ::std::borrow::Cow::Borrowed(&[])cvs![],
2730 cpu: "generic".into(),
2731 need_explicit_cpu: false,
2732 requires_consistent_cpu: false,
2733 unsupported_cpus: ::std::borrow::Cow::Borrowed(&[])cvs![],
2734 features: "".into(),
2735 direct_access_external_data: None,
2736 dynamic_linking: false,
2737 dll_tls_export: true,
2738 only_cdylib: false,
2739 executables: true,
2740 relocation_model: RelocModel::Pic,
2741 code_model: None,
2742 tls_model: TlsModel::GeneralDynamic,
2743 disable_redzone: false,
2744 frame_pointer: FramePointer::MayOmit,
2745 function_sections: true,
2746 dll_prefix: "lib".into(),
2747 dll_suffix: ".so".into(),
2748 exe_suffix: "".into(),
2749 staticlib_prefix: "lib".into(),
2750 staticlib_suffix: ".a".into(),
2751 families: ::std::borrow::Cow::Borrowed(&[])cvs![],
2752 abi_return_struct_as_int: false,
2753 is_like_aix: false,
2754 is_like_darwin: false,
2755 is_like_gpu: false,
2756 is_like_solaris: false,
2757 is_like_windows: false,
2758 is_like_msvc: false,
2759 is_like_wasm: false,
2760 is_like_android: false,
2761 is_like_vexos: false,
2762 binary_format: BinaryFormat::Elf,
2763 default_dwarf_version: 4,
2764 has_rpath: false,
2765 no_default_libraries: true,
2766 position_independent_executables: false,
2767 static_position_independent_executables: false,
2768 plt_by_default: true,
2769 relro_level: RelroLevel::None,
2770 pre_link_objects: Default::default(),
2771 post_link_objects: Default::default(),
2772 pre_link_objects_self_contained: Default::default(),
2773 post_link_objects_self_contained: Default::default(),
2774 link_self_contained: LinkSelfContainedDefault::False,
2775 pre_link_args: LinkArgs::new(),
2776 pre_link_args_json: LinkArgsCli::new(),
2777 late_link_args: LinkArgs::new(),
2778 late_link_args_json: LinkArgsCli::new(),
2779 late_link_args_dynamic: LinkArgs::new(),
2780 late_link_args_dynamic_json: LinkArgsCli::new(),
2781 late_link_args_static: LinkArgs::new(),
2782 late_link_args_static_json: LinkArgsCli::new(),
2783 post_link_args: LinkArgs::new(),
2784 post_link_args_json: LinkArgsCli::new(),
2785 link_env: ::std::borrow::Cow::Borrowed(&[])cvs![],
2786 link_env_remove: ::std::borrow::Cow::Borrowed(&[])cvs![],
2787 archive_format: "gnu".into(),
2788 main_needs_argc_argv: true,
2789 allow_asm: true,
2790 static_initializer_must_be_acyclic: false,
2791 has_thread_local: false,
2792 obj_is_bitcode: false,
2793 min_atomic_width: None,
2794 max_atomic_width: None,
2795 atomic_cas: true,
2796 panic_strategy: PanicStrategy::Unwind,
2797 crt_static_allows_dylibs: false,
2798 crt_static_default: false,
2799 crt_static_respected: false,
2800 stack_probes: StackProbeType::None,
2801 min_global_align: None,
2802 default_codegen_units: None,
2803 default_codegen_backend: None,
2804 trap_unreachable: true,
2805 requires_lto: false,
2806 singlethread: false,
2807 no_builtins: false,
2808 default_visibility: None,
2809 emit_debug_gdb_scripts: true,
2810 requires_uwtable: false,
2811 default_uwtable: false,
2812 simd_types_indirect: true,
2813 limit_rdylib_exports: true,
2814 override_export_symbols: None,
2815 merge_functions: MergeFunctions::Aliases,
2816 mcount: "mcount".into(),
2817 llvm_mcount_intrinsic: None,
2818 llvm_abiname: LlvmAbi::Unspecified,
2819 llvm_floatabi: None,
2820 rustc_abi: None,
2821 relax_elf_relocations: false,
2822 llvm_args: ::std::borrow::Cow::Borrowed(&[])cvs![],
2823 use_ctors_section: false,
2824 eh_frame_header: true,
2825 has_thumb_interworking: false,
2826 debuginfo_kind: Default::default(),
2827 split_debuginfo: Default::default(),
2828 supported_split_debuginfo: Cow::Borrowed(&[SplitDebuginfo::Off]),
2830 supported_sanitizers: SanitizerSet::empty(),
2831 default_sanitizers: SanitizerSet::empty(),
2832 c_enum_min_bits: None,
2833 generate_arange_section: true,
2834 supports_stack_protector: true,
2835 entry_name: "main".into(),
2836 entry_abi: CanonAbi::C,
2837 supports_fentry: false,
2838 supports_xray: false,
2839 default_address_space: rustc_abi::AddressSpace::ZERO,
2840 small_data_threshold_support: SmallDataThresholdSupport::DefaultForArch,
2841 }
2842 }
2843}
2844
2845impl Deref for Target {
2849 type Target = TargetOptions;
2850
2851 #[inline]
2852 fn deref(&self) -> &Self::Target {
2853 &self.options
2854 }
2855}
2856impl DerefMut for Target {
2857 #[inline]
2858 fn deref_mut(&mut self) -> &mut Self::Target {
2859 &mut self.options
2860 }
2861}
2862
2863impl Target {
2864 pub fn is_abi_supported(&self, abi: ExternAbi) -> bool {
2865 let abi_map = AbiMap::from_target(self);
2866 abi_map.canonize_abi(abi, false).is_mapped()
2867 }
2868
2869 pub fn min_atomic_width(&self) -> u64 {
2872 self.min_atomic_width.unwrap_or(8)
2873 }
2874
2875 pub fn max_atomic_width(&self) -> u64 {
2878 self.max_atomic_width.unwrap_or_else(|| self.pointer_width.into())
2879 }
2880
2881 #[cfg(test)]
2883 fn test_target(mut self) {
2884 let recycled_target =
2885 Target::from_json(&serde_json::to_string(&self.to_json()).unwrap()).map(|(j, _)| j);
2886 self.update_to_cli();
2887 self.check_consistency(TargetKind::Builtin)
2888 .unwrap_or_else(|err| panic!("Target consistency check failed:\n{err}"));
2889 assert_eq!(recycled_target, Ok(self));
2890 }
2891
2892 fn can_use_os_unknown(&self) -> bool {
2895 self.llvm_target == "wasm32-unknown-unknown"
2896 || self.llvm_target == "wasm64-unknown-unknown"
2897 || (self.env == Env::Sgx && self.vendor == "fortanix")
2898 }
2899
2900 pub fn expect_builtin(target_tuple: &TargetTuple) -> Target {
2902 match *target_tuple {
2903 TargetTuple::TargetTuple(ref target_tuple) => {
2904 load_builtin(target_tuple).expect("built-in target")
2905 }
2906 TargetTuple::TargetJson { .. } => {
2907 {
::core::panicking::panic_fmt(format_args!("built-in targets doesn\'t support target-paths"));
}panic!("built-in targets doesn't support target-paths")
2908 }
2909 }
2910 }
2911
2912 pub fn builtins() -> impl Iterator<Item = Target> {
2914 load_all_builtins()
2915 }
2916
2917 pub fn search(
2927 target_tuple: &TargetTuple,
2928 sysroot: &Path,
2929 unstable_options: bool,
2930 ) -> Result<(Target, TargetWarnings), String> {
2931 use std::{env, fs};
2932
2933 fn load_file(
2934 path: &Path,
2935 unstable_options: bool,
2936 ) -> Result<(Target, TargetWarnings), String> {
2937 if !unstable_options {
2938 return Err(
2939 "custom targets are unstable and require `-Zunstable-options`".to_string()
2940 );
2941 }
2942 let contents = fs::read_to_string(path).map_err(|e| e.to_string())?;
2943 Target::from_json(&contents)
2944 }
2945
2946 match *target_tuple {
2947 TargetTuple::TargetTuple(ref target_tuple) => {
2948 if let Some(t) = load_builtin(target_tuple) {
2950 return Ok((t, TargetWarnings::empty()));
2951 }
2952
2953 let path = {
2955 let mut target = target_tuple.to_string();
2956 target.push_str(".json");
2957 PathBuf::from(target)
2958 };
2959
2960 let target_path = env::var_os("RUST_TARGET_PATH").unwrap_or_default();
2961
2962 for dir in env::split_paths(&target_path) {
2963 let p = dir.join(&path);
2964 if p.is_file() {
2965 return load_file(&p, unstable_options);
2966 }
2967 }
2968
2969 let rustlib_path = crate::relative_target_rustlib_path(sysroot, target_tuple);
2972 let p = PathBuf::from_iter([
2973 Path::new(sysroot),
2974 Path::new(&rustlib_path),
2975 Path::new("target.json"),
2976 ]);
2977 if p.is_file() {
2978 return load_file(&p, unstable_options);
2979 }
2980
2981 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:?}"))
2982 }
2983 TargetTuple::TargetJson { ref contents, .. } if !unstable_options => {
2984 Err("custom targets are unstable and require `-Zunstable-options`".to_string())
2985 }
2986 TargetTuple::TargetJson { ref contents, .. } => Target::from_json(contents),
2987 }
2988 }
2989
2990 pub fn small_data_threshold_support(&self) -> SmallDataThresholdSupport {
2993 match &self.options.small_data_threshold_support {
2994 SmallDataThresholdSupport::DefaultForArch => match self.arch {
2998 Arch::Mips | Arch::Mips64 | Arch::Mips32r6 => {
2999 SmallDataThresholdSupport::LlvmArg("mips-ssection-threshold".into())
3000 }
3001 Arch::Hexagon => {
3002 SmallDataThresholdSupport::LlvmArg("hexagon-small-data-threshold".into())
3003 }
3004 Arch::M68k => SmallDataThresholdSupport::LlvmArg("m68k-ssection-threshold".into()),
3005 Arch::RiscV32 | Arch::RiscV64 => {
3006 SmallDataThresholdSupport::LlvmModuleFlag("SmallDataLimit".into())
3007 }
3008 _ => SmallDataThresholdSupport::None,
3009 },
3010 s => s.clone(),
3011 }
3012 }
3013
3014 pub fn object_architecture(
3015 &self,
3016 internal_target_features: &FxIndexSet<Symbol>,
3017 ) -> Option<(object::Architecture, Option<object::SubArchitecture>)> {
3018 use object::Architecture;
3019 Some(match self.arch {
3020 Arch::Arm => (Architecture::Arm, None),
3021 Arch::AArch64 => (
3022 if self.pointer_width == 32 {
3023 Architecture::Aarch64_Ilp32
3024 } else {
3025 Architecture::Aarch64
3026 },
3027 None,
3028 ),
3029 Arch::X86 => (Architecture::I386, None),
3030 Arch::S390x => (Architecture::S390x, None),
3031 Arch::M68k => (Architecture::M68k, None),
3032 Arch::Mips | Arch::Mips32r6 => (Architecture::Mips, None),
3033 Arch::Mips64 | Arch::Mips64r6 => (
3034 if self.options.llvm_abiname == LlvmAbi::N32 {
3040 Architecture::Mips64_N32
3041 } else {
3042 Architecture::Mips64
3043 },
3044 None,
3045 ),
3046 Arch::X86_64 => (
3047 if self.pointer_width == 32 {
3048 Architecture::X86_64_X32
3049 } else {
3050 Architecture::X86_64
3051 },
3052 None,
3053 ),
3054 Arch::PowerPC => (Architecture::PowerPc, None),
3055 Arch::PowerPC64 => (Architecture::PowerPc64, None),
3056 Arch::RiscV32 => (Architecture::Riscv32, None),
3057 Arch::RiscV64 => (Architecture::Riscv64, None),
3058 Arch::Sparc => {
3059 if internal_target_features.contains(&sym::v8plus) {
3060 (Architecture::Sparc32Plus, None)
3062 } else {
3063 (Architecture::Sparc, None)
3065 }
3066 }
3067 Arch::Sparc64 => (Architecture::Sparc64, None),
3068 Arch::Avr => (Architecture::Avr, None),
3069 Arch::Msp430 => (Architecture::Msp430, None),
3070 Arch::Hexagon => (Architecture::Hexagon, None),
3071 Arch::Xtensa => (Architecture::Xtensa, None),
3072 Arch::Bpf => (Architecture::Bpf, None),
3073 Arch::LoongArch32 => (Architecture::LoongArch32, None),
3074 Arch::LoongArch64 => (Architecture::LoongArch64, None),
3075 Arch::CSky => (Architecture::Csky, None),
3076 Arch::Arm64EC => (Architecture::Aarch64, Some(object::SubArchitecture::Arm64EC)),
3077 Arch::AmdGpu
3078 | Arch::Nvptx64
3079 | Arch::SpirV
3080 | Arch::Wasm32
3081 | Arch::Wasm64
3082 | Arch::Other(_) => return None,
3083 })
3084 }
3085
3086 pub fn max_reliable_alignment(&self) -> Align {
3095 if self.is_like_windows && self.arch == Arch::X86 {
3099 Align::from_bytes(4).unwrap()
3100 } else {
3101 Align::MAX
3102 }
3103 }
3104
3105 pub fn vendor_symbol(&self) -> Symbol {
3106 Symbol::intern(&self.vendor)
3107 }
3108}