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) -> Self { *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 { }Eq, #[automatically_derived]
impl ::core::cmp::Ord for Cc {
#[inline]
fn cmp(&self, other: &Self) -> ::core::cmp::Ordering {
::core::cmp::Ord::cmp(&::core::intrinsics::discriminant_value(self),
&::core::intrinsics::discriminant_value(other))
}
}Ord, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for Cc { }
#[automatically_derived]
impl ::core::cmp::PartialEq for Cc {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::PartialOrd for Cc {
#[inline]
fn partial_cmp(&self, other: &Self)
-> ::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) -> Self { *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 { }Eq, #[automatically_derived]
impl ::core::cmp::Ord for Lld {
#[inline]
fn cmp(&self, other: &Self) -> ::core::cmp::Ordering {
::core::cmp::Ord::cmp(&::core::intrinsics::discriminant_value(self),
&::core::intrinsics::discriminant_value(other))
}
}Ord, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for Lld { }
#[automatically_derived]
impl ::core::cmp::PartialEq for Lld {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::PartialOrd for Lld {
#[inline]
fn partial_cmp(&self, other: &Self)
-> ::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) -> Self {
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 {
Self::Gnu(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Gnu",
__self_0, &__self_1),
Self::Darwin(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Darwin",
__self_0, &__self_1),
Self::WasmLld(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"WasmLld", &__self_0),
Self::Unix(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Unix",
&__self_0),
Self::Msvc(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Msvc",
&__self_0),
Self::EmCc => ::core::fmt::Formatter::write_str(f, "EmCc"),
Self::Bpf => ::core::fmt::Formatter::write_str(f, "Bpf"),
Self::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: &Self) -> ::core::cmp::Ordering {
match (self, other) {
(Self::Gnu(__self_0, __self_1), Self::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,
},
(Self::Darwin(__self_0, __self_1),
Self::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,
},
(Self::WasmLld(__self_0), Self::WasmLld(__arg1_0)) =>
::core::cmp::Ord::cmp(__self_0, __arg1_0),
(Self::Unix(__self_0), Self::Unix(__arg1_0)) =>
::core::cmp::Ord::cmp(__self_0, __arg1_0),
(Self::Msvc(__self_0), Self::Msvc(__arg1_0)) =>
::core::cmp::Ord::cmp(__self_0, __arg1_0),
_ =>
::core::cmp::Ord::cmp(&::core::intrinsics::discriminant_value(self),
&::core::intrinsics::discriminant_value(other)),
}
}
}Ord, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for LinkerFlavor { }
#[automatically_derived]
impl ::core::cmp::PartialEq for LinkerFlavor {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Gnu(__self_0, __self_1), Self::Gnu(__arg1_0, __arg1_1))
=> __self_0 == __arg1_0 && __self_1 == __arg1_1,
(Self::Darwin(__self_0, __self_1),
Self::Darwin(__arg1_0, __arg1_1)) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1,
(Self::WasmLld(__self_0), Self::WasmLld(__arg1_0)) =>
__self_0 == __arg1_0,
(Self::Unix(__self_0), Self::Unix(__arg1_0)) =>
__self_0 == __arg1_0,
(Self::Msvc(__self_0), Self::Msvc(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::PartialOrd for LinkerFlavor {
#[inline]
fn partial_cmp(&self, other: &Self)
-> ::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) -> Self {
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 {
Self::Gnu(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Gnu",
__self_0, &__self_1),
Self::Darwin(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Darwin",
__self_0, &__self_1),
Self::WasmLld(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"WasmLld", &__self_0),
Self::Unix(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Unix",
&__self_0),
Self::Msvc(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Msvc",
&__self_0),
Self::EmCc => ::core::fmt::Formatter::write_str(f, "EmCc"),
Self::Bpf => ::core::fmt::Formatter::write_str(f, "Bpf"),
Self::Llbc => ::core::fmt::Formatter::write_str(f, "Llbc"),
Self::Gcc => ::core::fmt::Formatter::write_str(f, "Gcc"),
Self::Ld => ::core::fmt::Formatter::write_str(f, "Ld"),
Self::Lld(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Lld",
&__self_0),
Self::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: &Self) -> ::core::cmp::Ordering {
match ::core::cmp::Ord::cmp(&::core::intrinsics::discriminant_value(self),
&::core::intrinsics::discriminant_value(other)) {
::core::cmp::Ordering::Equal =>
match (self, other) {
(Self::Gnu(__self_0, __self_1),
Self::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,
},
(Self::Darwin(__self_0, __self_1),
Self::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,
},
(Self::WasmLld(__self_0), Self::WasmLld(__arg1_0)) =>
::core::cmp::Ord::cmp(__self_0, __arg1_0),
(Self::Unix(__self_0), Self::Unix(__arg1_0)) =>
::core::cmp::Ord::cmp(__self_0, __arg1_0),
(Self::Msvc(__self_0), Self::Msvc(__arg1_0)) =>
::core::cmp::Ord::cmp(__self_0, __arg1_0),
(Self::Lld(__self_0), Self::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: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Gnu(__self_0, __self_1), Self::Gnu(__arg1_0, __arg1_1))
=> __self_0 == __arg1_0 && __self_1 == __arg1_1,
(Self::Darwin(__self_0, __self_1),
Self::Darwin(__arg1_0, __arg1_1)) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1,
(Self::WasmLld(__self_0), Self::WasmLld(__arg1_0)) =>
__self_0 == __arg1_0,
(Self::Unix(__self_0), Self::Unix(__arg1_0)) =>
__self_0 == __arg1_0,
(Self::Msvc(__self_0), Self::Msvc(__arg1_0)) =>
__self_0 == __arg1_0,
(Self::Lld(__self_0), Self::Lld(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::PartialOrd for LinkerFlavorCli {
#[inline]
fn partial_cmp(&self, other: &Self)
-> ::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) -> Self { *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: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}
#[automatically_derived]
impl ::core::cmp::Eq for LldFlavor { }
#[automatically_derived]
impl ::core::hash::Hash for LldFlavor {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
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: &Self)
-> ::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: &Self) -> ::core::cmp::Ordering {
::core::cmp::Ord::cmp(&::core::intrinsics::discriminant_value(self),
&::core::intrinsics::discriminant_value(other))
}
}
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) -> Self {
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: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::WithComponents(__self_0),
Self::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 {
Self::True => ::core::fmt::Formatter::write_str(f, "True"),
Self::False => ::core::fmt::Formatter::write_str(f, "False"),
Self::InferredForMusl =>
::core::fmt::Formatter::write_str(f, "InferredForMusl"),
Self::InferredForMingw =>
::core::fmt::Formatter::write_str(f, "InferredForMingw"),
Self::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) -> Self {
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: &Self) -> 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() -> Self { Self(::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) -> Self {
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: &Self) -> 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: &Self)
-> ::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: &Self) -> ::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) -> Self {
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: &Self) -> 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() -> Self { Self(::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) -> Self {
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: &Self) -> 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: &Self)
-> ::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: &Self) -> ::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) -> Self { *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: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}
#[automatically_derived]
impl ::core::cmp::Eq for PanicStrategy { }
#[automatically_derived]
impl ::core::hash::Hash for PanicStrategy {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
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: &Self)
-> ::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: &Self) -> ::core::cmp::Ordering {
::core::cmp::Ord::cmp(&::core::intrinsics::discriminant_value(self),
&::core::intrinsics::discriminant_value(other))
}
}
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) -> Self { *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: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for OnBrokenPipe {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
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) -> Self { *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: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}
#[automatically_derived]
impl ::core::cmp::Eq for RelroLevel { }
#[automatically_derived]
impl ::core::hash::Hash for RelroLevel {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
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: &Self)
-> ::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: &Self) -> ::core::cmp::Ordering {
::core::cmp::Ord::cmp(&::core::intrinsics::discriminant_value(self),
&::core::intrinsics::discriminant_value(other))
}
}
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) -> Self { *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: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}
#[automatically_derived]
impl ::core::cmp::Eq for SymbolVisibility { }
#[automatically_derived]
impl ::core::hash::Hash for SymbolVisibility {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
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: &Self)
-> ::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: &Self) -> ::core::cmp::Ordering {
::core::cmp::Ord::cmp(&::core::intrinsics::discriminant_value(self),
&::core::intrinsics::discriminant_value(other))
}
}
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) -> Self {
match self {
Self::None => Self::None,
Self::DefaultForArch => Self::DefaultForArch,
Self::LlvmModuleFlag(__self_0) =>
Self::LlvmModuleFlag(::core::clone::Clone::clone(__self_0)),
Self::LlvmArg(__self_0) =>
Self::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 {
Self::None => ::core::fmt::Formatter::write_str(f, "None"),
Self::DefaultForArch =>
::core::fmt::Formatter::write_str(f, "DefaultForArch"),
Self::LlvmModuleFlag(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"LlvmModuleFlag", &__self_0),
Self::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: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::LlvmModuleFlag(__self_0),
Self::LlvmModuleFlag(__arg1_0)) => __self_0 == __arg1_0,
(Self::LlvmArg(__self_0), Self::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) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state);
match self {
Self::LlvmModuleFlag(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
Self::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 {
#[doc = r" Disable function merging entirely."]
#[serde(rename = "disabled")]
Disabled,
#[doc =
r" Allow function merging via trampolines (i.e., functions can be implemented"]
#[doc =
r" in terms of a jump to an unrelated function with identical behavior), but"]
#[doc = r" not via object-format-level global aliases."]
#[serde(rename = "trampolines")]
Trampolines,
#[doc =
r" (Default) allow function merging via either trampolines or (object format"]
#[doc =
r" level) global aliases. LLVM will normally use global aliases for merging, but"]
#[doc = r" trampolines are also permissible."]
#[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("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("disabled");
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"title",
{
const TITLE: &str =
schemars::_private::get_title_and_description("Disable function merging entirely.").0;
TITLE
});
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"description",
{
const DESCRIPTION: &str =
schemars::_private::get_title_and_description("Disable function merging entirely.").1;
DESCRIPTION
});
schema
}.to_value());
enum_values.push({
let mut schema =
schemars::_private::new_unit_enum_variant("trampolines");
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"title",
{
const TITLE: &str =
schemars::_private::get_title_and_description("Allow function merging via trampolines (i.e., functions can be implemented\nin terms of a jump to an unrelated function with identical behavior), but\nnot via object-format-level global aliases.").0;
TITLE
});
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"description",
{
const DESCRIPTION: &str =
schemars::_private::get_title_and_description("Allow function merging via trampolines (i.e., functions can be implemented\nin terms of a jump to an unrelated function with identical behavior), but\nnot via object-format-level global aliases.").1;
DESCRIPTION
});
schema
}.to_value());
enum_values.push({
let mut schema =
schemars::_private::new_unit_enum_variant("aliases");
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"title",
{
const TITLE: &str =
schemars::_private::get_title_and_description("(Default) allow function merging via either trampolines or (object format\nlevel) global aliases. LLVM will normally use global aliases for merging, but\ntrampolines are also permissible.").0;
TITLE
});
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"description",
{
const DESCRIPTION: &str =
schemars::_private::get_title_and_description("(Default) allow function merging via either trampolines or (object format\nlevel) global aliases. LLVM will normally use global aliases for merging, but\ntrampolines are also permissible.").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 MergeFunctions { }
#[automatically_derived]
impl ::core::clone::Clone for MergeFunctions {
#[inline]
fn clone(&self) -> Self { *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: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}
#[automatically_derived]
impl ::core::cmp::Eq for MergeFunctions { }
#[automatically_derived]
impl ::core::hash::Hash for MergeFunctions {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
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: &Self)
-> ::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: &Self) -> ::core::cmp::Ordering {
::core::cmp::Ord::cmp(&::core::intrinsics::discriminant_value(self),
&::core::intrinsics::discriminant_value(other))
}
}
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",
932 Trampolines = "trampolines",
936 Aliases = "aliases",
940 }
941
942 parse_error_type = "value for merge-functions";
943}
944
945pub 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) -> Self { *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: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}
#[automatically_derived]
impl ::core::cmp::Eq for RelocModel { }
#[automatically_derived]
impl ::core::hash::Hash for RelocModel {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
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: &Self)
-> ::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: &Self) -> ::core::cmp::Ordering {
::core::cmp::Ord::cmp(&::core::intrinsics::discriminant_value(self),
&::core::intrinsics::discriminant_value(other))
}
}
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! {
946 pub enum RelocModel {
947 Static = "static",
948 Pic = "pic",
949 Pie = "pie",
950 DynamicNoPic = "dynamic-no-pic",
951 Ropi = "ropi",
952 Rwpi = "rwpi",
953 RopiRwpi = "ropi-rwpi",
954 }
955
956 parse_error_type = "relocation model";
957}
958
959impl RelocModel {
960 pub const fn desc_symbol(&self) -> Symbol {
961 match *self {
962 RelocModel::Static => kw::Static,
963 RelocModel::Pic => sym::pic,
964 RelocModel::Pie => sym::pie,
965 RelocModel::DynamicNoPic => sym::dynamic_no_pic,
966 RelocModel::Ropi => sym::ropi,
967 RelocModel::Rwpi => sym::rwpi,
968 RelocModel::RopiRwpi => sym::ropi_rwpi,
969 }
970 }
971}
972
973pub 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) -> Self { *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: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}
#[automatically_derived]
impl ::core::cmp::Eq for CodeModel { }
#[automatically_derived]
impl ::core::hash::Hash for CodeModel {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
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: &Self)
-> ::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: &Self) -> ::core::cmp::Ordering {
::core::cmp::Ord::cmp(&::core::intrinsics::discriminant_value(self),
&::core::intrinsics::discriminant_value(other))
}
}
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! {
974 pub enum CodeModel {
975 Tiny = "tiny",
976 Small = "small",
977 Kernel = "kernel",
978 Medium = "medium",
979 Large = "large",
980 }
981
982 parse_error_type = "code model";
983}
984
985#[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) -> Self { *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: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}
#[automatically_derived]
impl ::core::cmp::Eq for FloatAbi { }
#[automatically_derived]
impl ::core::hash::Hash for FloatAbi {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
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: &Self)
-> ::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: &Self) -> ::core::cmp::Ordering {
::core::cmp::Ord::cmp(&::core::intrinsics::discriminant_value(self),
&::core::intrinsics::discriminant_value(other))
}
}
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! {
986 pub enum FloatAbi {
988 Soft = "soft",
989 Hard = "hard",
990 }
991
992 parse_error_type = "float abi";
993}
994
995#[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) -> Self { *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: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}
#[automatically_derived]
impl ::core::cmp::Eq for RustcAbi { }
#[automatically_derived]
impl ::core::hash::Hash for RustcAbi {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
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: &Self)
-> ::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: &Self) -> ::core::cmp::Ordering {
::core::cmp::Ord::cmp(&::core::intrinsics::discriminant_value(self),
&::core::intrinsics::discriminant_value(other))
}
}
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! {
996 pub enum RustcAbi {
998 Softfloat = "softfloat",
1000 X86Sse2 = "x86-sse2",
1002 PowerPcSpe = "powerpc-spe",
1004 SparcV8Plus = "sparc-v8plus",
1006 }
1007
1008 parse_error_type = "rustc abi";
1009}
1010
1011pub 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) -> Self { *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: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}
#[automatically_derived]
impl ::core::cmp::Eq for TlsModel { }
#[automatically_derived]
impl ::core::hash::Hash for TlsModel {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
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: &Self)
-> ::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: &Self) -> ::core::cmp::Ordering {
::core::cmp::Ord::cmp(&::core::intrinsics::discriminant_value(self),
&::core::intrinsics::discriminant_value(other))
}
}
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! {
1012 pub enum TlsModel {
1013 GeneralDynamic = "global-dynamic",
1014 LocalDynamic = "local-dynamic",
1015 InitialExec = "initial-exec",
1016 LocalExec = "local-exec",
1017 Emulated = "emulated",
1018 }
1019
1020 parse_error_type = "TLS model";
1021}
1022
1023#[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) -> Self { *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: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}
#[automatically_derived]
impl ::core::cmp::Eq for LinkOutputKind { }
#[automatically_derived]
impl ::core::hash::Hash for LinkOutputKind {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
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: &Self)
-> ::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: &Self) -> ::core::cmp::Ordering {
::core::cmp::Ord::cmp(&::core::intrinsics::discriminant_value(self),
&::core::intrinsics::discriminant_value(other))
}
}
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! {
1024 pub enum LinkOutputKind {
1026 DynamicNoPicExe = "dynamic-nopic-exe",
1028 DynamicPicExe = "dynamic-pic-exe",
1030 StaticNoPicExe = "static-nopic-exe",
1032 StaticPicExe = "static-pic-exe",
1034 DynamicDylib = "dynamic-dylib",
1036 StaticDylib = "static-dylib",
1038 WasiReactorExe = "wasi-reactor-exe",
1040 }
1041
1042 parse_error_type = "CRT object kind";
1043}
1044
1045impl LinkOutputKind {
1046 pub fn can_link_dylib(self) -> bool {
1047 match self {
1048 LinkOutputKind::StaticNoPicExe | LinkOutputKind::StaticPicExe => false,
1049 LinkOutputKind::DynamicNoPicExe
1050 | LinkOutputKind::DynamicPicExe
1051 | LinkOutputKind::DynamicDylib
1052 | LinkOutputKind::StaticDylib
1053 | LinkOutputKind::WasiReactorExe => true,
1054 }
1055 }
1056}
1057
1058pub type LinkArgs = BTreeMap<LinkerFlavor, Vec<StaticCow<str>>>;
1059pub type LinkArgsCli = BTreeMap<LinkerFlavorCli, Vec<StaticCow<str>>>;
1060
1061#[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) -> Self { *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: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}
#[automatically_derived]
impl ::core::cmp::Eq for DebuginfoKind { }
#[automatically_derived]
impl ::core::hash::Hash for DebuginfoKind {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
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: &Self)
-> ::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: &Self) -> ::core::cmp::Ordering {
::core::cmp::Ord::cmp(&::core::intrinsics::discriminant_value(self),
&::core::intrinsics::discriminant_value(other))
}
}
#[automatically_derived]
impl ::core::default::Default for DebuginfoKind {
#[inline]
fn default() -> Self { 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! {
1062 #[derive(Default)]
1067 pub enum DebuginfoKind {
1068 #[default]
1070 Dwarf = "dwarf",
1071 DwarfDsym = "dwarf-dsym",
1073 Pdb = "pdb",
1075 }
1076
1077 parse_error_type = "debuginfo kind";
1078}
1079
1080pub 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) -> Self { *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: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}
#[automatically_derived]
impl ::core::cmp::Eq for SplitDebuginfo { }
#[automatically_derived]
impl ::core::hash::Hash for SplitDebuginfo {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
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: &Self)
-> ::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: &Self) -> ::core::cmp::Ordering {
::core::cmp::Ord::cmp(&::core::intrinsics::discriminant_value(self),
&::core::intrinsics::discriminant_value(other))
}
}
#[automatically_derived]
impl ::core::default::Default for SplitDebuginfo {
#[inline]
fn default() -> Self { 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! {
1081 #[derive(Default, Encodable, Decodable)]
1082 pub enum SplitDebuginfo {
1083 #[default]
1091 Off = "off",
1092
1093 Packed = "packed",
1100
1101 Unpacked = "unpacked",
1108 }
1109
1110 parse_error_type = "split debuginfo";
1111}
1112
1113impl ::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);
1114
1115#[derive(#[automatically_derived]
impl ::core::clone::Clone for StackProbeType {
#[inline]
fn clone(&self) -> Self {
match self {
Self::None => Self::None,
Self::Inline => Self::Inline,
Self::Call => Self::Call,
Self::InlineOrCall { min_llvm_version_for_inline: __self_0 } =>
Self::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 {
Self::None => ::core::fmt::Formatter::write_str(f, "None"),
Self::Inline => ::core::fmt::Formatter::write_str(f, "Inline"),
Self::Call => ::core::fmt::Formatter::write_str(f, "Call"),
Self::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: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::InlineOrCall { min_llvm_version_for_inline: __self_0 },
Self::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)]
1116#[serde(tag = "kind")]
1117#[serde(rename_all = "kebab-case")]
1118pub enum StackProbeType {
1119 None,
1121 Inline,
1125 Call,
1127 InlineOrCall {
1130 #[serde(rename = "min-llvm-version-for-inline")]
1131 min_llvm_version_for_inline: (u32, u32, u32),
1132 },
1133}
1134
1135impl ToJson for StackProbeType {
1136 fn to_json(&self) -> Json {
1137 Json::Object(match self {
1138 StackProbeType::None => {
1139 [(String::from("kind"), "none".to_json())].into_iter().collect()
1140 }
1141 StackProbeType::Inline => {
1142 [(String::from("kind"), "inline".to_json())].into_iter().collect()
1143 }
1144 StackProbeType::Call => {
1145 [(String::from("kind"), "call".to_json())].into_iter().collect()
1146 }
1147 StackProbeType::InlineOrCall { min_llvm_version_for_inline: (maj, min, patch) } => [
1148 (String::from("kind"), "inline-or-call".to_json()),
1149 (
1150 String::from("min-llvm-version-for-inline"),
1151 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()]),
1152 ),
1153 ]
1154 .into_iter()
1155 .collect(),
1156 })
1157 }
1158}
1159
1160impl ToJson for SanitizerSet {
1161 fn to_json(&self) -> Json {
1162 self.into_iter()
1163 .map(|v| Some(v.as_str()?.to_json()))
1164 .collect::<Option<Vec<_>>>()
1165 .unwrap_or_default()
1166 .to_json()
1167 }
1168}
1169
1170pub 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) -> Self { *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: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}
#[automatically_derived]
impl ::core::cmp::Eq for FramePointer { }
#[automatically_derived]
impl ::core::hash::Hash for FramePointer {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
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: &Self)
-> ::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: &Self) -> ::core::cmp::Ordering {
::core::cmp::Ord::cmp(&::core::intrinsics::discriminant_value(self),
&::core::intrinsics::discriminant_value(other))
}
}
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! {
1171 pub enum FramePointer {
1172 Always = "always",
1174 NonLeaf = "non-leaf",
1177 MayOmit = "may-omit",
1181 }
1182
1183 parse_error_type = "frame pointer";
1184}
1185
1186impl FramePointer {
1187 #[inline]
1190 pub fn ratchet(&mut self, rhs: FramePointer) -> FramePointer {
1191 *self = match (*self, rhs) {
1192 (FramePointer::Always, _) | (_, FramePointer::Always) => FramePointer::Always,
1193 (FramePointer::NonLeaf, _) | (_, FramePointer::NonLeaf) => FramePointer::NonLeaf,
1194 _ => FramePointer::MayOmit,
1195 };
1196 *self
1197 }
1198}
1199
1200#[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) -> Self { *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: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}
#[automatically_derived]
impl ::core::cmp::Eq for StackProtector { }
#[automatically_derived]
impl ::core::hash::Hash for StackProtector {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
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: &Self)
-> ::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: &Self) -> ::core::cmp::Ordering {
::core::cmp::Ord::cmp(&::core::intrinsics::discriminant_value(self),
&::core::intrinsics::discriminant_value(other))
}
}
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! {
1201 #[derive(Encodable, BlobDecodable, StableHash)]
1203 pub enum StackProtector {
1204 None = "none",
1206
1207 Basic = "basic",
1212
1213 Strong = "strong",
1218
1219 All = "all",
1221 }
1222
1223 parse_error_type = "stack protector";
1224}
1225
1226impl ::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);
1227
1228pub 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) -> Self { *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: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}
#[automatically_derived]
impl ::core::cmp::Eq for BinaryFormat { }
#[automatically_derived]
impl ::core::hash::Hash for BinaryFormat {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
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: &Self)
-> ::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: &Self) -> ::core::cmp::Ordering {
::core::cmp::Ord::cmp(&::core::intrinsics::discriminant_value(self),
&::core::intrinsics::discriminant_value(other))
}
}
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! {
1229 pub enum BinaryFormat {
1230 Coff = "coff",
1231 Elf = "elf",
1232 MachO = "mach-o",
1233 Wasm = "wasm",
1234 Xcoff = "xcoff",
1235 }
1236
1237 parse_error_type = "binary format";
1238}
1239
1240impl BinaryFormat {
1241 pub fn to_object(&self) -> object::BinaryFormat {
1243 match self {
1244 Self::Coff => object::BinaryFormat::Coff,
1245 Self::Elf => object::BinaryFormat::Elf,
1246 Self::MachO => object::BinaryFormat::MachO,
1247 Self::Wasm => object::BinaryFormat::Wasm,
1248 Self::Xcoff => object::BinaryFormat::Xcoff,
1249 }
1250 }
1251
1252 pub fn desc_symbol(&self) -> Symbol {
1253 match self {
1254 Self::Coff => sym::coff,
1255 Self::Elf => sym::elf,
1256 Self::MachO => sym::macho,
1257 Self::Wasm => sym::wasm,
1258 Self::Xcoff => sym::xcoff,
1259 }
1260 }
1261}
1262
1263impl ToJson for Align {
1264 fn to_json(&self) -> Json {
1265 self.bits().to_json()
1266 }
1267}
1268
1269macro_rules! supported_targets {
1270 ( $(($tuple:literal, $module:ident),)+ ) => {
1271 mod targets {
1272 $(pub(crate) mod $module;)+
1273 }
1274
1275 pub static TARGETS: &[&str] = &[$($tuple),+];
1277
1278 fn load_builtin(target: &str) -> Option<Target> {
1279 let t = match target {
1280 $( $tuple => targets::$module::target(), )+
1281 _ => return None,
1282 };
1283 debug!("got builtin target: {:?}", t);
1284 Some(t)
1285 }
1286
1287 fn load_all_builtins() -> impl Iterator<Item = Target> {
1288 [
1289 $( targets::$module::target, )+
1290 ]
1291 .into_iter()
1292 .map(|f| f())
1293 }
1294
1295 #[cfg(test)]
1296 mod tests {
1297 $(
1299 #[test] fn $module() {
1301 crate::spec::targets::$module::target().test_target()
1302 }
1303 )+
1304 }
1305 };
1306}
1307
1308mod 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, Cc, CodeModel, LinkerFlavor, Lld, 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(),
pre_link_args: TargetOptions::link_args(LinkerFlavor::Gnu(Cc::Yes,
Lld::No), &["-Wl,--no-rosegment"]),
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, Cc, CodeModel, LinkerFlavor, Lld, 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,
pre_link_args: TargetOptions::link_args(LinkerFlavor::Gnu(Cc::Yes,
Lld::No), &["-Wl,--no-rosegment"]),
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: "arm-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,+db,+dsp,+aclass,+perfmon,+vfp3d16,+thumb2".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: "arm-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,+db,+dsp,+aclass,+perfmon,+vfp3d16,+thumb2".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: "arm-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,+db,+dsp,+aclass,+perfmon,+thumb-mode,+thumb2,+vfp3d16".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: "arm-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,+db,+dsp,+aclass,+perfmon,+vfp3d16,+thumb2".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: "arm-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,+db,+dsp,+aclass,+perfmon,+vfp3d16,+thumb2".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;
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,
cpu: "avr2".into(),
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(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 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(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 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: "arm-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: "+v7,+db,+dsp,+aclass,+perfmon,+vfp3d16,+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: "thumb-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: "+v7,+db,+dsp,+aclass,+perfmon,+vfp3d16,+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: "arm-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,+db,+dsp,+aclass,+perfmon,+vfp3d16,+thumb2".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: "arm-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,+db,+dsp,+aclass,+perfmon,+vfp3d16,+thumb2".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".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,+db,+dsp,+aclass,+perfmon,+vfp3d16,+thumb2".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, Cc, CodeModel, LinkerFlavor, Lld, 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(),
pre_link_args: TargetOptions::link_args(LinkerFlavor::Gnu(Cc::Yes,
Lld::No), &["-Wl,--no-rosegment"]),
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/c1070d69382b8d2f2eb65119c738a77d9e324c9e/compiler/rustc_target/src/spec/mod.rs:1308",
"rustc_target::spec", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/c1070d69382b8d2f2eb65119c738a77d9e324c9e/compiler/rustc_target/src/spec/mod.rs"),
::tracing_core::__macro_support::Option::Some(1308u32),
::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! {
1309 ("x86_64-unknown-linux-gnu", x86_64_unknown_linux_gnu),
1310 ("x86_64-unknown-linux-gnux32", x86_64_unknown_linux_gnux32),
1311 ("i686-unknown-linux-gnu", i686_unknown_linux_gnu),
1312 ("i586-unknown-linux-gnu", i586_unknown_linux_gnu),
1313 ("loongarch64-unknown-linux-gnu", loongarch64_unknown_linux_gnu),
1314 ("loongarch64-unknown-linux-musl", loongarch64_unknown_linux_musl),
1315 ("m68k-unknown-linux-gnu", m68k_unknown_linux_gnu),
1316 ("m68k-unknown-none-elf", m68k_unknown_none_elf),
1317 ("csky-unknown-linux-gnuabiv2", csky_unknown_linux_gnuabiv2),
1318 ("csky-unknown-linux-gnuabiv2hf", csky_unknown_linux_gnuabiv2hf),
1319 ("mips-unknown-linux-gnu", mips_unknown_linux_gnu),
1320 ("mips64-unknown-linux-gnuabi64", mips64_unknown_linux_gnuabi64),
1321 ("mips64el-unknown-linux-gnuabi64", mips64el_unknown_linux_gnuabi64),
1322 ("mipsisa32r6-unknown-linux-gnu", mipsisa32r6_unknown_linux_gnu),
1323 ("mipsisa32r6el-unknown-linux-gnu", mipsisa32r6el_unknown_linux_gnu),
1324 ("mipsisa64r6-unknown-linux-gnuabi64", mipsisa64r6_unknown_linux_gnuabi64),
1325 ("mipsisa64r6el-unknown-linux-gnuabi64", mipsisa64r6el_unknown_linux_gnuabi64),
1326 ("mipsel-unknown-linux-gnu", mipsel_unknown_linux_gnu),
1327 ("powerpc-unknown-linux-gnu", powerpc_unknown_linux_gnu),
1328 ("powerpc-unknown-linux-gnuspe", powerpc_unknown_linux_gnuspe),
1329 ("powerpc-unknown-linux-musl", powerpc_unknown_linux_musl),
1330 ("powerpc-unknown-linux-muslspe", powerpc_unknown_linux_muslspe),
1331 ("powerpc64-ibm-aix", powerpc64_ibm_aix),
1332 ("powerpc64-unknown-linux-gnu", powerpc64_unknown_linux_gnu),
1333 ("powerpc64-unknown-linux-gnuelfv2", powerpc64_unknown_linux_gnuelfv2),
1334 ("powerpc64-unknown-linux-musl", powerpc64_unknown_linux_musl),
1335 ("powerpc64le-unknown-linux-gnu", powerpc64le_unknown_linux_gnu),
1336 ("powerpc64le-unknown-linux-musl", powerpc64le_unknown_linux_musl),
1337 ("s390x-unknown-linux-gnu", s390x_unknown_linux_gnu),
1338 ("s390x-unknown-none-softfloat", s390x_unknown_none_softfloat),
1339 ("s390x-unknown-linux-musl", s390x_unknown_linux_musl),
1340 ("sparc-unknown-linux-gnu", sparc_unknown_linux_gnu),
1341 ("sparc64-unknown-linux-gnu", sparc64_unknown_linux_gnu),
1342 ("arm-unknown-linux-gnueabi", arm_unknown_linux_gnueabi),
1343 ("arm-unknown-linux-gnueabihf", arm_unknown_linux_gnueabihf),
1344 ("armeb-unknown-linux-gnueabi", armeb_unknown_linux_gnueabi),
1345 ("arm-unknown-linux-musleabi", arm_unknown_linux_musleabi),
1346 ("arm-unknown-linux-musleabihf", arm_unknown_linux_musleabihf),
1347 ("armv4t-unknown-linux-gnueabi", armv4t_unknown_linux_gnueabi),
1348 ("armv5te-unknown-linux-gnueabi", armv5te_unknown_linux_gnueabi),
1349 ("armv5te-unknown-linux-musleabi", armv5te_unknown_linux_musleabi),
1350 ("armv5te-unknown-linux-uclibceabi", armv5te_unknown_linux_uclibceabi),
1351 ("armv7-unknown-linux-gnueabi", armv7_unknown_linux_gnueabi),
1352 ("armv7-unknown-linux-gnueabihf", armv7_unknown_linux_gnueabihf),
1353 ("thumbv7neon-unknown-linux-gnueabihf", thumbv7neon_unknown_linux_gnueabihf),
1354 ("thumbv7neon-unknown-linux-musleabihf", thumbv7neon_unknown_linux_musleabihf),
1355 ("armv7-unknown-linux-musleabi", armv7_unknown_linux_musleabi),
1356 ("armv7-unknown-linux-musleabihf", armv7_unknown_linux_musleabihf),
1357 ("aarch64-unknown-linux-gnu", aarch64_unknown_linux_gnu),
1358 ("aarch64-unknown-linux-musl", aarch64_unknown_linux_musl),
1359 ("aarch64-unknown-linux-pauthtest", aarch64_unknown_linux_pauthtest),
1360 ("aarch64_be-unknown-linux-musl", aarch64_be_unknown_linux_musl),
1361 ("x86_64-unknown-linux-musl", x86_64_unknown_linux_musl),
1362 ("i686-unknown-linux-musl", i686_unknown_linux_musl),
1363 ("i586-unknown-linux-musl", i586_unknown_linux_musl),
1364 ("mips-unknown-linux-musl", mips_unknown_linux_musl),
1365 ("mipsel-unknown-linux-musl", mipsel_unknown_linux_musl),
1366 ("mips64-unknown-linux-muslabi64", mips64_unknown_linux_muslabi64),
1367 ("mips64el-unknown-linux-muslabi64", mips64el_unknown_linux_muslabi64),
1368 ("hexagon-unknown-linux-musl", hexagon_unknown_linux_musl),
1369 ("hexagon-unknown-none-elf", hexagon_unknown_none_elf),
1370 ("hexagon-unknown-qurt", hexagon_unknown_qurt),
1371
1372 ("mips-unknown-linux-uclibc", mips_unknown_linux_uclibc),
1373 ("mipsel-unknown-linux-uclibc", mipsel_unknown_linux_uclibc),
1374
1375 ("i686-linux-android", i686_linux_android),
1376 ("x86_64-linux-android", x86_64_linux_android),
1377 ("arm-linux-androideabi", arm_linux_androideabi),
1378 ("armv7-linux-androideabi", armv7_linux_androideabi),
1379 ("thumbv7neon-linux-androideabi", thumbv7neon_linux_androideabi),
1380 ("aarch64-linux-android", aarch64_linux_android),
1381 ("riscv64-linux-android", riscv64_linux_android),
1382
1383 ("aarch64-unknown-freebsd", aarch64_unknown_freebsd),
1384 ("armv6-unknown-freebsd", armv6_unknown_freebsd),
1385 ("armv7-unknown-freebsd", armv7_unknown_freebsd),
1386 ("i686-unknown-freebsd", i686_unknown_freebsd),
1387 ("powerpc-unknown-freebsd", powerpc_unknown_freebsd),
1388 ("powerpc64-unknown-freebsd", powerpc64_unknown_freebsd),
1389 ("powerpc64le-unknown-freebsd", powerpc64le_unknown_freebsd),
1390 ("riscv64gc-unknown-freebsd", riscv64gc_unknown_freebsd),
1391 ("x86_64-unknown-freebsd", x86_64_unknown_freebsd),
1392
1393 ("x86_64-unknown-dragonfly", x86_64_unknown_dragonfly),
1394
1395 ("aarch64-unknown-openbsd", aarch64_unknown_openbsd),
1396 ("i686-unknown-openbsd", i686_unknown_openbsd),
1397 ("powerpc-unknown-openbsd", powerpc_unknown_openbsd),
1398 ("powerpc64-unknown-openbsd", powerpc64_unknown_openbsd),
1399 ("riscv64gc-unknown-openbsd", riscv64gc_unknown_openbsd),
1400 ("sparc64-unknown-openbsd", sparc64_unknown_openbsd),
1401 ("x86_64-unknown-openbsd", x86_64_unknown_openbsd),
1402
1403 ("aarch64-unknown-netbsd", aarch64_unknown_netbsd),
1404 ("aarch64_be-unknown-netbsd", aarch64_be_unknown_netbsd),
1405 ("armv6-unknown-netbsd-eabihf", armv6_unknown_netbsd_eabihf),
1406 ("armv7-unknown-netbsd-eabihf", armv7_unknown_netbsd_eabihf),
1407 ("i586-unknown-netbsd", i586_unknown_netbsd),
1408 ("i686-unknown-netbsd", i686_unknown_netbsd),
1409 ("mipsel-unknown-netbsd", mipsel_unknown_netbsd),
1410 ("powerpc-unknown-netbsd", powerpc_unknown_netbsd),
1411 ("riscv64gc-unknown-netbsd", riscv64gc_unknown_netbsd),
1412 ("sparc64-unknown-netbsd", sparc64_unknown_netbsd),
1413 ("x86_64-unknown-netbsd", x86_64_unknown_netbsd),
1414
1415 ("i686-unknown-haiku", i686_unknown_haiku),
1416 ("x86_64-unknown-haiku", x86_64_unknown_haiku),
1417
1418 ("aarch64-unknown-helenos", aarch64_unknown_helenos),
1419 ("i686-unknown-helenos", i686_unknown_helenos),
1420 ("powerpc-unknown-helenos", powerpc_unknown_helenos),
1421 ("sparc64-unknown-helenos", sparc64_unknown_helenos),
1422 ("x86_64-unknown-helenos", x86_64_unknown_helenos),
1423
1424 ("i686-unknown-hurd-gnu", i686_unknown_hurd_gnu),
1425 ("x86_64-unknown-hurd-gnu", x86_64_unknown_hurd_gnu),
1426
1427 ("aarch64-apple-darwin", aarch64_apple_darwin),
1428 ("arm64e-apple-darwin", arm64e_apple_darwin),
1429 ("x86_64-apple-darwin", x86_64_apple_darwin),
1430 ("x86_64h-apple-darwin", x86_64h_apple_darwin),
1431 ("i686-apple-darwin", i686_apple_darwin),
1432
1433 ("aarch64-unknown-fuchsia", aarch64_unknown_fuchsia),
1434 ("riscv64gc-unknown-fuchsia", riscv64gc_unknown_fuchsia),
1435 ("x86_64-unknown-fuchsia", x86_64_unknown_fuchsia),
1436
1437 ("avr-none", avr_none),
1438
1439 ("aarch64-unknown-l4re-uclibc", aarch64_unknown_l4re_uclibc),
1440 ("x86_64-unknown-l4re-uclibc", x86_64_unknown_l4re_uclibc),
1441
1442 ("aarch64-unknown-redox", aarch64_unknown_redox),
1443 ("i586-unknown-redox", i586_unknown_redox),
1444 ("riscv64gc-unknown-redox", riscv64gc_unknown_redox),
1445 ("x86_64-unknown-redox", x86_64_unknown_redox),
1446
1447 ("x86_64-unknown-managarm-mlibc", x86_64_unknown_managarm_mlibc),
1448 ("aarch64-unknown-managarm-mlibc", aarch64_unknown_managarm_mlibc),
1449 ("riscv64gc-unknown-managarm-mlibc", riscv64gc_unknown_managarm_mlibc),
1450
1451 ("i386-apple-ios", i386_apple_ios),
1452 ("x86_64-apple-ios", x86_64_apple_ios),
1453 ("aarch64-apple-ios", aarch64_apple_ios),
1454 ("arm64e-apple-ios", arm64e_apple_ios),
1455 ("armv7s-apple-ios", armv7s_apple_ios),
1456 ("x86_64-apple-ios-macabi", x86_64_apple_ios_macabi),
1457 ("aarch64-apple-ios-macabi", aarch64_apple_ios_macabi),
1458 ("aarch64-apple-ios-sim", aarch64_apple_ios_sim),
1459
1460 ("aarch64-apple-tvos", aarch64_apple_tvos),
1461 ("aarch64-apple-tvos-sim", aarch64_apple_tvos_sim),
1462 ("arm64e-apple-tvos", arm64e_apple_tvos),
1463 ("x86_64-apple-tvos", x86_64_apple_tvos),
1464
1465 ("armv7k-apple-watchos", armv7k_apple_watchos),
1466 ("arm64_32-apple-watchos", arm64_32_apple_watchos),
1467 ("x86_64-apple-watchos-sim", x86_64_apple_watchos_sim),
1468 ("aarch64-apple-watchos", aarch64_apple_watchos),
1469 ("aarch64-apple-watchos-sim", aarch64_apple_watchos_sim),
1470
1471 ("aarch64-apple-visionos", aarch64_apple_visionos),
1472 ("aarch64-apple-visionos-sim", aarch64_apple_visionos_sim),
1473
1474 ("armebv7r-none-eabi", armebv7r_none_eabi),
1475 ("armebv7r-none-eabihf", armebv7r_none_eabihf),
1476 ("armv7r-none-eabi", armv7r_none_eabi),
1477 ("thumbv7r-none-eabi", thumbv7r_none_eabi),
1478 ("armv7r-none-eabihf", armv7r_none_eabihf),
1479 ("thumbv7r-none-eabihf", thumbv7r_none_eabihf),
1480 ("armv8r-none-eabihf", armv8r_none_eabihf),
1481 ("thumbv8r-none-eabihf", thumbv8r_none_eabihf),
1482
1483 ("armv7-rtems-eabihf", armv7_rtems_eabihf),
1484
1485 ("x86_64-pc-solaris", x86_64_pc_solaris),
1486 ("sparcv9-sun-solaris", sparcv9_sun_solaris),
1487
1488 ("x86_64-unknown-illumos", x86_64_unknown_illumos),
1489 ("aarch64-unknown-illumos", aarch64_unknown_illumos),
1490
1491 ("x86_64-pc-windows-gnu", x86_64_pc_windows_gnu),
1492 ("x86_64-uwp-windows-gnu", x86_64_uwp_windows_gnu),
1493 ("x86_64-win7-windows-gnu", x86_64_win7_windows_gnu),
1494 ("i686-pc-windows-gnu", i686_pc_windows_gnu),
1495 ("i686-uwp-windows-gnu", i686_uwp_windows_gnu),
1496 ("i686-win7-windows-gnu", i686_win7_windows_gnu),
1497
1498 ("aarch64-pc-windows-gnullvm", aarch64_pc_windows_gnullvm),
1499 ("i686-pc-windows-gnullvm", i686_pc_windows_gnullvm),
1500 ("x86_64-pc-windows-gnullvm", x86_64_pc_windows_gnullvm),
1501
1502 ("aarch64-pc-windows-msvc", aarch64_pc_windows_msvc),
1503 ("aarch64-uwp-windows-msvc", aarch64_uwp_windows_msvc),
1504 ("arm64ec-pc-windows-msvc", arm64ec_pc_windows_msvc),
1505 ("x86_64-pc-windows-msvc", x86_64_pc_windows_msvc),
1506 ("x86_64-uwp-windows-msvc", x86_64_uwp_windows_msvc),
1507 ("x86_64-win7-windows-msvc", x86_64_win7_windows_msvc),
1508 ("i686-pc-windows-msvc", i686_pc_windows_msvc),
1509 ("i686-uwp-windows-msvc", i686_uwp_windows_msvc),
1510 ("i686-win7-windows-msvc", i686_win7_windows_msvc),
1511 ("thumbv7a-pc-windows-msvc", thumbv7a_pc_windows_msvc),
1512 ("thumbv7a-uwp-windows-msvc", thumbv7a_uwp_windows_msvc),
1513
1514 ("wasm32-unknown-emscripten", wasm32_unknown_emscripten),
1515 ("wasm32-unknown-unknown", wasm32_unknown_unknown),
1516 ("wasm32v1-none", wasm32v1_none),
1517 ("wasm32-wasip1", wasm32_wasip1),
1518 ("wasm32-wasip2", wasm32_wasip2),
1519 ("wasm32-wasip3", wasm32_wasip3),
1520 ("wasm32-wasip1-threads", wasm32_wasip1_threads),
1521 ("wasm32-wali-linux-musl", wasm32_wali_linux_musl),
1522 ("wasm64-unknown-unknown", wasm64_unknown_unknown),
1523
1524 ("thumbv6m-none-eabi", thumbv6m_none_eabi),
1525 ("thumbv7m-none-eabi", thumbv7m_none_eabi),
1526 ("thumbv7em-none-eabi", thumbv7em_none_eabi),
1527 ("thumbv7em-none-eabihf", thumbv7em_none_eabihf),
1528 ("thumbv8m.base-none-eabi", thumbv8m_base_none_eabi),
1529 ("thumbv8m.main-none-eabi", thumbv8m_main_none_eabi),
1530 ("thumbv8m.main-none-eabihf", thumbv8m_main_none_eabihf),
1531
1532 ("armv7a-none-eabi", armv7a_none_eabi),
1533 ("thumbv7a-none-eabi", thumbv7a_none_eabi),
1534 ("armv7a-none-eabihf", armv7a_none_eabihf),
1535 ("thumbv7a-none-eabihf", thumbv7a_none_eabihf),
1536 ("armv7a-nuttx-eabi", armv7a_nuttx_eabi),
1537 ("armv7a-nuttx-eabihf", armv7a_nuttx_eabihf),
1538 ("thumbv7a-vex-v5", thumbv7a_vex_v5),
1539
1540 ("msp430-none-elf", msp430_none_elf),
1541
1542 ("aarch64_be-unknown-hermit", aarch64_be_unknown_hermit),
1543 ("aarch64-unknown-hermit", aarch64_unknown_hermit),
1544 ("riscv64gc-unknown-hermit", riscv64gc_unknown_hermit),
1545 ("x86_64-unknown-hermit", x86_64_unknown_hermit),
1546 ("x86_64-unknown-motor", x86_64_unknown_motor),
1547
1548 ("x86_64-unikraft-linux-musl", x86_64_unikraft_linux_musl),
1549
1550 ("armv7-unknown-trusty", armv7_unknown_trusty),
1551 ("aarch64-unknown-trusty", aarch64_unknown_trusty),
1552 ("x86_64-unknown-trusty", x86_64_unknown_trusty),
1553
1554 ("riscv32i-unknown-none-elf", riscv32i_unknown_none_elf),
1555 ("riscv32im-risc0-zkvm-elf", riscv32im_risc0_zkvm_elf),
1556 ("riscv32im-unknown-none-elf", riscv32im_unknown_none_elf),
1557 ("riscv32ima-unknown-none-elf", riscv32ima_unknown_none_elf),
1558 ("riscv32imc-unknown-none-elf", riscv32imc_unknown_none_elf),
1559 ("riscv32imfc-unknown-none-elf", riscv32imfc_unknown_none_elf),
1560 ("riscv32imc-esp-espidf", riscv32imc_esp_espidf),
1561 ("riscv32imac-esp-espidf", riscv32imac_esp_espidf),
1562 ("riscv32imafc-esp-espidf", riscv32imafc_esp_espidf),
1563
1564 ("riscv32e-unknown-none-elf", riscv32e_unknown_none_elf),
1565 ("riscv32em-unknown-none-elf", riscv32em_unknown_none_elf),
1566 ("riscv32emc-unknown-none-elf", riscv32emc_unknown_none_elf),
1567
1568 ("riscv32imac-unknown-none-elf", riscv32imac_unknown_none_elf),
1569 ("riscv32imafc-unknown-none-elf", riscv32imafc_unknown_none_elf),
1570 ("riscv32imac-unknown-xous-elf", riscv32imac_unknown_xous_elf),
1571 ("riscv32gc-unknown-linux-gnu", riscv32gc_unknown_linux_gnu),
1572 ("riscv32gc-unknown-linux-musl", riscv32gc_unknown_linux_musl),
1573 ("riscv64im-unknown-none-elf", riscv64im_unknown_none_elf),
1574 ("riscv64imac-unknown-none-elf", riscv64imac_unknown_none_elf),
1575 ("riscv64gc-unknown-none-elf", riscv64gc_unknown_none_elf),
1576 ("riscv64gc-unknown-linux-gnu", riscv64gc_unknown_linux_gnu),
1577 ("riscv64gc-unknown-linux-musl", riscv64gc_unknown_linux_musl),
1578 ("riscv64a23-unknown-linux-gnu", riscv64a23_unknown_linux_gnu),
1579
1580 ("sparc-unknown-none-elf", sparc_unknown_none_elf),
1581
1582 ("loongarch32-unknown-none", loongarch32_unknown_none),
1583 ("loongarch32-unknown-none-softfloat", loongarch32_unknown_none_softfloat),
1584 ("loongarch64-unknown-none", loongarch64_unknown_none),
1585 ("loongarch64-unknown-none-softfloat", loongarch64_unknown_none_softfloat),
1586
1587 ("aarch64-unknown-none", aarch64_unknown_none),
1588 ("aarch64-unknown-none-softfloat", aarch64_unknown_none_softfloat),
1589 ("aarch64_be-unknown-none-softfloat", aarch64_be_unknown_none_softfloat),
1590 ("aarch64-unknown-nuttx", aarch64_unknown_nuttx),
1591 ("aarch64v8r-unknown-none", aarch64v8r_unknown_none),
1592 ("aarch64v8r-unknown-none-softfloat", aarch64v8r_unknown_none_softfloat),
1593
1594 ("x86_64-fortanix-unknown-sgx", x86_64_fortanix_unknown_sgx),
1595
1596 ("x86_64-unknown-uefi", x86_64_unknown_uefi),
1597 ("i686-unknown-uefi", i686_unknown_uefi),
1598 ("aarch64-unknown-uefi", aarch64_unknown_uefi),
1599
1600 ("nvptx64-nvidia-cuda", nvptx64_nvidia_cuda),
1601
1602 ("amdgcn-amd-amdhsa", amdgcn_amd_amdhsa),
1603
1604 ("xtensa-esp32-none-elf", xtensa_esp32_none_elf),
1605 ("xtensa-esp32-espidf", xtensa_esp32_espidf),
1606 ("xtensa-esp32s2-none-elf", xtensa_esp32s2_none_elf),
1607 ("xtensa-esp32s2-espidf", xtensa_esp32s2_espidf),
1608 ("xtensa-esp32s3-none-elf", xtensa_esp32s3_none_elf),
1609 ("xtensa-esp32s3-espidf", xtensa_esp32s3_espidf),
1610
1611 ("i686-wrs-vxworks", i686_wrs_vxworks),
1612 ("x86_64-wrs-vxworks", x86_64_wrs_vxworks),
1613 ("armv7-wrs-vxworks-eabihf", armv7_wrs_vxworks_eabihf),
1614 ("aarch64-wrs-vxworks", aarch64_wrs_vxworks),
1615 ("powerpc-wrs-vxworks", powerpc_wrs_vxworks),
1616 ("powerpc-wrs-vxworks-spe", powerpc_wrs_vxworks_spe),
1617 ("powerpc64-wrs-vxworks", powerpc64_wrs_vxworks),
1618 ("riscv32-wrs-vxworks", riscv32_wrs_vxworks),
1619 ("riscv64-wrs-vxworks", riscv64_wrs_vxworks),
1620
1621 ("aarch64-kmc-solid_asp3", aarch64_kmc_solid_asp3),
1622 ("armv7a-kmc-solid_asp3-eabi", armv7a_kmc_solid_asp3_eabi),
1623 ("armv7a-kmc-solid_asp3-eabihf", armv7a_kmc_solid_asp3_eabihf),
1624
1625 ("powerpc64-sony-ps3", powerpc64_sony_ps3),
1626 ("mipsel-sony-psp", mipsel_sony_psp),
1627 ("mipsel-sony-psx", mipsel_sony_psx),
1628 ("mipsel-unknown-none", mipsel_unknown_none),
1629 ("mips-mti-none-elf", mips_mti_none_elf),
1630 ("mipsel-mti-none-elf", mipsel_mti_none_elf),
1631
1632 ("armv4t-none-eabi", armv4t_none_eabi),
1633 ("armv5te-none-eabi", armv5te_none_eabi),
1634 ("armv6-none-eabi", armv6_none_eabi),
1635 ("armv6-none-eabihf", armv6_none_eabihf),
1636 ("thumbv4t-none-eabi", thumbv4t_none_eabi),
1637 ("thumbv5te-none-eabi", thumbv5te_none_eabi),
1638 ("thumbv6-none-eabi", thumbv6_none_eabi),
1639
1640 ("aarch64_be-unknown-linux-gnu", aarch64_be_unknown_linux_gnu),
1641 ("aarch64-unknown-linux-gnu_ilp32", aarch64_unknown_linux_gnu_ilp32),
1642 ("aarch64_be-unknown-linux-gnu_ilp32", aarch64_be_unknown_linux_gnu_ilp32),
1643
1644 ("bpfeb-unknown-none", bpfeb_unknown_none),
1645 ("bpfel-unknown-none", bpfel_unknown_none),
1646
1647 ("armv6k-nintendo-3ds", armv6k_nintendo_3ds),
1648
1649 ("aarch64-nintendo-switch-freestanding", aarch64_nintendo_switch_freestanding),
1650
1651 ("armv7-sony-vita-newlibeabihf", armv7_sony_vita_newlibeabihf),
1652
1653 ("armv7-unknown-linux-uclibceabi", armv7_unknown_linux_uclibceabi),
1654 ("armv7-unknown-linux-uclibceabihf", armv7_unknown_linux_uclibceabihf),
1655
1656 ("x86_64-unknown-none", x86_64_unknown_none),
1657
1658 ("aarch64-unknown-teeos", aarch64_unknown_teeos),
1659
1660 ("mips64-openwrt-linux-musl", mips64_openwrt_linux_musl),
1661
1662 ("aarch64-unknown-nto-qnx700", aarch64_unknown_nto_qnx700),
1663 ("aarch64-unknown-nto-qnx710", aarch64_unknown_nto_qnx710),
1664 ("aarch64-unknown-nto-qnx710_iosock", aarch64_unknown_nto_qnx710_iosock),
1665 ("aarch64-unknown-qnx", aarch64_unknown_qnx),
1666 ("x86_64-pc-nto-qnx710", x86_64_pc_nto_qnx710),
1667 ("x86_64-pc-nto-qnx710_iosock", x86_64_pc_nto_qnx710_iosock),
1668 ("x86_64-pc-qnx", x86_64_pc_qnx),
1669 ("i686-pc-nto-qnx700", i686_pc_nto_qnx700),
1670
1671 ("aarch64-unknown-linux-ohos", aarch64_unknown_linux_ohos),
1672 ("armv7-unknown-linux-ohos", armv7_unknown_linux_ohos),
1673 ("loongarch64-unknown-linux-ohos", loongarch64_unknown_linux_ohos),
1674 ("x86_64-unknown-linux-ohos", x86_64_unknown_linux_ohos),
1675
1676 ("x86_64-unknown-linux-none", x86_64_unknown_linux_none),
1677
1678 ("thumbv6m-nuttx-eabi", thumbv6m_nuttx_eabi),
1679 ("thumbv7a-nuttx-eabi", thumbv7a_nuttx_eabi),
1680 ("thumbv7a-nuttx-eabihf", thumbv7a_nuttx_eabihf),
1681 ("thumbv7m-nuttx-eabi", thumbv7m_nuttx_eabi),
1682 ("thumbv7em-nuttx-eabi", thumbv7em_nuttx_eabi),
1683 ("thumbv7em-nuttx-eabihf", thumbv7em_nuttx_eabihf),
1684 ("thumbv8m.base-nuttx-eabi", thumbv8m_base_nuttx_eabi),
1685 ("thumbv8m.main-nuttx-eabi", thumbv8m_main_nuttx_eabi),
1686 ("thumbv8m.main-nuttx-eabihf", thumbv8m_main_nuttx_eabihf),
1687 ("riscv32imc-unknown-nuttx-elf", riscv32imc_unknown_nuttx_elf),
1688 ("riscv32imac-unknown-nuttx-elf", riscv32imac_unknown_nuttx_elf),
1689 ("riscv32imafc-unknown-nuttx-elf", riscv32imafc_unknown_nuttx_elf),
1690 ("riscv64imac-unknown-nuttx-elf", riscv64imac_unknown_nuttx_elf),
1691 ("riscv64gc-unknown-nuttx-elf", riscv64gc_unknown_nuttx_elf),
1692 ("x86_64-lynx-lynxos178", x86_64_lynx_lynxos178),
1693
1694 ("x86_64-pc-cygwin", x86_64_pc_cygwin),
1695
1696 ("x86_64-unknown-linux-gnuasan", x86_64_unknown_linux_gnuasan),
1697 ("x86_64-unknown-linux-gnumsan", x86_64_unknown_linux_gnumsan),
1698 ("x86_64-unknown-linux-gnutsan", x86_64_unknown_linux_gnutsan),
1699
1700 ("aarch64-oe-linux-gnu", aarch64_oe_linux_gnu),
1701 ("armv7-oe-linux-gnueabihf", armv7_oe_linux_gnueabihf),
1702 ("i686-oe-linux-gnu", i686_oe_linux_gnu),
1703 ("riscv64-oe-linux-gnu", riscv64_oe_linux_gnu),
1704 ("x86_64-oe-linux-gnu", x86_64_oe_linux_gnu),
1705}
1706
1707macro_rules! cvs {
1709 () => {
1710 ::std::borrow::Cow::Borrowed(&[])
1711 };
1712 ($($x:expr),+ $(,)?) => {
1713 ::std::borrow::Cow::Borrowed(&[
1714 $(
1715 ::std::borrow::Cow::Borrowed($x),
1716 )*
1717 ])
1718 };
1719}
1720
1721pub(crate) use cvs;
1722
1723#[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: &Self) -> bool {
self.unused_fields == other.unused_fields
}
}PartialEq)]
1727pub struct TargetWarnings {
1728 unused_fields: Vec<String>,
1729}
1730
1731impl TargetWarnings {
1732 pub fn empty() -> Self {
1733 Self { unused_fields: Vec::new() }
1734 }
1735
1736 pub fn warning_messages(&self) -> Vec<String> {
1737 let mut warnings = ::alloc::vec::Vec::new()vec![];
1738 if !self.unused_fields.is_empty() {
1739 warnings.push(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("target json file contains unused fields: {0}",
self.unused_fields.join(", ")))
})format!(
1740 "target json file contains unused fields: {}",
1741 self.unused_fields.join(", ")
1742 ));
1743 }
1744 warnings
1745 }
1746}
1747
1748#[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) -> Self { *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: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq)]
1751enum TargetKind {
1752 Json,
1753 Builtin,
1754}
1755
1756pub 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) -> Self {
match self {
Self::AArch64 => Self::AArch64,
Self::AmdGpu => Self::AmdGpu,
Self::Arm => Self::Arm,
Self::Arm64EC => Self::Arm64EC,
Self::Avr => Self::Avr,
Self::Bpf => Self::Bpf,
Self::CSky => Self::CSky,
Self::Hexagon => Self::Hexagon,
Self::LoongArch32 => Self::LoongArch32,
Self::LoongArch64 => Self::LoongArch64,
Self::M68k => Self::M68k,
Self::Mips => Self::Mips,
Self::Mips32r6 => Self::Mips32r6,
Self::Mips64 => Self::Mips64,
Self::Mips64r6 => Self::Mips64r6,
Self::Msp430 => Self::Msp430,
Self::Nvptx64 => Self::Nvptx64,
Self::PowerPC => Self::PowerPC,
Self::PowerPC64 => Self::PowerPC64,
Self::RiscV32 => Self::RiscV32,
Self::RiscV64 => Self::RiscV64,
Self::S390x => Self::S390x,
Self::Sparc => Self::Sparc,
Self::Sparc64 => Self::Sparc64,
Self::SpirV => Self::SpirV,
Self::Wasm32 => Self::Wasm32,
Self::Wasm64 => Self::Wasm64,
Self::X86 => Self::X86,
Self::X86_64 => Self::X86_64,
Self::Xtensa => Self::Xtensa,
Self::Other(__self_0) =>
Self::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: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Other(__self_0), Self::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) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state);
match self {
Self::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 {
Self::AArch64 => ::core::fmt::Formatter::write_str(f, "AArch64"),
Self::AmdGpu => ::core::fmt::Formatter::write_str(f, "AmdGpu"),
Self::Arm => ::core::fmt::Formatter::write_str(f, "Arm"),
Self::Arm64EC => ::core::fmt::Formatter::write_str(f, "Arm64EC"),
Self::Avr => ::core::fmt::Formatter::write_str(f, "Avr"),
Self::Bpf => ::core::fmt::Formatter::write_str(f, "Bpf"),
Self::CSky => ::core::fmt::Formatter::write_str(f, "CSky"),
Self::Hexagon => ::core::fmt::Formatter::write_str(f, "Hexagon"),
Self::LoongArch32 =>
::core::fmt::Formatter::write_str(f, "LoongArch32"),
Self::LoongArch64 =>
::core::fmt::Formatter::write_str(f, "LoongArch64"),
Self::M68k => ::core::fmt::Formatter::write_str(f, "M68k"),
Self::Mips => ::core::fmt::Formatter::write_str(f, "Mips"),
Self::Mips32r6 =>
::core::fmt::Formatter::write_str(f, "Mips32r6"),
Self::Mips64 => ::core::fmt::Formatter::write_str(f, "Mips64"),
Self::Mips64r6 =>
::core::fmt::Formatter::write_str(f, "Mips64r6"),
Self::Msp430 => ::core::fmt::Formatter::write_str(f, "Msp430"),
Self::Nvptx64 => ::core::fmt::Formatter::write_str(f, "Nvptx64"),
Self::PowerPC => ::core::fmt::Formatter::write_str(f, "PowerPC"),
Self::PowerPC64 =>
::core::fmt::Formatter::write_str(f, "PowerPC64"),
Self::RiscV32 => ::core::fmt::Formatter::write_str(f, "RiscV32"),
Self::RiscV64 => ::core::fmt::Formatter::write_str(f, "RiscV64"),
Self::S390x => ::core::fmt::Formatter::write_str(f, "S390x"),
Self::Sparc => ::core::fmt::Formatter::write_str(f, "Sparc"),
Self::Sparc64 => ::core::fmt::Formatter::write_str(f, "Sparc64"),
Self::SpirV => ::core::fmt::Formatter::write_str(f, "SpirV"),
Self::Wasm32 => ::core::fmt::Formatter::write_str(f, "Wasm32"),
Self::Wasm64 => ::core::fmt::Formatter::write_str(f, "Wasm64"),
Self::X86 => ::core::fmt::Formatter::write_str(f, "X86"),
Self::X86_64 => ::core::fmt::Formatter::write_str(f, "X86_64"),
Self::Xtensa => ::core::fmt::Formatter::write_str(f, "Xtensa"),
Self::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: &Self)
-> ::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: &Self) -> ::core::cmp::Ordering {
match (self, other) {
(Self::Other(__self_0), Self::Other(__arg1_0)) =>
::core::cmp::Ord::cmp(__self_0, __arg1_0),
_ =>
::core::cmp::Ord::cmp(&::core::intrinsics::discriminant_value(self),
&::core::intrinsics::discriminant_value(other)),
}
}
}
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! {
1757 pub enum Arch {
1758 AArch64 = "aarch64",
1759 AmdGpu = "amdgpu",
1760 Arm = "arm",
1761 Arm64EC = "arm64ec",
1762 Avr = "avr",
1763 Bpf = "bpf",
1764 CSky = "csky",
1765 Hexagon = "hexagon",
1766 LoongArch32 = "loongarch32",
1767 LoongArch64 = "loongarch64",
1768 M68k = "m68k",
1769 Mips = "mips",
1770 Mips32r6 = "mips32r6",
1771 Mips64 = "mips64",
1772 Mips64r6 = "mips64r6",
1773 Msp430 = "msp430",
1774 Nvptx64 = "nvptx64",
1775 PowerPC = "powerpc",
1776 PowerPC64 = "powerpc64",
1777 RiscV32 = "riscv32",
1778 RiscV64 = "riscv64",
1779 S390x = "s390x",
1780 Sparc = "sparc",
1781 Sparc64 = "sparc64",
1782 SpirV = "spirv",
1783 Wasm32 = "wasm32",
1784 Wasm64 = "wasm64",
1785 X86 = "x86",
1786 X86_64 = "x86_64",
1787 Xtensa = "xtensa",
1788 }
1789 other_variant = Other;
1790}
1791
1792impl Arch {
1793 pub fn desc_symbol(&self) -> Symbol {
1794 match self {
1795 Self::AArch64 => sym::aarch64,
1796 Self::AmdGpu => sym::amdgpu,
1797 Self::Arm => sym::arm,
1798 Self::Arm64EC => sym::arm64ec,
1799 Self::Avr => sym::avr,
1800 Self::Bpf => sym::bpf,
1801 Self::CSky => sym::csky,
1802 Self::Hexagon => sym::hexagon,
1803 Self::LoongArch32 => sym::loongarch32,
1804 Self::LoongArch64 => sym::loongarch64,
1805 Self::M68k => sym::m68k,
1806 Self::Mips => sym::mips,
1807 Self::Mips32r6 => sym::mips32r6,
1808 Self::Mips64 => sym::mips64,
1809 Self::Mips64r6 => sym::mips64r6,
1810 Self::Msp430 => sym::msp430,
1811 Self::Nvptx64 => sym::nvptx64,
1812 Self::PowerPC => sym::powerpc,
1813 Self::PowerPC64 => sym::powerpc64,
1814 Self::RiscV32 => sym::riscv32,
1815 Self::RiscV64 => sym::riscv64,
1816 Self::S390x => sym::s390x,
1817 Self::Sparc => sym::sparc,
1818 Self::Sparc64 => sym::sparc64,
1819 Self::SpirV => sym::spirv,
1820 Self::Wasm32 => sym::wasm32,
1821 Self::Wasm64 => sym::wasm64,
1822 Self::X86 => sym::x86,
1823 Self::X86_64 => sym::x86_64,
1824 Self::Xtensa => sym::xtensa,
1825 Self::Other(name) => rustc_span::Symbol::intern(name),
1826 }
1827 }
1828
1829 pub fn supports_scalable_vectors(&self) -> bool {
1831 use Arch::*;
1832
1833 match self {
1834 AArch64 | RiscV32 | RiscV64 => true,
1835 AmdGpu | Arm | Arm64EC | Avr | Bpf | CSky | Hexagon | LoongArch32 | LoongArch64
1836 | M68k | Mips | Mips32r6 | Mips64 | Mips64r6 | Msp430 | Nvptx64 | PowerPC
1837 | PowerPC64 | S390x | Sparc | Sparc64 | SpirV | Wasm32 | Wasm64 | X86 | X86_64
1838 | Xtensa | Other(_) => false,
1839 }
1840 }
1841}
1842
1843pub 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) -> Self {
match self {
Self::Aix => Self::Aix,
Self::AmdHsa => Self::AmdHsa,
Self::Android => Self::Android,
Self::Cuda => Self::Cuda,
Self::Cygwin => Self::Cygwin,
Self::Dragonfly => Self::Dragonfly,
Self::Emscripten => Self::Emscripten,
Self::EspIdf => Self::EspIdf,
Self::FreeBsd => Self::FreeBsd,
Self::Fuchsia => Self::Fuchsia,
Self::Haiku => Self::Haiku,
Self::HelenOs => Self::HelenOs,
Self::Hermit => Self::Hermit,
Self::Horizon => Self::Horizon,
Self::Hurd => Self::Hurd,
Self::Illumos => Self::Illumos,
Self::IOs => Self::IOs,
Self::L4Re => Self::L4Re,
Self::Linux => Self::Linux,
Self::LynxOs178 => Self::LynxOs178,
Self::MacOs => Self::MacOs,
Self::Managarm => Self::Managarm,
Self::Motor => Self::Motor,
Self::NetBsd => Self::NetBsd,
Self::None => Self::None,
Self::Nto => Self::Nto,
Self::NuttX => Self::NuttX,
Self::OpenBsd => Self::OpenBsd,
Self::Ps3 => Self::Ps3,
Self::Psp => Self::Psp,
Self::Psx => Self::Psx,
Self::Qnx => Self::Qnx,
Self::Qurt => Self::Qurt,
Self::Redox => Self::Redox,
Self::Rtems => Self::Rtems,
Self::Solaris => Self::Solaris,
Self::SolidAsp3 => Self::SolidAsp3,
Self::TeeOs => Self::TeeOs,
Self::Trusty => Self::Trusty,
Self::TvOs => Self::TvOs,
Self::Uefi => Self::Uefi,
Self::VexOs => Self::VexOs,
Self::VisionOs => Self::VisionOs,
Self::Vita => Self::Vita,
Self::VxWorks => Self::VxWorks,
Self::Wasi => Self::Wasi,
Self::WatchOs => Self::WatchOs,
Self::Windows => Self::Windows,
Self::Xous => Self::Xous,
Self::Zkvm => Self::Zkvm,
Self::Unknown => Self::Unknown,
Self::Other(__self_0) =>
Self::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: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Other(__self_0), Self::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) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state);
match self {
Self::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 {
Self::Aix => ::core::fmt::Formatter::write_str(f, "Aix"),
Self::AmdHsa => ::core::fmt::Formatter::write_str(f, "AmdHsa"),
Self::Android => ::core::fmt::Formatter::write_str(f, "Android"),
Self::Cuda => ::core::fmt::Formatter::write_str(f, "Cuda"),
Self::Cygwin => ::core::fmt::Formatter::write_str(f, "Cygwin"),
Self::Dragonfly =>
::core::fmt::Formatter::write_str(f, "Dragonfly"),
Self::Emscripten =>
::core::fmt::Formatter::write_str(f, "Emscripten"),
Self::EspIdf => ::core::fmt::Formatter::write_str(f, "EspIdf"),
Self::FreeBsd => ::core::fmt::Formatter::write_str(f, "FreeBsd"),
Self::Fuchsia => ::core::fmt::Formatter::write_str(f, "Fuchsia"),
Self::Haiku => ::core::fmt::Formatter::write_str(f, "Haiku"),
Self::HelenOs => ::core::fmt::Formatter::write_str(f, "HelenOs"),
Self::Hermit => ::core::fmt::Formatter::write_str(f, "Hermit"),
Self::Horizon => ::core::fmt::Formatter::write_str(f, "Horizon"),
Self::Hurd => ::core::fmt::Formatter::write_str(f, "Hurd"),
Self::Illumos => ::core::fmt::Formatter::write_str(f, "Illumos"),
Self::IOs => ::core::fmt::Formatter::write_str(f, "IOs"),
Self::L4Re => ::core::fmt::Formatter::write_str(f, "L4Re"),
Self::Linux => ::core::fmt::Formatter::write_str(f, "Linux"),
Self::LynxOs178 =>
::core::fmt::Formatter::write_str(f, "LynxOs178"),
Self::MacOs => ::core::fmt::Formatter::write_str(f, "MacOs"),
Self::Managarm =>
::core::fmt::Formatter::write_str(f, "Managarm"),
Self::Motor => ::core::fmt::Formatter::write_str(f, "Motor"),
Self::NetBsd => ::core::fmt::Formatter::write_str(f, "NetBsd"),
Self::None => ::core::fmt::Formatter::write_str(f, "None"),
Self::Nto => ::core::fmt::Formatter::write_str(f, "Nto"),
Self::NuttX => ::core::fmt::Formatter::write_str(f, "NuttX"),
Self::OpenBsd => ::core::fmt::Formatter::write_str(f, "OpenBsd"),
Self::Ps3 => ::core::fmt::Formatter::write_str(f, "Ps3"),
Self::Psp => ::core::fmt::Formatter::write_str(f, "Psp"),
Self::Psx => ::core::fmt::Formatter::write_str(f, "Psx"),
Self::Qnx => ::core::fmt::Formatter::write_str(f, "Qnx"),
Self::Qurt => ::core::fmt::Formatter::write_str(f, "Qurt"),
Self::Redox => ::core::fmt::Formatter::write_str(f, "Redox"),
Self::Rtems => ::core::fmt::Formatter::write_str(f, "Rtems"),
Self::Solaris => ::core::fmt::Formatter::write_str(f, "Solaris"),
Self::SolidAsp3 =>
::core::fmt::Formatter::write_str(f, "SolidAsp3"),
Self::TeeOs => ::core::fmt::Formatter::write_str(f, "TeeOs"),
Self::Trusty => ::core::fmt::Formatter::write_str(f, "Trusty"),
Self::TvOs => ::core::fmt::Formatter::write_str(f, "TvOs"),
Self::Uefi => ::core::fmt::Formatter::write_str(f, "Uefi"),
Self::VexOs => ::core::fmt::Formatter::write_str(f, "VexOs"),
Self::VisionOs =>
::core::fmt::Formatter::write_str(f, "VisionOs"),
Self::Vita => ::core::fmt::Formatter::write_str(f, "Vita"),
Self::VxWorks => ::core::fmt::Formatter::write_str(f, "VxWorks"),
Self::Wasi => ::core::fmt::Formatter::write_str(f, "Wasi"),
Self::WatchOs => ::core::fmt::Formatter::write_str(f, "WatchOs"),
Self::Windows => ::core::fmt::Formatter::write_str(f, "Windows"),
Self::Xous => ::core::fmt::Formatter::write_str(f, "Xous"),
Self::Zkvm => ::core::fmt::Formatter::write_str(f, "Zkvm"),
Self::Unknown => ::core::fmt::Formatter::write_str(f, "Unknown"),
Self::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: &Self)
-> ::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: &Self) -> ::core::cmp::Ordering {
match (self, other) {
(Self::Other(__self_0), Self::Other(__arg1_0)) =>
::core::cmp::Ord::cmp(__self_0, __arg1_0),
_ =>
::core::cmp::Ord::cmp(&::core::intrinsics::discriminant_value(self),
&::core::intrinsics::discriminant_value(other)),
}
}
}
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! {
1844 pub enum Os {
1845 Aix = "aix",
1846 AmdHsa = "amdhsa",
1847 Android = "android",
1848 Cuda = "cuda",
1849 Cygwin = "cygwin",
1850 Dragonfly = "dragonfly",
1851 Emscripten = "emscripten",
1852 EspIdf = "espidf",
1853 FreeBsd = "freebsd",
1854 Fuchsia = "fuchsia",
1855 Haiku = "haiku",
1856 HelenOs = "helenos",
1857 Hermit = "hermit",
1858 Horizon = "horizon",
1859 Hurd = "hurd",
1860 Illumos = "illumos",
1861 IOs = "ios",
1862 L4Re = "l4re",
1863 Linux = "linux",
1864 LynxOs178 = "lynxos178",
1865 MacOs = "macos",
1866 Managarm = "managarm",
1867 Motor = "motor",
1868 NetBsd = "netbsd",
1869 None = "none",
1870 Nto = "nto",
1871 NuttX = "nuttx",
1872 OpenBsd = "openbsd",
1873 Ps3 = "ps3",
1874 Psp = "psp",
1875 Psx = "psx",
1876 Qnx = "qnx",
1877 Qurt = "qurt",
1878 Redox = "redox",
1879 Rtems = "rtems",
1880 Solaris = "solaris",
1881 SolidAsp3 = "solid_asp3",
1882 TeeOs = "teeos",
1883 Trusty = "trusty",
1884 TvOs = "tvos",
1885 Uefi = "uefi",
1886 VexOs = "vexos",
1887 VisionOs = "visionos",
1888 Vita = "vita",
1889 VxWorks = "vxworks",
1890 Wasi = "wasi",
1891 WatchOs = "watchos",
1892 Windows = "windows",
1893 Xous = "xous",
1894 Zkvm = "zkvm",
1895 Unknown = "unknown",
1896 }
1897 other_variant = Other;
1898}
1899
1900impl Os {
1901 pub fn desc_symbol(&self) -> Symbol {
1902 Symbol::intern(self.desc())
1903 }
1904}
1905
1906pub 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) -> Self {
match self {
Self::Gnu => Self::Gnu,
Self::MacAbi => Self::MacAbi,
Self::Mlibc => Self::Mlibc,
Self::Msvc => Self::Msvc,
Self::Musl => Self::Musl,
Self::Newlib => Self::Newlib,
Self::Nto70 => Self::Nto70,
Self::Nto71 => Self::Nto71,
Self::Nto71IoSock => Self::Nto71IoSock,
Self::Ohos => Self::Ohos,
Self::Relibc => Self::Relibc,
Self::Sgx => Self::Sgx,
Self::Sim => Self::Sim,
Self::P1 => Self::P1,
Self::P2 => Self::P2,
Self::P3 => Self::P3,
Self::Uclibc => Self::Uclibc,
Self::V5 => Self::V5,
Self::Unspecified => Self::Unspecified,
Self::Other(__self_0) =>
Self::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: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Other(__self_0), Self::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) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state);
match self {
Self::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 {
Self::Gnu => ::core::fmt::Formatter::write_str(f, "Gnu"),
Self::MacAbi => ::core::fmt::Formatter::write_str(f, "MacAbi"),
Self::Mlibc => ::core::fmt::Formatter::write_str(f, "Mlibc"),
Self::Msvc => ::core::fmt::Formatter::write_str(f, "Msvc"),
Self::Musl => ::core::fmt::Formatter::write_str(f, "Musl"),
Self::Newlib => ::core::fmt::Formatter::write_str(f, "Newlib"),
Self::Nto70 => ::core::fmt::Formatter::write_str(f, "Nto70"),
Self::Nto71 => ::core::fmt::Formatter::write_str(f, "Nto71"),
Self::Nto71IoSock =>
::core::fmt::Formatter::write_str(f, "Nto71IoSock"),
Self::Ohos => ::core::fmt::Formatter::write_str(f, "Ohos"),
Self::Relibc => ::core::fmt::Formatter::write_str(f, "Relibc"),
Self::Sgx => ::core::fmt::Formatter::write_str(f, "Sgx"),
Self::Sim => ::core::fmt::Formatter::write_str(f, "Sim"),
Self::P1 => ::core::fmt::Formatter::write_str(f, "P1"),
Self::P2 => ::core::fmt::Formatter::write_str(f, "P2"),
Self::P3 => ::core::fmt::Formatter::write_str(f, "P3"),
Self::Uclibc => ::core::fmt::Formatter::write_str(f, "Uclibc"),
Self::V5 => ::core::fmt::Formatter::write_str(f, "V5"),
Self::Unspecified =>
::core::fmt::Formatter::write_str(f, "Unspecified"),
Self::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: &Self)
-> ::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: &Self) -> ::core::cmp::Ordering {
match (self, other) {
(Self::Other(__self_0), Self::Other(__arg1_0)) =>
::core::cmp::Ord::cmp(__self_0, __arg1_0),
_ =>
::core::cmp::Ord::cmp(&::core::intrinsics::discriminant_value(self),
&::core::intrinsics::discriminant_value(other)),
}
}
}
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! {
1907 pub enum Env {
1908 Gnu = "gnu",
1909 MacAbi = "macabi",
1910 Mlibc = "mlibc",
1911 Msvc = "msvc",
1912 Musl = "musl",
1913 Newlib = "newlib",
1914 Nto70 = "nto70",
1915 Nto71 = "nto71",
1916 Nto71IoSock = "nto71_iosock",
1917 Ohos = "ohos",
1918 Relibc = "relibc",
1919 Sgx = "sgx",
1920 Sim = "sim",
1921 P1 = "p1",
1922 P2 = "p2",
1923 P3 = "p3",
1924 Uclibc = "uclibc",
1925 V5 = "v5",
1926 Unspecified = "",
1927 }
1928 other_variant = Other;
1929}
1930
1931impl Env {
1932 pub fn desc_symbol(&self) -> Symbol {
1933 Symbol::intern(self.desc())
1934 }
1935}
1936
1937#[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,
X32,
V8Plus,
Unspecified,
Other(crate::spec::StaticCow<str>),
}
#[automatically_derived]
impl ::core::clone::Clone for CfgAbi {
#[inline]
fn clone(&self) -> Self {
match self {
Self::Abi64 => Self::Abi64,
Self::AbiV2 => Self::AbiV2,
Self::AbiV2Hf => Self::AbiV2Hf,
Self::Eabi => Self::Eabi,
Self::EabiHf => Self::EabiHf,
Self::ElfV1 => Self::ElfV1,
Self::ElfV2 => Self::ElfV2,
Self::Fortanix => Self::Fortanix,
Self::Ilp32 => Self::Ilp32,
Self::Ilp32e => Self::Ilp32e,
Self::Llvm => Self::Llvm,
Self::MacAbi => Self::MacAbi,
Self::Pauthtest => Self::Pauthtest,
Self::Sim => Self::Sim,
Self::SoftFloat => Self::SoftFloat,
Self::Spe => Self::Spe,
Self::Uwp => Self::Uwp,
Self::VecDefault => Self::VecDefault,
Self::X32 => Self::X32,
Self::V8Plus => Self::V8Plus,
Self::Unspecified => Self::Unspecified,
Self::Other(__self_0) =>
Self::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: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Other(__self_0), Self::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) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state);
match self {
Self::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 {
Self::Abi64 => ::core::fmt::Formatter::write_str(f, "Abi64"),
Self::AbiV2 => ::core::fmt::Formatter::write_str(f, "AbiV2"),
Self::AbiV2Hf => ::core::fmt::Formatter::write_str(f, "AbiV2Hf"),
Self::Eabi => ::core::fmt::Formatter::write_str(f, "Eabi"),
Self::EabiHf => ::core::fmt::Formatter::write_str(f, "EabiHf"),
Self::ElfV1 => ::core::fmt::Formatter::write_str(f, "ElfV1"),
Self::ElfV2 => ::core::fmt::Formatter::write_str(f, "ElfV2"),
Self::Fortanix =>
::core::fmt::Formatter::write_str(f, "Fortanix"),
Self::Ilp32 => ::core::fmt::Formatter::write_str(f, "Ilp32"),
Self::Ilp32e => ::core::fmt::Formatter::write_str(f, "Ilp32e"),
Self::Llvm => ::core::fmt::Formatter::write_str(f, "Llvm"),
Self::MacAbi => ::core::fmt::Formatter::write_str(f, "MacAbi"),
Self::Pauthtest =>
::core::fmt::Formatter::write_str(f, "Pauthtest"),
Self::Sim => ::core::fmt::Formatter::write_str(f, "Sim"),
Self::SoftFloat =>
::core::fmt::Formatter::write_str(f, "SoftFloat"),
Self::Spe => ::core::fmt::Formatter::write_str(f, "Spe"),
Self::Uwp => ::core::fmt::Formatter::write_str(f, "Uwp"),
Self::VecDefault =>
::core::fmt::Formatter::write_str(f, "VecDefault"),
Self::X32 => ::core::fmt::Formatter::write_str(f, "X32"),
Self::V8Plus => ::core::fmt::Formatter::write_str(f, "V8Plus"),
Self::Unspecified =>
::core::fmt::Formatter::write_str(f, "Unspecified"),
Self::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: &Self)
-> ::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: &Self) -> ::core::cmp::Ordering {
match (self, other) {
(Self::Other(__self_0), Self::Other(__arg1_0)) =>
::core::cmp::Ord::cmp(__self_0, __arg1_0),
_ =>
::core::cmp::Ord::cmp(&::core::intrinsics::discriminant_value(self),
&::core::intrinsics::discriminant_value(other)),
}
}
}
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,
"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::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! {
1938 pub enum CfgAbi {
1942 Abi64 = "abi64",
1943 AbiV2 = "abiv2",
1944 AbiV2Hf = "abiv2hf",
1945 Eabi = "eabi",
1946 EabiHf = "eabihf",
1947 ElfV1 = "elfv1",
1948 ElfV2 = "elfv2",
1949 Fortanix = "fortanix",
1950 Ilp32 = "ilp32",
1951 Ilp32e = "ilp32e",
1952 Llvm = "llvm",
1953 MacAbi = "macabi",
1954 Pauthtest = "pauthtest",
1955 Sim = "sim",
1956 SoftFloat = "softfloat",
1957 Spe = "spe",
1958 Uwp = "uwp",
1959 VecDefault = "vec-default",
1960 X32 = "x32",
1961 V8Plus = "v8plus",
1962 Unspecified = "",
1963 }
1964 other_variant = Other;
1965}
1966
1967impl CfgAbi {
1968 pub fn desc_symbol(&self) -> Symbol {
1969 Symbol::intern(self.desc())
1970 }
1971}
1972
1973#[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) -> Self {
match self {
Self::Ilp32 => Self::Ilp32,
Self::Ilp32f => Self::Ilp32f,
Self::Ilp32d => Self::Ilp32d,
Self::Ilp32e => Self::Ilp32e,
Self::Ilp32s => Self::Ilp32s,
Self::Lp64 => Self::Lp64,
Self::Lp64f => Self::Lp64f,
Self::Lp64d => Self::Lp64d,
Self::Lp64e => Self::Lp64e,
Self::Lp64s => Self::Lp64s,
Self::O32 => Self::O32,
Self::N32 => Self::N32,
Self::N64 => Self::N64,
Self::ElfV1 => Self::ElfV1,
Self::ElfV2 => Self::ElfV2,
Self::Pauthtest => Self::Pauthtest,
Self::Unspecified => Self::Unspecified,
Self::Other(__self_0) =>
Self::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: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Other(__self_0), Self::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) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state);
match self {
Self::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 {
Self::Ilp32 => ::core::fmt::Formatter::write_str(f, "Ilp32"),
Self::Ilp32f => ::core::fmt::Formatter::write_str(f, "Ilp32f"),
Self::Ilp32d => ::core::fmt::Formatter::write_str(f, "Ilp32d"),
Self::Ilp32e => ::core::fmt::Formatter::write_str(f, "Ilp32e"),
Self::Ilp32s => ::core::fmt::Formatter::write_str(f, "Ilp32s"),
Self::Lp64 => ::core::fmt::Formatter::write_str(f, "Lp64"),
Self::Lp64f => ::core::fmt::Formatter::write_str(f, "Lp64f"),
Self::Lp64d => ::core::fmt::Formatter::write_str(f, "Lp64d"),
Self::Lp64e => ::core::fmt::Formatter::write_str(f, "Lp64e"),
Self::Lp64s => ::core::fmt::Formatter::write_str(f, "Lp64s"),
Self::O32 => ::core::fmt::Formatter::write_str(f, "O32"),
Self::N32 => ::core::fmt::Formatter::write_str(f, "N32"),
Self::N64 => ::core::fmt::Formatter::write_str(f, "N64"),
Self::ElfV1 => ::core::fmt::Formatter::write_str(f, "ElfV1"),
Self::ElfV2 => ::core::fmt::Formatter::write_str(f, "ElfV2"),
Self::Pauthtest =>
::core::fmt::Formatter::write_str(f, "Pauthtest"),
Self::Unspecified =>
::core::fmt::Formatter::write_str(f, "Unspecified"),
Self::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: &Self)
-> ::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: &Self) -> ::core::cmp::Ordering {
match (self, other) {
(Self::Other(__self_0), Self::Other(__arg1_0)) =>
::core::cmp::Ord::cmp(__self_0, __arg1_0),
_ =>
::core::cmp::Ord::cmp(&::core::intrinsics::discriminant_value(self),
&::core::intrinsics::discriminant_value(other)),
}
}
}
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! {
1974 pub enum LlvmAbi {
1977 Ilp32 = "ilp32",
1979 Ilp32f = "ilp32f",
1980 Ilp32d = "ilp32d",
1981 Ilp32e = "ilp32e",
1982 Ilp32s = "ilp32s",
1983 Lp64 = "lp64",
1984 Lp64f = "lp64f",
1985 Lp64d = "lp64d",
1986 Lp64e = "lp64e",
1987 Lp64s = "lp64s",
1988 O32 = "o32",
1990 N32 = "n32",
1991 N64 = "n64",
1992 ElfV1 = "elfv1",
1994 ElfV2 = "elfv2",
1995 Pauthtest = "pauthtest",
1997
1998 Unspecified = "",
1999 }
2000 other_variant = Other;
2001}
2002
2003#[derive(#[automatically_derived]
impl ::core::marker::StructuralPartialEq for Target { }
#[automatically_derived]
impl ::core::cmp::PartialEq for Target {
#[inline]
fn eq(&self, other: &Self) -> 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) -> Self {
Self {
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)]
2007pub struct Target {
2008 pub llvm_target: StaticCow<str>,
2015 pub metadata: TargetMetadata,
2018 pub pointer_width: u16,
2020 pub arch: Arch,
2023 pub data_layout: StaticCow<str>,
2025 pub options: TargetOptions,
2027}
2028
2029#[derive(#[automatically_derived]
impl ::core::default::Default for TargetMetadata {
#[inline]
fn default() -> Self {
Self {
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: &Self) -> 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) -> Self {
Self {
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)]
2033pub struct TargetMetadata {
2034 pub description: Option<StaticCow<str>>,
2037 pub tier: Option<u64>,
2039 pub host_tools: Option<bool>,
2041 pub std: Option<bool>,
2044}
2045
2046impl Target {
2047 pub fn parse_data_layout(&self) -> Result<TargetDataLayout, TargetDataLayoutError<'_>> {
2048 let mut dl = TargetDataLayout::parse_from_llvm_datalayout_string(
2049 &self.data_layout,
2050 self.options.default_address_space,
2051 )?;
2052
2053 if dl.endian != self.endian {
2055 return Err(TargetDataLayoutError::InconsistentTargetArchitecture {
2056 dl: dl.endian.as_str(),
2057 target: self.endian.as_str(),
2058 });
2059 }
2060
2061 let target_pointer_width: u64 = self.pointer_width.into();
2062 let dl_pointer_size: u64 = dl.pointer_size().bits();
2063 if dl_pointer_size != target_pointer_width {
2064 return Err(TargetDataLayoutError::InconsistentTargetPointerWidth {
2065 pointer_size: dl_pointer_size,
2066 target: self.pointer_width,
2067 });
2068 }
2069
2070 dl.c_enum_min_size = Integer::from_size(Size::from_bits(
2071 self.c_enum_min_bits.unwrap_or(self.c_int_width as _),
2072 ))
2073 .map_err(|err| TargetDataLayoutError::InvalidBitsSize { err })?;
2074
2075 Ok(dl)
2076 }
2077
2078 pub fn supports_c_variadic_definitions(&self) -> CVariadicStatus {
2079 use Arch::*;
2080
2081 match self.arch {
2082 Bpf | SpirV => CVariadicStatus::NotSupported,
2084
2085 RiscV32 if self.llvm_abiname == LlvmAbi::Ilp32e => {
2093 CVariadicStatus::Unstable { feature: sym::c_variadic_experimental_arch }
2094 }
2095
2096 Other(_) => CVariadicStatus::Unstable { feature: sym::c_variadic_experimental_arch },
2099
2100 Sparc | Avr | M68k | Msp430 => {
2120 CVariadicStatus::Unstable { feature: sym::c_variadic_experimental_arch }
2121 }
2122
2123 AArch64 | AmdGpu | Arm | Arm64EC | CSky | Hexagon | LoongArch32 | LoongArch64
2124 | Mips | Mips32r6 | Mips64 | Mips64r6 | Nvptx64 | PowerPC | PowerPC64 | RiscV32
2125 | RiscV64 | S390x | Sparc64 | Wasm32 | Wasm64 | X86 | X86_64 | Xtensa => {
2126 CVariadicStatus::Stable
2127 }
2128 }
2129 }
2130
2131 pub fn singlethread(&self, target_features: &FxIndexSet<Symbol>) -> bool {
2136 if self.singlethread && self.is_like_wasm && target_features.contains(&sym::atomics) {
2145 return false;
2146 }
2147
2148 self.singlethread
2149 }
2150}
2151
2152pub trait HasTargetSpec {
2153 fn target_spec(&self) -> &Target;
2154}
2155
2156impl HasTargetSpec for Target {
2157 #[inline]
2158 fn target_spec(&self) -> &Target {
2159 self
2160 }
2161}
2162
2163#[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) -> Self {
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: &Self) -> 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)]
2165pub struct X86Abi {
2166 pub regparm: Option<u32>,
2169 pub reg_struct_return: bool,
2171}
2172
2173pub trait HasX86AbiOpt {
2174 fn x86_abi_opt(&self) -> X86Abi;
2175}
2176
2177type StaticCow<T> = Cow<'static, T>;
2178
2179#[derive(#[automatically_derived]
impl ::core::marker::StructuralPartialEq for TargetOptions { }
#[automatically_derived]
impl ::core::cmp::PartialEq for TargetOptions {
#[inline]
fn eq(&self, other: &Self) -> 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) -> Self {
Self {
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)]
2188#[rustc_lint_opt_ty]
2189pub struct TargetOptions {
2190 pub endian: Endian,
2192 pub c_int_width: u16,
2194 pub os: Os,
2199 pub env: Env,
2201 pub cfg_abi: CfgAbi,
2213 #[rustc_lint_opt_deny_field_access(
2215 "use `Target::is_like_*` instead of this field; see https://github.com/rust-lang/rust/issues/100343 for rationale"
2216 )]
2217 vendor: StaticCow<str>,
2218
2219 pub linker: Option<StaticCow<str>>,
2221 pub linker_flavor: LinkerFlavor,
2224 linker_flavor_json: LinkerFlavorCli,
2225 lld_flavor_json: LldFlavor,
2226 linker_is_gnu_json: bool,
2227
2228 pub pre_link_objects: CrtObjects,
2230 pub post_link_objects: CrtObjects,
2231 pub pre_link_objects_self_contained: CrtObjects,
2233 pub post_link_objects_self_contained: CrtObjects,
2234 pub link_self_contained: LinkSelfContainedDefault,
2237
2238 pub pre_link_args: LinkArgs,
2240 pre_link_args_json: LinkArgsCli,
2241 pub late_link_args: LinkArgs,
2245 late_link_args_json: LinkArgsCli,
2246 pub late_link_args_dynamic: LinkArgs,
2249 late_link_args_dynamic_json: LinkArgsCli,
2250 pub late_link_args_static: LinkArgs,
2253 late_link_args_static_json: LinkArgsCli,
2254 pub post_link_args: LinkArgs,
2257 post_link_args_json: LinkArgsCli,
2258
2259 pub link_script: Option<StaticCow<str>>,
2263 pub link_env: StaticCow<[(StaticCow<str>, StaticCow<str>)]>,
2265 pub link_env_remove: StaticCow<[StaticCow<str>]>,
2267
2268 pub asm_args: StaticCow<[StaticCow<str>]>,
2270
2271 pub cpu: StaticCow<str>,
2274 pub need_explicit_cpu: bool,
2278 pub requires_consistent_cpu: bool,
2282 pub unsupported_cpus: StaticCow<[StaticCow<str>]>,
2286 pub features: StaticCow<str>,
2295 pub direct_access_external_data: Option<bool>,
2297 pub dynamic_linking: bool,
2299 pub dll_tls_export: bool,
2301 pub only_cdylib: bool,
2303 pub executables: bool,
2305 pub relocation_model: RelocModel,
2308 pub code_model: Option<CodeModel>,
2311 pub tls_model: TlsModel,
2314 pub disable_redzone: bool,
2316 pub frame_pointer: FramePointer,
2318 pub function_sections: bool,
2320 pub dll_prefix: StaticCow<str>,
2322 pub dll_suffix: StaticCow<str>,
2324 pub exe_suffix: StaticCow<str>,
2326 pub staticlib_prefix: StaticCow<str>,
2328 pub staticlib_suffix: StaticCow<str>,
2330 pub families: StaticCow<[StaticCow<str>]>,
2336 pub abi_return_struct_as_int: bool,
2338 pub is_like_aix: bool,
2341 pub is_like_darwin: bool,
2346 pub is_like_gpu: bool,
2348 pub is_like_solaris: bool,
2352 pub is_like_windows: bool,
2360 pub is_like_msvc: bool,
2370 pub is_like_wasm: bool,
2372 pub is_like_android: bool,
2374 pub is_like_vexos: bool,
2376 pub binary_format: BinaryFormat,
2378 pub default_dwarf_version: u32,
2381 pub has_rpath: bool,
2383 pub no_default_libraries: bool,
2386 pub position_independent_executables: bool,
2392 pub static_position_independent_executables: bool,
2394 pub plt_by_default: bool,
2397 pub relro_level: RelroLevel,
2401 pub archive_format: StaticCow<str>,
2406 pub allow_asm: bool,
2408 pub static_initializer_must_be_acyclic: bool,
2411 pub main_needs_argc_argv: bool,
2414
2415 pub has_thread_local: bool,
2417 pub obj_is_bitcode: bool,
2421
2422 pub min_atomic_width: Option<u64>,
2424
2425 pub max_atomic_width: Option<u64>,
2427
2428 pub atomic_cas: bool,
2430
2431 pub panic_strategy: PanicStrategy,
2433
2434 pub crt_static_allows_dylibs: bool,
2436 pub crt_static_default: bool,
2438 pub crt_static_respected: bool,
2440
2441 pub stack_probes: StackProbeType,
2443
2444 pub min_global_align: Option<Align>,
2446
2447 pub default_codegen_units: Option<u64>,
2449
2450 pub default_codegen_backend: Option<StaticCow<str>>,
2460
2461 pub trap_unreachable: bool,
2464
2465 pub requires_lto: bool,
2468
2469 singlethread: bool,
2472
2473 pub no_builtins: bool,
2476
2477 pub default_visibility: Option<SymbolVisibility>,
2483
2484 pub emit_debug_gdb_scripts: bool,
2486
2487 pub requires_uwtable: bool,
2491
2492 pub default_uwtable: bool,
2495
2496 pub simd_types_indirect: bool,
2501
2502 pub limit_rdylib_exports: bool,
2504
2505 pub override_export_symbols: Option<StaticCow<[StaticCow<str>]>>,
2508
2509 pub merge_functions: MergeFunctions,
2516
2517 pub mcount: StaticCow<str>,
2519
2520 pub llvm_mcount_intrinsic: Option<StaticCow<str>>,
2522
2523 pub llvm_abiname: LlvmAbi,
2526
2527 pub llvm_floatabi: Option<FloatAbi>,
2534
2535 pub rustc_abi: Option<RustcAbi>,
2539
2540 pub relax_elf_relocations: bool,
2542
2543 pub llvm_args: StaticCow<[StaticCow<str>]>,
2545
2546 pub use_ctors_section: bool,
2549
2550 pub eh_frame_header: bool,
2554
2555 pub has_thumb_interworking: bool,
2558
2559 pub debuginfo_kind: DebuginfoKind,
2561 pub split_debuginfo: SplitDebuginfo,
2564 pub supported_split_debuginfo: StaticCow<[SplitDebuginfo]>,
2566
2567 pub supported_sanitizers: SanitizerSet,
2573
2574 pub default_sanitizers: SanitizerSet,
2580
2581 pub c_enum_min_bits: Option<u64>,
2583
2584 pub generate_arange_section: bool,
2586
2587 pub supports_stack_protector: bool,
2590
2591 pub entry_name: StaticCow<str>,
2594
2595 pub entry_abi: CanonAbi,
2598
2599 pub supports_fentry: bool,
2601
2602 pub supports_xray: bool,
2604
2605 pub default_address_space: rustc_abi::AddressSpace,
2609
2610 small_data_threshold_support: SmallDataThresholdSupport,
2612}
2613
2614fn add_link_args_iter(
2617 link_args: &mut LinkArgs,
2618 flavor: LinkerFlavor,
2619 args: impl Iterator<Item = StaticCow<str>> + Clone,
2620) {
2621 let mut insert = |flavor| link_args.entry(flavor).or_default().extend(args.clone());
2622 insert(flavor);
2623 match flavor {
2624 LinkerFlavor::Gnu(cc, lld) => {
2625 {
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);
2626 insert(LinkerFlavor::Gnu(cc, Lld::Yes));
2627 }
2628 LinkerFlavor::Darwin(cc, lld) => {
2629 {
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);
2630 insert(LinkerFlavor::Darwin(cc, Lld::Yes));
2631 }
2632 LinkerFlavor::Msvc(lld) => {
2633 {
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);
2634 insert(LinkerFlavor::Msvc(Lld::Yes));
2635 }
2636 LinkerFlavor::WasmLld(..)
2637 | LinkerFlavor::Unix(..)
2638 | LinkerFlavor::EmCc
2639 | LinkerFlavor::Bpf
2640 | LinkerFlavor::Llbc => {}
2641 }
2642}
2643
2644fn add_link_args(link_args: &mut LinkArgs, flavor: LinkerFlavor, args: &[&'static str]) {
2645 add_link_args_iter(link_args, flavor, args.iter().copied().map(Cow::Borrowed))
2646}
2647
2648impl TargetOptions {
2649 pub fn supports_comdat(&self) -> bool {
2650 !self.is_like_aix && !self.is_like_darwin
2652 }
2653
2654 pub fn uses_pdb_debuginfo(&self) -> bool {
2655 self.debuginfo_kind == DebuginfoKind::Pdb
2656 }
2657}
2658
2659impl TargetOptions {
2660 fn link_args(flavor: LinkerFlavor, args: &[&'static str]) -> LinkArgs {
2661 let mut link_args = LinkArgs::new();
2662 add_link_args(&mut link_args, flavor, args);
2663 link_args
2664 }
2665
2666 fn add_pre_link_args(&mut self, flavor: LinkerFlavor, args: &[&'static str]) {
2667 add_link_args(&mut self.pre_link_args, flavor, args);
2668 }
2669
2670 fn update_from_cli(&mut self) {
2671 self.linker_flavor = LinkerFlavor::from_cli_json(
2672 self.linker_flavor_json,
2673 self.lld_flavor_json,
2674 self.linker_is_gnu_json,
2675 );
2676 for (args, args_json) in [
2677 (&mut self.pre_link_args, &self.pre_link_args_json),
2678 (&mut self.late_link_args, &self.late_link_args_json),
2679 (&mut self.late_link_args_dynamic, &self.late_link_args_dynamic_json),
2680 (&mut self.late_link_args_static, &self.late_link_args_static_json),
2681 (&mut self.post_link_args, &self.post_link_args_json),
2682 ] {
2683 args.clear();
2684 for (flavor, args_json) in args_json {
2685 let linker_flavor = self.linker_flavor.with_cli_hints(*flavor);
2686 let linker_flavor = match linker_flavor {
2688 LinkerFlavor::Gnu(cc, _) => LinkerFlavor::Gnu(cc, Lld::No),
2689 LinkerFlavor::Darwin(cc, _) => LinkerFlavor::Darwin(cc, Lld::No),
2690 LinkerFlavor::Msvc(_) => LinkerFlavor::Msvc(Lld::No),
2691 _ => linker_flavor,
2692 };
2693 if !args.contains_key(&linker_flavor) {
2694 add_link_args_iter(args, linker_flavor, args_json.iter().cloned());
2695 }
2696 }
2697 }
2698 }
2699
2700 fn update_to_cli(&mut self) {
2701 self.linker_flavor_json = self.linker_flavor.to_cli_counterpart();
2702 self.lld_flavor_json = self.linker_flavor.lld_flavor();
2703 self.linker_is_gnu_json = self.linker_flavor.is_gnu();
2704 for (args, args_json) in [
2705 (&self.pre_link_args, &mut self.pre_link_args_json),
2706 (&self.late_link_args, &mut self.late_link_args_json),
2707 (&self.late_link_args_dynamic, &mut self.late_link_args_dynamic_json),
2708 (&self.late_link_args_static, &mut self.late_link_args_static_json),
2709 (&self.post_link_args, &mut self.post_link_args_json),
2710 ] {
2711 *args_json = args
2712 .iter()
2713 .map(|(flavor, args)| (flavor.to_cli_counterpart(), args.clone()))
2714 .collect();
2715 }
2716 }
2717}
2718
2719impl Default for TargetOptions {
2720 fn default() -> TargetOptions {
2723 TargetOptions {
2724 endian: Endian::Little,
2725 c_int_width: 32,
2726 os: Os::None,
2727 env: Env::Unspecified,
2728 cfg_abi: CfgAbi::Unspecified,
2729 vendor: "unknown".into(),
2730 linker: ::core::option::Option::None::<&'static str>option_env!("CFG_DEFAULT_LINKER").map(|s| s.into()),
2731 linker_flavor: LinkerFlavor::Gnu(Cc::Yes, Lld::No),
2732 linker_flavor_json: LinkerFlavorCli::Gcc,
2733 lld_flavor_json: LldFlavor::Ld,
2734 linker_is_gnu_json: true,
2735 link_script: None,
2736 asm_args: ::std::borrow::Cow::Borrowed(&[])cvs![],
2737 cpu: "generic".into(),
2738 need_explicit_cpu: false,
2739 requires_consistent_cpu: false,
2740 unsupported_cpus: ::std::borrow::Cow::Borrowed(&[])cvs![],
2741 features: "".into(),
2742 direct_access_external_data: None,
2743 dynamic_linking: false,
2744 dll_tls_export: true,
2745 only_cdylib: false,
2746 executables: true,
2747 relocation_model: RelocModel::Pic,
2748 code_model: None,
2749 tls_model: TlsModel::GeneralDynamic,
2750 disable_redzone: false,
2751 frame_pointer: FramePointer::MayOmit,
2752 function_sections: true,
2753 dll_prefix: "lib".into(),
2754 dll_suffix: ".so".into(),
2755 exe_suffix: "".into(),
2756 staticlib_prefix: "lib".into(),
2757 staticlib_suffix: ".a".into(),
2758 families: ::std::borrow::Cow::Borrowed(&[])cvs![],
2759 abi_return_struct_as_int: false,
2760 is_like_aix: false,
2761 is_like_darwin: false,
2762 is_like_gpu: false,
2763 is_like_solaris: false,
2764 is_like_windows: false,
2765 is_like_msvc: false,
2766 is_like_wasm: false,
2767 is_like_android: false,
2768 is_like_vexos: false,
2769 binary_format: BinaryFormat::Elf,
2770 default_dwarf_version: 4,
2771 has_rpath: false,
2772 no_default_libraries: true,
2773 position_independent_executables: false,
2774 static_position_independent_executables: false,
2775 plt_by_default: true,
2776 relro_level: RelroLevel::None,
2777 pre_link_objects: Default::default(),
2778 post_link_objects: Default::default(),
2779 pre_link_objects_self_contained: Default::default(),
2780 post_link_objects_self_contained: Default::default(),
2781 link_self_contained: LinkSelfContainedDefault::False,
2782 pre_link_args: LinkArgs::new(),
2783 pre_link_args_json: LinkArgsCli::new(),
2784 late_link_args: LinkArgs::new(),
2785 late_link_args_json: LinkArgsCli::new(),
2786 late_link_args_dynamic: LinkArgs::new(),
2787 late_link_args_dynamic_json: LinkArgsCli::new(),
2788 late_link_args_static: LinkArgs::new(),
2789 late_link_args_static_json: LinkArgsCli::new(),
2790 post_link_args: LinkArgs::new(),
2791 post_link_args_json: LinkArgsCli::new(),
2792 link_env: ::std::borrow::Cow::Borrowed(&[])cvs![],
2793 link_env_remove: ::std::borrow::Cow::Borrowed(&[])cvs![],
2794 archive_format: "gnu".into(),
2795 main_needs_argc_argv: true,
2796 allow_asm: true,
2797 static_initializer_must_be_acyclic: false,
2798 has_thread_local: false,
2799 obj_is_bitcode: false,
2800 min_atomic_width: None,
2801 max_atomic_width: None,
2802 atomic_cas: true,
2803 panic_strategy: PanicStrategy::Unwind,
2804 crt_static_allows_dylibs: false,
2805 crt_static_default: false,
2806 crt_static_respected: false,
2807 stack_probes: StackProbeType::None,
2808 min_global_align: None,
2809 default_codegen_units: None,
2810 default_codegen_backend: None,
2811 trap_unreachable: true,
2812 requires_lto: false,
2813 singlethread: false,
2814 no_builtins: false,
2815 default_visibility: None,
2816 emit_debug_gdb_scripts: true,
2817 requires_uwtable: false,
2818 default_uwtable: false,
2819 simd_types_indirect: true,
2820 limit_rdylib_exports: true,
2821 override_export_symbols: None,
2822 merge_functions: MergeFunctions::Aliases,
2823 mcount: "mcount".into(),
2824 llvm_mcount_intrinsic: None,
2825 llvm_abiname: LlvmAbi::Unspecified,
2826 llvm_floatabi: None,
2827 rustc_abi: None,
2828 relax_elf_relocations: false,
2829 llvm_args: ::std::borrow::Cow::Borrowed(&[])cvs![],
2830 use_ctors_section: false,
2831 eh_frame_header: true,
2832 has_thumb_interworking: false,
2833 debuginfo_kind: Default::default(),
2834 split_debuginfo: Default::default(),
2835 supported_split_debuginfo: Cow::Borrowed(&[SplitDebuginfo::Off]),
2837 supported_sanitizers: SanitizerSet::empty(),
2838 default_sanitizers: SanitizerSet::empty(),
2839 c_enum_min_bits: None,
2840 generate_arange_section: true,
2841 supports_stack_protector: true,
2842 entry_name: "main".into(),
2843 entry_abi: CanonAbi::C,
2844 supports_fentry: false,
2845 supports_xray: false,
2846 default_address_space: rustc_abi::AddressSpace::ZERO,
2847 small_data_threshold_support: SmallDataThresholdSupport::DefaultForArch,
2848 }
2849 }
2850}
2851
2852impl Deref for Target {
2856 type Target = TargetOptions;
2857
2858 #[inline]
2859 fn deref(&self) -> &Self::Target {
2860 &self.options
2861 }
2862}
2863impl DerefMut for Target {
2864 #[inline]
2865 fn deref_mut(&mut self) -> &mut Self::Target {
2866 &mut self.options
2867 }
2868}
2869
2870impl Target {
2871 pub fn is_abi_supported(&self, abi: ExternAbi) -> bool {
2872 let abi_map = AbiMap::from_target(self);
2873 abi_map.canonize_abi(abi, false).is_mapped()
2874 }
2875
2876 pub fn min_atomic_width(&self) -> u64 {
2879 self.min_atomic_width.unwrap_or(8)
2880 }
2881
2882 pub fn max_atomic_width(&self) -> u64 {
2885 self.max_atomic_width.unwrap_or_else(|| self.pointer_width.into())
2886 }
2887
2888 #[cfg(test)]
2890 fn test_target(mut self) {
2891 let recycled_target =
2892 Target::from_json(&serde_json::to_string(&self.to_json()).unwrap()).map(|(j, _)| j);
2893 self.update_to_cli();
2894 self.check_consistency(TargetKind::Builtin)
2895 .unwrap_or_else(|err| panic!("Target consistency check failed:\n{err}"));
2896 assert_eq!(recycled_target, Ok(self));
2897 }
2898
2899 fn can_use_os_unknown(&self) -> bool {
2902 self.llvm_target == "wasm32-unknown-unknown"
2903 || self.llvm_target == "wasm64-unknown-unknown"
2904 || (self.env == Env::Sgx && self.vendor == "fortanix")
2905 }
2906
2907 pub fn expect_builtin(target_tuple: &TargetTuple) -> Target {
2909 match *target_tuple {
2910 TargetTuple::TargetTuple(ref target_tuple) => {
2911 load_builtin(target_tuple).expect("built-in target")
2912 }
2913 TargetTuple::TargetJson { .. } => {
2914 {
::core::panicking::panic_fmt(format_args!("built-in targets doesn\'t support target-paths"));
}panic!("built-in targets doesn't support target-paths")
2915 }
2916 }
2917 }
2918
2919 pub fn builtins() -> impl Iterator<Item = Target> {
2921 load_all_builtins()
2922 }
2923
2924 pub fn search(
2934 target_tuple: &TargetTuple,
2935 sysroot: &Path,
2936 unstable_options: bool,
2937 ) -> Result<(Target, TargetWarnings), String> {
2938 use std::{env, fs};
2939
2940 fn load_file(
2941 path: &Path,
2942 unstable_options: bool,
2943 ) -> Result<(Target, TargetWarnings), String> {
2944 if !unstable_options {
2945 return Err(
2946 "custom targets are unstable and require `-Zunstable-options`".to_string()
2947 );
2948 }
2949 let contents = fs::read_to_string(path).map_err(|e| e.to_string())?;
2950 Target::from_json(&contents)
2951 }
2952
2953 match *target_tuple {
2954 TargetTuple::TargetTuple(ref target_tuple) => {
2955 if let Some(t) = load_builtin(target_tuple) {
2957 return Ok((t, TargetWarnings::empty()));
2958 }
2959
2960 let path = {
2962 let mut target = target_tuple.to_string();
2963 target.push_str(".json");
2964 PathBuf::from(target)
2965 };
2966
2967 let target_path = env::var_os("RUST_TARGET_PATH").unwrap_or_default();
2968
2969 for dir in env::split_paths(&target_path) {
2970 let p = dir.join(&path);
2971 if p.is_file() {
2972 return load_file(&p, unstable_options);
2973 }
2974 }
2975
2976 let rustlib_path = crate::relative_target_rustlib_path(sysroot, target_tuple);
2979 let p = PathBuf::from_iter([
2980 Path::new(sysroot),
2981 Path::new(&rustlib_path),
2982 Path::new("target.json"),
2983 ]);
2984 if p.is_file() {
2985 return load_file(&p, unstable_options);
2986 }
2987
2988 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:?}"))
2989 }
2990 TargetTuple::TargetJson { ref contents, .. } if !unstable_options => {
2991 Err("custom targets are unstable and require `-Zunstable-options`".to_string())
2992 }
2993 TargetTuple::TargetJson { ref contents, .. } => Target::from_json(contents),
2994 }
2995 }
2996
2997 pub fn small_data_threshold_support(&self) -> SmallDataThresholdSupport {
3000 match &self.options.small_data_threshold_support {
3001 SmallDataThresholdSupport::DefaultForArch => match self.arch {
3005 Arch::Mips | Arch::Mips64 | Arch::Mips32r6 => {
3006 SmallDataThresholdSupport::LlvmArg("mips-ssection-threshold".into())
3007 }
3008 Arch::Hexagon => {
3009 SmallDataThresholdSupport::LlvmArg("hexagon-small-data-threshold".into())
3010 }
3011 Arch::M68k => SmallDataThresholdSupport::LlvmArg("m68k-ssection-threshold".into()),
3012 Arch::RiscV32 | Arch::RiscV64 => {
3013 SmallDataThresholdSupport::LlvmModuleFlag("SmallDataLimit".into())
3014 }
3015 _ => SmallDataThresholdSupport::None,
3016 },
3017 s => s.clone(),
3018 }
3019 }
3020
3021 pub fn object_architecture(
3022 &self,
3023 internal_target_features: &FxIndexSet<Symbol>,
3024 ) -> Option<(object::Architecture, Option<object::SubArchitecture>)> {
3025 use object::Architecture;
3026 Some(match self.arch {
3027 Arch::Arm => (Architecture::Arm, None),
3028 Arch::AArch64 => (
3029 if self.pointer_width == 32 {
3030 Architecture::Aarch64_Ilp32
3031 } else {
3032 Architecture::Aarch64
3033 },
3034 None,
3035 ),
3036 Arch::X86 => (Architecture::I386, None),
3037 Arch::S390x => (Architecture::S390x, None),
3038 Arch::M68k => (Architecture::M68k, None),
3039 Arch::Mips | Arch::Mips32r6 => (Architecture::Mips, None),
3040 Arch::Mips64 | Arch::Mips64r6 => (
3041 if self.options.llvm_abiname == LlvmAbi::N32 {
3047 Architecture::Mips64_N32
3048 } else {
3049 Architecture::Mips64
3050 },
3051 None,
3052 ),
3053 Arch::X86_64 => (
3054 if self.pointer_width == 32 {
3055 Architecture::X86_64_X32
3056 } else {
3057 Architecture::X86_64
3058 },
3059 None,
3060 ),
3061 Arch::PowerPC => (Architecture::PowerPc, None),
3062 Arch::PowerPC64 => (Architecture::PowerPc64, None),
3063 Arch::RiscV32 => (Architecture::Riscv32, None),
3064 Arch::RiscV64 => (Architecture::Riscv64, None),
3065 Arch::Sparc => {
3066 if internal_target_features.contains(&sym::v8plus) {
3067 (Architecture::Sparc32Plus, None)
3069 } else {
3070 (Architecture::Sparc, None)
3072 }
3073 }
3074 Arch::Sparc64 => (Architecture::Sparc64, None),
3075 Arch::Avr => (Architecture::Avr, None),
3076 Arch::Msp430 => (Architecture::Msp430, None),
3077 Arch::Hexagon => (Architecture::Hexagon, None),
3078 Arch::Xtensa => (Architecture::Xtensa, None),
3079 Arch::Bpf => (Architecture::Bpf, None),
3080 Arch::LoongArch32 => (Architecture::LoongArch32, None),
3081 Arch::LoongArch64 => (Architecture::LoongArch64, None),
3082 Arch::CSky => (Architecture::Csky, None),
3083 Arch::Arm64EC => (Architecture::Aarch64, Some(object::SubArchitecture::Arm64EC)),
3084 Arch::AmdGpu
3085 | Arch::Nvptx64
3086 | Arch::SpirV
3087 | Arch::Wasm32
3088 | Arch::Wasm64
3089 | Arch::Other(_) => return None,
3090 })
3091 }
3092
3093 pub fn max_reliable_alignment(&self) -> Align {
3102 if self.is_like_windows && self.arch == Arch::X86 {
3106 Align::from_bytes(4).unwrap()
3107 } else {
3108 Align::MAX
3109 }
3110 }
3111
3112 pub fn vendor_symbol(&self) -> Symbol {
3113 Symbol::intern(&self.vendor)
3114 }
3115}