1use core::result::Result;
41use std::borrow::Cow;
42use std::collections::BTreeMap;
43use std::hash::{Hash, Hasher};
44use std::ops::{Deref, DerefMut};
45use std::path::{Path, PathBuf};
46use std::str::FromStr;
47use std::{fmt, io};
48
49use rustc_abi::{
50 Align, CanonAbi, Endian, ExternAbi, Integer, Size, TargetDataLayout, TargetDataLayoutErrors,
51};
52use rustc_data_structures::fx::{FxHashSet, FxIndexSet};
53use rustc_error_messages::{DiagArgValue, IntoDiagArg, into_diag_arg_using_display};
54use rustc_fs_util::try_canonicalize;
55use rustc_macros::{BlobDecodable, Decodable, Encodable, HashStable_Generic};
56use rustc_serialize::{Decodable, Decoder, Encodable, Encoder};
57use rustc_span::{Symbol, kw, sym};
58use serde_json::Value;
59use tracing::debug;
60
61use crate::json::{Json, ToJson};
62use crate::spec::crt_objects::CrtObjects;
63
64pub mod crt_objects;
65
66mod abi_map;
67mod base;
68mod json;
69
70pub use abi_map::{AbiMap, AbiMapping};
71pub use base::apple;
72pub use base::avr::ef_avr_arch;
73pub use json::json_schema;
74
75#[derive(#[automatically_derived]
impl ::core::clone::Clone for Cc {
#[inline]
fn clone(&self) -> Cc { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for Cc { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for Cc {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self { Cc::Yes => "Yes", Cc::No => "No", })
}
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for Cc {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) {}
}Eq, #[automatically_derived]
impl ::core::cmp::Ord for Cc {
#[inline]
fn cmp(&self, other: &Cc) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr)
}
}Ord, #[automatically_derived]
impl ::core::cmp::PartialEq for Cc {
#[inline]
fn eq(&self, other: &Cc) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::PartialOrd for Cc {
#[inline]
fn partial_cmp(&self, other: &Cc)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::PartialOrd::partial_cmp(&__self_discr, &__arg1_discr)
}
}PartialOrd)]
77pub enum Cc {
78 Yes,
79 No,
80}
81
82#[derive(#[automatically_derived]
impl ::core::clone::Clone for Lld {
#[inline]
fn clone(&self) -> Lld { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for Lld { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for Lld {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self { Lld::Yes => "Yes", Lld::No => "No", })
}
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for Lld {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) {}
}Eq, #[automatically_derived]
impl ::core::cmp::Ord for Lld {
#[inline]
fn cmp(&self, other: &Lld) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr)
}
}Ord, #[automatically_derived]
impl ::core::cmp::PartialEq for Lld {
#[inline]
fn eq(&self, other: &Lld) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::PartialOrd for Lld {
#[inline]
fn partial_cmp(&self, other: &Lld)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::PartialOrd::partial_cmp(&__self_discr, &__arg1_discr)
}
}PartialOrd)]
84pub enum Lld {
85 Yes,
86 No,
87}
88
89#[derive(#[automatically_derived]
impl ::core::clone::Clone for LinkerFlavor {
#[inline]
fn clone(&self) -> LinkerFlavor {
let _: ::core::clone::AssertParamIsClone<Cc>;
let _: ::core::clone::AssertParamIsClone<Lld>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for LinkerFlavor { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for LinkerFlavor {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
LinkerFlavor::Gnu(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Gnu",
__self_0, &__self_1),
LinkerFlavor::Darwin(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Darwin",
__self_0, &__self_1),
LinkerFlavor::WasmLld(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"WasmLld", &__self_0),
LinkerFlavor::Unix(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Unix",
&__self_0),
LinkerFlavor::Msvc(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Msvc",
&__self_0),
LinkerFlavor::EmCc =>
::core::fmt::Formatter::write_str(f, "EmCc"),
LinkerFlavor::Bpf => ::core::fmt::Formatter::write_str(f, "Bpf"),
LinkerFlavor::Ptx => ::core::fmt::Formatter::write_str(f, "Ptx"),
LinkerFlavor::Llbc =>
::core::fmt::Formatter::write_str(f, "Llbc"),
}
}
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for LinkerFlavor {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<Cc>;
let _: ::core::cmp::AssertParamIsEq<Lld>;
}
}Eq, #[automatically_derived]
impl ::core::cmp::Ord for LinkerFlavor {
#[inline]
fn cmp(&self, other: &LinkerFlavor) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
match ::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr) {
::core::cmp::Ordering::Equal =>
match (self, other) {
(LinkerFlavor::Gnu(__self_0, __self_1),
LinkerFlavor::Gnu(__arg1_0, __arg1_1)) =>
match ::core::cmp::Ord::cmp(__self_0, __arg1_0) {
::core::cmp::Ordering::Equal =>
::core::cmp::Ord::cmp(__self_1, __arg1_1),
cmp => cmp,
},
(LinkerFlavor::Darwin(__self_0, __self_1),
LinkerFlavor::Darwin(__arg1_0, __arg1_1)) =>
match ::core::cmp::Ord::cmp(__self_0, __arg1_0) {
::core::cmp::Ordering::Equal =>
::core::cmp::Ord::cmp(__self_1, __arg1_1),
cmp => cmp,
},
(LinkerFlavor::WasmLld(__self_0),
LinkerFlavor::WasmLld(__arg1_0)) =>
::core::cmp::Ord::cmp(__self_0, __arg1_0),
(LinkerFlavor::Unix(__self_0), LinkerFlavor::Unix(__arg1_0))
=> ::core::cmp::Ord::cmp(__self_0, __arg1_0),
(LinkerFlavor::Msvc(__self_0), LinkerFlavor::Msvc(__arg1_0))
=> ::core::cmp::Ord::cmp(__self_0, __arg1_0),
_ => ::core::cmp::Ordering::Equal,
},
cmp => cmp,
}
}
}Ord, #[automatically_derived]
impl ::core::cmp::PartialEq for LinkerFlavor {
#[inline]
fn eq(&self, other: &LinkerFlavor) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(LinkerFlavor::Gnu(__self_0, __self_1),
LinkerFlavor::Gnu(__arg1_0, __arg1_1)) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1,
(LinkerFlavor::Darwin(__self_0, __self_1),
LinkerFlavor::Darwin(__arg1_0, __arg1_1)) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1,
(LinkerFlavor::WasmLld(__self_0),
LinkerFlavor::WasmLld(__arg1_0)) => __self_0 == __arg1_0,
(LinkerFlavor::Unix(__self_0), LinkerFlavor::Unix(__arg1_0))
=> __self_0 == __arg1_0,
(LinkerFlavor::Msvc(__self_0), LinkerFlavor::Msvc(__arg1_0))
=> __self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::PartialOrd for LinkerFlavor {
#[inline]
fn partial_cmp(&self, other: &LinkerFlavor)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
match (self, other) {
(LinkerFlavor::Gnu(__self_0, __self_1),
LinkerFlavor::Gnu(__arg1_0, __arg1_1)) =>
match ::core::cmp::PartialOrd::partial_cmp(__self_0, __arg1_0)
{
::core::option::Option::Some(::core::cmp::Ordering::Equal)
=> ::core::cmp::PartialOrd::partial_cmp(__self_1, __arg1_1),
cmp => cmp,
},
(LinkerFlavor::Darwin(__self_0, __self_1),
LinkerFlavor::Darwin(__arg1_0, __arg1_1)) =>
match ::core::cmp::PartialOrd::partial_cmp(__self_0, __arg1_0)
{
::core::option::Option::Some(::core::cmp::Ordering::Equal)
=> ::core::cmp::PartialOrd::partial_cmp(__self_1, __arg1_1),
cmp => cmp,
},
(LinkerFlavor::WasmLld(__self_0), LinkerFlavor::WasmLld(__arg1_0))
=> ::core::cmp::PartialOrd::partial_cmp(__self_0, __arg1_0),
(LinkerFlavor::Unix(__self_0), LinkerFlavor::Unix(__arg1_0)) =>
::core::cmp::PartialOrd::partial_cmp(__self_0, __arg1_0),
(LinkerFlavor::Msvc(__self_0), LinkerFlavor::Msvc(__arg1_0)) =>
::core::cmp::PartialOrd::partial_cmp(__self_0, __arg1_0),
_ =>
::core::cmp::PartialOrd::partial_cmp(&__self_discr,
&__arg1_discr),
}
}
}PartialOrd)]
110pub enum LinkerFlavor {
111 Gnu(Cc, Lld),
115 Darwin(Cc, Lld),
118 WasmLld(Cc),
122 Unix(Cc),
126 Msvc(Lld),
128 EmCc,
131 Bpf,
134 Ptx,
136 Llbc,
138}
139
140#[derive(#[automatically_derived]
impl ::core::clone::Clone for LinkerFlavorCli {
#[inline]
fn clone(&self) -> LinkerFlavorCli {
let _: ::core::clone::AssertParamIsClone<Cc>;
let _: ::core::clone::AssertParamIsClone<Lld>;
let _: ::core::clone::AssertParamIsClone<LldFlavor>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for LinkerFlavorCli { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for LinkerFlavorCli {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
LinkerFlavorCli::Gnu(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Gnu",
__self_0, &__self_1),
LinkerFlavorCli::Darwin(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Darwin",
__self_0, &__self_1),
LinkerFlavorCli::WasmLld(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"WasmLld", &__self_0),
LinkerFlavorCli::Unix(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Unix",
&__self_0),
LinkerFlavorCli::Msvc(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Msvc",
&__self_0),
LinkerFlavorCli::EmCc =>
::core::fmt::Formatter::write_str(f, "EmCc"),
LinkerFlavorCli::Bpf =>
::core::fmt::Formatter::write_str(f, "Bpf"),
LinkerFlavorCli::Ptx =>
::core::fmt::Formatter::write_str(f, "Ptx"),
LinkerFlavorCli::Llbc =>
::core::fmt::Formatter::write_str(f, "Llbc"),
LinkerFlavorCli::Gcc =>
::core::fmt::Formatter::write_str(f, "Gcc"),
LinkerFlavorCli::Ld => ::core::fmt::Formatter::write_str(f, "Ld"),
LinkerFlavorCli::Lld(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Lld",
&__self_0),
LinkerFlavorCli::Em => ::core::fmt::Formatter::write_str(f, "Em"),
}
}
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for LinkerFlavorCli {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<Cc>;
let _: ::core::cmp::AssertParamIsEq<Lld>;
let _: ::core::cmp::AssertParamIsEq<LldFlavor>;
}
}Eq, #[automatically_derived]
impl ::core::cmp::Ord for LinkerFlavorCli {
#[inline]
fn cmp(&self, other: &LinkerFlavorCli) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
match ::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr) {
::core::cmp::Ordering::Equal =>
match (self, other) {
(LinkerFlavorCli::Gnu(__self_0, __self_1),
LinkerFlavorCli::Gnu(__arg1_0, __arg1_1)) =>
match ::core::cmp::Ord::cmp(__self_0, __arg1_0) {
::core::cmp::Ordering::Equal =>
::core::cmp::Ord::cmp(__self_1, __arg1_1),
cmp => cmp,
},
(LinkerFlavorCli::Darwin(__self_0, __self_1),
LinkerFlavorCli::Darwin(__arg1_0, __arg1_1)) =>
match ::core::cmp::Ord::cmp(__self_0, __arg1_0) {
::core::cmp::Ordering::Equal =>
::core::cmp::Ord::cmp(__self_1, __arg1_1),
cmp => cmp,
},
(LinkerFlavorCli::WasmLld(__self_0),
LinkerFlavorCli::WasmLld(__arg1_0)) =>
::core::cmp::Ord::cmp(__self_0, __arg1_0),
(LinkerFlavorCli::Unix(__self_0),
LinkerFlavorCli::Unix(__arg1_0)) =>
::core::cmp::Ord::cmp(__self_0, __arg1_0),
(LinkerFlavorCli::Msvc(__self_0),
LinkerFlavorCli::Msvc(__arg1_0)) =>
::core::cmp::Ord::cmp(__self_0, __arg1_0),
(LinkerFlavorCli::Lld(__self_0),
LinkerFlavorCli::Lld(__arg1_0)) =>
::core::cmp::Ord::cmp(__self_0, __arg1_0),
_ => ::core::cmp::Ordering::Equal,
},
cmp => cmp,
}
}
}Ord, #[automatically_derived]
impl ::core::cmp::PartialEq for LinkerFlavorCli {
#[inline]
fn eq(&self, other: &LinkerFlavorCli) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(LinkerFlavorCli::Gnu(__self_0, __self_1),
LinkerFlavorCli::Gnu(__arg1_0, __arg1_1)) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1,
(LinkerFlavorCli::Darwin(__self_0, __self_1),
LinkerFlavorCli::Darwin(__arg1_0, __arg1_1)) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1,
(LinkerFlavorCli::WasmLld(__self_0),
LinkerFlavorCli::WasmLld(__arg1_0)) => __self_0 == __arg1_0,
(LinkerFlavorCli::Unix(__self_0),
LinkerFlavorCli::Unix(__arg1_0)) => __self_0 == __arg1_0,
(LinkerFlavorCli::Msvc(__self_0),
LinkerFlavorCli::Msvc(__arg1_0)) => __self_0 == __arg1_0,
(LinkerFlavorCli::Lld(__self_0),
LinkerFlavorCli::Lld(__arg1_0)) => __self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::PartialOrd for LinkerFlavorCli {
#[inline]
fn partial_cmp(&self, other: &LinkerFlavorCli)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
match ::core::cmp::PartialOrd::partial_cmp(&__self_discr,
&__arg1_discr) {
::core::option::Option::Some(::core::cmp::Ordering::Equal) =>
match (self, other) {
(LinkerFlavorCli::Gnu(__self_0, __self_1),
LinkerFlavorCli::Gnu(__arg1_0, __arg1_1)) =>
match ::core::cmp::PartialOrd::partial_cmp(__self_0,
__arg1_0) {
::core::option::Option::Some(::core::cmp::Ordering::Equal)
=> ::core::cmp::PartialOrd::partial_cmp(__self_1, __arg1_1),
cmp => cmp,
},
(LinkerFlavorCli::Darwin(__self_0, __self_1),
LinkerFlavorCli::Darwin(__arg1_0, __arg1_1)) =>
match ::core::cmp::PartialOrd::partial_cmp(__self_0,
__arg1_0) {
::core::option::Option::Some(::core::cmp::Ordering::Equal)
=> ::core::cmp::PartialOrd::partial_cmp(__self_1, __arg1_1),
cmp => cmp,
},
(LinkerFlavorCli::WasmLld(__self_0),
LinkerFlavorCli::WasmLld(__arg1_0)) =>
::core::cmp::PartialOrd::partial_cmp(__self_0, __arg1_0),
(LinkerFlavorCli::Unix(__self_0),
LinkerFlavorCli::Unix(__arg1_0)) =>
::core::cmp::PartialOrd::partial_cmp(__self_0, __arg1_0),
(LinkerFlavorCli::Msvc(__self_0),
LinkerFlavorCli::Msvc(__arg1_0)) =>
::core::cmp::PartialOrd::partial_cmp(__self_0, __arg1_0),
(LinkerFlavorCli::Lld(__self_0),
LinkerFlavorCli::Lld(__arg1_0)) =>
::core::cmp::PartialOrd::partial_cmp(__self_0, __arg1_0),
_ =>
::core::option::Option::Some(::core::cmp::Ordering::Equal),
},
cmp => cmp,
}
}
}PartialOrd)]
145pub enum LinkerFlavorCli {
146 Gnu(Cc, Lld),
148 Darwin(Cc, Lld),
149 WasmLld(Cc),
150 Unix(Cc),
151 Msvc(Lld),
153 EmCc,
154 Bpf,
155 Ptx,
156 Llbc,
157
158 Gcc,
160 Ld,
161 Lld(LldFlavor),
162 Em,
163}
164
165impl LinkerFlavorCli {
166 pub fn is_unstable(&self) -> bool {
168 match self {
169 LinkerFlavorCli::Gnu(..)
170 | LinkerFlavorCli::Darwin(..)
171 | LinkerFlavorCli::WasmLld(..)
172 | LinkerFlavorCli::Unix(..)
173 | LinkerFlavorCli::Msvc(Lld::Yes)
174 | LinkerFlavorCli::EmCc
175 | LinkerFlavorCli::Bpf
176 | LinkerFlavorCli::Llbc
177 | LinkerFlavorCli::Ptx => true,
178 LinkerFlavorCli::Gcc
179 | LinkerFlavorCli::Ld
180 | LinkerFlavorCli::Lld(..)
181 | LinkerFlavorCli::Msvc(Lld::No)
182 | LinkerFlavorCli::Em => false,
183 }
184 }
185}
186
187#[automatically_derived]
impl ::core::clone::Clone for LldFlavor {
#[inline]
fn clone(&self) -> LldFlavor { *self }
}
#[automatically_derived]
impl ::core::marker::Copy for LldFlavor { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for LldFlavor { }
#[automatically_derived]
impl ::core::cmp::PartialEq for LldFlavor {
#[inline]
fn eq(&self, other: &LldFlavor) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}
#[automatically_derived]
impl ::core::cmp::Eq for LldFlavor {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) {}
}
#[automatically_derived]
impl ::core::hash::Hash for LldFlavor {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}
#[automatically_derived]
impl ::core::fmt::Debug for LldFlavor {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
LldFlavor::Wasm => "Wasm",
LldFlavor::Ld64 => "Ld64",
LldFlavor::Ld => "Ld",
LldFlavor::Link => "Link",
})
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for LldFlavor {
#[inline]
fn partial_cmp(&self, other: &LldFlavor)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::PartialOrd::partial_cmp(&__self_discr, &__arg1_discr)
}
}
#[automatically_derived]
impl ::core::cmp::Ord for LldFlavor {
#[inline]
fn cmp(&self, other: &LldFlavor) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr)
}
}
impl FromStr for LldFlavor {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"wasm" => Self::Wasm,
"darwin" => Self::Ld64,
"gnu" => Self::Ld,
"link" => Self::Link,
_ => {
let all =
["\'wasm\'", "\'darwin\'", "\'gnu\'",
"\'link\'"].join(", ");
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid {0}: \'{1}\'. allowed values: {2}",
"LLD flavor", s, all))
}));
}
})
}
}
impl LldFlavor {
pub const ALL: &'static [LldFlavor] =
&[LldFlavor::Wasm, LldFlavor::Ld64, LldFlavor::Ld, LldFlavor::Link];
pub fn desc(&self) -> &'static str {
match self {
Self::Wasm => "wasm",
Self::Ld64 => "darwin",
Self::Ld => "gnu",
Self::Link => "link",
}
}
}
impl crate::json::ToJson for LldFlavor {
fn to_json(&self) -> crate::json::Json { self.desc().to_json() }
}
impl<'de> serde::Deserialize<'de> for LldFlavor {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}
impl std::fmt::Display for LldFlavor {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.desc())
}
}crate::target_spec_enum! {
188 pub enum LldFlavor {
189 Wasm = "wasm",
190 Ld64 = "darwin",
191 Ld = "gnu",
192 Link = "link",
193 }
194
195 parse_error_type = "LLD flavor";
196}
197
198impl LinkerFlavor {
199 fn from_cli_json(cli: LinkerFlavorCli, lld_flavor: LldFlavor, is_gnu: bool) -> LinkerFlavor {
204 match cli {
205 LinkerFlavorCli::Gnu(cc, lld) => LinkerFlavor::Gnu(cc, lld),
206 LinkerFlavorCli::Darwin(cc, lld) => LinkerFlavor::Darwin(cc, lld),
207 LinkerFlavorCli::WasmLld(cc) => LinkerFlavor::WasmLld(cc),
208 LinkerFlavorCli::Unix(cc) => LinkerFlavor::Unix(cc),
209 LinkerFlavorCli::Msvc(lld) => LinkerFlavor::Msvc(lld),
210 LinkerFlavorCli::EmCc => LinkerFlavor::EmCc,
211 LinkerFlavorCli::Bpf => LinkerFlavor::Bpf,
212 LinkerFlavorCli::Llbc => LinkerFlavor::Llbc,
213 LinkerFlavorCli::Ptx => LinkerFlavor::Ptx,
214
215 LinkerFlavorCli::Gcc => match lld_flavor {
217 LldFlavor::Ld if is_gnu => LinkerFlavor::Gnu(Cc::Yes, Lld::No),
218 LldFlavor::Ld64 => LinkerFlavor::Darwin(Cc::Yes, Lld::No),
219 LldFlavor::Wasm => LinkerFlavor::WasmLld(Cc::Yes),
220 LldFlavor::Ld | LldFlavor::Link => LinkerFlavor::Unix(Cc::Yes),
221 },
222 LinkerFlavorCli::Ld => match lld_flavor {
223 LldFlavor::Ld if is_gnu => LinkerFlavor::Gnu(Cc::No, Lld::No),
224 LldFlavor::Ld64 => LinkerFlavor::Darwin(Cc::No, Lld::No),
225 LldFlavor::Ld | LldFlavor::Wasm | LldFlavor::Link => LinkerFlavor::Unix(Cc::No),
226 },
227 LinkerFlavorCli::Lld(LldFlavor::Ld) => LinkerFlavor::Gnu(Cc::No, Lld::Yes),
228 LinkerFlavorCli::Lld(LldFlavor::Ld64) => LinkerFlavor::Darwin(Cc::No, Lld::Yes),
229 LinkerFlavorCli::Lld(LldFlavor::Wasm) => LinkerFlavor::WasmLld(Cc::No),
230 LinkerFlavorCli::Lld(LldFlavor::Link) => LinkerFlavor::Msvc(Lld::Yes),
231 LinkerFlavorCli::Em => LinkerFlavor::EmCc,
232 }
233 }
234
235 fn to_cli(self) -> LinkerFlavorCli {
237 match self {
238 LinkerFlavor::Gnu(Cc::Yes, _)
239 | LinkerFlavor::Darwin(Cc::Yes, _)
240 | LinkerFlavor::WasmLld(Cc::Yes)
241 | LinkerFlavor::Unix(Cc::Yes) => LinkerFlavorCli::Gcc,
242 LinkerFlavor::Gnu(_, Lld::Yes) => LinkerFlavorCli::Lld(LldFlavor::Ld),
243 LinkerFlavor::Darwin(_, Lld::Yes) => LinkerFlavorCli::Lld(LldFlavor::Ld64),
244 LinkerFlavor::WasmLld(..) => LinkerFlavorCli::Lld(LldFlavor::Wasm),
245 LinkerFlavor::Gnu(..) | LinkerFlavor::Darwin(..) | LinkerFlavor::Unix(..) => {
246 LinkerFlavorCli::Ld
247 }
248 LinkerFlavor::Msvc(Lld::Yes) => LinkerFlavorCli::Lld(LldFlavor::Link),
249 LinkerFlavor::Msvc(..) => LinkerFlavorCli::Msvc(Lld::No),
250 LinkerFlavor::EmCc => LinkerFlavorCli::Em,
251 LinkerFlavor::Bpf => LinkerFlavorCli::Bpf,
252 LinkerFlavor::Llbc => LinkerFlavorCli::Llbc,
253 LinkerFlavor::Ptx => LinkerFlavorCli::Ptx,
254 }
255 }
256
257 fn to_cli_counterpart(self) -> LinkerFlavorCli {
259 match self {
260 LinkerFlavor::Gnu(cc, lld) => LinkerFlavorCli::Gnu(cc, lld),
261 LinkerFlavor::Darwin(cc, lld) => LinkerFlavorCli::Darwin(cc, lld),
262 LinkerFlavor::WasmLld(cc) => LinkerFlavorCli::WasmLld(cc),
263 LinkerFlavor::Unix(cc) => LinkerFlavorCli::Unix(cc),
264 LinkerFlavor::Msvc(lld) => LinkerFlavorCli::Msvc(lld),
265 LinkerFlavor::EmCc => LinkerFlavorCli::EmCc,
266 LinkerFlavor::Bpf => LinkerFlavorCli::Bpf,
267 LinkerFlavor::Llbc => LinkerFlavorCli::Llbc,
268 LinkerFlavor::Ptx => LinkerFlavorCli::Ptx,
269 }
270 }
271
272 fn infer_cli_hints(cli: LinkerFlavorCli) -> (Option<Cc>, Option<Lld>) {
273 match cli {
274 LinkerFlavorCli::Gnu(cc, lld) | LinkerFlavorCli::Darwin(cc, lld) => {
275 (Some(cc), Some(lld))
276 }
277 LinkerFlavorCli::WasmLld(cc) => (Some(cc), Some(Lld::Yes)),
278 LinkerFlavorCli::Unix(cc) => (Some(cc), None),
279 LinkerFlavorCli::Msvc(lld) => (Some(Cc::No), Some(lld)),
280 LinkerFlavorCli::EmCc => (Some(Cc::Yes), Some(Lld::Yes)),
281 LinkerFlavorCli::Bpf | LinkerFlavorCli::Ptx => (None, None),
282 LinkerFlavorCli::Llbc => (None, None),
283
284 LinkerFlavorCli::Gcc => (Some(Cc::Yes), None),
286 LinkerFlavorCli::Ld => (Some(Cc::No), Some(Lld::No)),
287 LinkerFlavorCli::Lld(_) => (Some(Cc::No), Some(Lld::Yes)),
288 LinkerFlavorCli::Em => (Some(Cc::Yes), Some(Lld::Yes)),
289 }
290 }
291
292 fn infer_linker_hints(linker_stem: &str) -> Result<Self, (Option<Cc>, Option<Lld>)> {
293 let stem = linker_stem
295 .rsplit_once('-')
296 .and_then(|(lhs, rhs)| rhs.chars().all(char::is_numeric).then_some(lhs))
297 .unwrap_or(linker_stem);
298
299 if stem == "llvm-bitcode-linker" {
300 Ok(Self::Llbc)
301 } else if stem == "emcc" || stem == "gcc"
303 || stem.ends_with("-gcc")
304 || stem == "g++"
305 || stem.ends_with("-g++")
306 || stem == "clang"
307 || stem.ends_with("-clang")
308 || stem == "clang++"
309 || stem.ends_with("-clang++")
310 {
311 Err((Some(Cc::Yes), Some(Lld::No)))
312 } else if stem == "wasm-ld"
313 || stem.ends_with("-wasm-ld")
314 || stem == "ld.lld"
315 || stem == "lld"
316 || stem == "rust-lld"
317 || stem == "lld-link"
318 {
319 Err((Some(Cc::No), Some(Lld::Yes)))
320 } else if stem == "ld" || stem.ends_with("-ld") || stem == "link" {
321 Err((Some(Cc::No), Some(Lld::No)))
322 } else {
323 Err((None, None))
324 }
325 }
326
327 fn with_hints(self, (cc_hint, lld_hint): (Option<Cc>, Option<Lld>)) -> LinkerFlavor {
328 match self {
329 LinkerFlavor::Gnu(cc, lld) => {
330 LinkerFlavor::Gnu(cc_hint.unwrap_or(cc), lld_hint.unwrap_or(lld))
331 }
332 LinkerFlavor::Darwin(cc, lld) => {
333 LinkerFlavor::Darwin(cc_hint.unwrap_or(cc), lld_hint.unwrap_or(lld))
334 }
335 LinkerFlavor::WasmLld(cc) => LinkerFlavor::WasmLld(cc_hint.unwrap_or(cc)),
336 LinkerFlavor::Unix(cc) => LinkerFlavor::Unix(cc_hint.unwrap_or(cc)),
337 LinkerFlavor::Msvc(lld) => LinkerFlavor::Msvc(lld_hint.unwrap_or(lld)),
338 LinkerFlavor::EmCc | LinkerFlavor::Bpf | LinkerFlavor::Llbc | LinkerFlavor::Ptx => self,
339 }
340 }
341
342 pub fn with_cli_hints(self, cli: LinkerFlavorCli) -> LinkerFlavor {
343 self.with_hints(LinkerFlavor::infer_cli_hints(cli))
344 }
345
346 pub fn with_linker_hints(self, linker_stem: &str) -> LinkerFlavor {
347 match LinkerFlavor::infer_linker_hints(linker_stem) {
348 Ok(linker_flavor) => linker_flavor,
349 Err(hints) => self.with_hints(hints),
350 }
351 }
352
353 pub fn check_compatibility(self, cli: LinkerFlavorCli) -> Option<String> {
354 let compatible = |cli| {
355 match (self, cli) {
357 (LinkerFlavor::Gnu(..), LinkerFlavorCli::Gnu(..))
359 | (LinkerFlavor::Darwin(..), LinkerFlavorCli::Darwin(..))
360 | (LinkerFlavor::WasmLld(..), LinkerFlavorCli::WasmLld(..))
361 | (LinkerFlavor::Unix(..), LinkerFlavorCli::Unix(..))
362 | (LinkerFlavor::Msvc(..), LinkerFlavorCli::Msvc(..))
363 | (LinkerFlavor::EmCc, LinkerFlavorCli::EmCc)
364 | (LinkerFlavor::Bpf, LinkerFlavorCli::Bpf)
365 | (LinkerFlavor::Llbc, LinkerFlavorCli::Llbc)
366 | (LinkerFlavor::Ptx, LinkerFlavorCli::Ptx) => return true,
367 (LinkerFlavor::Ptx, LinkerFlavorCli::Llbc) => return true,
369 _ => {}
370 }
371
372 cli == self.with_cli_hints(cli).to_cli()
374 };
375 (!compatible(cli)).then(|| {
376 LinkerFlavorCli::all()
377 .iter()
378 .filter(|cli| compatible(**cli))
379 .map(|cli| cli.desc())
380 .intersperse(", ")
381 .collect()
382 })
383 }
384
385 pub fn lld_flavor(self) -> LldFlavor {
386 match self {
387 LinkerFlavor::Gnu(..)
388 | LinkerFlavor::Unix(..)
389 | LinkerFlavor::EmCc
390 | LinkerFlavor::Bpf
391 | LinkerFlavor::Llbc
392 | LinkerFlavor::Ptx => LldFlavor::Ld,
393 LinkerFlavor::Darwin(..) => LldFlavor::Ld64,
394 LinkerFlavor::WasmLld(..) => LldFlavor::Wasm,
395 LinkerFlavor::Msvc(..) => LldFlavor::Link,
396 }
397 }
398
399 pub fn is_gnu(self) -> bool {
400 #[allow(non_exhaustive_omitted_patterns)] match self {
LinkerFlavor::Gnu(..) => true,
_ => false,
}matches!(self, LinkerFlavor::Gnu(..))
401 }
402
403 pub fn uses_lld(self) -> bool {
405 match self {
407 LinkerFlavor::Gnu(_, Lld::Yes)
408 | LinkerFlavor::Darwin(_, Lld::Yes)
409 | LinkerFlavor::WasmLld(..)
410 | LinkerFlavor::EmCc
411 | LinkerFlavor::Msvc(Lld::Yes) => true,
412 LinkerFlavor::Gnu(..)
413 | LinkerFlavor::Darwin(..)
414 | LinkerFlavor::Msvc(_)
415 | LinkerFlavor::Unix(_)
416 | LinkerFlavor::Bpf
417 | LinkerFlavor::Llbc
418 | LinkerFlavor::Ptx => false,
419 }
420 }
421
422 pub fn uses_cc(self) -> bool {
424 match self {
426 LinkerFlavor::Gnu(Cc::Yes, _)
427 | LinkerFlavor::Darwin(Cc::Yes, _)
428 | LinkerFlavor::WasmLld(Cc::Yes)
429 | LinkerFlavor::Unix(Cc::Yes)
430 | LinkerFlavor::EmCc => true,
431 LinkerFlavor::Gnu(..)
432 | LinkerFlavor::Darwin(..)
433 | LinkerFlavor::WasmLld(_)
434 | LinkerFlavor::Msvc(_)
435 | LinkerFlavor::Unix(_)
436 | LinkerFlavor::Bpf
437 | LinkerFlavor::Llbc
438 | LinkerFlavor::Ptx => false,
439 }
440 }
441
442 pub fn with_lld_enabled(self) -> LinkerFlavor {
445 match self {
446 LinkerFlavor::Gnu(cc, Lld::No) => LinkerFlavor::Gnu(cc, Lld::Yes),
447 LinkerFlavor::Darwin(cc, Lld::No) => LinkerFlavor::Darwin(cc, Lld::Yes),
448 LinkerFlavor::Msvc(Lld::No) => LinkerFlavor::Msvc(Lld::Yes),
449 _ => self,
450 }
451 }
452
453 pub fn with_lld_disabled(self) -> LinkerFlavor {
456 match self {
457 LinkerFlavor::Gnu(cc, Lld::Yes) => LinkerFlavor::Gnu(cc, Lld::No),
458 LinkerFlavor::Darwin(cc, Lld::Yes) => LinkerFlavor::Darwin(cc, Lld::No),
459 LinkerFlavor::Msvc(Lld::Yes) => LinkerFlavor::Msvc(Lld::No),
460 _ => self,
461 }
462 }
463}
464
465macro_rules! linker_flavor_cli_impls {
466 ($(($($flavor:tt)*) $string:literal)*) => (
467 impl LinkerFlavorCli {
468 const fn all() -> &'static [LinkerFlavorCli] {
469 &[$($($flavor)*,)*]
470 }
471
472 pub const fn one_of() -> &'static str {
473 concat!("one of: ", $($string, " ",)*)
474 }
475
476 pub fn desc(self) -> &'static str {
477 match self {
478 $($($flavor)* => $string,)*
479 }
480 }
481 }
482
483 impl FromStr for LinkerFlavorCli {
484 type Err = String;
485
486 fn from_str(s: &str) -> Result<LinkerFlavorCli, Self::Err> {
487 Ok(match s {
488 $($string => $($flavor)*,)*
489 _ => return Err(format!("invalid linker flavor, allowed values: {}", Self::one_of())),
490 })
491 }
492 }
493 )
494}
495
496impl LinkerFlavorCli {
const fn all() -> &'static [LinkerFlavorCli] {
&[LinkerFlavorCli::Gnu(Cc::No, Lld::No),
LinkerFlavorCli::Gnu(Cc::No, Lld::Yes),
LinkerFlavorCli::Gnu(Cc::Yes, Lld::No),
LinkerFlavorCli::Gnu(Cc::Yes, Lld::Yes),
LinkerFlavorCli::Darwin(Cc::No, Lld::No),
LinkerFlavorCli::Darwin(Cc::No, Lld::Yes),
LinkerFlavorCli::Darwin(Cc::Yes, Lld::No),
LinkerFlavorCli::Darwin(Cc::Yes, Lld::Yes),
LinkerFlavorCli::WasmLld(Cc::No),
LinkerFlavorCli::WasmLld(Cc::Yes),
LinkerFlavorCli::Unix(Cc::No),
LinkerFlavorCli::Unix(Cc::Yes),
LinkerFlavorCli::Msvc(Lld::Yes),
LinkerFlavorCli::Msvc(Lld::No), LinkerFlavorCli::EmCc,
LinkerFlavorCli::Bpf, LinkerFlavorCli::Llbc,
LinkerFlavorCli::Ptx, LinkerFlavorCli::Gcc,
LinkerFlavorCli::Ld, LinkerFlavorCli::Lld(LldFlavor::Ld),
LinkerFlavorCli::Lld(LldFlavor::Ld64),
LinkerFlavorCli::Lld(LldFlavor::Link),
LinkerFlavorCli::Lld(LldFlavor::Wasm), LinkerFlavorCli::Em]
}
pub const fn one_of() -> &'static str {
"one of: gnu gnu-lld gnu-cc gnu-lld-cc darwin darwin-lld darwin-cc darwin-lld-cc wasm-lld wasm-lld-cc unix unix-cc msvc-lld msvc em-cc bpf llbc ptx gcc ld ld.lld ld64.lld lld-link wasm-ld em "
}
pub fn desc(self) -> &'static str {
match self {
LinkerFlavorCli::Gnu(Cc::No, Lld::No) => "gnu",
LinkerFlavorCli::Gnu(Cc::No, Lld::Yes) => "gnu-lld",
LinkerFlavorCli::Gnu(Cc::Yes, Lld::No) => "gnu-cc",
LinkerFlavorCli::Gnu(Cc::Yes, Lld::Yes) => "gnu-lld-cc",
LinkerFlavorCli::Darwin(Cc::No, Lld::No) => "darwin",
LinkerFlavorCli::Darwin(Cc::No, Lld::Yes) => "darwin-lld",
LinkerFlavorCli::Darwin(Cc::Yes, Lld::No) => "darwin-cc",
LinkerFlavorCli::Darwin(Cc::Yes, Lld::Yes) => "darwin-lld-cc",
LinkerFlavorCli::WasmLld(Cc::No) => "wasm-lld",
LinkerFlavorCli::WasmLld(Cc::Yes) => "wasm-lld-cc",
LinkerFlavorCli::Unix(Cc::No) => "unix",
LinkerFlavorCli::Unix(Cc::Yes) => "unix-cc",
LinkerFlavorCli::Msvc(Lld::Yes) => "msvc-lld",
LinkerFlavorCli::Msvc(Lld::No) => "msvc",
LinkerFlavorCli::EmCc => "em-cc",
LinkerFlavorCli::Bpf => "bpf",
LinkerFlavorCli::Llbc => "llbc",
LinkerFlavorCli::Ptx => "ptx",
LinkerFlavorCli::Gcc => "gcc",
LinkerFlavorCli::Ld => "ld",
LinkerFlavorCli::Lld(LldFlavor::Ld) => "ld.lld",
LinkerFlavorCli::Lld(LldFlavor::Ld64) => "ld64.lld",
LinkerFlavorCli::Lld(LldFlavor::Link) => "lld-link",
LinkerFlavorCli::Lld(LldFlavor::Wasm) => "wasm-ld",
LinkerFlavorCli::Em => "em",
}
}
}
impl FromStr for LinkerFlavorCli {
type Err = String;
fn from_str(s: &str) -> Result<LinkerFlavorCli, Self::Err> {
Ok(match s {
"gnu" => LinkerFlavorCli::Gnu(Cc::No, Lld::No),
"gnu-lld" => LinkerFlavorCli::Gnu(Cc::No, Lld::Yes),
"gnu-cc" => LinkerFlavorCli::Gnu(Cc::Yes, Lld::No),
"gnu-lld-cc" => LinkerFlavorCli::Gnu(Cc::Yes, Lld::Yes),
"darwin" => LinkerFlavorCli::Darwin(Cc::No, Lld::No),
"darwin-lld" => LinkerFlavorCli::Darwin(Cc::No, Lld::Yes),
"darwin-cc" => LinkerFlavorCli::Darwin(Cc::Yes, Lld::No),
"darwin-lld-cc" => LinkerFlavorCli::Darwin(Cc::Yes, Lld::Yes),
"wasm-lld" => LinkerFlavorCli::WasmLld(Cc::No),
"wasm-lld-cc" => LinkerFlavorCli::WasmLld(Cc::Yes),
"unix" => LinkerFlavorCli::Unix(Cc::No),
"unix-cc" => LinkerFlavorCli::Unix(Cc::Yes),
"msvc-lld" => LinkerFlavorCli::Msvc(Lld::Yes),
"msvc" => LinkerFlavorCli::Msvc(Lld::No),
"em-cc" => LinkerFlavorCli::EmCc,
"bpf" => LinkerFlavorCli::Bpf,
"llbc" => LinkerFlavorCli::Llbc,
"ptx" => LinkerFlavorCli::Ptx,
"gcc" => LinkerFlavorCli::Gcc,
"ld" => LinkerFlavorCli::Ld,
"ld.lld" => LinkerFlavorCli::Lld(LldFlavor::Ld),
"ld64.lld" => LinkerFlavorCli::Lld(LldFlavor::Ld64),
"lld-link" => LinkerFlavorCli::Lld(LldFlavor::Link),
"wasm-ld" => LinkerFlavorCli::Lld(LldFlavor::Wasm),
"em" => LinkerFlavorCli::Em,
_ =>
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid linker flavor, allowed values: {0}",
Self::one_of()))
})),
})
}
}linker_flavor_cli_impls! {
497 (LinkerFlavorCli::Gnu(Cc::No, Lld::No)) "gnu"
498 (LinkerFlavorCli::Gnu(Cc::No, Lld::Yes)) "gnu-lld"
499 (LinkerFlavorCli::Gnu(Cc::Yes, Lld::No)) "gnu-cc"
500 (LinkerFlavorCli::Gnu(Cc::Yes, Lld::Yes)) "gnu-lld-cc"
501 (LinkerFlavorCli::Darwin(Cc::No, Lld::No)) "darwin"
502 (LinkerFlavorCli::Darwin(Cc::No, Lld::Yes)) "darwin-lld"
503 (LinkerFlavorCli::Darwin(Cc::Yes, Lld::No)) "darwin-cc"
504 (LinkerFlavorCli::Darwin(Cc::Yes, Lld::Yes)) "darwin-lld-cc"
505 (LinkerFlavorCli::WasmLld(Cc::No)) "wasm-lld"
506 (LinkerFlavorCli::WasmLld(Cc::Yes)) "wasm-lld-cc"
507 (LinkerFlavorCli::Unix(Cc::No)) "unix"
508 (LinkerFlavorCli::Unix(Cc::Yes)) "unix-cc"
509 (LinkerFlavorCli::Msvc(Lld::Yes)) "msvc-lld"
510 (LinkerFlavorCli::Msvc(Lld::No)) "msvc"
511 (LinkerFlavorCli::EmCc) "em-cc"
512 (LinkerFlavorCli::Bpf) "bpf"
513 (LinkerFlavorCli::Llbc) "llbc"
514 (LinkerFlavorCli::Ptx) "ptx"
515
516 (LinkerFlavorCli::Gcc) "gcc"
518 (LinkerFlavorCli::Ld) "ld"
519 (LinkerFlavorCli::Lld(LldFlavor::Ld)) "ld.lld"
520 (LinkerFlavorCli::Lld(LldFlavor::Ld64)) "ld64.lld"
521 (LinkerFlavorCli::Lld(LldFlavor::Link)) "lld-link"
522 (LinkerFlavorCli::Lld(LldFlavor::Wasm)) "wasm-ld"
523 (LinkerFlavorCli::Em) "em"
524}
525
526impl<'de> serde::Deserialize<'de> for LinkerFlavorCli {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}crate::json::serde_deserialize_from_str!(LinkerFlavorCli);
527impl schemars::JsonSchema for LinkerFlavorCli {
528 fn schema_name() -> std::borrow::Cow<'static, str> {
529 "LinkerFlavor".into()
530 }
531 fn json_schema(_: &mut schemars::SchemaGenerator) -> schemars::Schema {
532 let all: Vec<&'static str> =
533 Self::all().iter().map(|flavor| flavor.desc()).collect::<Vec<_>>();
534 <::schemars::Schema as
::core::convert::TryFrom<_>>::try_from(::serde_json::Value::Object({
let mut object = ::serde_json::Map::new();
let _ =
object.insert(("type").into(),
::serde_json::to_value(&"string").unwrap());
let _ =
object.insert(("enum").into(),
::serde_json::to_value(&all).unwrap());
object
})).unwrap()schemars::json_schema! ({
535 "type": "string",
536 "enum": all
537 })
538 .into()
539 }
540}
541
542impl ToJson for LinkerFlavorCli {
543 fn to_json(&self) -> Json {
544 self.desc().to_json()
545 }
546}
547
548#[derive(#[automatically_derived]
impl ::core::clone::Clone for LinkSelfContainedDefault {
#[inline]
fn clone(&self) -> LinkSelfContainedDefault {
let _: ::core::clone::AssertParamIsClone<LinkSelfContainedComponents>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for LinkSelfContainedDefault { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for LinkSelfContainedDefault {
#[inline]
fn eq(&self, other: &LinkSelfContainedDefault) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(LinkSelfContainedDefault::WithComponents(__self_0),
LinkSelfContainedDefault::WithComponents(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::fmt::Debug for LinkSelfContainedDefault {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
LinkSelfContainedDefault::True =>
::core::fmt::Formatter::write_str(f, "True"),
LinkSelfContainedDefault::False =>
::core::fmt::Formatter::write_str(f, "False"),
LinkSelfContainedDefault::InferredForMusl =>
::core::fmt::Formatter::write_str(f, "InferredForMusl"),
LinkSelfContainedDefault::InferredForMingw =>
::core::fmt::Formatter::write_str(f, "InferredForMingw"),
LinkSelfContainedDefault::WithComponents(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"WithComponents", &__self_0),
}
}
}Debug)]
555pub enum LinkSelfContainedDefault {
556 True,
558
559 False,
561
562 InferredForMusl,
564
565 InferredForMingw,
567
568 WithComponents(LinkSelfContainedComponents),
571}
572
573impl FromStr for LinkSelfContainedDefault {
575 type Err = String;
576
577 fn from_str(s: &str) -> Result<LinkSelfContainedDefault, Self::Err> {
578 Ok(match s {
579 "false" => LinkSelfContainedDefault::False,
580 "true" | "wasm" => LinkSelfContainedDefault::True,
581 "musl" => LinkSelfContainedDefault::InferredForMusl,
582 "mingw" => LinkSelfContainedDefault::InferredForMingw,
583 _ => {
584 return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("\'{0}\' is not a valid `-Clink-self-contained` default. Use \'false\', \'true\', \'wasm\', \'musl\' or \'mingw\'",
s))
})format!(
585 "'{s}' is not a valid `-Clink-self-contained` default. \
586 Use 'false', 'true', 'wasm', 'musl' or 'mingw'",
587 ));
588 }
589 })
590 }
591}
592
593impl<'de> serde::Deserialize<'de> for LinkSelfContainedDefault {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}crate::json::serde_deserialize_from_str!(LinkSelfContainedDefault);
594impl schemars::JsonSchema for LinkSelfContainedDefault {
595 fn schema_name() -> std::borrow::Cow<'static, str> {
596 "LinkSelfContainedDefault".into()
597 }
598 fn json_schema(_: &mut schemars::SchemaGenerator) -> schemars::Schema {
599 <::schemars::Schema as
::core::convert::TryFrom<_>>::try_from(::serde_json::Value::Object({
let mut object = ::serde_json::Map::new();
let _ =
object.insert(("type").into(),
::serde_json::to_value(&"string").unwrap());
let _ =
object.insert(("enum").into(),
::serde_json::Value::Array(<[_]>::into_vec(::alloc::boxed::box_new([::serde_json::to_value(&"false").unwrap(),
::serde_json::to_value(&"true").unwrap(),
::serde_json::to_value(&"wasm").unwrap(),
::serde_json::to_value(&"musl").unwrap(),
::serde_json::to_value(&"mingw").unwrap()]))));
object
})).unwrap()schemars::json_schema! ({
600 "type": "string",
601 "enum": ["false", "true", "wasm", "musl", "mingw"]
602 })
603 .into()
604 }
605}
606
607impl ToJson for LinkSelfContainedDefault {
608 fn to_json(&self) -> Json {
609 match *self {
610 LinkSelfContainedDefault::WithComponents(components) => {
611 let mut map = BTreeMap::new();
615 map.insert("components", components);
616 map.to_json()
617 }
618
619 LinkSelfContainedDefault::True => "true".to_json(),
621 LinkSelfContainedDefault::False => "false".to_json(),
622 LinkSelfContainedDefault::InferredForMusl => "musl".to_json(),
623 LinkSelfContainedDefault::InferredForMingw => "mingw".to_json(),
624 }
625 }
626}
627
628impl LinkSelfContainedDefault {
629 pub fn is_disabled(self) -> bool {
632 self == LinkSelfContainedDefault::False
633 }
634
635 fn json_key(self) -> &'static str {
639 match self {
640 LinkSelfContainedDefault::WithComponents(_) => "link-self-contained",
641 _ => "crt-objects-fallback",
642 }
643 }
644
645 pub fn with_linker() -> LinkSelfContainedDefault {
648 LinkSelfContainedDefault::WithComponents(LinkSelfContainedComponents::LINKER)
649 }
650}
651
652bitflags::bitflags! {
653 #[derive(#[automatically_derived]
impl ::core::clone::Clone for LinkSelfContainedComponents {
#[inline]
fn clone(&self) -> LinkSelfContainedComponents {
let _:
::core::clone::AssertParamIsClone<<LinkSelfContainedComponents
as ::bitflags::__private::PublicFlags>::Internal>;
*self
}
}
impl LinkSelfContainedComponents {
#[doc = r" CRT objects (e.g. on `windows-gnu`, `musl`, `wasi` targets)"]
#[allow(deprecated, non_upper_case_globals,)]
pub const CRT_OBJECTS: Self = Self::from_bits_retain(1 << 0);
#[doc = r" libc static library (e.g. on `musl`, `wasi` targets)"]
#[allow(deprecated, non_upper_case_globals,)]
pub const LIBC: Self = Self::from_bits_retain(1 << 1);
#[doc =
r" libgcc/libunwind (e.g. on `windows-gnu`, `fuchsia`, `fortanix`, `gnullvm` targets)"]
#[allow(deprecated, non_upper_case_globals,)]
pub const UNWIND: Self = Self::from_bits_retain(1 << 2);
#[doc =
r" Linker, dlltool, and their necessary libraries (e.g. on `windows-gnu` and for `rust-lld`)"]
#[allow(deprecated, non_upper_case_globals,)]
pub const LINKER: Self = Self::from_bits_retain(1 << 3);
#[doc = r" Sanitizer runtime libraries"]
#[allow(deprecated, non_upper_case_globals,)]
pub const SANITIZERS: Self = Self::from_bits_retain(1 << 4);
#[doc = r" Other MinGW libs and Windows import libs"]
#[allow(deprecated, non_upper_case_globals,)]
pub const MINGW: Self = Self::from_bits_retain(1 << 5);
}
impl ::bitflags::Flags for LinkSelfContainedComponents {
const FLAGS: &'static [::bitflags::Flag<LinkSelfContainedComponents>] =
&[{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("CRT_OBJECTS",
LinkSelfContainedComponents::CRT_OBJECTS)
},
{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("LIBC",
LinkSelfContainedComponents::LIBC)
},
{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("UNWIND",
LinkSelfContainedComponents::UNWIND)
},
{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("LINKER",
LinkSelfContainedComponents::LINKER)
},
{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("SANITIZERS",
LinkSelfContainedComponents::SANITIZERS)
},
{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("MINGW",
LinkSelfContainedComponents::MINGW)
}];
type Bits = u8;
fn bits(&self) -> u8 { LinkSelfContainedComponents::bits(self) }
fn from_bits_retain(bits: u8) -> LinkSelfContainedComponents {
LinkSelfContainedComponents::from_bits_retain(bits)
}
}
#[allow(dead_code, deprecated, unused_doc_comments, unused_attributes,
unused_mut, unused_imports, non_upper_case_globals, clippy ::
assign_op_pattern, clippy :: indexing_slicing, clippy :: same_name_method,
clippy :: iter_without_into_iter,)]
const _: () =
{
#[repr(transparent)]
pub struct InternalBitFlags(u8);
#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for InternalBitFlags { }
#[automatically_derived]
impl ::core::clone::Clone for InternalBitFlags {
#[inline]
fn clone(&self) -> InternalBitFlags {
let _: ::core::clone::AssertParamIsClone<u8>;
*self
}
}
#[automatically_derived]
impl ::core::marker::Copy for InternalBitFlags { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for InternalBitFlags { }
#[automatically_derived]
impl ::core::cmp::PartialEq for InternalBitFlags {
#[inline]
fn eq(&self, other: &InternalBitFlags) -> bool {
self.0 == other.0
}
}
#[automatically_derived]
impl ::core::cmp::Eq for InternalBitFlags {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<u8>;
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for InternalBitFlags {
#[inline]
fn partial_cmp(&self, other: &InternalBitFlags)
-> ::core::option::Option<::core::cmp::Ordering> {
::core::cmp::PartialOrd::partial_cmp(&self.0, &other.0)
}
}
#[automatically_derived]
impl ::core::cmp::Ord for InternalBitFlags {
#[inline]
fn cmp(&self, other: &InternalBitFlags) -> ::core::cmp::Ordering {
::core::cmp::Ord::cmp(&self.0, &other.0)
}
}
#[automatically_derived]
impl ::core::hash::Hash for InternalBitFlags {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.0, state)
}
}
impl ::bitflags::__private::PublicFlags for
LinkSelfContainedComponents {
type Primitive = u8;
type Internal = InternalBitFlags;
}
impl ::bitflags::__private::core::default::Default for
InternalBitFlags {
#[inline]
fn default() -> Self { InternalBitFlags::empty() }
}
impl ::bitflags::__private::core::fmt::Debug for InternalBitFlags {
fn fmt(&self,
f: &mut ::bitflags::__private::core::fmt::Formatter<'_>)
-> ::bitflags::__private::core::fmt::Result {
if self.is_empty() {
f.write_fmt(format_args!("{0:#x}",
<u8 as ::bitflags::Bits>::EMPTY))
} else {
::bitflags::__private::core::fmt::Display::fmt(self, f)
}
}
}
impl ::bitflags::__private::core::fmt::Display for InternalBitFlags {
fn fmt(&self,
f: &mut ::bitflags::__private::core::fmt::Formatter<'_>)
-> ::bitflags::__private::core::fmt::Result {
::bitflags::parser::to_writer(&LinkSelfContainedComponents(*self),
f)
}
}
impl ::bitflags::__private::core::str::FromStr for InternalBitFlags {
type Err = ::bitflags::parser::ParseError;
fn from_str(s: &str)
->
::bitflags::__private::core::result::Result<Self,
Self::Err> {
::bitflags::parser::from_str::<LinkSelfContainedComponents>(s).map(|flags|
flags.0)
}
}
impl ::bitflags::__private::core::convert::AsRef<u8> for
InternalBitFlags {
fn as_ref(&self) -> &u8 { &self.0 }
}
impl ::bitflags::__private::core::convert::From<u8> for
InternalBitFlags {
fn from(bits: u8) -> Self { Self::from_bits_retain(bits) }
}
#[allow(dead_code, deprecated, unused_attributes)]
impl InternalBitFlags {
#[inline]
pub const fn empty() -> Self {
Self(<u8 as ::bitflags::Bits>::EMPTY)
}
#[inline]
pub const fn all() -> Self {
let mut truncated = <u8 as ::bitflags::Bits>::EMPTY;
let mut i = 0;
{
{
let flag =
<LinkSelfContainedComponents as
::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
{
{
let flag =
<LinkSelfContainedComponents as
::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
{
{
let flag =
<LinkSelfContainedComponents as
::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
{
{
let flag =
<LinkSelfContainedComponents as
::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
{
{
let flag =
<LinkSelfContainedComponents as
::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
{
{
let flag =
<LinkSelfContainedComponents as
::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
let _ = i;
Self(truncated)
}
#[inline]
pub const fn bits(&self) -> u8 { self.0 }
#[inline]
pub const fn from_bits(bits: u8)
-> ::bitflags::__private::core::option::Option<Self> {
let truncated = Self::from_bits_truncate(bits).0;
if truncated == bits {
::bitflags::__private::core::option::Option::Some(Self(bits))
} else { ::bitflags::__private::core::option::Option::None }
}
#[inline]
pub const fn from_bits_truncate(bits: u8) -> Self {
Self(bits & Self::all().0)
}
#[inline]
pub const fn from_bits_retain(bits: u8) -> Self { Self(bits) }
#[inline]
pub fn from_name(name: &str)
-> ::bitflags::__private::core::option::Option<Self> {
{
if name == "CRT_OBJECTS" {
return ::bitflags::__private::core::option::Option::Some(Self(LinkSelfContainedComponents::CRT_OBJECTS.bits()));
}
};
;
{
if name == "LIBC" {
return ::bitflags::__private::core::option::Option::Some(Self(LinkSelfContainedComponents::LIBC.bits()));
}
};
;
{
if name == "UNWIND" {
return ::bitflags::__private::core::option::Option::Some(Self(LinkSelfContainedComponents::UNWIND.bits()));
}
};
;
{
if name == "LINKER" {
return ::bitflags::__private::core::option::Option::Some(Self(LinkSelfContainedComponents::LINKER.bits()));
}
};
;
{
if name == "SANITIZERS" {
return ::bitflags::__private::core::option::Option::Some(Self(LinkSelfContainedComponents::SANITIZERS.bits()));
}
};
;
{
if name == "MINGW" {
return ::bitflags::__private::core::option::Option::Some(Self(LinkSelfContainedComponents::MINGW.bits()));
}
};
;
let _ = name;
::bitflags::__private::core::option::Option::None
}
#[inline]
pub const fn is_empty(&self) -> bool {
self.0 == <u8 as ::bitflags::Bits>::EMPTY
}
#[inline]
pub const fn is_all(&self) -> bool {
Self::all().0 | self.0 == self.0
}
#[inline]
pub const fn intersects(&self, other: Self) -> bool {
self.0 & other.0 != <u8 as ::bitflags::Bits>::EMPTY
}
#[inline]
pub const fn contains(&self, other: Self) -> bool {
self.0 & other.0 == other.0
}
#[inline]
pub fn insert(&mut self, other: Self) {
*self = Self(self.0).union(other);
}
#[inline]
pub fn remove(&mut self, other: Self) {
*self = Self(self.0).difference(other);
}
#[inline]
pub fn toggle(&mut self, other: Self) {
*self = Self(self.0).symmetric_difference(other);
}
#[inline]
pub fn set(&mut self, other: Self, value: bool) {
if value { self.insert(other); } else { self.remove(other); }
}
#[inline]
#[must_use]
pub const fn intersection(self, other: Self) -> Self {
Self(self.0 & other.0)
}
#[inline]
#[must_use]
pub const fn union(self, other: Self) -> Self {
Self(self.0 | other.0)
}
#[inline]
#[must_use]
pub const fn difference(self, other: Self) -> Self {
Self(self.0 & !other.0)
}
#[inline]
#[must_use]
pub const fn symmetric_difference(self, other: Self) -> Self {
Self(self.0 ^ other.0)
}
#[inline]
#[must_use]
pub const fn complement(self) -> Self {
Self::from_bits_truncate(!self.0)
}
}
impl ::bitflags::__private::core::fmt::Binary for InternalBitFlags {
fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
-> ::bitflags::__private::core::fmt::Result {
let inner = self.0;
::bitflags::__private::core::fmt::Binary::fmt(&inner, f)
}
}
impl ::bitflags::__private::core::fmt::Octal for InternalBitFlags {
fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
-> ::bitflags::__private::core::fmt::Result {
let inner = self.0;
::bitflags::__private::core::fmt::Octal::fmt(&inner, f)
}
}
impl ::bitflags::__private::core::fmt::LowerHex for InternalBitFlags {
fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
-> ::bitflags::__private::core::fmt::Result {
let inner = self.0;
::bitflags::__private::core::fmt::LowerHex::fmt(&inner, f)
}
}
impl ::bitflags::__private::core::fmt::UpperHex for InternalBitFlags {
fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
-> ::bitflags::__private::core::fmt::Result {
let inner = self.0;
::bitflags::__private::core::fmt::UpperHex::fmt(&inner, f)
}
}
impl ::bitflags::__private::core::ops::BitOr for InternalBitFlags {
type Output = Self;
#[inline]
fn bitor(self, other: InternalBitFlags) -> Self {
self.union(other)
}
}
impl ::bitflags::__private::core::ops::BitOrAssign for
InternalBitFlags {
#[inline]
fn bitor_assign(&mut self, other: Self) { self.insert(other); }
}
impl ::bitflags::__private::core::ops::BitXor for InternalBitFlags {
type Output = Self;
#[inline]
fn bitxor(self, other: Self) -> Self {
self.symmetric_difference(other)
}
}
impl ::bitflags::__private::core::ops::BitXorAssign for
InternalBitFlags {
#[inline]
fn bitxor_assign(&mut self, other: Self) { self.toggle(other); }
}
impl ::bitflags::__private::core::ops::BitAnd for InternalBitFlags {
type Output = Self;
#[inline]
fn bitand(self, other: Self) -> Self { self.intersection(other) }
}
impl ::bitflags::__private::core::ops::BitAndAssign for
InternalBitFlags {
#[inline]
fn bitand_assign(&mut self, other: Self) {
*self =
Self::from_bits_retain(self.bits()).intersection(other);
}
}
impl ::bitflags::__private::core::ops::Sub for InternalBitFlags {
type Output = Self;
#[inline]
fn sub(self, other: Self) -> Self { self.difference(other) }
}
impl ::bitflags::__private::core::ops::SubAssign for InternalBitFlags
{
#[inline]
fn sub_assign(&mut self, other: Self) { self.remove(other); }
}
impl ::bitflags::__private::core::ops::Not for InternalBitFlags {
type Output = Self;
#[inline]
fn not(self) -> Self { self.complement() }
}
impl ::bitflags::__private::core::iter::Extend<InternalBitFlags> for
InternalBitFlags {
fn extend<T: ::bitflags::__private::core::iter::IntoIterator<Item
= Self>>(&mut self, iterator: T) {
for item in iterator { self.insert(item) }
}
}
impl ::bitflags::__private::core::iter::FromIterator<InternalBitFlags>
for InternalBitFlags {
fn from_iter<T: ::bitflags::__private::core::iter::IntoIterator<Item
= Self>>(iterator: T) -> Self {
use ::bitflags::__private::core::iter::Extend;
let mut result = Self::empty();
result.extend(iterator);
result
}
}
impl InternalBitFlags {
#[inline]
pub const fn iter(&self)
-> ::bitflags::iter::Iter<LinkSelfContainedComponents> {
::bitflags::iter::Iter::__private_const_new(<LinkSelfContainedComponents
as ::bitflags::Flags>::FLAGS,
LinkSelfContainedComponents::from_bits_retain(self.bits()),
LinkSelfContainedComponents::from_bits_retain(self.bits()))
}
#[inline]
pub const fn iter_names(&self)
-> ::bitflags::iter::IterNames<LinkSelfContainedComponents> {
::bitflags::iter::IterNames::__private_const_new(<LinkSelfContainedComponents
as ::bitflags::Flags>::FLAGS,
LinkSelfContainedComponents::from_bits_retain(self.bits()),
LinkSelfContainedComponents::from_bits_retain(self.bits()))
}
}
impl ::bitflags::__private::core::iter::IntoIterator for
InternalBitFlags {
type Item = LinkSelfContainedComponents;
type IntoIter =
::bitflags::iter::Iter<LinkSelfContainedComponents>;
fn into_iter(self) -> Self::IntoIter { self.iter() }
}
impl InternalBitFlags {
#[inline]
pub fn bits_mut(&mut self) -> &mut u8 { &mut self.0 }
}
#[allow(dead_code, deprecated, unused_attributes)]
impl LinkSelfContainedComponents {
#[inline]
pub const fn empty() -> Self { Self(InternalBitFlags::empty()) }
#[inline]
pub const fn all() -> Self { Self(InternalBitFlags::all()) }
#[inline]
pub const fn bits(&self) -> u8 { self.0.bits() }
#[inline]
pub const fn from_bits(bits: u8)
-> ::bitflags::__private::core::option::Option<Self> {
match InternalBitFlags::from_bits(bits) {
::bitflags::__private::core::option::Option::Some(bits) =>
::bitflags::__private::core::option::Option::Some(Self(bits)),
::bitflags::__private::core::option::Option::None =>
::bitflags::__private::core::option::Option::None,
}
}
#[inline]
pub const fn from_bits_truncate(bits: u8) -> Self {
Self(InternalBitFlags::from_bits_truncate(bits))
}
#[inline]
pub const fn from_bits_retain(bits: u8) -> Self {
Self(InternalBitFlags::from_bits_retain(bits))
}
#[inline]
pub fn from_name(name: &str)
-> ::bitflags::__private::core::option::Option<Self> {
match InternalBitFlags::from_name(name) {
::bitflags::__private::core::option::Option::Some(bits) =>
::bitflags::__private::core::option::Option::Some(Self(bits)),
::bitflags::__private::core::option::Option::None =>
::bitflags::__private::core::option::Option::None,
}
}
#[inline]
pub const fn is_empty(&self) -> bool { self.0.is_empty() }
#[inline]
pub const fn is_all(&self) -> bool { self.0.is_all() }
#[inline]
pub const fn intersects(&self, other: Self) -> bool {
self.0.intersects(other.0)
}
#[inline]
pub const fn contains(&self, other: Self) -> bool {
self.0.contains(other.0)
}
#[inline]
pub fn insert(&mut self, other: Self) { self.0.insert(other.0) }
#[inline]
pub fn remove(&mut self, other: Self) { self.0.remove(other.0) }
#[inline]
pub fn toggle(&mut self, other: Self) { self.0.toggle(other.0) }
#[inline]
pub fn set(&mut self, other: Self, value: bool) {
self.0.set(other.0, value)
}
#[inline]
#[must_use]
pub const fn intersection(self, other: Self) -> Self {
Self(self.0.intersection(other.0))
}
#[inline]
#[must_use]
pub const fn union(self, other: Self) -> Self {
Self(self.0.union(other.0))
}
#[inline]
#[must_use]
pub const fn difference(self, other: Self) -> Self {
Self(self.0.difference(other.0))
}
#[inline]
#[must_use]
pub const fn symmetric_difference(self, other: Self) -> Self {
Self(self.0.symmetric_difference(other.0))
}
#[inline]
#[must_use]
pub const fn complement(self) -> Self {
Self(self.0.complement())
}
}
impl ::bitflags::__private::core::fmt::Binary for
LinkSelfContainedComponents {
fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
-> ::bitflags::__private::core::fmt::Result {
let inner = self.0;
::bitflags::__private::core::fmt::Binary::fmt(&inner, f)
}
}
impl ::bitflags::__private::core::fmt::Octal for
LinkSelfContainedComponents {
fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
-> ::bitflags::__private::core::fmt::Result {
let inner = self.0;
::bitflags::__private::core::fmt::Octal::fmt(&inner, f)
}
}
impl ::bitflags::__private::core::fmt::LowerHex for
LinkSelfContainedComponents {
fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
-> ::bitflags::__private::core::fmt::Result {
let inner = self.0;
::bitflags::__private::core::fmt::LowerHex::fmt(&inner, f)
}
}
impl ::bitflags::__private::core::fmt::UpperHex for
LinkSelfContainedComponents {
fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
-> ::bitflags::__private::core::fmt::Result {
let inner = self.0;
::bitflags::__private::core::fmt::UpperHex::fmt(&inner, f)
}
}
impl ::bitflags::__private::core::ops::BitOr for
LinkSelfContainedComponents {
type Output = Self;
#[inline]
fn bitor(self, other: LinkSelfContainedComponents) -> Self {
self.union(other)
}
}
impl ::bitflags::__private::core::ops::BitOrAssign for
LinkSelfContainedComponents {
#[inline]
fn bitor_assign(&mut self, other: Self) { self.insert(other); }
}
impl ::bitflags::__private::core::ops::BitXor for
LinkSelfContainedComponents {
type Output = Self;
#[inline]
fn bitxor(self, other: Self) -> Self {
self.symmetric_difference(other)
}
}
impl ::bitflags::__private::core::ops::BitXorAssign for
LinkSelfContainedComponents {
#[inline]
fn bitxor_assign(&mut self, other: Self) { self.toggle(other); }
}
impl ::bitflags::__private::core::ops::BitAnd for
LinkSelfContainedComponents {
type Output = Self;
#[inline]
fn bitand(self, other: Self) -> Self { self.intersection(other) }
}
impl ::bitflags::__private::core::ops::BitAndAssign for
LinkSelfContainedComponents {
#[inline]
fn bitand_assign(&mut self, other: Self) {
*self =
Self::from_bits_retain(self.bits()).intersection(other);
}
}
impl ::bitflags::__private::core::ops::Sub for
LinkSelfContainedComponents {
type Output = Self;
#[inline]
fn sub(self, other: Self) -> Self { self.difference(other) }
}
impl ::bitflags::__private::core::ops::SubAssign for
LinkSelfContainedComponents {
#[inline]
fn sub_assign(&mut self, other: Self) { self.remove(other); }
}
impl ::bitflags::__private::core::ops::Not for
LinkSelfContainedComponents {
type Output = Self;
#[inline]
fn not(self) -> Self { self.complement() }
}
impl ::bitflags::__private::core::iter::Extend<LinkSelfContainedComponents>
for LinkSelfContainedComponents {
fn extend<T: ::bitflags::__private::core::iter::IntoIterator<Item
= Self>>(&mut self, iterator: T) {
for item in iterator { self.insert(item) }
}
}
impl ::bitflags::__private::core::iter::FromIterator<LinkSelfContainedComponents>
for LinkSelfContainedComponents {
fn from_iter<T: ::bitflags::__private::core::iter::IntoIterator<Item
= Self>>(iterator: T) -> Self {
use ::bitflags::__private::core::iter::Extend;
let mut result = Self::empty();
result.extend(iterator);
result
}
}
impl LinkSelfContainedComponents {
#[inline]
pub const fn iter(&self)
-> ::bitflags::iter::Iter<LinkSelfContainedComponents> {
::bitflags::iter::Iter::__private_const_new(<LinkSelfContainedComponents
as ::bitflags::Flags>::FLAGS,
LinkSelfContainedComponents::from_bits_retain(self.bits()),
LinkSelfContainedComponents::from_bits_retain(self.bits()))
}
#[inline]
pub const fn iter_names(&self)
-> ::bitflags::iter::IterNames<LinkSelfContainedComponents> {
::bitflags::iter::IterNames::__private_const_new(<LinkSelfContainedComponents
as ::bitflags::Flags>::FLAGS,
LinkSelfContainedComponents::from_bits_retain(self.bits()),
LinkSelfContainedComponents::from_bits_retain(self.bits()))
}
}
impl ::bitflags::__private::core::iter::IntoIterator for
LinkSelfContainedComponents {
type Item = LinkSelfContainedComponents;
type IntoIter =
::bitflags::iter::Iter<LinkSelfContainedComponents>;
fn into_iter(self) -> Self::IntoIter { self.iter() }
}
};Clone, #[automatically_derived]
impl ::core::marker::Copy for LinkSelfContainedComponents { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for LinkSelfContainedComponents {
#[inline]
fn eq(&self, other: &LinkSelfContainedComponents) -> bool {
self.0 == other.0
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for LinkSelfContainedComponents {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) {
let _:
::core::cmp::AssertParamIsEq<<LinkSelfContainedComponents as
::bitflags::__private::PublicFlags>::Internal>;
}
}Eq, #[automatically_derived]
impl ::core::default::Default for LinkSelfContainedComponents {
#[inline]
fn default() -> LinkSelfContainedComponents {
LinkSelfContainedComponents(::core::default::Default::default())
}
}Default)]
654 pub struct LinkSelfContainedComponents: u8 {
656 const CRT_OBJECTS = 1 << 0;
658 const LIBC = 1 << 1;
660 const UNWIND = 1 << 2;
662 const LINKER = 1 << 3;
664 const SANITIZERS = 1 << 4;
666 const MINGW = 1 << 5;
668 }
669}
670impl ::std::fmt::Debug for LinkSelfContainedComponents {
fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
::bitflags::parser::to_writer(self, f)
}
}rustc_data_structures::external_bitflags_debug! { LinkSelfContainedComponents }
671
672impl LinkSelfContainedComponents {
673 pub fn as_str(self) -> Option<&'static str> {
677 Some(match self {
678 LinkSelfContainedComponents::CRT_OBJECTS => "crto",
679 LinkSelfContainedComponents::LIBC => "libc",
680 LinkSelfContainedComponents::UNWIND => "unwind",
681 LinkSelfContainedComponents::LINKER => "linker",
682 LinkSelfContainedComponents::SANITIZERS => "sanitizers",
683 LinkSelfContainedComponents::MINGW => "mingw",
684 _ => return None,
685 })
686 }
687
688 fn all_components() -> [LinkSelfContainedComponents; 6] {
690 [
691 LinkSelfContainedComponents::CRT_OBJECTS,
692 LinkSelfContainedComponents::LIBC,
693 LinkSelfContainedComponents::UNWIND,
694 LinkSelfContainedComponents::LINKER,
695 LinkSelfContainedComponents::SANITIZERS,
696 LinkSelfContainedComponents::MINGW,
697 ]
698 }
699
700 pub fn are_any_components_enabled(self) -> bool {
702 !self.is_empty()
703 }
704
705 pub fn is_linker_enabled(self) -> bool {
707 self.contains(LinkSelfContainedComponents::LINKER)
708 }
709
710 pub fn is_crt_objects_enabled(self) -> bool {
712 self.contains(LinkSelfContainedComponents::CRT_OBJECTS)
713 }
714}
715
716impl FromStr for LinkSelfContainedComponents {
717 type Err = String;
718
719 fn from_str(s: &str) -> Result<Self, Self::Err> {
721 Ok(match s {
722 "crto" => LinkSelfContainedComponents::CRT_OBJECTS,
723 "libc" => LinkSelfContainedComponents::LIBC,
724 "unwind" => LinkSelfContainedComponents::UNWIND,
725 "linker" => LinkSelfContainedComponents::LINKER,
726 "sanitizers" => LinkSelfContainedComponents::SANITIZERS,
727 "mingw" => LinkSelfContainedComponents::MINGW,
728 _ => {
729 return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("\'{0}\' is not a valid link-self-contained component, expected \'crto\', \'libc\', \'unwind\', \'linker\', \'sanitizers\', \'mingw\'",
s))
})format!(
730 "'{s}' is not a valid link-self-contained component, expected 'crto', 'libc', 'unwind', 'linker', 'sanitizers', 'mingw'"
731 ));
732 }
733 })
734 }
735}
736
737impl<'de> serde::Deserialize<'de> for LinkSelfContainedComponents {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}crate::json::serde_deserialize_from_str!(LinkSelfContainedComponents);
738impl schemars::JsonSchema for LinkSelfContainedComponents {
739 fn schema_name() -> std::borrow::Cow<'static, str> {
740 "LinkSelfContainedComponents".into()
741 }
742 fn json_schema(_: &mut schemars::SchemaGenerator) -> schemars::Schema {
743 let all =
744 Self::all_components().iter().map(|component| component.as_str()).collect::<Vec<_>>();
745 <::schemars::Schema as
::core::convert::TryFrom<_>>::try_from(::serde_json::Value::Object({
let mut object = ::serde_json::Map::new();
let _ =
object.insert(("type").into(),
::serde_json::to_value(&"string").unwrap());
let _ =
object.insert(("enum").into(),
::serde_json::to_value(&all).unwrap());
;
object
})).unwrap()schemars::json_schema! ({
746 "type": "string",
747 "enum": all,
748 })
749 .into()
750 }
751}
752
753impl ToJson for LinkSelfContainedComponents {
754 fn to_json(&self) -> Json {
755 let components: Vec<_> = Self::all_components()
756 .into_iter()
757 .filter(|c| self.contains(*c))
758 .map(|c| {
759 c.as_str().unwrap().to_owned()
762 })
763 .collect();
764
765 components.to_json()
766 }
767}
768
769bitflags::bitflags! {
770 #[derive(#[automatically_derived]
impl ::core::clone::Clone for LinkerFeatures {
#[inline]
fn clone(&self) -> LinkerFeatures {
let _:
::core::clone::AssertParamIsClone<<LinkerFeatures as
::bitflags::__private::PublicFlags>::Internal>;
*self
}
}
impl LinkerFeatures {
#[doc =
r" Invoke the linker via a C/C++ compiler (e.g. on most unix targets)."]
#[allow(deprecated, non_upper_case_globals,)]
pub const CC: Self = Self::from_bits_retain(1 << 0);
#[doc =
r" Use the lld linker, either the system lld or the self-contained linker `rust-lld`."]
#[allow(deprecated, non_upper_case_globals,)]
pub const LLD: Self = Self::from_bits_retain(1 << 1);
}
impl ::bitflags::Flags for LinkerFeatures {
const FLAGS: &'static [::bitflags::Flag<LinkerFeatures>] =
&[{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("CC", LinkerFeatures::CC)
},
{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("LLD", LinkerFeatures::LLD)
}];
type Bits = u8;
fn bits(&self) -> u8 { LinkerFeatures::bits(self) }
fn from_bits_retain(bits: u8) -> LinkerFeatures {
LinkerFeatures::from_bits_retain(bits)
}
}
#[allow(dead_code, deprecated, unused_doc_comments, unused_attributes,
unused_mut, unused_imports, non_upper_case_globals, clippy ::
assign_op_pattern, clippy :: indexing_slicing, clippy :: same_name_method,
clippy :: iter_without_into_iter,)]
const _: () =
{
#[repr(transparent)]
pub struct InternalBitFlags(u8);
#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for InternalBitFlags { }
#[automatically_derived]
impl ::core::clone::Clone for InternalBitFlags {
#[inline]
fn clone(&self) -> InternalBitFlags {
let _: ::core::clone::AssertParamIsClone<u8>;
*self
}
}
#[automatically_derived]
impl ::core::marker::Copy for InternalBitFlags { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for InternalBitFlags { }
#[automatically_derived]
impl ::core::cmp::PartialEq for InternalBitFlags {
#[inline]
fn eq(&self, other: &InternalBitFlags) -> bool {
self.0 == other.0
}
}
#[automatically_derived]
impl ::core::cmp::Eq for InternalBitFlags {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<u8>;
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for InternalBitFlags {
#[inline]
fn partial_cmp(&self, other: &InternalBitFlags)
-> ::core::option::Option<::core::cmp::Ordering> {
::core::cmp::PartialOrd::partial_cmp(&self.0, &other.0)
}
}
#[automatically_derived]
impl ::core::cmp::Ord for InternalBitFlags {
#[inline]
fn cmp(&self, other: &InternalBitFlags) -> ::core::cmp::Ordering {
::core::cmp::Ord::cmp(&self.0, &other.0)
}
}
#[automatically_derived]
impl ::core::hash::Hash for InternalBitFlags {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.0, state)
}
}
impl ::bitflags::__private::PublicFlags for LinkerFeatures {
type Primitive = u8;
type Internal = InternalBitFlags;
}
impl ::bitflags::__private::core::default::Default for
InternalBitFlags {
#[inline]
fn default() -> Self { InternalBitFlags::empty() }
}
impl ::bitflags::__private::core::fmt::Debug for InternalBitFlags {
fn fmt(&self,
f: &mut ::bitflags::__private::core::fmt::Formatter<'_>)
-> ::bitflags::__private::core::fmt::Result {
if self.is_empty() {
f.write_fmt(format_args!("{0:#x}",
<u8 as ::bitflags::Bits>::EMPTY))
} else {
::bitflags::__private::core::fmt::Display::fmt(self, f)
}
}
}
impl ::bitflags::__private::core::fmt::Display for InternalBitFlags {
fn fmt(&self,
f: &mut ::bitflags::__private::core::fmt::Formatter<'_>)
-> ::bitflags::__private::core::fmt::Result {
::bitflags::parser::to_writer(&LinkerFeatures(*self), f)
}
}
impl ::bitflags::__private::core::str::FromStr for InternalBitFlags {
type Err = ::bitflags::parser::ParseError;
fn from_str(s: &str)
->
::bitflags::__private::core::result::Result<Self,
Self::Err> {
::bitflags::parser::from_str::<LinkerFeatures>(s).map(|flags|
flags.0)
}
}
impl ::bitflags::__private::core::convert::AsRef<u8> for
InternalBitFlags {
fn as_ref(&self) -> &u8 { &self.0 }
}
impl ::bitflags::__private::core::convert::From<u8> for
InternalBitFlags {
fn from(bits: u8) -> Self { Self::from_bits_retain(bits) }
}
#[allow(dead_code, deprecated, unused_attributes)]
impl InternalBitFlags {
#[inline]
pub const fn empty() -> Self {
Self(<u8 as ::bitflags::Bits>::EMPTY)
}
#[inline]
pub const fn all() -> Self {
let mut truncated = <u8 as ::bitflags::Bits>::EMPTY;
let mut i = 0;
{
{
let flag =
<LinkerFeatures as
::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
{
{
let flag =
<LinkerFeatures as
::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
let _ = i;
Self(truncated)
}
#[inline]
pub const fn bits(&self) -> u8 { self.0 }
#[inline]
pub const fn from_bits(bits: u8)
-> ::bitflags::__private::core::option::Option<Self> {
let truncated = Self::from_bits_truncate(bits).0;
if truncated == bits {
::bitflags::__private::core::option::Option::Some(Self(bits))
} else { ::bitflags::__private::core::option::Option::None }
}
#[inline]
pub const fn from_bits_truncate(bits: u8) -> Self {
Self(bits & Self::all().0)
}
#[inline]
pub const fn from_bits_retain(bits: u8) -> Self { Self(bits) }
#[inline]
pub fn from_name(name: &str)
-> ::bitflags::__private::core::option::Option<Self> {
{
if name == "CC" {
return ::bitflags::__private::core::option::Option::Some(Self(LinkerFeatures::CC.bits()));
}
};
;
{
if name == "LLD" {
return ::bitflags::__private::core::option::Option::Some(Self(LinkerFeatures::LLD.bits()));
}
};
;
let _ = name;
::bitflags::__private::core::option::Option::None
}
#[inline]
pub const fn is_empty(&self) -> bool {
self.0 == <u8 as ::bitflags::Bits>::EMPTY
}
#[inline]
pub const fn is_all(&self) -> bool {
Self::all().0 | self.0 == self.0
}
#[inline]
pub const fn intersects(&self, other: Self) -> bool {
self.0 & other.0 != <u8 as ::bitflags::Bits>::EMPTY
}
#[inline]
pub const fn contains(&self, other: Self) -> bool {
self.0 & other.0 == other.0
}
#[inline]
pub fn insert(&mut self, other: Self) {
*self = Self(self.0).union(other);
}
#[inline]
pub fn remove(&mut self, other: Self) {
*self = Self(self.0).difference(other);
}
#[inline]
pub fn toggle(&mut self, other: Self) {
*self = Self(self.0).symmetric_difference(other);
}
#[inline]
pub fn set(&mut self, other: Self, value: bool) {
if value { self.insert(other); } else { self.remove(other); }
}
#[inline]
#[must_use]
pub const fn intersection(self, other: Self) -> Self {
Self(self.0 & other.0)
}
#[inline]
#[must_use]
pub const fn union(self, other: Self) -> Self {
Self(self.0 | other.0)
}
#[inline]
#[must_use]
pub const fn difference(self, other: Self) -> Self {
Self(self.0 & !other.0)
}
#[inline]
#[must_use]
pub const fn symmetric_difference(self, other: Self) -> Self {
Self(self.0 ^ other.0)
}
#[inline]
#[must_use]
pub const fn complement(self) -> Self {
Self::from_bits_truncate(!self.0)
}
}
impl ::bitflags::__private::core::fmt::Binary for InternalBitFlags {
fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
-> ::bitflags::__private::core::fmt::Result {
let inner = self.0;
::bitflags::__private::core::fmt::Binary::fmt(&inner, f)
}
}
impl ::bitflags::__private::core::fmt::Octal for InternalBitFlags {
fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
-> ::bitflags::__private::core::fmt::Result {
let inner = self.0;
::bitflags::__private::core::fmt::Octal::fmt(&inner, f)
}
}
impl ::bitflags::__private::core::fmt::LowerHex for InternalBitFlags {
fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
-> ::bitflags::__private::core::fmt::Result {
let inner = self.0;
::bitflags::__private::core::fmt::LowerHex::fmt(&inner, f)
}
}
impl ::bitflags::__private::core::fmt::UpperHex for InternalBitFlags {
fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
-> ::bitflags::__private::core::fmt::Result {
let inner = self.0;
::bitflags::__private::core::fmt::UpperHex::fmt(&inner, f)
}
}
impl ::bitflags::__private::core::ops::BitOr for InternalBitFlags {
type Output = Self;
#[inline]
fn bitor(self, other: InternalBitFlags) -> Self {
self.union(other)
}
}
impl ::bitflags::__private::core::ops::BitOrAssign for
InternalBitFlags {
#[inline]
fn bitor_assign(&mut self, other: Self) { self.insert(other); }
}
impl ::bitflags::__private::core::ops::BitXor for InternalBitFlags {
type Output = Self;
#[inline]
fn bitxor(self, other: Self) -> Self {
self.symmetric_difference(other)
}
}
impl ::bitflags::__private::core::ops::BitXorAssign for
InternalBitFlags {
#[inline]
fn bitxor_assign(&mut self, other: Self) { self.toggle(other); }
}
impl ::bitflags::__private::core::ops::BitAnd for InternalBitFlags {
type Output = Self;
#[inline]
fn bitand(self, other: Self) -> Self { self.intersection(other) }
}
impl ::bitflags::__private::core::ops::BitAndAssign for
InternalBitFlags {
#[inline]
fn bitand_assign(&mut self, other: Self) {
*self =
Self::from_bits_retain(self.bits()).intersection(other);
}
}
impl ::bitflags::__private::core::ops::Sub for InternalBitFlags {
type Output = Self;
#[inline]
fn sub(self, other: Self) -> Self { self.difference(other) }
}
impl ::bitflags::__private::core::ops::SubAssign for InternalBitFlags
{
#[inline]
fn sub_assign(&mut self, other: Self) { self.remove(other); }
}
impl ::bitflags::__private::core::ops::Not for InternalBitFlags {
type Output = Self;
#[inline]
fn not(self) -> Self { self.complement() }
}
impl ::bitflags::__private::core::iter::Extend<InternalBitFlags> for
InternalBitFlags {
fn extend<T: ::bitflags::__private::core::iter::IntoIterator<Item
= Self>>(&mut self, iterator: T) {
for item in iterator { self.insert(item) }
}
}
impl ::bitflags::__private::core::iter::FromIterator<InternalBitFlags>
for InternalBitFlags {
fn from_iter<T: ::bitflags::__private::core::iter::IntoIterator<Item
= Self>>(iterator: T) -> Self {
use ::bitflags::__private::core::iter::Extend;
let mut result = Self::empty();
result.extend(iterator);
result
}
}
impl InternalBitFlags {
#[inline]
pub const fn iter(&self)
-> ::bitflags::iter::Iter<LinkerFeatures> {
::bitflags::iter::Iter::__private_const_new(<LinkerFeatures as
::bitflags::Flags>::FLAGS,
LinkerFeatures::from_bits_retain(self.bits()),
LinkerFeatures::from_bits_retain(self.bits()))
}
#[inline]
pub const fn iter_names(&self)
-> ::bitflags::iter::IterNames<LinkerFeatures> {
::bitflags::iter::IterNames::__private_const_new(<LinkerFeatures
as ::bitflags::Flags>::FLAGS,
LinkerFeatures::from_bits_retain(self.bits()),
LinkerFeatures::from_bits_retain(self.bits()))
}
}
impl ::bitflags::__private::core::iter::IntoIterator for
InternalBitFlags {
type Item = LinkerFeatures;
type IntoIter = ::bitflags::iter::Iter<LinkerFeatures>;
fn into_iter(self) -> Self::IntoIter { self.iter() }
}
impl InternalBitFlags {
#[inline]
pub fn bits_mut(&mut self) -> &mut u8 { &mut self.0 }
}
#[allow(dead_code, deprecated, unused_attributes)]
impl LinkerFeatures {
#[inline]
pub const fn empty() -> Self { Self(InternalBitFlags::empty()) }
#[inline]
pub const fn all() -> Self { Self(InternalBitFlags::all()) }
#[inline]
pub const fn bits(&self) -> u8 { self.0.bits() }
#[inline]
pub const fn from_bits(bits: u8)
-> ::bitflags::__private::core::option::Option<Self> {
match InternalBitFlags::from_bits(bits) {
::bitflags::__private::core::option::Option::Some(bits) =>
::bitflags::__private::core::option::Option::Some(Self(bits)),
::bitflags::__private::core::option::Option::None =>
::bitflags::__private::core::option::Option::None,
}
}
#[inline]
pub const fn from_bits_truncate(bits: u8) -> Self {
Self(InternalBitFlags::from_bits_truncate(bits))
}
#[inline]
pub const fn from_bits_retain(bits: u8) -> Self {
Self(InternalBitFlags::from_bits_retain(bits))
}
#[inline]
pub fn from_name(name: &str)
-> ::bitflags::__private::core::option::Option<Self> {
match InternalBitFlags::from_name(name) {
::bitflags::__private::core::option::Option::Some(bits) =>
::bitflags::__private::core::option::Option::Some(Self(bits)),
::bitflags::__private::core::option::Option::None =>
::bitflags::__private::core::option::Option::None,
}
}
#[inline]
pub const fn is_empty(&self) -> bool { self.0.is_empty() }
#[inline]
pub const fn is_all(&self) -> bool { self.0.is_all() }
#[inline]
pub const fn intersects(&self, other: Self) -> bool {
self.0.intersects(other.0)
}
#[inline]
pub const fn contains(&self, other: Self) -> bool {
self.0.contains(other.0)
}
#[inline]
pub fn insert(&mut self, other: Self) { self.0.insert(other.0) }
#[inline]
pub fn remove(&mut self, other: Self) { self.0.remove(other.0) }
#[inline]
pub fn toggle(&mut self, other: Self) { self.0.toggle(other.0) }
#[inline]
pub fn set(&mut self, other: Self, value: bool) {
self.0.set(other.0, value)
}
#[inline]
#[must_use]
pub const fn intersection(self, other: Self) -> Self {
Self(self.0.intersection(other.0))
}
#[inline]
#[must_use]
pub const fn union(self, other: Self) -> Self {
Self(self.0.union(other.0))
}
#[inline]
#[must_use]
pub const fn difference(self, other: Self) -> Self {
Self(self.0.difference(other.0))
}
#[inline]
#[must_use]
pub const fn symmetric_difference(self, other: Self) -> Self {
Self(self.0.symmetric_difference(other.0))
}
#[inline]
#[must_use]
pub const fn complement(self) -> Self {
Self(self.0.complement())
}
}
impl ::bitflags::__private::core::fmt::Binary for LinkerFeatures {
fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
-> ::bitflags::__private::core::fmt::Result {
let inner = self.0;
::bitflags::__private::core::fmt::Binary::fmt(&inner, f)
}
}
impl ::bitflags::__private::core::fmt::Octal for LinkerFeatures {
fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
-> ::bitflags::__private::core::fmt::Result {
let inner = self.0;
::bitflags::__private::core::fmt::Octal::fmt(&inner, f)
}
}
impl ::bitflags::__private::core::fmt::LowerHex for LinkerFeatures {
fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
-> ::bitflags::__private::core::fmt::Result {
let inner = self.0;
::bitflags::__private::core::fmt::LowerHex::fmt(&inner, f)
}
}
impl ::bitflags::__private::core::fmt::UpperHex for LinkerFeatures {
fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
-> ::bitflags::__private::core::fmt::Result {
let inner = self.0;
::bitflags::__private::core::fmt::UpperHex::fmt(&inner, f)
}
}
impl ::bitflags::__private::core::ops::BitOr for LinkerFeatures {
type Output = Self;
#[inline]
fn bitor(self, other: LinkerFeatures) -> Self {
self.union(other)
}
}
impl ::bitflags::__private::core::ops::BitOrAssign for LinkerFeatures
{
#[inline]
fn bitor_assign(&mut self, other: Self) { self.insert(other); }
}
impl ::bitflags::__private::core::ops::BitXor for LinkerFeatures {
type Output = Self;
#[inline]
fn bitxor(self, other: Self) -> Self {
self.symmetric_difference(other)
}
}
impl ::bitflags::__private::core::ops::BitXorAssign for LinkerFeatures
{
#[inline]
fn bitxor_assign(&mut self, other: Self) { self.toggle(other); }
}
impl ::bitflags::__private::core::ops::BitAnd for LinkerFeatures {
type Output = Self;
#[inline]
fn bitand(self, other: Self) -> Self { self.intersection(other) }
}
impl ::bitflags::__private::core::ops::BitAndAssign for LinkerFeatures
{
#[inline]
fn bitand_assign(&mut self, other: Self) {
*self =
Self::from_bits_retain(self.bits()).intersection(other);
}
}
impl ::bitflags::__private::core::ops::Sub for LinkerFeatures {
type Output = Self;
#[inline]
fn sub(self, other: Self) -> Self { self.difference(other) }
}
impl ::bitflags::__private::core::ops::SubAssign for LinkerFeatures {
#[inline]
fn sub_assign(&mut self, other: Self) { self.remove(other); }
}
impl ::bitflags::__private::core::ops::Not for LinkerFeatures {
type Output = Self;
#[inline]
fn not(self) -> Self { self.complement() }
}
impl ::bitflags::__private::core::iter::Extend<LinkerFeatures> for
LinkerFeatures {
fn extend<T: ::bitflags::__private::core::iter::IntoIterator<Item
= Self>>(&mut self, iterator: T) {
for item in iterator { self.insert(item) }
}
}
impl ::bitflags::__private::core::iter::FromIterator<LinkerFeatures>
for LinkerFeatures {
fn from_iter<T: ::bitflags::__private::core::iter::IntoIterator<Item
= Self>>(iterator: T) -> Self {
use ::bitflags::__private::core::iter::Extend;
let mut result = Self::empty();
result.extend(iterator);
result
}
}
impl LinkerFeatures {
#[inline]
pub const fn iter(&self)
-> ::bitflags::iter::Iter<LinkerFeatures> {
::bitflags::iter::Iter::__private_const_new(<LinkerFeatures as
::bitflags::Flags>::FLAGS,
LinkerFeatures::from_bits_retain(self.bits()),
LinkerFeatures::from_bits_retain(self.bits()))
}
#[inline]
pub const fn iter_names(&self)
-> ::bitflags::iter::IterNames<LinkerFeatures> {
::bitflags::iter::IterNames::__private_const_new(<LinkerFeatures
as ::bitflags::Flags>::FLAGS,
LinkerFeatures::from_bits_retain(self.bits()),
LinkerFeatures::from_bits_retain(self.bits()))
}
}
impl ::bitflags::__private::core::iter::IntoIterator for
LinkerFeatures {
type Item = LinkerFeatures;
type IntoIter = ::bitflags::iter::Iter<LinkerFeatures>;
fn into_iter(self) -> Self::IntoIter { self.iter() }
}
};Clone, #[automatically_derived]
impl ::core::marker::Copy for LinkerFeatures { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for LinkerFeatures {
#[inline]
fn eq(&self, other: &LinkerFeatures) -> bool { self.0 == other.0 }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for LinkerFeatures {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) {
let _:
::core::cmp::AssertParamIsEq<<LinkerFeatures as
::bitflags::__private::PublicFlags>::Internal>;
}
}Eq, #[automatically_derived]
impl ::core::default::Default for LinkerFeatures {
#[inline]
fn default() -> LinkerFeatures {
LinkerFeatures(::core::default::Default::default())
}
}Default)]
791 pub struct LinkerFeatures: u8 {
792 const CC = 1 << 0;
794 const LLD = 1 << 1;
796 }
797}
798impl ::std::fmt::Debug for LinkerFeatures {
fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
::bitflags::parser::to_writer(self, f)
}
}rustc_data_structures::external_bitflags_debug! { LinkerFeatures }
799
800impl LinkerFeatures {
801 pub fn from_str(s: &str) -> Option<LinkerFeatures> {
803 Some(match s {
804 "cc" => LinkerFeatures::CC,
805 "lld" => LinkerFeatures::LLD,
806 _ => return None,
807 })
808 }
809
810 pub fn as_str(self) -> Option<&'static str> {
814 Some(match self {
815 LinkerFeatures::CC => "cc",
816 LinkerFeatures::LLD => "lld",
817 _ => return None,
818 })
819 }
820
821 pub fn is_lld_enabled(self) -> bool {
823 self.contains(LinkerFeatures::LLD)
824 }
825
826 pub fn is_cc_enabled(self) -> bool {
828 self.contains(LinkerFeatures::CC)
829 }
830}
831
832#[automatically_derived]
impl ::core::clone::Clone for PanicStrategy {
#[inline]
fn clone(&self) -> PanicStrategy { *self }
}
#[automatically_derived]
impl ::core::marker::Copy for PanicStrategy { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for PanicStrategy { }
#[automatically_derived]
impl ::core::cmp::PartialEq for PanicStrategy {
#[inline]
fn eq(&self, other: &PanicStrategy) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}
#[automatically_derived]
impl ::core::cmp::Eq for PanicStrategy {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) {}
}
#[automatically_derived]
impl ::core::hash::Hash for PanicStrategy {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}
#[automatically_derived]
impl ::core::fmt::Debug for PanicStrategy {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
PanicStrategy::Unwind => "Unwind",
PanicStrategy::Abort => "Abort",
PanicStrategy::ImmediateAbort => "ImmediateAbort",
})
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for PanicStrategy {
#[inline]
fn partial_cmp(&self, other: &PanicStrategy)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::PartialOrd::partial_cmp(&__self_discr, &__arg1_discr)
}
}
#[automatically_derived]
impl ::core::cmp::Ord for PanicStrategy {
#[inline]
fn cmp(&self, other: &PanicStrategy) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr)
}
}
const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for PanicStrategy {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
PanicStrategy::Unwind => { 0usize }
PanicStrategy::Abort => { 1usize }
PanicStrategy::ImmediateAbort => { 2usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
PanicStrategy::Unwind => {}
PanicStrategy::Abort => {}
PanicStrategy::ImmediateAbort => {}
}
}
}
};
const _: () =
{
impl<__D: ::rustc_span::BlobDecoder> ::rustc_serialize::Decodable<__D>
for PanicStrategy {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { PanicStrategy::Unwind }
1usize => { PanicStrategy::Abort }
2usize => { PanicStrategy::ImmediateAbort }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `PanicStrategy`, expected 0..3, actual {0}",
n));
}
}
}
}
};
const _: () =
{
impl<__CTX> ::rustc_data_structures::stable_hasher::HashStable<__CTX>
for PanicStrategy where __CTX: crate::HashStableContext {
#[inline]
fn hash_stable(&self, __hcx: &mut __CTX,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
match *self {
PanicStrategy::Unwind => {}
PanicStrategy::Abort => {}
PanicStrategy::ImmediateAbort => {}
}
}
}
};
impl FromStr for PanicStrategy {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"unwind" => Self::Unwind,
"abort" => Self::Abort,
"immediate-abort" => Self::ImmediateAbort,
_ => {
let all =
["\'unwind\'", "\'abort\'",
"\'immediate-abort\'"].join(", ");
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid {0}: \'{1}\'. allowed values: {2}",
"panic strategy", s, all))
}));
}
})
}
}
impl PanicStrategy {
pub const ALL: &'static [PanicStrategy] =
&[PanicStrategy::Unwind, PanicStrategy::Abort,
PanicStrategy::ImmediateAbort];
pub fn desc(&self) -> &'static str {
match self {
Self::Unwind => "unwind",
Self::Abort => "abort",
Self::ImmediateAbort => "immediate-abort",
}
}
}
impl crate::json::ToJson for PanicStrategy {
fn to_json(&self) -> crate::json::Json { self.desc().to_json() }
}
impl<'de> serde::Deserialize<'de> for PanicStrategy {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}
impl std::fmt::Display for PanicStrategy {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.desc())
}
}crate::target_spec_enum! {
833 #[derive(Encodable, BlobDecodable, HashStable_Generic)]
834 pub enum PanicStrategy {
835 Unwind = "unwind",
836 Abort = "abort",
837 ImmediateAbort = "immediate-abort",
838 }
839
840 parse_error_type = "panic strategy";
841}
842
843#[derive(#[automatically_derived]
impl ::core::clone::Clone for OnBrokenPipe {
#[inline]
fn clone(&self) -> OnBrokenPipe { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for OnBrokenPipe { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for OnBrokenPipe {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
OnBrokenPipe::Default => "Default",
OnBrokenPipe::Kill => "Kill",
OnBrokenPipe::Error => "Error",
OnBrokenPipe::Inherit => "Inherit",
})
}
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for OnBrokenPipe {
#[inline]
fn eq(&self, other: &OnBrokenPipe) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for OnBrokenPipe {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}Hash, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for OnBrokenPipe {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
OnBrokenPipe::Default => { 0usize }
OnBrokenPipe::Kill => { 1usize }
OnBrokenPipe::Error => { 2usize }
OnBrokenPipe::Inherit => { 3usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
OnBrokenPipe::Default => {}
OnBrokenPipe::Kill => {}
OnBrokenPipe::Error => {}
OnBrokenPipe::Inherit => {}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::BlobDecoder> ::rustc_serialize::Decodable<__D>
for OnBrokenPipe {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { OnBrokenPipe::Default }
1usize => { OnBrokenPipe::Kill }
2usize => { OnBrokenPipe::Error }
3usize => { OnBrokenPipe::Inherit }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `OnBrokenPipe`, expected 0..4, actual {0}",
n));
}
}
}
}
};BlobDecodable, const _: () =
{
impl<__CTX> ::rustc_data_structures::stable_hasher::HashStable<__CTX>
for OnBrokenPipe where __CTX: crate::HashStableContext {
#[inline]
fn hash_stable(&self, __hcx: &mut __CTX,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
match *self {
OnBrokenPipe::Default => {}
OnBrokenPipe::Kill => {}
OnBrokenPipe::Error => {}
OnBrokenPipe::Inherit => {}
}
}
}
};HashStable_Generic)]
844pub enum OnBrokenPipe {
845 Default,
846 Kill,
847 Error,
848 Inherit,
849}
850
851impl PanicStrategy {
852 pub const fn desc_symbol(&self) -> Symbol {
853 match *self {
854 PanicStrategy::Unwind => sym::unwind,
855 PanicStrategy::Abort => sym::abort,
856 PanicStrategy::ImmediateAbort => sym::immediate_abort,
857 }
858 }
859
860 pub fn unwinds(self) -> bool {
861 #[allow(non_exhaustive_omitted_patterns)] match self {
PanicStrategy::Unwind => true,
_ => false,
}matches!(self, PanicStrategy::Unwind)
862 }
863}
864
865#[automatically_derived]
impl ::core::clone::Clone for RelroLevel {
#[inline]
fn clone(&self) -> RelroLevel { *self }
}
#[automatically_derived]
impl ::core::marker::Copy for RelroLevel { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for RelroLevel { }
#[automatically_derived]
impl ::core::cmp::PartialEq for RelroLevel {
#[inline]
fn eq(&self, other: &RelroLevel) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}
#[automatically_derived]
impl ::core::cmp::Eq for RelroLevel {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) {}
}
#[automatically_derived]
impl ::core::hash::Hash for RelroLevel {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}
#[automatically_derived]
impl ::core::fmt::Debug for RelroLevel {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
RelroLevel::Full => "Full",
RelroLevel::Partial => "Partial",
RelroLevel::Off => "Off",
RelroLevel::None => "None",
})
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for RelroLevel {
#[inline]
fn partial_cmp(&self, other: &RelroLevel)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::PartialOrd::partial_cmp(&__self_discr, &__arg1_discr)
}
}
#[automatically_derived]
impl ::core::cmp::Ord for RelroLevel {
#[inline]
fn cmp(&self, other: &RelroLevel) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr)
}
}
impl FromStr for RelroLevel {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"full" => Self::Full,
"partial" => Self::Partial,
"off" => Self::Off,
"none" => Self::None,
_ => {
let all =
["\'full\'", "\'partial\'", "\'off\'",
"\'none\'"].join(", ");
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid {0}: \'{1}\'. allowed values: {2}",
"relro level", s, all))
}));
}
})
}
}
impl RelroLevel {
pub const ALL: &'static [RelroLevel] =
&[RelroLevel::Full, RelroLevel::Partial, RelroLevel::Off,
RelroLevel::None];
pub fn desc(&self) -> &'static str {
match self {
Self::Full => "full",
Self::Partial => "partial",
Self::Off => "off",
Self::None => "none",
}
}
}
impl crate::json::ToJson for RelroLevel {
fn to_json(&self) -> crate::json::Json { self.desc().to_json() }
}
impl<'de> serde::Deserialize<'de> for RelroLevel {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}
impl std::fmt::Display for RelroLevel {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.desc())
}
}crate::target_spec_enum! {
866 pub enum RelroLevel {
867 Full = "full",
868 Partial = "partial",
869 Off = "off",
870 None = "none",
871 }
872
873 parse_error_type = "relro level";
874}
875
876impl IntoDiagArg for PanicStrategy {
877 fn into_diag_arg(self, _: &mut Option<std::path::PathBuf>) -> DiagArgValue {
878 DiagArgValue::Str(Cow::Owned(self.desc().to_string()))
879 }
880}
881
882#[automatically_derived]
impl ::core::clone::Clone for SymbolVisibility {
#[inline]
fn clone(&self) -> SymbolVisibility { *self }
}
#[automatically_derived]
impl ::core::marker::Copy for SymbolVisibility { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for SymbolVisibility { }
#[automatically_derived]
impl ::core::cmp::PartialEq for SymbolVisibility {
#[inline]
fn eq(&self, other: &SymbolVisibility) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}
#[automatically_derived]
impl ::core::cmp::Eq for SymbolVisibility {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) {}
}
#[automatically_derived]
impl ::core::hash::Hash for SymbolVisibility {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}
#[automatically_derived]
impl ::core::fmt::Debug for SymbolVisibility {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
SymbolVisibility::Hidden => "Hidden",
SymbolVisibility::Protected => "Protected",
SymbolVisibility::Interposable => "Interposable",
})
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for SymbolVisibility {
#[inline]
fn partial_cmp(&self, other: &SymbolVisibility)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::PartialOrd::partial_cmp(&__self_discr, &__arg1_discr)
}
}
#[automatically_derived]
impl ::core::cmp::Ord for SymbolVisibility {
#[inline]
fn cmp(&self, other: &SymbolVisibility) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr)
}
}
impl FromStr for SymbolVisibility {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"hidden" => Self::Hidden,
"protected" => Self::Protected,
"interposable" => Self::Interposable,
_ => {
let all =
["\'hidden\'", "\'protected\'",
"\'interposable\'"].join(", ");
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid {0}: \'{1}\'. allowed values: {2}",
"symbol visibility", s, all))
}));
}
})
}
}
impl SymbolVisibility {
pub const ALL: &'static [SymbolVisibility] =
&[SymbolVisibility::Hidden, SymbolVisibility::Protected,
SymbolVisibility::Interposable];
pub fn desc(&self) -> &'static str {
match self {
Self::Hidden => "hidden",
Self::Protected => "protected",
Self::Interposable => "interposable",
}
}
}
impl crate::json::ToJson for SymbolVisibility {
fn to_json(&self) -> crate::json::Json { self.desc().to_json() }
}
impl<'de> serde::Deserialize<'de> for SymbolVisibility {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}
impl std::fmt::Display for SymbolVisibility {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.desc())
}
}crate::target_spec_enum! {
883 pub enum SymbolVisibility {
884 Hidden = "hidden",
885 Protected = "protected",
886 Interposable = "interposable",
887 }
888
889 parse_error_type = "symbol visibility";
890}
891
892#[derive(#[automatically_derived]
impl ::core::clone::Clone for SmallDataThresholdSupport {
#[inline]
fn clone(&self) -> SmallDataThresholdSupport {
match self {
SmallDataThresholdSupport::None =>
SmallDataThresholdSupport::None,
SmallDataThresholdSupport::DefaultForArch =>
SmallDataThresholdSupport::DefaultForArch,
SmallDataThresholdSupport::LlvmModuleFlag(__self_0) =>
SmallDataThresholdSupport::LlvmModuleFlag(::core::clone::Clone::clone(__self_0)),
SmallDataThresholdSupport::LlvmArg(__self_0) =>
SmallDataThresholdSupport::LlvmArg(::core::clone::Clone::clone(__self_0)),
}
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for SmallDataThresholdSupport {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
SmallDataThresholdSupport::None =>
::core::fmt::Formatter::write_str(f, "None"),
SmallDataThresholdSupport::DefaultForArch =>
::core::fmt::Formatter::write_str(f, "DefaultForArch"),
SmallDataThresholdSupport::LlvmModuleFlag(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"LlvmModuleFlag", &__self_0),
SmallDataThresholdSupport::LlvmArg(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"LlvmArg", &__self_0),
}
}
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for SmallDataThresholdSupport {
#[inline]
fn eq(&self, other: &SmallDataThresholdSupport) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(SmallDataThresholdSupport::LlvmModuleFlag(__self_0),
SmallDataThresholdSupport::LlvmModuleFlag(__arg1_0)) =>
__self_0 == __arg1_0,
(SmallDataThresholdSupport::LlvmArg(__self_0),
SmallDataThresholdSupport::LlvmArg(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for SmallDataThresholdSupport {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state);
match self {
SmallDataThresholdSupport::LlvmModuleFlag(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
SmallDataThresholdSupport::LlvmArg(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}Hash)]
893pub enum SmallDataThresholdSupport {
894 None,
895 DefaultForArch,
896 LlvmModuleFlag(StaticCow<str>),
897 LlvmArg(StaticCow<str>),
898}
899
900impl FromStr for SmallDataThresholdSupport {
901 type Err = String;
902
903 fn from_str(s: &str) -> Result<Self, Self::Err> {
904 if s == "none" {
905 Ok(Self::None)
906 } else if s == "default-for-arch" {
907 Ok(Self::DefaultForArch)
908 } else if let Some(flag) = s.strip_prefix("llvm-module-flag=") {
909 Ok(Self::LlvmModuleFlag(flag.to_string().into()))
910 } else if let Some(arg) = s.strip_prefix("llvm-arg=") {
911 Ok(Self::LlvmArg(arg.to_string().into()))
912 } else {
913 Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("\'{0}\' is not a valid value for small-data-threshold-support.",
s))
})format!("'{s}' is not a valid value for small-data-threshold-support."))
914 }
915 }
916}
917
918impl<'de> serde::Deserialize<'de> for SmallDataThresholdSupport {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}crate::json::serde_deserialize_from_str!(SmallDataThresholdSupport);
919impl schemars::JsonSchema for SmallDataThresholdSupport {
920 fn schema_name() -> std::borrow::Cow<'static, str> {
921 "SmallDataThresholdSupport".into()
922 }
923 fn json_schema(_: &mut schemars::SchemaGenerator) -> schemars::Schema {
924 <::schemars::Schema as
::core::convert::TryFrom<_>>::try_from(::serde_json::Value::Object({
let mut object = ::serde_json::Map::new();
let _ =
object.insert(("type").into(),
::serde_json::to_value(&"string").unwrap());
let _ =
object.insert(("pattern").into(),
::serde_json::to_value(&r#"^none|default-for-arch|llvm-module-flag=.+|llvm-arg=.+$"#).unwrap());
;
object
})).unwrap()schemars::json_schema! ({
925 "type": "string",
926 "pattern": r#"^none|default-for-arch|llvm-module-flag=.+|llvm-arg=.+$"#,
927 })
928 .into()
929 }
930}
931
932impl ToJson for SmallDataThresholdSupport {
933 fn to_json(&self) -> Value {
934 match self {
935 Self::None => "none".to_json(),
936 Self::DefaultForArch => "default-for-arch".to_json(),
937 Self::LlvmModuleFlag(flag) => ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("llvm-module-flag={0}", flag))
})format!("llvm-module-flag={flag}").to_json(),
938 Self::LlvmArg(arg) => ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("llvm-arg={0}", arg))
})format!("llvm-arg={arg}").to_json(),
939 }
940 }
941}
942
943#[automatically_derived]
impl ::core::clone::Clone for MergeFunctions {
#[inline]
fn clone(&self) -> MergeFunctions { *self }
}
#[automatically_derived]
impl ::core::marker::Copy for MergeFunctions { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for MergeFunctions { }
#[automatically_derived]
impl ::core::cmp::PartialEq for MergeFunctions {
#[inline]
fn eq(&self, other: &MergeFunctions) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}
#[automatically_derived]
impl ::core::cmp::Eq for MergeFunctions {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) {}
}
#[automatically_derived]
impl ::core::hash::Hash for MergeFunctions {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}
#[automatically_derived]
impl ::core::fmt::Debug for MergeFunctions {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
MergeFunctions::Disabled => "Disabled",
MergeFunctions::Trampolines => "Trampolines",
MergeFunctions::Aliases => "Aliases",
})
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for MergeFunctions {
#[inline]
fn partial_cmp(&self, other: &MergeFunctions)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::PartialOrd::partial_cmp(&__self_discr, &__arg1_discr)
}
}
#[automatically_derived]
impl ::core::cmp::Ord for MergeFunctions {
#[inline]
fn cmp(&self, other: &MergeFunctions) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr)
}
}
impl FromStr for MergeFunctions {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"disabled" => Self::Disabled,
"trampolines" => Self::Trampolines,
"aliases" => Self::Aliases,
_ => {
let all =
["\'disabled\'", "\'trampolines\'",
"\'aliases\'"].join(", ");
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid {0}: \'{1}\'. allowed values: {2}",
"value for merge-functions", s, all))
}));
}
})
}
}
impl MergeFunctions {
pub const ALL: &'static [MergeFunctions] =
&[MergeFunctions::Disabled, MergeFunctions::Trampolines,
MergeFunctions::Aliases];
pub fn desc(&self) -> &'static str {
match self {
Self::Disabled => "disabled",
Self::Trampolines => "trampolines",
Self::Aliases => "aliases",
}
}
}
impl crate::json::ToJson for MergeFunctions {
fn to_json(&self) -> crate::json::Json { self.desc().to_json() }
}
impl<'de> serde::Deserialize<'de> for MergeFunctions {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}
impl std::fmt::Display for MergeFunctions {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.desc())
}
}crate::target_spec_enum! {
944 pub enum MergeFunctions {
945 Disabled = "disabled",
946 Trampolines = "trampolines",
947 Aliases = "aliases",
948 }
949
950 parse_error_type = "value for merge-functions";
951}
952
953#[automatically_derived]
impl ::core::clone::Clone for RelocModel {
#[inline]
fn clone(&self) -> RelocModel { *self }
}
#[automatically_derived]
impl ::core::marker::Copy for RelocModel { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for RelocModel { }
#[automatically_derived]
impl ::core::cmp::PartialEq for RelocModel {
#[inline]
fn eq(&self, other: &RelocModel) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}
#[automatically_derived]
impl ::core::cmp::Eq for RelocModel {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) {}
}
#[automatically_derived]
impl ::core::hash::Hash for RelocModel {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}
#[automatically_derived]
impl ::core::fmt::Debug for RelocModel {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
RelocModel::Static => "Static",
RelocModel::Pic => "Pic",
RelocModel::Pie => "Pie",
RelocModel::DynamicNoPic => "DynamicNoPic",
RelocModel::Ropi => "Ropi",
RelocModel::Rwpi => "Rwpi",
RelocModel::RopiRwpi => "RopiRwpi",
})
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for RelocModel {
#[inline]
fn partial_cmp(&self, other: &RelocModel)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::PartialOrd::partial_cmp(&__self_discr, &__arg1_discr)
}
}
#[automatically_derived]
impl ::core::cmp::Ord for RelocModel {
#[inline]
fn cmp(&self, other: &RelocModel) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr)
}
}
impl FromStr for RelocModel {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"static" => Self::Static,
"pic" => Self::Pic,
"pie" => Self::Pie,
"dynamic-no-pic" => Self::DynamicNoPic,
"ropi" => Self::Ropi,
"rwpi" => Self::Rwpi,
"ropi-rwpi" => Self::RopiRwpi,
_ => {
let all =
["\'static\'", "\'pic\'", "\'pie\'", "\'dynamic-no-pic\'",
"\'ropi\'", "\'rwpi\'", "\'ropi-rwpi\'"].join(", ");
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid {0}: \'{1}\'. allowed values: {2}",
"relocation model", s, all))
}));
}
})
}
}
impl RelocModel {
pub const ALL: &'static [RelocModel] =
&[RelocModel::Static, RelocModel::Pic, RelocModel::Pie,
RelocModel::DynamicNoPic, RelocModel::Ropi,
RelocModel::Rwpi, RelocModel::RopiRwpi];
pub fn desc(&self) -> &'static str {
match self {
Self::Static => "static",
Self::Pic => "pic",
Self::Pie => "pie",
Self::DynamicNoPic => "dynamic-no-pic",
Self::Ropi => "ropi",
Self::Rwpi => "rwpi",
Self::RopiRwpi => "ropi-rwpi",
}
}
}
impl crate::json::ToJson for RelocModel {
fn to_json(&self) -> crate::json::Json { self.desc().to_json() }
}
impl<'de> serde::Deserialize<'de> for RelocModel {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}
impl std::fmt::Display for RelocModel {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.desc())
}
}crate::target_spec_enum! {
954 pub enum RelocModel {
955 Static = "static",
956 Pic = "pic",
957 Pie = "pie",
958 DynamicNoPic = "dynamic-no-pic",
959 Ropi = "ropi",
960 Rwpi = "rwpi",
961 RopiRwpi = "ropi-rwpi",
962 }
963
964 parse_error_type = "relocation model";
965}
966
967impl RelocModel {
968 pub const fn desc_symbol(&self) -> Symbol {
969 match *self {
970 RelocModel::Static => kw::Static,
971 RelocModel::Pic => sym::pic,
972 RelocModel::Pie => sym::pie,
973 RelocModel::DynamicNoPic => sym::dynamic_no_pic,
974 RelocModel::Ropi => sym::ropi,
975 RelocModel::Rwpi => sym::rwpi,
976 RelocModel::RopiRwpi => sym::ropi_rwpi,
977 }
978 }
979}
980
981#[automatically_derived]
impl ::core::clone::Clone for CodeModel {
#[inline]
fn clone(&self) -> CodeModel { *self }
}
#[automatically_derived]
impl ::core::marker::Copy for CodeModel { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for CodeModel { }
#[automatically_derived]
impl ::core::cmp::PartialEq for CodeModel {
#[inline]
fn eq(&self, other: &CodeModel) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}
#[automatically_derived]
impl ::core::cmp::Eq for CodeModel {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) {}
}
#[automatically_derived]
impl ::core::hash::Hash for CodeModel {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}
#[automatically_derived]
impl ::core::fmt::Debug for CodeModel {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
CodeModel::Tiny => "Tiny",
CodeModel::Small => "Small",
CodeModel::Kernel => "Kernel",
CodeModel::Medium => "Medium",
CodeModel::Large => "Large",
})
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for CodeModel {
#[inline]
fn partial_cmp(&self, other: &CodeModel)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::PartialOrd::partial_cmp(&__self_discr, &__arg1_discr)
}
}
#[automatically_derived]
impl ::core::cmp::Ord for CodeModel {
#[inline]
fn cmp(&self, other: &CodeModel) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr)
}
}
impl FromStr for CodeModel {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"tiny" => Self::Tiny,
"small" => Self::Small,
"kernel" => Self::Kernel,
"medium" => Self::Medium,
"large" => Self::Large,
_ => {
let all =
["\'tiny\'", "\'small\'", "\'kernel\'", "\'medium\'",
"\'large\'"].join(", ");
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid {0}: \'{1}\'. allowed values: {2}",
"code model", s, all))
}));
}
})
}
}
impl CodeModel {
pub const ALL: &'static [CodeModel] =
&[CodeModel::Tiny, CodeModel::Small, CodeModel::Kernel,
CodeModel::Medium, CodeModel::Large];
pub fn desc(&self) -> &'static str {
match self {
Self::Tiny => "tiny",
Self::Small => "small",
Self::Kernel => "kernel",
Self::Medium => "medium",
Self::Large => "large",
}
}
}
impl crate::json::ToJson for CodeModel {
fn to_json(&self) -> crate::json::Json { self.desc().to_json() }
}
impl<'de> serde::Deserialize<'de> for CodeModel {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}
impl std::fmt::Display for CodeModel {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.desc())
}
}crate::target_spec_enum! {
982 pub enum CodeModel {
983 Tiny = "tiny",
984 Small = "small",
985 Kernel = "kernel",
986 Medium = "medium",
987 Large = "large",
988 }
989
990 parse_error_type = "code model";
991}
992
993#[automatically_derived]
impl ::core::clone::Clone for FloatAbi {
#[inline]
fn clone(&self) -> FloatAbi { *self }
}
#[automatically_derived]
impl ::core::marker::Copy for FloatAbi { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for FloatAbi { }
#[automatically_derived]
impl ::core::cmp::PartialEq for FloatAbi {
#[inline]
fn eq(&self, other: &FloatAbi) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}
#[automatically_derived]
impl ::core::cmp::Eq for FloatAbi {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) {}
}
#[automatically_derived]
impl ::core::hash::Hash for FloatAbi {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}
#[automatically_derived]
impl ::core::fmt::Debug for FloatAbi {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
FloatAbi::Soft => "Soft",
FloatAbi::Hard => "Hard",
})
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for FloatAbi {
#[inline]
fn partial_cmp(&self, other: &FloatAbi)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::PartialOrd::partial_cmp(&__self_discr, &__arg1_discr)
}
}
#[automatically_derived]
impl ::core::cmp::Ord for FloatAbi {
#[inline]
fn cmp(&self, other: &FloatAbi) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr)
}
}
impl FromStr for FloatAbi {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"soft" => Self::Soft,
"hard" => Self::Hard,
_ => {
let all = ["\'soft\'", "\'hard\'"].join(", ");
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid {0}: \'{1}\'. allowed values: {2}",
"float abi", s, all))
}));
}
})
}
}
impl FloatAbi {
pub const ALL: &'static [FloatAbi] = &[FloatAbi::Soft, FloatAbi::Hard];
pub fn desc(&self) -> &'static str {
match self { Self::Soft => "soft", Self::Hard => "hard", }
}
}
impl crate::json::ToJson for FloatAbi {
fn to_json(&self) -> crate::json::Json { self.desc().to_json() }
}
impl<'de> serde::Deserialize<'de> for FloatAbi {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}
impl std::fmt::Display for FloatAbi {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.desc())
}
}crate::target_spec_enum! {
994 pub enum FloatAbi {
996 Soft = "soft",
997 Hard = "hard",
998 }
999
1000 parse_error_type = "float abi";
1001}
1002
1003#[automatically_derived]
impl ::core::clone::Clone for RustcAbi {
#[inline]
fn clone(&self) -> RustcAbi { *self }
}
#[automatically_derived]
impl ::core::marker::Copy for RustcAbi { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for RustcAbi { }
#[automatically_derived]
impl ::core::cmp::PartialEq for RustcAbi {
#[inline]
fn eq(&self, other: &RustcAbi) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}
#[automatically_derived]
impl ::core::cmp::Eq for RustcAbi {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) {}
}
#[automatically_derived]
impl ::core::hash::Hash for RustcAbi {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}
#[automatically_derived]
impl ::core::fmt::Debug for RustcAbi {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
RustcAbi::X86Sse2 => "X86Sse2",
RustcAbi::X86Softfloat => "X86Softfloat",
})
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for RustcAbi {
#[inline]
fn partial_cmp(&self, other: &RustcAbi)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::PartialOrd::partial_cmp(&__self_discr, &__arg1_discr)
}
}
#[automatically_derived]
impl ::core::cmp::Ord for RustcAbi {
#[inline]
fn cmp(&self, other: &RustcAbi) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr)
}
}
impl FromStr for RustcAbi {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"x86-sse2" => Self::X86Sse2,
"x86-softfloat" => Self::X86Softfloat,
_ => {
let all = ["\'x86-sse2\'", "\'x86-softfloat\'"].join(", ");
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid {0}: \'{1}\'. allowed values: {2}",
"rustc abi", s, all))
}));
}
})
}
}
impl RustcAbi {
pub const ALL: &'static [RustcAbi] =
&[RustcAbi::X86Sse2, RustcAbi::X86Softfloat];
pub fn desc(&self) -> &'static str {
match self {
Self::X86Sse2 => "x86-sse2",
Self::X86Softfloat => "x86-softfloat",
}
}
}
impl crate::json::ToJson for RustcAbi {
fn to_json(&self) -> crate::json::Json { self.desc().to_json() }
}
impl<'de> serde::Deserialize<'de> for RustcAbi {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}
impl std::fmt::Display for RustcAbi {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.desc())
}
}crate::target_spec_enum! {
1004 pub enum RustcAbi {
1006 X86Sse2 = "x86-sse2",
1008 X86Softfloat = "x86-softfloat",
1010 }
1011
1012 parse_error_type = "rustc abi";
1013}
1014
1015#[automatically_derived]
impl ::core::clone::Clone for TlsModel {
#[inline]
fn clone(&self) -> TlsModel { *self }
}
#[automatically_derived]
impl ::core::marker::Copy for TlsModel { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for TlsModel { }
#[automatically_derived]
impl ::core::cmp::PartialEq for TlsModel {
#[inline]
fn eq(&self, other: &TlsModel) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}
#[automatically_derived]
impl ::core::cmp::Eq for TlsModel {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) {}
}
#[automatically_derived]
impl ::core::hash::Hash for TlsModel {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}
#[automatically_derived]
impl ::core::fmt::Debug for TlsModel {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
TlsModel::GeneralDynamic => "GeneralDynamic",
TlsModel::LocalDynamic => "LocalDynamic",
TlsModel::InitialExec => "InitialExec",
TlsModel::LocalExec => "LocalExec",
TlsModel::Emulated => "Emulated",
})
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for TlsModel {
#[inline]
fn partial_cmp(&self, other: &TlsModel)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::PartialOrd::partial_cmp(&__self_discr, &__arg1_discr)
}
}
#[automatically_derived]
impl ::core::cmp::Ord for TlsModel {
#[inline]
fn cmp(&self, other: &TlsModel) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr)
}
}
impl FromStr for TlsModel {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"global-dynamic" => Self::GeneralDynamic,
"local-dynamic" => Self::LocalDynamic,
"initial-exec" => Self::InitialExec,
"local-exec" => Self::LocalExec,
"emulated" => Self::Emulated,
_ => {
let all =
["\'global-dynamic\'", "\'local-dynamic\'",
"\'initial-exec\'", "\'local-exec\'",
"\'emulated\'"].join(", ");
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid {0}: \'{1}\'. allowed values: {2}",
"TLS model", s, all))
}));
}
})
}
}
impl TlsModel {
pub const ALL: &'static [TlsModel] =
&[TlsModel::GeneralDynamic, TlsModel::LocalDynamic,
TlsModel::InitialExec, TlsModel::LocalExec,
TlsModel::Emulated];
pub fn desc(&self) -> &'static str {
match self {
Self::GeneralDynamic => "global-dynamic",
Self::LocalDynamic => "local-dynamic",
Self::InitialExec => "initial-exec",
Self::LocalExec => "local-exec",
Self::Emulated => "emulated",
}
}
}
impl crate::json::ToJson for TlsModel {
fn to_json(&self) -> crate::json::Json { self.desc().to_json() }
}
impl<'de> serde::Deserialize<'de> for TlsModel {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}
impl std::fmt::Display for TlsModel {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.desc())
}
}crate::target_spec_enum! {
1016 pub enum TlsModel {
1017 GeneralDynamic = "global-dynamic",
1018 LocalDynamic = "local-dynamic",
1019 InitialExec = "initial-exec",
1020 LocalExec = "local-exec",
1021 Emulated = "emulated",
1022 }
1023
1024 parse_error_type = "TLS model";
1025}
1026
1027#[automatically_derived]
impl ::core::clone::Clone for LinkOutputKind {
#[inline]
fn clone(&self) -> LinkOutputKind { *self }
}
#[automatically_derived]
impl ::core::marker::Copy for LinkOutputKind { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for LinkOutputKind { }
#[automatically_derived]
impl ::core::cmp::PartialEq for LinkOutputKind {
#[inline]
fn eq(&self, other: &LinkOutputKind) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}
#[automatically_derived]
impl ::core::cmp::Eq for LinkOutputKind {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) {}
}
#[automatically_derived]
impl ::core::hash::Hash for LinkOutputKind {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}
#[automatically_derived]
impl ::core::fmt::Debug for LinkOutputKind {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
LinkOutputKind::DynamicNoPicExe => "DynamicNoPicExe",
LinkOutputKind::DynamicPicExe => "DynamicPicExe",
LinkOutputKind::StaticNoPicExe => "StaticNoPicExe",
LinkOutputKind::StaticPicExe => "StaticPicExe",
LinkOutputKind::DynamicDylib => "DynamicDylib",
LinkOutputKind::StaticDylib => "StaticDylib",
LinkOutputKind::WasiReactorExe => "WasiReactorExe",
})
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for LinkOutputKind {
#[inline]
fn partial_cmp(&self, other: &LinkOutputKind)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::PartialOrd::partial_cmp(&__self_discr, &__arg1_discr)
}
}
#[automatically_derived]
impl ::core::cmp::Ord for LinkOutputKind {
#[inline]
fn cmp(&self, other: &LinkOutputKind) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr)
}
}
impl FromStr for LinkOutputKind {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"dynamic-nopic-exe" => Self::DynamicNoPicExe,
"dynamic-pic-exe" => Self::DynamicPicExe,
"static-nopic-exe" => Self::StaticNoPicExe,
"static-pic-exe" => Self::StaticPicExe,
"dynamic-dylib" => Self::DynamicDylib,
"static-dylib" => Self::StaticDylib,
"wasi-reactor-exe" => Self::WasiReactorExe,
_ => {
let all =
["\'dynamic-nopic-exe\'", "\'dynamic-pic-exe\'",
"\'static-nopic-exe\'", "\'static-pic-exe\'",
"\'dynamic-dylib\'", "\'static-dylib\'",
"\'wasi-reactor-exe\'"].join(", ");
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid {0}: \'{1}\'. allowed values: {2}",
"CRT object kind", s, all))
}));
}
})
}
}
impl LinkOutputKind {
pub const ALL: &'static [LinkOutputKind] =
&[LinkOutputKind::DynamicNoPicExe, LinkOutputKind::DynamicPicExe,
LinkOutputKind::StaticNoPicExe,
LinkOutputKind::StaticPicExe, LinkOutputKind::DynamicDylib,
LinkOutputKind::StaticDylib,
LinkOutputKind::WasiReactorExe];
pub fn desc(&self) -> &'static str {
match self {
Self::DynamicNoPicExe => "dynamic-nopic-exe",
Self::DynamicPicExe => "dynamic-pic-exe",
Self::StaticNoPicExe => "static-nopic-exe",
Self::StaticPicExe => "static-pic-exe",
Self::DynamicDylib => "dynamic-dylib",
Self::StaticDylib => "static-dylib",
Self::WasiReactorExe => "wasi-reactor-exe",
}
}
}
impl crate::json::ToJson for LinkOutputKind {
fn to_json(&self) -> crate::json::Json { self.desc().to_json() }
}
impl<'de> serde::Deserialize<'de> for LinkOutputKind {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}
impl std::fmt::Display for LinkOutputKind {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.desc())
}
}crate::target_spec_enum! {
1028 pub enum LinkOutputKind {
1030 DynamicNoPicExe = "dynamic-nopic-exe",
1032 DynamicPicExe = "dynamic-pic-exe",
1034 StaticNoPicExe = "static-nopic-exe",
1036 StaticPicExe = "static-pic-exe",
1038 DynamicDylib = "dynamic-dylib",
1040 StaticDylib = "static-dylib",
1042 WasiReactorExe = "wasi-reactor-exe",
1044 }
1045
1046 parse_error_type = "CRT object kind";
1047}
1048
1049impl LinkOutputKind {
1050 pub fn can_link_dylib(self) -> bool {
1051 match self {
1052 LinkOutputKind::StaticNoPicExe | LinkOutputKind::StaticPicExe => false,
1053 LinkOutputKind::DynamicNoPicExe
1054 | LinkOutputKind::DynamicPicExe
1055 | LinkOutputKind::DynamicDylib
1056 | LinkOutputKind::StaticDylib
1057 | LinkOutputKind::WasiReactorExe => true,
1058 }
1059 }
1060}
1061
1062pub type LinkArgs = BTreeMap<LinkerFlavor, Vec<StaticCow<str>>>;
1063pub type LinkArgsCli = BTreeMap<LinkerFlavorCli, Vec<StaticCow<str>>>;
1064
1065#[automatically_derived]
impl ::core::clone::Clone for DebuginfoKind {
#[inline]
fn clone(&self) -> DebuginfoKind { *self }
}
#[automatically_derived]
impl ::core::marker::Copy for DebuginfoKind { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for DebuginfoKind { }
#[automatically_derived]
impl ::core::cmp::PartialEq for DebuginfoKind {
#[inline]
fn eq(&self, other: &DebuginfoKind) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}
#[automatically_derived]
impl ::core::cmp::Eq for DebuginfoKind {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) {}
}
#[automatically_derived]
impl ::core::hash::Hash for DebuginfoKind {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}
#[automatically_derived]
impl ::core::fmt::Debug for DebuginfoKind {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
DebuginfoKind::Dwarf => "Dwarf",
DebuginfoKind::DwarfDsym => "DwarfDsym",
DebuginfoKind::Pdb => "Pdb",
})
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for DebuginfoKind {
#[inline]
fn partial_cmp(&self, other: &DebuginfoKind)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::PartialOrd::partial_cmp(&__self_discr, &__arg1_discr)
}
}
#[automatically_derived]
impl ::core::cmp::Ord for DebuginfoKind {
#[inline]
fn cmp(&self, other: &DebuginfoKind) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr)
}
}
#[automatically_derived]
impl ::core::default::Default for DebuginfoKind {
#[inline]
fn default() -> DebuginfoKind { Self::Dwarf }
}
impl FromStr for DebuginfoKind {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"dwarf" => Self::Dwarf,
"dwarf-dsym" => Self::DwarfDsym,
"pdb" => Self::Pdb,
_ => {
let all =
["\'dwarf\'", "\'dwarf-dsym\'", "\'pdb\'"].join(", ");
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid {0}: \'{1}\'. allowed values: {2}",
"debuginfo kind", s, all))
}));
}
})
}
}
impl DebuginfoKind {
pub const ALL: &'static [DebuginfoKind] =
&[DebuginfoKind::Dwarf, DebuginfoKind::DwarfDsym, DebuginfoKind::Pdb];
pub fn desc(&self) -> &'static str {
match self {
Self::Dwarf => "dwarf",
Self::DwarfDsym => "dwarf-dsym",
Self::Pdb => "pdb",
}
}
}
impl crate::json::ToJson for DebuginfoKind {
fn to_json(&self) -> crate::json::Json { self.desc().to_json() }
}
impl<'de> serde::Deserialize<'de> for DebuginfoKind {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}
impl std::fmt::Display for DebuginfoKind {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.desc())
}
}crate::target_spec_enum! {
1066 #[derive(Default)]
1071 pub enum DebuginfoKind {
1072 #[default]
1074 Dwarf = "dwarf",
1075 DwarfDsym = "dwarf-dsym",
1077 Pdb = "pdb",
1079 }
1080
1081 parse_error_type = "debuginfo kind";
1082}
1083
1084#[automatically_derived]
impl ::core::clone::Clone for SplitDebuginfo {
#[inline]
fn clone(&self) -> SplitDebuginfo { *self }
}
#[automatically_derived]
impl ::core::marker::Copy for SplitDebuginfo { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for SplitDebuginfo { }
#[automatically_derived]
impl ::core::cmp::PartialEq for SplitDebuginfo {
#[inline]
fn eq(&self, other: &SplitDebuginfo) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}
#[automatically_derived]
impl ::core::cmp::Eq for SplitDebuginfo {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) {}
}
#[automatically_derived]
impl ::core::hash::Hash for SplitDebuginfo {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}
#[automatically_derived]
impl ::core::fmt::Debug for SplitDebuginfo {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
SplitDebuginfo::Off => "Off",
SplitDebuginfo::Packed => "Packed",
SplitDebuginfo::Unpacked => "Unpacked",
})
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for SplitDebuginfo {
#[inline]
fn partial_cmp(&self, other: &SplitDebuginfo)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::PartialOrd::partial_cmp(&__self_discr, &__arg1_discr)
}
}
#[automatically_derived]
impl ::core::cmp::Ord for SplitDebuginfo {
#[inline]
fn cmp(&self, other: &SplitDebuginfo) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr)
}
}
#[automatically_derived]
impl ::core::default::Default for SplitDebuginfo {
#[inline]
fn default() -> SplitDebuginfo { Self::Off }
}
impl FromStr for SplitDebuginfo {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"off" => Self::Off,
"packed" => Self::Packed,
"unpacked" => Self::Unpacked,
_ => {
let all =
["\'off\'", "\'packed\'", "\'unpacked\'"].join(", ");
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid {0}: \'{1}\'. allowed values: {2}",
"split debuginfo", s, all))
}));
}
})
}
}
impl SplitDebuginfo {
pub const ALL: &'static [SplitDebuginfo] =
&[SplitDebuginfo::Off, SplitDebuginfo::Packed,
SplitDebuginfo::Unpacked];
pub fn desc(&self) -> &'static str {
match self {
Self::Off => "off",
Self::Packed => "packed",
Self::Unpacked => "unpacked",
}
}
}
impl crate::json::ToJson for SplitDebuginfo {
fn to_json(&self) -> crate::json::Json { self.desc().to_json() }
}
impl<'de> serde::Deserialize<'de> for SplitDebuginfo {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}
impl std::fmt::Display for SplitDebuginfo {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.desc())
}
}crate::target_spec_enum! {
1085 #[derive(Default)]
1086 pub enum SplitDebuginfo {
1087 #[default]
1095 Off = "off",
1096
1097 Packed = "packed",
1104
1105 Unpacked = "unpacked",
1112 }
1113
1114 parse_error_type = "split debuginfo";
1115}
1116
1117impl ::rustc_error_messages::IntoDiagArg for SplitDebuginfo {
fn into_diag_arg(self, path: &mut Option<std::path::PathBuf>)
-> ::rustc_error_messages::DiagArgValue {
self.to_string().into_diag_arg(path)
}
}into_diag_arg_using_display!(SplitDebuginfo);
1118
1119#[derive(#[automatically_derived]
impl ::core::clone::Clone for StackProbeType {
#[inline]
fn clone(&self) -> StackProbeType {
match self {
StackProbeType::None => StackProbeType::None,
StackProbeType::Inline => StackProbeType::Inline,
StackProbeType::Call => StackProbeType::Call,
StackProbeType::InlineOrCall {
min_llvm_version_for_inline: __self_0 } =>
StackProbeType::InlineOrCall {
min_llvm_version_for_inline: ::core::clone::Clone::clone(__self_0),
},
}
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for StackProbeType {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
StackProbeType::None =>
::core::fmt::Formatter::write_str(f, "None"),
StackProbeType::Inline =>
::core::fmt::Formatter::write_str(f, "Inline"),
StackProbeType::Call =>
::core::fmt::Formatter::write_str(f, "Call"),
StackProbeType::InlineOrCall {
min_llvm_version_for_inline: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"InlineOrCall", "min_llvm_version_for_inline", &__self_0),
}
}
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for StackProbeType {
#[inline]
fn eq(&self, other: &StackProbeType) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(StackProbeType::InlineOrCall {
min_llvm_version_for_inline: __self_0 },
StackProbeType::InlineOrCall {
min_llvm_version_for_inline: __arg1_0 }) =>
__self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for StackProbeType {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<(u32, u32, u32)>;
}
}Eq, #[doc(hidden)]
#[allow(non_upper_case_globals, unused_attributes, unused_qualifications,
clippy :: absolute_paths,)]
const _: () =
{
#[allow(unused_extern_crates, clippy :: useless_attribute)]
extern crate serde as _serde;
;
#[automatically_derived]
impl<'de> _serde::Deserialize<'de> for StackProbeType {
fn deserialize<__D>(__deserializer: __D)
-> _serde::__private228::Result<Self, __D::Error> where
__D: _serde::Deserializer<'de> {
#[allow(non_camel_case_types)]
#[doc(hidden)]
enum __Field { __field0, __field1, __field2, __field3, }
#[doc(hidden)]
struct __FieldVisitor;
#[automatically_derived]
impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
type Value = __Field;
fn expecting(&self,
__formatter: &mut _serde::__private228::Formatter)
-> _serde::__private228::fmt::Result {
_serde::__private228::Formatter::write_str(__formatter,
"variant identifier")
}
fn visit_u64<__E>(self, __value: u64)
-> _serde::__private228::Result<Self::Value, __E> where
__E: _serde::de::Error {
match __value {
0u64 => _serde::__private228::Ok(__Field::__field0),
1u64 => _serde::__private228::Ok(__Field::__field1),
2u64 => _serde::__private228::Ok(__Field::__field2),
3u64 => _serde::__private228::Ok(__Field::__field3),
_ =>
_serde::__private228::Err(_serde::de::Error::invalid_value(_serde::de::Unexpected::Unsigned(__value),
&"variant index 0 <= i < 4")),
}
}
fn visit_str<__E>(self, __value: &str)
-> _serde::__private228::Result<Self::Value, __E> where
__E: _serde::de::Error {
match __value {
"none" => _serde::__private228::Ok(__Field::__field0),
"inline" => _serde::__private228::Ok(__Field::__field1),
"call" => _serde::__private228::Ok(__Field::__field2),
"inline-or-call" =>
_serde::__private228::Ok(__Field::__field3),
_ => {
_serde::__private228::Err(_serde::de::Error::unknown_variant(__value,
VARIANTS))
}
}
}
fn visit_bytes<__E>(self, __value: &[u8])
-> _serde::__private228::Result<Self::Value, __E> where
__E: _serde::de::Error {
match __value {
b"none" => _serde::__private228::Ok(__Field::__field0),
b"inline" => _serde::__private228::Ok(__Field::__field1),
b"call" => _serde::__private228::Ok(__Field::__field2),
b"inline-or-call" =>
_serde::__private228::Ok(__Field::__field3),
_ => {
let __value =
&_serde::__private228::from_utf8_lossy(__value);
_serde::__private228::Err(_serde::de::Error::unknown_variant(__value,
VARIANTS))
}
}
}
}
#[automatically_derived]
impl<'de> _serde::Deserialize<'de> for __Field {
#[inline]
fn deserialize<__D>(__deserializer: __D)
-> _serde::__private228::Result<Self, __D::Error> where
__D: _serde::Deserializer<'de> {
_serde::Deserializer::deserialize_identifier(__deserializer,
__FieldVisitor)
}
}
#[doc(hidden)]
const VARIANTS: &'static [&'static str] =
&["none", "inline", "call", "inline-or-call"];
let (__tag, __content) =
_serde::Deserializer::deserialize_any(__deserializer,
_serde::__private228::de::TaggedContentVisitor::<__Field>::new("kind",
"internally tagged enum StackProbeType"))?;
let __deserializer =
_serde::__private228::de::ContentDeserializer::<__D::Error>::new(__content);
match __tag {
__Field::__field0 => {
_serde::Deserializer::deserialize_any(__deserializer,
_serde::__private228::de::InternallyTaggedUnitVisitor::new("StackProbeType",
"None"))?;
_serde::__private228::Ok(StackProbeType::None)
}
__Field::__field1 => {
_serde::Deserializer::deserialize_any(__deserializer,
_serde::__private228::de::InternallyTaggedUnitVisitor::new("StackProbeType",
"Inline"))?;
_serde::__private228::Ok(StackProbeType::Inline)
}
__Field::__field2 => {
_serde::Deserializer::deserialize_any(__deserializer,
_serde::__private228::de::InternallyTaggedUnitVisitor::new("StackProbeType",
"Call"))?;
_serde::__private228::Ok(StackProbeType::Call)
}
__Field::__field3 => {
#[allow(non_camel_case_types)]
#[doc(hidden)]
enum __Field { __field0, __ignore, }
#[doc(hidden)]
struct __FieldVisitor;
#[automatically_derived]
impl<'de> _serde::de::Visitor<'de> for __FieldVisitor {
type Value = __Field;
fn expecting(&self,
__formatter: &mut _serde::__private228::Formatter)
-> _serde::__private228::fmt::Result {
_serde::__private228::Formatter::write_str(__formatter,
"field identifier")
}
fn visit_u64<__E>(self, __value: u64)
-> _serde::__private228::Result<Self::Value, __E> where
__E: _serde::de::Error {
match __value {
0u64 => _serde::__private228::Ok(__Field::__field0),
_ => _serde::__private228::Ok(__Field::__ignore),
}
}
fn visit_str<__E>(self, __value: &str)
-> _serde::__private228::Result<Self::Value, __E> where
__E: _serde::de::Error {
match __value {
"min-llvm-version-for-inline" =>
_serde::__private228::Ok(__Field::__field0),
_ => { _serde::__private228::Ok(__Field::__ignore) }
}
}
fn visit_bytes<__E>(self, __value: &[u8])
-> _serde::__private228::Result<Self::Value, __E> where
__E: _serde::de::Error {
match __value {
b"min-llvm-version-for-inline" =>
_serde::__private228::Ok(__Field::__field0),
_ => { _serde::__private228::Ok(__Field::__ignore) }
}
}
}
#[automatically_derived]
impl<'de> _serde::Deserialize<'de> for __Field {
#[inline]
fn deserialize<__D>(__deserializer: __D)
-> _serde::__private228::Result<Self, __D::Error> where
__D: _serde::Deserializer<'de> {
_serde::Deserializer::deserialize_identifier(__deserializer,
__FieldVisitor)
}
}
#[doc(hidden)]
struct __Visitor<'de> {
marker: _serde::__private228::PhantomData<StackProbeType>,
lifetime: _serde::__private228::PhantomData<&'de ()>,
}
#[automatically_derived]
impl<'de> _serde::de::Visitor<'de> for __Visitor<'de> {
type Value = StackProbeType;
fn expecting(&self,
__formatter: &mut _serde::__private228::Formatter)
-> _serde::__private228::fmt::Result {
_serde::__private228::Formatter::write_str(__formatter,
"struct variant StackProbeType::InlineOrCall")
}
#[inline]
fn visit_seq<__A>(self, mut __seq: __A)
-> _serde::__private228::Result<Self::Value, __A::Error>
where __A: _serde::de::SeqAccess<'de> {
let __field0 =
match _serde::de::SeqAccess::next_element::<(u32, u32,
u32)>(&mut __seq)? {
_serde::__private228::Some(__value) => __value,
_serde::__private228::None =>
return _serde::__private228::Err(_serde::de::Error::invalid_length(0usize,
&"struct variant StackProbeType::InlineOrCall with 1 element")),
};
_serde::__private228::Ok(StackProbeType::InlineOrCall {
min_llvm_version_for_inline: __field0,
})
}
#[inline]
fn visit_map<__A>(self, mut __map: __A)
-> _serde::__private228::Result<Self::Value, __A::Error>
where __A: _serde::de::MapAccess<'de> {
let mut __field0:
_serde::__private228::Option<(u32, u32, u32)> =
_serde::__private228::None;
while let _serde::__private228::Some(__key) =
_serde::de::MapAccess::next_key::<__Field>(&mut __map)? {
match __key {
__Field::__field0 => {
if _serde::__private228::Option::is_some(&__field0) {
return _serde::__private228::Err(<__A::Error as
_serde::de::Error>::duplicate_field("min-llvm-version-for-inline"));
}
__field0 =
_serde::__private228::Some(_serde::de::MapAccess::next_value::<(u32,
u32, u32)>(&mut __map)?);
}
_ => {
let _ =
_serde::de::MapAccess::next_value::<_serde::de::IgnoredAny>(&mut __map)?;
}
}
}
let __field0 =
match __field0 {
_serde::__private228::Some(__field0) => __field0,
_serde::__private228::None =>
_serde::__private228::de::missing_field("min-llvm-version-for-inline")?,
};
_serde::__private228::Ok(StackProbeType::InlineOrCall {
min_llvm_version_for_inline: __field0,
})
}
}
#[doc(hidden)]
const FIELDS: &'static [&'static str] =
&["min-llvm-version-for-inline"];
_serde::Deserializer::deserialize_any(__deserializer,
__Visitor {
marker: _serde::__private228::PhantomData::<StackProbeType>,
lifetime: _serde::__private228::PhantomData,
})
}
}
}
}
};serde_derive::Deserialize, const _: () =
{
#[automatically_derived]
#[allow(unused_braces)]
impl schemars::JsonSchema for StackProbeType {
fn schema_name()
-> schemars::_private::alloc::borrow::Cow<'static, str> {
schemars::_private::alloc::borrow::Cow::Borrowed("StackProbeType")
}
fn schema_id()
-> schemars::_private::alloc::borrow::Cow<'static, str> {
schemars::_private::alloc::borrow::Cow::Borrowed("rustc_target::spec::StackProbeType")
}
fn json_schema(generator: &mut schemars::SchemaGenerator)
-> schemars::Schema {
{
{
let mut map = schemars::_private::serde_json::Map::new();
map.insert("oneOf".into(),
schemars::_private::serde_json::Value::Array({
let mut enum_values =
schemars::_private::alloc::vec::Vec::new();
enum_values.push({
let mut schema = generator.subschema_for::<()>();
schemars::_private::apply_internal_enum_variant_tag(&mut schema,
"kind", "none", false);
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"title",
{
const TITLE: &str =
schemars::_private::get_title_and_description("Don\'t emit any stack probes.").0;
TITLE
});
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"description",
{
const DESCRIPTION: &str =
schemars::_private::get_title_and_description("Don\'t emit any stack probes.").1;
DESCRIPTION
});
schema
}.to_value());
enum_values.push({
let mut schema = generator.subschema_for::<()>();
schemars::_private::apply_internal_enum_variant_tag(&mut schema,
"kind", "inline", false);
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"title",
{
const TITLE: &str =
schemars::_private::get_title_and_description("It is harmless to use this option even on targets that do not have backend support for\nstack probes as the failure mode is the same as if no stack-probe option was specified in\nthe first place.").0;
TITLE
});
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"description",
{
const DESCRIPTION: &str =
schemars::_private::get_title_and_description("It is harmless to use this option even on targets that do not have backend support for\nstack probes as the failure mode is the same as if no stack-probe option was specified in\nthe first place.").1;
DESCRIPTION
});
schema
}.to_value());
enum_values.push({
let mut schema = generator.subschema_for::<()>();
schemars::_private::apply_internal_enum_variant_tag(&mut schema,
"kind", "call", false);
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"title",
{
const TITLE: &str =
schemars::_private::get_title_and_description("Call `__rust_probestack` whenever stack needs to be probed.").0;
TITLE
});
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"description",
{
const DESCRIPTION: &str =
schemars::_private::get_title_and_description("Call `__rust_probestack` whenever stack needs to be probed.").1;
DESCRIPTION
});
schema
}.to_value());
enum_values.push({
let mut schema =
<::schemars::Schema as
::core::convert::TryFrom<_>>::try_from(::serde_json::Value::Object({
let mut object = ::serde_json::Map::new();
let _ =
object.insert(("type").into(),
::serde_json::to_value(&"object").unwrap());
;
object
})).unwrap();
{
schemars::_private::insert_object_property(&mut schema,
"min-llvm-version-for-inline",
generator.contract().is_deserialize() &&
<(u32, u32, u32) as
schemars::JsonSchema>::_schemars_private_is_option(),
{ generator.subschema_for::<(u32, u32, u32)>() });
}
schemars::_private::apply_internal_enum_variant_tag(&mut schema,
"kind", "inline-or-call", false);
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"title",
{
const TITLE: &str =
schemars::_private::get_title_and_description("Use inline option for LLVM versions later than specified in `min_llvm_version_for_inline`\nand call `__rust_probestack` otherwise.").0;
TITLE
});
schemars::_private::insert_metadata_property_if_nonempty(&mut schema,
"description",
{
const DESCRIPTION: &str =
schemars::_private::get_title_and_description("Use inline option for LLVM versions later than specified in `min_llvm_version_for_inline`\nand call `__rust_probestack` otherwise.").1;
DESCRIPTION
});
schema
}.to_value());
enum_values
}));
schemars::Schema::from(map)
}
}
}
fn inline_schema() -> bool { false }
}
;
};schemars::JsonSchema)]
1120#[serde(tag = "kind")]
1121#[serde(rename_all = "kebab-case")]
1122pub enum StackProbeType {
1123 None,
1125 Inline,
1129 Call,
1131 InlineOrCall {
1134 #[serde(rename = "min-llvm-version-for-inline")]
1135 min_llvm_version_for_inline: (u32, u32, u32),
1136 },
1137}
1138
1139impl ToJson for StackProbeType {
1140 fn to_json(&self) -> Json {
1141 Json::Object(match self {
1142 StackProbeType::None => {
1143 [(String::from("kind"), "none".to_json())].into_iter().collect()
1144 }
1145 StackProbeType::Inline => {
1146 [(String::from("kind"), "inline".to_json())].into_iter().collect()
1147 }
1148 StackProbeType::Call => {
1149 [(String::from("kind"), "call".to_json())].into_iter().collect()
1150 }
1151 StackProbeType::InlineOrCall { min_llvm_version_for_inline: (maj, min, patch) } => [
1152 (String::from("kind"), "inline-or-call".to_json()),
1153 (
1154 String::from("min-llvm-version-for-inline"),
1155 Json::Array(<[_]>::into_vec(::alloc::boxed::box_new([maj.to_json(), min.to_json(),
patch.to_json()]))vec![maj.to_json(), min.to_json(), patch.to_json()]),
1156 ),
1157 ]
1158 .into_iter()
1159 .collect(),
1160 })
1161 }
1162}
1163
1164#[derive(#[automatically_derived]
impl ::core::default::Default for SanitizerSet {
#[inline]
fn default() -> SanitizerSet {
SanitizerSet(::core::default::Default::default())
}
}Default, #[automatically_derived]
impl ::core::clone::Clone for SanitizerSet {
#[inline]
fn clone(&self) -> SanitizerSet {
let _: ::core::clone::AssertParamIsClone<u16>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for SanitizerSet { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for SanitizerSet {
#[inline]
fn eq(&self, other: &SanitizerSet) -> bool { self.0 == other.0 }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for SanitizerSet {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<u16>;
}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for SanitizerSet {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.0, state)
}
}Hash, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for SanitizerSet {
fn encode(&self, __encoder: &mut __E) {
match *self {
SanitizerSet(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for SanitizerSet {
fn decode(__decoder: &mut __D) -> Self {
SanitizerSet(::rustc_serialize::Decodable::decode(__decoder))
}
}
};Decodable, const _: () =
{
impl<__CTX> ::rustc_data_structures::stable_hasher::HashStable<__CTX>
for SanitizerSet where __CTX: crate::HashStableContext {
#[inline]
fn hash_stable(&self, __hcx: &mut __CTX,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
SanitizerSet(ref __binding_0) => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable_Generic)]
1165pub struct SanitizerSet(u16);
1166impl SanitizerSet {
#[allow(deprecated, non_upper_case_globals,)]
pub const ADDRESS: Self = Self::from_bits_retain(1 << 0);
#[allow(deprecated, non_upper_case_globals,)]
pub const LEAK: Self = Self::from_bits_retain(1 << 1);
#[allow(deprecated, non_upper_case_globals,)]
pub const MEMORY: Self = Self::from_bits_retain(1 << 2);
#[allow(deprecated, non_upper_case_globals,)]
pub const THREAD: Self = Self::from_bits_retain(1 << 3);
#[allow(deprecated, non_upper_case_globals,)]
pub const HWADDRESS: Self = Self::from_bits_retain(1 << 4);
#[allow(deprecated, non_upper_case_globals,)]
pub const CFI: Self = Self::from_bits_retain(1 << 5);
#[allow(deprecated, non_upper_case_globals,)]
pub const MEMTAG: Self = Self::from_bits_retain(1 << 6);
#[allow(deprecated, non_upper_case_globals,)]
pub const SHADOWCALLSTACK: Self = Self::from_bits_retain(1 << 7);
#[allow(deprecated, non_upper_case_globals,)]
pub const KCFI: Self = Self::from_bits_retain(1 << 8);
#[allow(deprecated, non_upper_case_globals,)]
pub const KERNELADDRESS: Self = Self::from_bits_retain(1 << 9);
#[allow(deprecated, non_upper_case_globals,)]
pub const SAFESTACK: Self = Self::from_bits_retain(1 << 10);
#[allow(deprecated, non_upper_case_globals,)]
pub const DATAFLOW: Self = Self::from_bits_retain(1 << 11);
#[allow(deprecated, non_upper_case_globals,)]
pub const REALTIME: Self = Self::from_bits_retain(1 << 12);
}
impl ::bitflags::Flags for SanitizerSet {
const FLAGS: &'static [::bitflags::Flag<SanitizerSet>] =
&[{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("ADDRESS", SanitizerSet::ADDRESS)
},
{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("LEAK", SanitizerSet::LEAK)
},
{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("MEMORY", SanitizerSet::MEMORY)
},
{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("THREAD", SanitizerSet::THREAD)
},
{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("HWADDRESS", SanitizerSet::HWADDRESS)
},
{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("CFI", SanitizerSet::CFI)
},
{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("MEMTAG", SanitizerSet::MEMTAG)
},
{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("SHADOWCALLSTACK",
SanitizerSet::SHADOWCALLSTACK)
},
{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("KCFI", SanitizerSet::KCFI)
},
{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("KERNELADDRESS",
SanitizerSet::KERNELADDRESS)
},
{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("SAFESTACK", SanitizerSet::SAFESTACK)
},
{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("DATAFLOW", SanitizerSet::DATAFLOW)
},
{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("REALTIME", SanitizerSet::REALTIME)
}];
type Bits = u16;
fn bits(&self) -> u16 { SanitizerSet::bits(self) }
fn from_bits_retain(bits: u16) -> SanitizerSet {
SanitizerSet::from_bits_retain(bits)
}
}
#[allow(dead_code, deprecated, unused_doc_comments, unused_attributes,
unused_mut, unused_imports, non_upper_case_globals, clippy ::
assign_op_pattern, clippy :: iter_without_into_iter,)]
const _: () =
{
#[allow(dead_code, deprecated, unused_attributes)]
impl SanitizerSet {
#[inline]
pub const fn empty() -> Self {
Self(<u16 as ::bitflags::Bits>::EMPTY)
}
#[inline]
pub const fn all() -> Self {
let mut truncated = <u16 as ::bitflags::Bits>::EMPTY;
let mut i = 0;
{
{
let flag =
<SanitizerSet as
::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
{
{
let flag =
<SanitizerSet as
::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
{
{
let flag =
<SanitizerSet as
::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
{
{
let flag =
<SanitizerSet as
::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
{
{
let flag =
<SanitizerSet as
::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
{
{
let flag =
<SanitizerSet as
::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
{
{
let flag =
<SanitizerSet as
::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
{
{
let flag =
<SanitizerSet as
::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
{
{
let flag =
<SanitizerSet as
::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
{
{
let flag =
<SanitizerSet as
::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
{
{
let flag =
<SanitizerSet as
::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
{
{
let flag =
<SanitizerSet as
::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
{
{
let flag =
<SanitizerSet as
::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
let _ = i;
Self(truncated)
}
#[inline]
pub const fn bits(&self) -> u16 { self.0 }
#[inline]
pub const fn from_bits(bits: u16)
-> ::bitflags::__private::core::option::Option<Self> {
let truncated = Self::from_bits_truncate(bits).0;
if truncated == bits {
::bitflags::__private::core::option::Option::Some(Self(bits))
} else { ::bitflags::__private::core::option::Option::None }
}
#[inline]
pub const fn from_bits_truncate(bits: u16) -> Self {
Self(bits & Self::all().0)
}
#[inline]
pub const fn from_bits_retain(bits: u16) -> Self { Self(bits) }
#[inline]
pub fn from_name(name: &str)
-> ::bitflags::__private::core::option::Option<Self> {
{
if name == "ADDRESS" {
return ::bitflags::__private::core::option::Option::Some(Self(SanitizerSet::ADDRESS.bits()));
}
};
;
{
if name == "LEAK" {
return ::bitflags::__private::core::option::Option::Some(Self(SanitizerSet::LEAK.bits()));
}
};
;
{
if name == "MEMORY" {
return ::bitflags::__private::core::option::Option::Some(Self(SanitizerSet::MEMORY.bits()));
}
};
;
{
if name == "THREAD" {
return ::bitflags::__private::core::option::Option::Some(Self(SanitizerSet::THREAD.bits()));
}
};
;
{
if name == "HWADDRESS" {
return ::bitflags::__private::core::option::Option::Some(Self(SanitizerSet::HWADDRESS.bits()));
}
};
;
{
if name == "CFI" {
return ::bitflags::__private::core::option::Option::Some(Self(SanitizerSet::CFI.bits()));
}
};
;
{
if name == "MEMTAG" {
return ::bitflags::__private::core::option::Option::Some(Self(SanitizerSet::MEMTAG.bits()));
}
};
;
{
if name == "SHADOWCALLSTACK" {
return ::bitflags::__private::core::option::Option::Some(Self(SanitizerSet::SHADOWCALLSTACK.bits()));
}
};
;
{
if name == "KCFI" {
return ::bitflags::__private::core::option::Option::Some(Self(SanitizerSet::KCFI.bits()));
}
};
;
{
if name == "KERNELADDRESS" {
return ::bitflags::__private::core::option::Option::Some(Self(SanitizerSet::KERNELADDRESS.bits()));
}
};
;
{
if name == "SAFESTACK" {
return ::bitflags::__private::core::option::Option::Some(Self(SanitizerSet::SAFESTACK.bits()));
}
};
;
{
if name == "DATAFLOW" {
return ::bitflags::__private::core::option::Option::Some(Self(SanitizerSet::DATAFLOW.bits()));
}
};
;
{
if name == "REALTIME" {
return ::bitflags::__private::core::option::Option::Some(Self(SanitizerSet::REALTIME.bits()));
}
};
;
let _ = name;
::bitflags::__private::core::option::Option::None
}
#[inline]
pub const fn is_empty(&self) -> bool {
self.0 == <u16 as ::bitflags::Bits>::EMPTY
}
#[inline]
pub const fn is_all(&self) -> bool {
Self::all().0 | self.0 == self.0
}
#[inline]
pub const fn intersects(&self, other: Self) -> bool {
self.0 & other.0 != <u16 as ::bitflags::Bits>::EMPTY
}
#[inline]
pub const fn contains(&self, other: Self) -> bool {
self.0 & other.0 == other.0
}
#[inline]
pub fn insert(&mut self, other: Self) {
*self = Self(self.0).union(other);
}
#[inline]
pub fn remove(&mut self, other: Self) {
*self = Self(self.0).difference(other);
}
#[inline]
pub fn toggle(&mut self, other: Self) {
*self = Self(self.0).symmetric_difference(other);
}
#[inline]
pub fn set(&mut self, other: Self, value: bool) {
if value { self.insert(other); } else { self.remove(other); }
}
#[inline]
#[must_use]
pub const fn intersection(self, other: Self) -> Self {
Self(self.0 & other.0)
}
#[inline]
#[must_use]
pub const fn union(self, other: Self) -> Self {
Self(self.0 | other.0)
}
#[inline]
#[must_use]
pub const fn difference(self, other: Self) -> Self {
Self(self.0 & !other.0)
}
#[inline]
#[must_use]
pub const fn symmetric_difference(self, other: Self) -> Self {
Self(self.0 ^ other.0)
}
#[inline]
#[must_use]
pub const fn complement(self) -> Self {
Self::from_bits_truncate(!self.0)
}
}
impl ::bitflags::__private::core::fmt::Binary for SanitizerSet {
fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
-> ::bitflags::__private::core::fmt::Result {
let inner = self.0;
::bitflags::__private::core::fmt::Binary::fmt(&inner, f)
}
}
impl ::bitflags::__private::core::fmt::Octal for SanitizerSet {
fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
-> ::bitflags::__private::core::fmt::Result {
let inner = self.0;
::bitflags::__private::core::fmt::Octal::fmt(&inner, f)
}
}
impl ::bitflags::__private::core::fmt::LowerHex for SanitizerSet {
fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
-> ::bitflags::__private::core::fmt::Result {
let inner = self.0;
::bitflags::__private::core::fmt::LowerHex::fmt(&inner, f)
}
}
impl ::bitflags::__private::core::fmt::UpperHex for SanitizerSet {
fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
-> ::bitflags::__private::core::fmt::Result {
let inner = self.0;
::bitflags::__private::core::fmt::UpperHex::fmt(&inner, f)
}
}
impl ::bitflags::__private::core::ops::BitOr for SanitizerSet {
type Output = Self;
#[inline]
fn bitor(self, other: SanitizerSet) -> Self { self.union(other) }
}
impl ::bitflags::__private::core::ops::BitOrAssign for SanitizerSet {
#[inline]
fn bitor_assign(&mut self, other: Self) { self.insert(other); }
}
impl ::bitflags::__private::core::ops::BitXor for SanitizerSet {
type Output = Self;
#[inline]
fn bitxor(self, other: Self) -> Self {
self.symmetric_difference(other)
}
}
impl ::bitflags::__private::core::ops::BitXorAssign for SanitizerSet {
#[inline]
fn bitxor_assign(&mut self, other: Self) { self.toggle(other); }
}
impl ::bitflags::__private::core::ops::BitAnd for SanitizerSet {
type Output = Self;
#[inline]
fn bitand(self, other: Self) -> Self { self.intersection(other) }
}
impl ::bitflags::__private::core::ops::BitAndAssign for SanitizerSet {
#[inline]
fn bitand_assign(&mut self, other: Self) {
*self =
Self::from_bits_retain(self.bits()).intersection(other);
}
}
impl ::bitflags::__private::core::ops::Sub for SanitizerSet {
type Output = Self;
#[inline]
fn sub(self, other: Self) -> Self { self.difference(other) }
}
impl ::bitflags::__private::core::ops::SubAssign for SanitizerSet {
#[inline]
fn sub_assign(&mut self, other: Self) { self.remove(other); }
}
impl ::bitflags::__private::core::ops::Not for SanitizerSet {
type Output = Self;
#[inline]
fn not(self) -> Self { self.complement() }
}
impl ::bitflags::__private::core::iter::Extend<SanitizerSet> for
SanitizerSet {
fn extend<T: ::bitflags::__private::core::iter::IntoIterator<Item
= Self>>(&mut self, iterator: T) {
for item in iterator { self.insert(item) }
}
}
impl ::bitflags::__private::core::iter::FromIterator<SanitizerSet> for
SanitizerSet {
fn from_iter<T: ::bitflags::__private::core::iter::IntoIterator<Item
= Self>>(iterator: T) -> Self {
use ::bitflags::__private::core::iter::Extend;
let mut result = Self::empty();
result.extend(iterator);
result
}
}
impl SanitizerSet {
#[inline]
pub const fn iter(&self) -> ::bitflags::iter::Iter<SanitizerSet> {
::bitflags::iter::Iter::__private_const_new(<SanitizerSet as
::bitflags::Flags>::FLAGS,
SanitizerSet::from_bits_retain(self.bits()),
SanitizerSet::from_bits_retain(self.bits()))
}
#[inline]
pub const fn iter_names(&self)
-> ::bitflags::iter::IterNames<SanitizerSet> {
::bitflags::iter::IterNames::__private_const_new(<SanitizerSet
as ::bitflags::Flags>::FLAGS,
SanitizerSet::from_bits_retain(self.bits()),
SanitizerSet::from_bits_retain(self.bits()))
}
}
impl ::bitflags::__private::core::iter::IntoIterator for SanitizerSet
{
type Item = SanitizerSet;
type IntoIter = ::bitflags::iter::Iter<SanitizerSet>;
fn into_iter(self) -> Self::IntoIter { self.iter() }
}
};bitflags::bitflags! {
1167 impl SanitizerSet: u16 {
1168 const ADDRESS = 1 << 0;
1169 const LEAK = 1 << 1;
1170 const MEMORY = 1 << 2;
1171 const THREAD = 1 << 3;
1172 const HWADDRESS = 1 << 4;
1173 const CFI = 1 << 5;
1174 const MEMTAG = 1 << 6;
1175 const SHADOWCALLSTACK = 1 << 7;
1176 const KCFI = 1 << 8;
1177 const KERNELADDRESS = 1 << 9;
1178 const SAFESTACK = 1 << 10;
1179 const DATAFLOW = 1 << 11;
1180 const REALTIME = 1 << 12;
1181 }
1182}
1183impl ::std::fmt::Debug for SanitizerSet {
fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
::bitflags::parser::to_writer(self, f)
}
}rustc_data_structures::external_bitflags_debug! { SanitizerSet }
1184
1185impl SanitizerSet {
1186 const MUTUALLY_EXCLUSIVE: &'static [(SanitizerSet, SanitizerSet)] = &[
1189 (SanitizerSet::ADDRESS, SanitizerSet::MEMORY),
1190 (SanitizerSet::ADDRESS, SanitizerSet::THREAD),
1191 (SanitizerSet::ADDRESS, SanitizerSet::HWADDRESS),
1192 (SanitizerSet::ADDRESS, SanitizerSet::MEMTAG),
1193 (SanitizerSet::ADDRESS, SanitizerSet::KERNELADDRESS),
1194 (SanitizerSet::ADDRESS, SanitizerSet::SAFESTACK),
1195 (SanitizerSet::LEAK, SanitizerSet::MEMORY),
1196 (SanitizerSet::LEAK, SanitizerSet::THREAD),
1197 (SanitizerSet::LEAK, SanitizerSet::KERNELADDRESS),
1198 (SanitizerSet::LEAK, SanitizerSet::SAFESTACK),
1199 (SanitizerSet::MEMORY, SanitizerSet::THREAD),
1200 (SanitizerSet::MEMORY, SanitizerSet::HWADDRESS),
1201 (SanitizerSet::MEMORY, SanitizerSet::KERNELADDRESS),
1202 (SanitizerSet::MEMORY, SanitizerSet::SAFESTACK),
1203 (SanitizerSet::THREAD, SanitizerSet::HWADDRESS),
1204 (SanitizerSet::THREAD, SanitizerSet::KERNELADDRESS),
1205 (SanitizerSet::THREAD, SanitizerSet::SAFESTACK),
1206 (SanitizerSet::HWADDRESS, SanitizerSet::MEMTAG),
1207 (SanitizerSet::HWADDRESS, SanitizerSet::KERNELADDRESS),
1208 (SanitizerSet::HWADDRESS, SanitizerSet::SAFESTACK),
1209 (SanitizerSet::CFI, SanitizerSet::KCFI),
1210 (SanitizerSet::MEMTAG, SanitizerSet::KERNELADDRESS),
1211 (SanitizerSet::KERNELADDRESS, SanitizerSet::SAFESTACK),
1212 ];
1213
1214 pub fn as_str(self) -> Option<&'static str> {
1218 Some(match self {
1219 SanitizerSet::ADDRESS => "address",
1220 SanitizerSet::CFI => "cfi",
1221 SanitizerSet::DATAFLOW => "dataflow",
1222 SanitizerSet::KCFI => "kcfi",
1223 SanitizerSet::KERNELADDRESS => "kernel-address",
1224 SanitizerSet::LEAK => "leak",
1225 SanitizerSet::MEMORY => "memory",
1226 SanitizerSet::MEMTAG => "memtag",
1227 SanitizerSet::SAFESTACK => "safestack",
1228 SanitizerSet::SHADOWCALLSTACK => "shadow-call-stack",
1229 SanitizerSet::THREAD => "thread",
1230 SanitizerSet::HWADDRESS => "hwaddress",
1231 SanitizerSet::REALTIME => "realtime",
1232 _ => return None,
1233 })
1234 }
1235
1236 pub fn mutually_exclusive(self) -> Option<(SanitizerSet, SanitizerSet)> {
1237 Self::MUTUALLY_EXCLUSIVE
1238 .into_iter()
1239 .find(|&(a, b)| self.contains(*a) && self.contains(*b))
1240 .copied()
1241 }
1242}
1243
1244impl fmt::Display for SanitizerSet {
1246 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1247 let mut first = true;
1248 for s in *self {
1249 let name = s.as_str().unwrap_or_else(|| {
::core::panicking::panic_fmt(format_args!("unrecognized sanitizer {0:?}",
s));
}panic!("unrecognized sanitizer {s:?}"));
1250 if !first {
1251 f.write_str(", ")?;
1252 }
1253 f.write_str(name)?;
1254 first = false;
1255 }
1256 Ok(())
1257 }
1258}
1259
1260impl FromStr for SanitizerSet {
1261 type Err = String;
1262 fn from_str(s: &str) -> Result<Self, Self::Err> {
1263 Ok(match s {
1264 "address" => SanitizerSet::ADDRESS,
1265 "cfi" => SanitizerSet::CFI,
1266 "dataflow" => SanitizerSet::DATAFLOW,
1267 "kcfi" => SanitizerSet::KCFI,
1268 "kernel-address" => SanitizerSet::KERNELADDRESS,
1269 "leak" => SanitizerSet::LEAK,
1270 "memory" => SanitizerSet::MEMORY,
1271 "memtag" => SanitizerSet::MEMTAG,
1272 "safestack" => SanitizerSet::SAFESTACK,
1273 "shadow-call-stack" => SanitizerSet::SHADOWCALLSTACK,
1274 "thread" => SanitizerSet::THREAD,
1275 "hwaddress" => SanitizerSet::HWADDRESS,
1276 "realtime" => SanitizerSet::REALTIME,
1277 s => return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("unknown sanitizer {0}", s))
})format!("unknown sanitizer {s}")),
1278 })
1279 }
1280}
1281
1282impl<'de> serde::Deserialize<'de> for SanitizerSet {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}crate::json::serde_deserialize_from_str!(SanitizerSet);
1283impl schemars::JsonSchema for SanitizerSet {
1284 fn schema_name() -> std::borrow::Cow<'static, str> {
1285 "SanitizerSet".into()
1286 }
1287 fn json_schema(_: &mut schemars::SchemaGenerator) -> schemars::Schema {
1288 let all = Self::all().iter().map(|sanitizer| sanitizer.as_str()).collect::<Vec<_>>();
1289 <::schemars::Schema as
::core::convert::TryFrom<_>>::try_from(::serde_json::Value::Object({
let mut object = ::serde_json::Map::new();
let _ =
object.insert(("type").into(),
::serde_json::to_value(&"string").unwrap());
let _ =
object.insert(("enum").into(),
::serde_json::to_value(&all).unwrap());
;
object
})).unwrap()schemars::json_schema! ({
1290 "type": "string",
1291 "enum": all,
1292 })
1293 .into()
1294 }
1295}
1296
1297impl ToJson for SanitizerSet {
1298 fn to_json(&self) -> Json {
1299 self.into_iter()
1300 .map(|v| Some(v.as_str()?.to_json()))
1301 .collect::<Option<Vec<_>>>()
1302 .unwrap_or_default()
1303 .to_json()
1304 }
1305}
1306
1307#[automatically_derived]
impl ::core::clone::Clone for FramePointer {
#[inline]
fn clone(&self) -> FramePointer { *self }
}
#[automatically_derived]
impl ::core::marker::Copy for FramePointer { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for FramePointer { }
#[automatically_derived]
impl ::core::cmp::PartialEq for FramePointer {
#[inline]
fn eq(&self, other: &FramePointer) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}
#[automatically_derived]
impl ::core::cmp::Eq for FramePointer {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) {}
}
#[automatically_derived]
impl ::core::hash::Hash for FramePointer {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}
#[automatically_derived]
impl ::core::fmt::Debug for FramePointer {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
FramePointer::Always => "Always",
FramePointer::NonLeaf => "NonLeaf",
FramePointer::MayOmit => "MayOmit",
})
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for FramePointer {
#[inline]
fn partial_cmp(&self, other: &FramePointer)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::PartialOrd::partial_cmp(&__self_discr, &__arg1_discr)
}
}
#[automatically_derived]
impl ::core::cmp::Ord for FramePointer {
#[inline]
fn cmp(&self, other: &FramePointer) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr)
}
}
impl FromStr for FramePointer {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"always" => Self::Always,
"non-leaf" => Self::NonLeaf,
"may-omit" => Self::MayOmit,
_ => {
let all =
["\'always\'", "\'non-leaf\'", "\'may-omit\'"].join(", ");
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid {0}: \'{1}\'. allowed values: {2}",
"frame pointer", s, all))
}));
}
})
}
}
impl FramePointer {
pub const ALL: &'static [FramePointer] =
&[FramePointer::Always, FramePointer::NonLeaf, FramePointer::MayOmit];
pub fn desc(&self) -> &'static str {
match self {
Self::Always => "always",
Self::NonLeaf => "non-leaf",
Self::MayOmit => "may-omit",
}
}
}
impl crate::json::ToJson for FramePointer {
fn to_json(&self) -> crate::json::Json { self.desc().to_json() }
}
impl<'de> serde::Deserialize<'de> for FramePointer {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}
impl std::fmt::Display for FramePointer {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.desc())
}
}crate::target_spec_enum! {
1308 pub enum FramePointer {
1309 Always = "always",
1311 NonLeaf = "non-leaf",
1314 MayOmit = "may-omit",
1318 }
1319
1320 parse_error_type = "frame pointer";
1321}
1322
1323impl FramePointer {
1324 #[inline]
1327 pub fn ratchet(&mut self, rhs: FramePointer) -> FramePointer {
1328 *self = match (*self, rhs) {
1329 (FramePointer::Always, _) | (_, FramePointer::Always) => FramePointer::Always,
1330 (FramePointer::NonLeaf, _) | (_, FramePointer::NonLeaf) => FramePointer::NonLeaf,
1331 _ => FramePointer::MayOmit,
1332 };
1333 *self
1334 }
1335}
1336
1337#[automatically_derived]
impl ::core::clone::Clone for StackProtector {
#[inline]
fn clone(&self) -> StackProtector { *self }
}
#[automatically_derived]
impl ::core::marker::Copy for StackProtector { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for StackProtector { }
#[automatically_derived]
impl ::core::cmp::PartialEq for StackProtector {
#[inline]
fn eq(&self, other: &StackProtector) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}
#[automatically_derived]
impl ::core::cmp::Eq for StackProtector {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) {}
}
#[automatically_derived]
impl ::core::hash::Hash for StackProtector {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}
#[automatically_derived]
impl ::core::fmt::Debug for StackProtector {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
StackProtector::None => "None",
StackProtector::Basic => "Basic",
StackProtector::Strong => "Strong",
StackProtector::All => "All",
})
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for StackProtector {
#[inline]
fn partial_cmp(&self, other: &StackProtector)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::PartialOrd::partial_cmp(&__self_discr, &__arg1_discr)
}
}
#[automatically_derived]
impl ::core::cmp::Ord for StackProtector {
#[inline]
fn cmp(&self, other: &StackProtector) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr)
}
}
impl FromStr for StackProtector {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"none" => Self::None,
"basic" => Self::Basic,
"strong" => Self::Strong,
"all" => Self::All,
_ => {
let all =
["\'none\'", "\'basic\'", "\'strong\'",
"\'all\'"].join(", ");
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid {0}: \'{1}\'. allowed values: {2}",
"stack protector", s, all))
}));
}
})
}
}
impl StackProtector {
pub const ALL: &'static [StackProtector] =
&[StackProtector::None, StackProtector::Basic, StackProtector::Strong,
StackProtector::All];
pub fn desc(&self) -> &'static str {
match self {
Self::None => "none",
Self::Basic => "basic",
Self::Strong => "strong",
Self::All => "all",
}
}
}
impl crate::json::ToJson for StackProtector {
fn to_json(&self) -> crate::json::Json { self.desc().to_json() }
}
impl<'de> serde::Deserialize<'de> for StackProtector {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}
impl std::fmt::Display for StackProtector {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.desc())
}
}crate::target_spec_enum! {
1338 pub enum StackProtector {
1340 None = "none",
1342
1343 Basic = "basic",
1348
1349 Strong = "strong",
1354
1355 All = "all",
1357 }
1358
1359 parse_error_type = "stack protector";
1360}
1361
1362impl ::rustc_error_messages::IntoDiagArg for StackProtector {
fn into_diag_arg(self, path: &mut Option<std::path::PathBuf>)
-> ::rustc_error_messages::DiagArgValue {
self.to_string().into_diag_arg(path)
}
}into_diag_arg_using_display!(StackProtector);
1363
1364#[automatically_derived]
impl ::core::clone::Clone for BinaryFormat {
#[inline]
fn clone(&self) -> BinaryFormat { *self }
}
#[automatically_derived]
impl ::core::marker::Copy for BinaryFormat { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for BinaryFormat { }
#[automatically_derived]
impl ::core::cmp::PartialEq for BinaryFormat {
#[inline]
fn eq(&self, other: &BinaryFormat) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}
#[automatically_derived]
impl ::core::cmp::Eq for BinaryFormat {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) {}
}
#[automatically_derived]
impl ::core::hash::Hash for BinaryFormat {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}
#[automatically_derived]
impl ::core::fmt::Debug for BinaryFormat {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
BinaryFormat::Coff => "Coff",
BinaryFormat::Elf => "Elf",
BinaryFormat::MachO => "MachO",
BinaryFormat::Wasm => "Wasm",
BinaryFormat::Xcoff => "Xcoff",
})
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for BinaryFormat {
#[inline]
fn partial_cmp(&self, other: &BinaryFormat)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::PartialOrd::partial_cmp(&__self_discr, &__arg1_discr)
}
}
#[automatically_derived]
impl ::core::cmp::Ord for BinaryFormat {
#[inline]
fn cmp(&self, other: &BinaryFormat) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr)
}
}
impl FromStr for BinaryFormat {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"coff" => Self::Coff,
"elf" => Self::Elf,
"mach-o" => Self::MachO,
"wasm" => Self::Wasm,
"xcoff" => Self::Xcoff,
_ => {
let all =
["\'coff\'", "\'elf\'", "\'mach-o\'", "\'wasm\'",
"\'xcoff\'"].join(", ");
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid {0}: \'{1}\'. allowed values: {2}",
"binary format", s, all))
}));
}
})
}
}
impl BinaryFormat {
pub const ALL: &'static [BinaryFormat] =
&[BinaryFormat::Coff, BinaryFormat::Elf, BinaryFormat::MachO,
BinaryFormat::Wasm, BinaryFormat::Xcoff];
pub fn desc(&self) -> &'static str {
match self {
Self::Coff => "coff",
Self::Elf => "elf",
Self::MachO => "mach-o",
Self::Wasm => "wasm",
Self::Xcoff => "xcoff",
}
}
}
impl crate::json::ToJson for BinaryFormat {
fn to_json(&self) -> crate::json::Json { self.desc().to_json() }
}
impl<'de> serde::Deserialize<'de> for BinaryFormat {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}
impl std::fmt::Display for BinaryFormat {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.desc())
}
}crate::target_spec_enum! {
1365 pub enum BinaryFormat {
1366 Coff = "coff",
1367 Elf = "elf",
1368 MachO = "mach-o",
1369 Wasm = "wasm",
1370 Xcoff = "xcoff",
1371 }
1372
1373 parse_error_type = "binary format";
1374}
1375
1376impl BinaryFormat {
1377 pub fn to_object(&self) -> object::BinaryFormat {
1379 match self {
1380 Self::Coff => object::BinaryFormat::Coff,
1381 Self::Elf => object::BinaryFormat::Elf,
1382 Self::MachO => object::BinaryFormat::MachO,
1383 Self::Wasm => object::BinaryFormat::Wasm,
1384 Self::Xcoff => object::BinaryFormat::Xcoff,
1385 }
1386 }
1387}
1388
1389impl ToJson for Align {
1390 fn to_json(&self) -> Json {
1391 self.bits().to_json()
1392 }
1393}
1394
1395macro_rules! supported_targets {
1396 ( $(($tuple:literal, $module:ident),)+ ) => {
1397 mod targets {
1398 $(pub(crate) mod $module;)+
1399 }
1400
1401 pub static TARGETS: &[&str] = &[$($tuple),+];
1403
1404 fn load_builtin(target: &str) -> Option<Target> {
1405 let t = match target {
1406 $( $tuple => targets::$module::target(), )+
1407 _ => return None,
1408 };
1409 debug!("got builtin target: {:?}", t);
1410 Some(t)
1411 }
1412
1413 fn load_all_builtins() -> impl Iterator<Item = Target> {
1414 [
1415 $( targets::$module::target, )+
1416 ]
1417 .into_iter()
1418 .map(|f| f())
1419 }
1420
1421 #[cfg(test)]
1422 mod tests {
1423 $(
1425 #[test] fn $module() {
1427 crate::spec::targets::$module::target().test_target()
1428 }
1429 )+
1430 }
1431 };
1432}
1433
1434mod targets {
pub(crate) mod x86_64_unknown_linux_gnu {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, SanitizerSet, StackProbeType, Target,
TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_gnu::opts();
base.cpu = "x86-64".into();
base.plt_by_default = false;
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.stack_probes = StackProbeType::Inline;
base.static_position_independent_executables = true;
base.supported_sanitizers =
SanitizerSet::ADDRESS | SanitizerSet::CFI | SanitizerSet::KCFI
| SanitizerSet::DATAFLOW | SanitizerSet::LEAK |
SanitizerSet::MEMORY | SanitizerSet::SAFESTACK |
SanitizerSet::THREAD | SanitizerSet::REALTIME;
base.supports_xray = true;
Target {
llvm_target: "x86_64-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: Some("64-bit Linux (kernel 3.2+, glibc 2.17+)".into()),
tier: Some(1),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod x86_64_unknown_linux_gnux32 {
use crate::spec::{
Abi, Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_gnu::opts();
base.cpu = "x86-64".into();
base.abi = Abi::X32;
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-mx32"]);
base.stack_probes = StackProbeType::Inline;
base.has_thread_local = false;
base.plt_by_default = true;
Target {
llvm_target: "x86_64-unknown-linux-gnux32".into(),
metadata: TargetMetadata {
description: Some("64-bit Linux (x32 ABI) (kernel 4.15, glibc 2.27)".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod i686_unknown_linux_gnu {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, RustcAbi, SanitizerSet,
StackProbeType, Target, TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_gnu::opts();
base.rustc_abi = Some(RustcAbi::X86Sse2);
base.cpu = "pentium4".into();
base.max_atomic_width = Some(64);
base.supported_sanitizers = SanitizerSet::ADDRESS;
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m32"]);
base.stack_probes = StackProbeType::Inline;
Target {
llvm_target: "i686-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: Some("32-bit Linux (kernel 3.2, glibc 2.17+)".into()),
tier: Some(1),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i128:128-f64:32:64-f80:32-n8:16:32-S128".into(),
arch: Arch::X86,
options: base,
}
}
}
pub(crate) mod i586_unknown_linux_gnu {
use crate::spec::Target;
pub(crate) fn target() -> Target {
let mut base = super::i686_unknown_linux_gnu::target();
base.rustc_abi = None;
base.cpu = "pentium".into();
base.llvm_target = "i586-unknown-linux-gnu".into();
base.metadata =
crate::spec::TargetMetadata {
description: Some("32-bit Linux (kernel 3.2, glibc 2.17+)".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
};
base
}
}
pub(crate) mod loongarch64_unknown_linux_gnu {
use crate::spec::{
Arch, CodeModel, SanitizerSet, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "loongarch64-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: Some("LoongArch64 Linux, LP64D ABI (kernel 5.19, glibc 2.36)".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::LoongArch64,
options: TargetOptions {
code_model: Some(CodeModel::Medium),
cpu: "generic".into(),
features: "+f,+d,+lsx".into(),
llvm_abiname: "lp64d".into(),
max_atomic_width: Some(64),
supported_sanitizers: SanitizerSet::ADDRESS |
SanitizerSet::CFI | SanitizerSet::LEAK |
SanitizerSet::MEMORY | SanitizerSet::THREAD,
supports_xray: true,
direct_access_external_data: Some(false),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod loongarch64_unknown_linux_musl {
use crate::spec::{
Arch, CodeModel, SanitizerSet, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "loongarch64-unknown-linux-musl".into(),
metadata: TargetMetadata {
description: Some("LoongArch64 Linux (LP64D ABI) with musl 1.2.5".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::LoongArch64,
options: TargetOptions {
code_model: Some(CodeModel::Medium),
cpu: "generic".into(),
features: "+f,+d,+lsx".into(),
llvm_abiname: "lp64d".into(),
max_atomic_width: Some(64),
crt_static_default: false,
supported_sanitizers: SanitizerSet::ADDRESS |
SanitizerSet::CFI | SanitizerSet::LEAK |
SanitizerSet::MEMORY | SanitizerSet::THREAD,
supports_xray: true,
direct_access_external_data: Some(false),
..base::linux_musl::opts()
},
}
}
}
pub(crate) mod m68k_unknown_linux_gnu {
use rustc_abi::Endian;
use crate::spec::{
Arch, LinkSelfContainedDefault, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_gnu::opts();
base.cpu = "M68020".into();
base.max_atomic_width = Some(32);
Target {
llvm_target: "m68k-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: Some("Motorola 680x0 Linux".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "E-m:e-p:32:16:32-i8:8:8-i16:16:16-i32:16:32-n8:16:32-a:0:16-S16".into(),
arch: Arch::M68k,
options: TargetOptions {
endian: Endian::Big,
mcount: "_mcount".into(),
link_self_contained: LinkSelfContainedDefault::False,
..base
},
}
}
}
pub(crate) mod m68k_unknown_none_elf {
use rustc_abi::Endian;
use crate::spec::{
Arch, CodeModel, PanicStrategy, RelocModel, Target,
TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
let options =
TargetOptions {
cpu: "M68010".into(),
max_atomic_width: None,
endian: Endian::Big,
linker: Some("m68k-linux-gnu-ld".into()),
panic_strategy: PanicStrategy::Abort,
code_model: Some(CodeModel::Medium),
has_rpath: false,
llvm_floatabi: None,
relocation_model: RelocModel::Static,
..Default::default()
};
Target {
llvm_target: "m68k".into(),
metadata: TargetMetadata {
description: Some("Motorola 680x0".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
data_layout: "E-m:e-p:32:16:32-i8:8:8-i16:16:16-i32:16:32-n8:16:32-a:0:16-S16".into(),
arch: Arch::M68k,
options,
}
}
}
pub(crate) mod csky_unknown_linux_gnuabiv2 {
use crate::spec::{
Abi, Arch, Cc, LinkerFlavor, Lld, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "csky-unknown-linux-gnuabiv2".into(),
metadata: TargetMetadata {
description: Some("C-SKY abiv2 Linux (little endian)".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-S32-p:32:32-i32:32:32-i64:32:32-f32:32:32-f64:32:32-v64:32:32-v128:32:32-a:0:32-Fi32-n32".into(),
arch: Arch::CSky,
options: TargetOptions {
abi: Abi::AbiV2,
features: "+2e3,+3e7,+7e10,+cache,+dsp1e2,+dspe60,+e1,+e2,+edsp,+elrw,+hard-tp,+high-registers,+hwdiv,+mp,+mp1e2,+nvic,+trust".into(),
late_link_args: TargetOptions::link_args(LinkerFlavor::Gnu(Cc::Yes,
Lld::No), &["-l:libatomic.a"]),
max_atomic_width: Some(32),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod csky_unknown_linux_gnuabiv2hf {
use crate::spec::{
Abi, Arch, Cc, LinkerFlavor, Lld, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "csky-unknown-linux-gnuabiv2".into(),
metadata: TargetMetadata {
description: Some("C-SKY abiv2 Linux, hardfloat (little endian)".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-S32-p:32:32-i32:32:32-i64:32:32-f32:32:32-f64:32:32-v64:32:32-v128:32:32-a:0:32-Fi32-n32".into(),
arch: Arch::CSky,
options: TargetOptions {
abi: Abi::AbiV2Hf,
cpu: "ck860fv".into(),
features: "+hard-float,+hard-float-abi,+2e3,+3e7,+7e10,+cache,+dsp1e2,+dspe60,+e1,+e2,+edsp,+elrw,+hard-tp,+high-registers,+hwdiv,+mp,+mp1e2,+nvic,+trust".into(),
late_link_args: TargetOptions::link_args(LinkerFlavor::Gnu(Cc::Yes,
Lld::No), &["-l:libatomic.a", "-mhard-float"]),
max_atomic_width: Some(32),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod mips_unknown_linux_gnu {
use rustc_abi::Endian;
use crate::spec::{Arch, Target, TargetMetadata, TargetOptions, base};
pub(crate) fn target() -> Target {
Target {
llvm_target: "mips-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: Some("MIPS Linux (kernel 4.4, glibc 2.23)".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64".into(),
arch: Arch::Mips,
options: TargetOptions {
endian: Endian::Big,
cpu: "mips32r2".into(),
features: "+mips32r2,+fpxx,+nooddspreg".into(),
max_atomic_width: Some(32),
mcount: "_mcount".into(),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod mips64_unknown_linux_gnuabi64 {
use rustc_abi::Endian;
use crate::spec::{
Abi, Arch, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "mips64-unknown-linux-gnuabi64".into(),
metadata: TargetMetadata {
description: Some("MIPS64 Linux, N64 ABI (kernel 4.4, glibc 2.23)".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::Mips64,
options: TargetOptions {
abi: Abi::Abi64,
endian: Endian::Big,
cpu: "mips64r2".into(),
features: "+mips64r2,+xgot".into(),
max_atomic_width: Some(64),
mcount: "_mcount".into(),
llvm_abiname: "n64".into(),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod mips64el_unknown_linux_gnuabi64 {
use crate::spec::{
Abi, Arch, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "mips64el-unknown-linux-gnuabi64".into(),
metadata: TargetMetadata {
description: Some("MIPS64 Linux, N64 ABI (kernel 4.4, glibc 2.23)".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::Mips64,
options: TargetOptions {
abi: Abi::Abi64,
cpu: "mips64r2".into(),
features: "+mips64r2,+xgot".into(),
max_atomic_width: Some(64),
mcount: "_mcount".into(),
llvm_abiname: "n64".into(),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod mipsisa32r6_unknown_linux_gnu {
use rustc_abi::Endian;
use crate::spec::{Arch, Target, TargetMetadata, TargetOptions, base};
pub(crate) fn target() -> Target {
Target {
llvm_target: "mipsisa32r6-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: Some("32-bit MIPS Release 6 Big Endian".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64".into(),
arch: Arch::Mips32r6,
options: TargetOptions {
endian: Endian::Big,
cpu: "mips32r6".into(),
features: "+mips32r6".into(),
max_atomic_width: Some(32),
mcount: "_mcount".into(),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod mipsisa32r6el_unknown_linux_gnu {
use crate::spec::{Arch, Target, TargetMetadata, TargetOptions, base};
pub(crate) fn target() -> Target {
Target {
llvm_target: "mipsisa32r6el-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: Some("32-bit MIPS Release 6 Little Endian".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64".into(),
arch: Arch::Mips32r6,
options: TargetOptions {
cpu: "mips32r6".into(),
features: "+mips32r6".into(),
max_atomic_width: Some(32),
mcount: "_mcount".into(),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod mipsisa64r6_unknown_linux_gnuabi64 {
use rustc_abi::Endian;
use crate::spec::{
Abi, Arch, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "mipsisa64r6-unknown-linux-gnuabi64".into(),
metadata: TargetMetadata {
description: Some("64-bit MIPS Release 6 Big Endian".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::Mips64r6,
options: TargetOptions {
abi: Abi::Abi64,
endian: Endian::Big,
cpu: "mips64r6".into(),
features: "+mips64r6".into(),
max_atomic_width: Some(64),
mcount: "_mcount".into(),
llvm_abiname: "n64".into(),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod mipsisa64r6el_unknown_linux_gnuabi64 {
use crate::spec::{
Abi, Arch, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "mipsisa64r6el-unknown-linux-gnuabi64".into(),
metadata: TargetMetadata {
description: Some("64-bit MIPS Release 6 Little Endian".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::Mips64r6,
options: TargetOptions {
abi: Abi::Abi64,
cpu: "mips64r6".into(),
features: "+mips64r6".into(),
max_atomic_width: Some(64),
mcount: "_mcount".into(),
llvm_abiname: "n64".into(),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod mipsel_unknown_linux_gnu {
use crate::spec::{Arch, Target, TargetMetadata, TargetOptions, base};
pub(crate) fn target() -> Target {
Target {
llvm_target: "mipsel-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: Some("MIPS (little endian) Linux (kernel 4.4, glibc 2.23)".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64".into(),
arch: Arch::Mips,
options: TargetOptions {
cpu: "mips32r2".into(),
features: "+mips32r2,+fpxx,+nooddspreg".into(),
max_atomic_width: Some(32),
mcount: "_mcount".into(),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod powerpc_unknown_linux_gnu {
use rustc_abi::Endian;
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_gnu::opts();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m32"]);
base.max_atomic_width = Some(32);
base.stack_probes = StackProbeType::Inline;
Target {
llvm_target: "powerpc-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: Some("PowerPC Linux (kernel 3.2, glibc 2.17)".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "E-m:e-p:32:32-Fn32-i64:64-n32".into(),
arch: Arch::PowerPC,
options: TargetOptions {
endian: Endian::Big,
features: "+secure-plt".into(),
mcount: "_mcount".into(),
..base
},
}
}
}
pub(crate) mod powerpc_unknown_linux_gnuspe {
use rustc_abi::Endian;
use crate::spec::{
Abi, Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_gnu::opts();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-mspe"]);
base.max_atomic_width = Some(32);
base.stack_probes = StackProbeType::Inline;
Target {
llvm_target: "powerpc-unknown-linux-gnuspe".into(),
metadata: TargetMetadata {
description: Some("PowerPC SPE Linux".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "E-m:e-p:32:32-Fn32-i64:64-n32".into(),
arch: Arch::PowerPC,
options: TargetOptions {
abi: Abi::Spe,
endian: Endian::Big,
features: "+secure-plt,+msync".into(),
mcount: "_mcount".into(),
..base
},
}
}
}
pub(crate) mod powerpc_unknown_linux_musl {
use rustc_abi::Endian;
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_musl::opts();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m32"]);
base.max_atomic_width = Some(32);
base.stack_probes = StackProbeType::Inline;
Target {
llvm_target: "powerpc-unknown-linux-musl".into(),
metadata: TargetMetadata {
description: Some("PowerPC Linux with musl 1.2.5".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "E-m:e-p:32:32-Fn32-i64:64-n32".into(),
arch: Arch::PowerPC,
options: TargetOptions {
endian: Endian::Big,
mcount: "_mcount".into(),
..base
},
}
}
}
pub(crate) mod powerpc_unknown_linux_muslspe {
use rustc_abi::Endian;
use crate::spec::{
Abi, Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_musl::opts();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-mspe"]);
base.max_atomic_width = Some(32);
base.stack_probes = StackProbeType::Inline;
Target {
llvm_target: "powerpc-unknown-linux-muslspe".into(),
metadata: TargetMetadata {
description: Some("PowerPC SPE Linux with musl".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "E-m:e-p:32:32-Fn32-i64:64-n32".into(),
arch: Arch::PowerPC,
options: TargetOptions {
abi: Abi::Spe,
endian: Endian::Big,
features: "+msync".into(),
mcount: "_mcount".into(),
..base
},
}
}
}
pub(crate) mod powerpc64_ibm_aix {
use crate::spec::{
Arch, Cc, LinkerFlavor, Target, TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::aix::opts();
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Unix(Cc::No),
&["-b64", "-bpT:0x100000000", "-bpD:0x110000000",
"-bcdtors:all:0:s"]);
Target {
llvm_target: "powerpc64-ibm-aix".into(),
metadata: TargetMetadata {
description: Some("64-bit AIX (7.2 and newer)".into()),
tier: Some(3),
host_tools: Some(false),
std: None,
},
pointer_width: 64,
data_layout: "E-m:a-Fi64-i64:64-i128:128-n32:64-f64:32:64-S128-v256:256:256-v512:512:512".into(),
arch: Arch::PowerPC64,
options: base,
}
}
}
pub(crate) mod powerpc64_unknown_linux_gnu {
use rustc_abi::Endian;
use crate::spec::{
Abi, Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_gnu::opts();
base.cpu = "ppc64".into();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.max_atomic_width = Some(64);
base.stack_probes = StackProbeType::Inline;
base.abi = Abi::ElfV1;
base.llvm_abiname = "elfv1".into();
Target {
llvm_target: "powerpc64-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: Some("PowerPC Linux (kernel 3.2, glibc 2.17)".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "E-m:e-Fi64-i64:64-i128:128-n32:64-S128-v256:256:256-v512:512:512".into(),
arch: Arch::PowerPC64,
options: TargetOptions {
endian: Endian::Big,
mcount: "_mcount".into(),
..base
},
}
}
}
pub(crate) mod powerpc64_unknown_linux_musl {
use rustc_abi::Endian;
use crate::spec::{
Abi, Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_musl::opts();
base.cpu = "ppc64".into();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.max_atomic_width = Some(64);
base.stack_probes = StackProbeType::Inline;
base.abi = Abi::ElfV2;
base.llvm_abiname = "elfv2".into();
Target {
llvm_target: "powerpc64-unknown-linux-musl".into(),
metadata: TargetMetadata {
description: Some("64-bit PowerPC Linux with musl 1.2.5".into()),
tier: Some(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::{
Abi, Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_gnu::opts();
base.cpu = "ppc64le".into();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.max_atomic_width = Some(64);
base.stack_probes = StackProbeType::Inline;
base.abi = Abi::ElfV2;
base.llvm_abiname = "elfv2".into();
Target {
llvm_target: "powerpc64le-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: Some("PPC64LE Linux (kernel 3.10, glibc 2.17)".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-Fn32-i64:64-i128:128-n32:64-S128-v256:256:256-v512:512:512".into(),
arch: Arch::PowerPC64,
options: TargetOptions { mcount: "_mcount".into(), ..base },
}
}
}
pub(crate) mod powerpc64le_unknown_linux_musl {
use crate::spec::{
Abi, Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_musl::opts();
base.cpu = "ppc64le".into();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.max_atomic_width = Some(64);
base.stack_probes = StackProbeType::Inline;
base.crt_static_default = true;
base.abi = Abi::ElfV2;
base.llvm_abiname = "elfv2".into();
Target {
llvm_target: "powerpc64le-unknown-linux-musl".into(),
metadata: TargetMetadata {
description: Some("64-bit PowerPC Linux with musl 1.2.5, Little Endian".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-Fn32-i64:64-i128:128-n32:64-S128-v256:256:256-v512:512:512".into(),
arch: Arch::PowerPC64,
options: TargetOptions { mcount: "_mcount".into(), ..base },
}
}
}
pub(crate) mod s390x_unknown_linux_gnu {
use rustc_abi::{Align, Endian};
use crate::spec::{
Arch, SanitizerSet, StackProbeType, Target, TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_gnu::opts();
base.endian = Endian::Big;
base.cpu = "z10".into();
base.max_atomic_width = Some(128);
base.min_global_align = Some(Align::from_bits(16).unwrap());
base.stack_probes = StackProbeType::Inline;
base.supported_sanitizers =
SanitizerSet::ADDRESS | SanitizerSet::LEAK |
SanitizerSet::MEMORY | SanitizerSet::THREAD;
Target {
llvm_target: "s390x-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: Some("S390x Linux (kernel 3.2, glibc 2.17)".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "E-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_linux_musl {
use rustc_abi::{Align, Endian};
use crate::spec::{
Arch, SanitizerSet, StackProbeType, Target, TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_musl::opts();
base.endian = Endian::Big;
base.cpu = "z10".into();
base.max_atomic_width = Some(128);
base.min_global_align = Some(Align::from_bits(16).unwrap());
base.static_position_independent_executables = true;
base.stack_probes = StackProbeType::Inline;
base.supported_sanitizers =
SanitizerSet::ADDRESS | SanitizerSet::LEAK |
SanitizerSet::MEMORY | SanitizerSet::THREAD;
Target {
llvm_target: "s390x-unknown-linux-musl".into(),
metadata: TargetMetadata {
description: Some("S390x Linux (kernel 3.2, musl 1.2.5)".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "E-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, LinkerFlavor, Lld, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "sparc-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: Some("32-bit SPARC Linux".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "E-m:e-p:32:32-i64:64-i128:128-f128:64-n32-S64".into(),
arch: Arch::Sparc,
options: TargetOptions {
features: "+v8plus".into(),
cpu: "v9".into(),
endian: Endian::Big,
late_link_args: TargetOptions::link_args(LinkerFlavor::Gnu(Cc::Yes,
Lld::No), &["-mcpu=v9", "-m32"]),
max_atomic_width: Some(32),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod sparc64_unknown_linux_gnu {
use rustc_abi::Endian;
use crate::spec::{Arch, Target, TargetMetadata, base};
pub(crate) fn target() -> Target {
let mut base = base::linux_gnu::opts();
base.endian = Endian::Big;
base.cpu = "v9".into();
base.max_atomic_width = Some(64);
Target {
llvm_target: "sparc64-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: Some("SPARC Linux (kernel 4.4, glibc 2.23)".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "E-m:e-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::Sparc64,
options: base,
}
}
}
pub(crate) mod arm_unknown_linux_gnueabi {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "arm-unknown-linux-gnueabi".into(),
metadata: TargetMetadata {
description: Some("Armv6 Linux (kernel 3.2, glibc 2.17)".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
features: "+strict-align,+v6".into(),
max_atomic_width: Some(64),
mcount: "\u{1}__gnu_mcount_nc".into(),
llvm_mcount_intrinsic: Some("llvm.arm.gnu.eabi.mcount".into()),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod arm_unknown_linux_gnueabihf {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "arm-unknown-linux-gnueabihf".into(),
metadata: TargetMetadata {
description: Some("Armv6 Linux, hardfloat (kernel 3.2, glibc 2.17)".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
features: "+strict-align,+v6,+vfp2".into(),
max_atomic_width: Some(64),
mcount: "\u{1}__gnu_mcount_nc".into(),
llvm_mcount_intrinsic: Some("llvm.arm.gnu.eabi.mcount".into()),
default_uwtable: false,
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod armeb_unknown_linux_gnueabi {
use rustc_abi::Endian;
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armeb-unknown-linux-gnueabi".into(),
metadata: TargetMetadata {
description: Some("Arm BE8 the default Arm big-endian architecture since Armv6".into()),
tier: Some(3),
host_tools: None,
std: Some(true),
},
pointer_width: 32,
data_layout: "E-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
features: "+strict-align,+v8,+crc".into(),
endian: Endian::Big,
max_atomic_width: Some(64),
mcount: "\u{1}__gnu_mcount_nc".into(),
llvm_mcount_intrinsic: Some("llvm.arm.gnu.eabi.mcount".into()),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod arm_unknown_linux_musleabi {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "arm-unknown-linux-musleabi".into(),
metadata: TargetMetadata {
description: Some("Armv6 Linux with musl 1.2.5".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
features: "+strict-align,+v6".into(),
max_atomic_width: Some(64),
mcount: "\u{1}mcount".into(),
crt_static_default: true,
..base::linux_musl::opts()
},
}
}
}
pub(crate) mod arm_unknown_linux_musleabihf {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "arm-unknown-linux-musleabihf".into(),
metadata: TargetMetadata {
description: Some("Armv6 Linux with musl 1.2.5, hardfloat".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
features: "+strict-align,+v6,+vfp2".into(),
max_atomic_width: Some(64),
mcount: "\u{1}mcount".into(),
crt_static_default: true,
..base::linux_musl::opts()
},
}
}
}
pub(crate) mod armv4t_unknown_linux_gnueabi {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv4t-unknown-linux-gnueabi".into(),
metadata: TargetMetadata {
description: Some("Armv4T Linux".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
features: "+soft-float,+strict-align".into(),
max_atomic_width: Some(32),
mcount: "\u{1}__gnu_mcount_nc".into(),
llvm_mcount_intrinsic: Some("llvm.arm.gnu.eabi.mcount".into()),
has_thumb_interworking: true,
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod armv5te_unknown_linux_gnueabi {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv5te-unknown-linux-gnueabi".into(),
metadata: TargetMetadata {
description: Some("Armv5TE Linux (kernel 4.4, glibc 2.23)".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
features: "+soft-float,+strict-align".into(),
max_atomic_width: Some(32),
mcount: "\u{1}__gnu_mcount_nc".into(),
has_thumb_interworking: true,
llvm_mcount_intrinsic: Some("llvm.arm.gnu.eabi.mcount".into()),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod armv5te_unknown_linux_musleabi {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv5te-unknown-linux-musleabi".into(),
metadata: TargetMetadata {
description: Some("Armv5TE Linux with musl 1.2.5".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
features: "+soft-float,+strict-align".into(),
max_atomic_width: Some(32),
mcount: "\u{1}mcount".into(),
has_thumb_interworking: true,
crt_static_default: true,
..base::linux_musl::opts()
},
}
}
}
pub(crate) mod armv5te_unknown_linux_uclibceabi {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv5te-unknown-linux-gnueabi".into(),
metadata: TargetMetadata {
description: Some("Armv5TE Linux with uClibc".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
features: "+soft-float,+strict-align".into(),
max_atomic_width: Some(32),
mcount: "\u{1}__gnu_mcount_nc".into(),
has_thumb_interworking: true,
..base::linux_uclibc::opts()
},
}
}
}
pub(crate) mod armv7_unknown_linux_gnueabi {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv7-unknown-linux-gnueabi".into(),
metadata: TargetMetadata {
description: Some("Armv7-A Linux (kernel 4.15, glibc 2.27)".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
features: "+v7,+thumb2,+soft-float,-neon".into(),
max_atomic_width: Some(64),
mcount: "\u{1}__gnu_mcount_nc".into(),
llvm_mcount_intrinsic: Some("llvm.arm.gnu.eabi.mcount".into()),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod armv7_unknown_linux_gnueabihf {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv7-unknown-linux-gnueabihf".into(),
metadata: TargetMetadata {
description: Some("Armv7-A Linux, hardfloat (kernel 3.2, glibc 2.17)".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
features: "+v7,+vfp3d16,+thumb2,-neon".into(),
max_atomic_width: Some(64),
mcount: "\u{1}__gnu_mcount_nc".into(),
llvm_mcount_intrinsic: Some("llvm.arm.gnu.eabi.mcount".into()),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod thumbv7neon_unknown_linux_gnueabihf {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv7-unknown-linux-gnueabihf".into(),
metadata: TargetMetadata {
description: Some("Thumb2-mode ARMv7-A Linux with NEON (kernel 4.4, glibc 2.23)".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
features: "+v7,+thumb-mode,+thumb2,+vfp3,+neon".into(),
max_atomic_width: Some(64),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod thumbv7neon_unknown_linux_musleabihf {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv7-unknown-linux-musleabihf".into(),
metadata: TargetMetadata {
description: Some("Thumb2-mode ARMv7-A Linux with NEON, musl 1.2.5".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
features: "+v7,+thumb-mode,+thumb2,+vfp3,+neon".into(),
max_atomic_width: Some(64),
mcount: "\u{1}mcount".into(),
..base::linux_musl::opts()
},
}
}
}
pub(crate) mod armv7_unknown_linux_musleabi {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv7-unknown-linux-musleabi".into(),
metadata: TargetMetadata {
description: Some("Armv7-A Linux with musl 1.2.5".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
features: "+v7,+thumb2,+soft-float,-neon".into(),
max_atomic_width: Some(64),
mcount: "\u{1}mcount".into(),
crt_static_default: true,
..base::linux_musl::opts()
},
}
}
}
pub(crate) mod armv7_unknown_linux_musleabihf {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv7-unknown-linux-musleabihf".into(),
metadata: TargetMetadata {
description: Some("Armv7-A Linux with musl 1.2.5, hardfloat".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
features: "+v7,+vfp3d16,+thumb2,-neon".into(),
max_atomic_width: Some(64),
mcount: "\u{1}mcount".into(),
crt_static_default: true,
..base::linux_musl::opts()
},
}
}
}
pub(crate) mod aarch64_unknown_linux_gnu {
use crate::spec::{
Arch, FramePointer, SanitizerSet, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "aarch64-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: Some("ARM64 Linux (kernel 4.1, glibc 2.17+)".into()),
tier: Some(1),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: TargetOptions {
features: "+v8a,+outline-atomics".into(),
frame_pointer: FramePointer::NonLeaf,
mcount: "\u{1}_mcount".into(),
max_atomic_width: Some(128),
stack_probes: StackProbeType::Inline,
supported_sanitizers: SanitizerSet::ADDRESS |
SanitizerSet::CFI | SanitizerSet::KCFI | SanitizerSet::LEAK
| SanitizerSet::MEMORY | SanitizerSet::MEMTAG |
SanitizerSet::THREAD | SanitizerSet::HWADDRESS |
SanitizerSet::REALTIME,
supports_xray: true,
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod aarch64_unknown_linux_musl {
use crate::spec::{
Arch, FramePointer, SanitizerSet, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_musl::opts();
base.max_atomic_width = Some(128);
base.supports_xray = true;
base.features = "+v8a,+outline-atomics".into();
base.stack_probes = StackProbeType::Inline;
base.supported_sanitizers =
SanitizerSet::ADDRESS | SanitizerSet::CFI | SanitizerSet::LEAK
| SanitizerSet::MEMORY | SanitizerSet::THREAD;
base.crt_static_default = true;
Target {
llvm_target: "aarch64-unknown-linux-musl".into(),
metadata: TargetMetadata {
description: Some("ARM64 Linux with musl 1.2.5".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: TargetOptions {
frame_pointer: FramePointer::NonLeaf,
mcount: "\u{1}_mcount".into(),
..base
},
}
}
}
pub(crate) mod aarch64_be_unknown_linux_musl {
use rustc_abi::Endian;
use crate::spec::{
Arch, FramePointer, SanitizerSet, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_musl::opts();
base.max_atomic_width = Some(128);
base.supports_xray = true;
base.features = "+v8a,+outline-atomics".into();
base.stack_probes = StackProbeType::Inline;
base.supported_sanitizers =
SanitizerSet::ADDRESS | SanitizerSet::CFI | SanitizerSet::LEAK
| SanitizerSet::MEMORY | SanitizerSet::THREAD;
Target {
llvm_target: "aarch64_be-unknown-linux-musl".into(),
metadata: TargetMetadata {
description: Some("ARM64 Linux (big-endian) with musl-libc 1.2.5".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "E-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: TargetOptions {
frame_pointer: FramePointer::NonLeaf,
mcount: "\u{1}_mcount".into(),
endian: Endian::Big,
..base
},
}
}
}
pub(crate) mod x86_64_unknown_linux_musl {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, SanitizerSet, StackProbeType, Target,
TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_musl::opts();
base.cpu = "x86-64".into();
base.plt_by_default = false;
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.stack_probes = StackProbeType::Inline;
base.static_position_independent_executables = true;
base.supported_sanitizers =
SanitizerSet::ADDRESS | SanitizerSet::CFI | SanitizerSet::LEAK
| SanitizerSet::MEMORY | SanitizerSet::THREAD;
base.supports_xray = true;
base.crt_static_default = true;
Target {
llvm_target: "x86_64-unknown-linux-musl".into(),
metadata: TargetMetadata {
description: Some("64-bit Linux with musl 1.2.5".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod i686_unknown_linux_musl {
use crate::spec::{
Arch, Cc, FramePointer, LinkerFlavor, Lld, RustcAbi,
StackProbeType, Target, TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_musl::opts();
base.rustc_abi = Some(RustcAbi::X86Sse2);
base.cpu = "pentium4".into();
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m32", "-Wl,-melf_i386"]);
base.stack_probes = StackProbeType::Inline;
base.crt_static_default = true;
base.frame_pointer = FramePointer::Always;
Target {
llvm_target: "i686-unknown-linux-musl".into(),
metadata: TargetMetadata {
description: Some("32-bit Linux with musl 1.2.5".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i128:128-f64:32:64-f80:32-n8:16:32-S128".into(),
arch: Arch::X86,
options: base,
}
}
}
pub(crate) mod i586_unknown_linux_musl {
use crate::spec::Target;
pub(crate) fn target() -> Target {
let mut base = super::i686_unknown_linux_musl::target();
base.rustc_abi = None;
base.cpu = "pentium".into();
base.llvm_target = "i586-unknown-linux-musl".into();
base.crt_static_default = true;
base
}
}
pub(crate) mod mips_unknown_linux_musl {
use rustc_abi::Endian;
use crate::spec::{Arch, Target, TargetMetadata, TargetOptions, base};
pub(crate) fn target() -> Target {
let mut base = base::linux_musl::opts();
base.cpu = "mips32r2".into();
base.features = "+mips32r2,+soft-float".into();
base.max_atomic_width = Some(32);
Target {
llvm_target: "mips-unknown-linux-musl".into(),
metadata: TargetMetadata {
description: Some("MIPS Linux with musl 1.2.5".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64".into(),
arch: Arch::Mips,
options: TargetOptions {
endian: Endian::Big,
mcount: "_mcount".into(),
..base
},
}
}
}
pub(crate) mod mipsel_unknown_linux_musl {
use crate::spec::{Arch, Target, TargetMetadata, TargetOptions, base};
pub(crate) fn target() -> Target {
let mut base = base::linux_musl::opts();
base.cpu = "mips32r2".into();
base.features = "+mips32r2,+soft-float".into();
base.max_atomic_width = Some(32);
Target {
llvm_target: "mipsel-unknown-linux-musl".into(),
metadata: TargetMetadata {
description: Some("MIPS (little endian) Linux with musl 1.2.5".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64".into(),
arch: Arch::Mips,
options: TargetOptions { mcount: "_mcount".into(), ..base },
}
}
}
pub(crate) mod mips64_unknown_linux_muslabi64 {
use rustc_abi::Endian;
use crate::spec::{
Abi, Arch, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_musl::opts();
base.cpu = "mips64r2".into();
base.features = "+mips64r2,+xgot".into();
base.max_atomic_width = Some(64);
Target {
llvm_target: "mips64-unknown-linux-musl".into(),
metadata: TargetMetadata {
description: Some("MIPS64 Linux, N64 ABI, musl 1.2.5".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::Mips64,
options: TargetOptions {
abi: Abi::Abi64,
endian: Endian::Big,
mcount: "_mcount".into(),
llvm_abiname: "n64".into(),
..base
},
}
}
}
pub(crate) mod mips64el_unknown_linux_muslabi64 {
use crate::spec::{
Abi, Arch, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_musl::opts();
base.cpu = "mips64r2".into();
base.features = "+mips64r2,+xgot".into();
base.max_atomic_width = Some(64);
Target {
llvm_target: "mips64el-unknown-linux-musl".into(),
metadata: TargetMetadata {
description: Some("MIPS64 Linux, N64 ABI, musl 1.2.5".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::Mips64,
options: TargetOptions {
abi: Abi::Abi64,
mcount: "_mcount".into(),
llvm_abiname: "n64".into(),
..base
},
}
}
}
pub(crate) mod hexagon_unknown_linux_musl {
use crate::spec::{
Arch, Cc, LinkerFlavor, 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, Target, TargetMetadata, TargetOptions, base};
pub(crate) fn target() -> Target {
Target {
llvm_target: "mips-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: Some("MIPS Linux with uClibc".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64".into(),
arch: Arch::Mips,
options: TargetOptions {
endian: Endian::Big,
cpu: "mips32r2".into(),
features: "+mips32r2,+soft-float".into(),
max_atomic_width: Some(32),
mcount: "_mcount".into(),
..base::linux_uclibc::opts()
},
}
}
}
pub(crate) mod mipsel_unknown_linux_uclibc {
use crate::spec::{Arch, Target, TargetMetadata, TargetOptions, base};
pub(crate) fn target() -> Target {
Target {
llvm_target: "mipsel-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: Some("MIPS (LE) Linux with uClibc".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64".into(),
arch: Arch::Mips,
options: TargetOptions {
cpu: "mips32r2".into(),
features: "+mips32r2,+soft-float".into(),
max_atomic_width: Some(32),
mcount: "_mcount".into(),
..base::linux_uclibc::opts()
},
}
}
}
pub(crate) mod i686_linux_android {
use crate::spec::{
Arch, RustcAbi, SanitizerSet, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::android::opts();
base.max_atomic_width = Some(64);
base.rustc_abi = Some(RustcAbi::X86Sse2);
base.cpu = "pentium4".into();
base.features = "+mmx,+sse,+sse2,+sse3,+ssse3".into();
base.stack_probes = StackProbeType::Inline;
Target {
llvm_target: "i686-linux-android".into(),
metadata: TargetMetadata {
description: Some("32-bit x86 Android".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i128:128-f64:32:64-f80:32-n8:16:32-S128".into(),
arch: Arch::X86,
options: TargetOptions {
supported_sanitizers: SanitizerSet::ADDRESS,
..base
},
}
}
}
pub(crate) mod x86_64_linux_android {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, SanitizerSet, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::android::opts();
base.cpu = "x86-64".into();
base.plt_by_default = false;
base.features =
"+mmx,+sse,+sse2,+sse3,+ssse3,+sse4.1,+sse4.2,+popcnt".into();
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.stack_probes = StackProbeType::Inline;
base.supports_xray = true;
Target {
llvm_target: "x86_64-linux-android".into(),
metadata: TargetMetadata {
description: Some("64-bit x86 Android".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: TargetOptions {
supported_sanitizers: SanitizerSet::ADDRESS,
..base
},
}
}
}
pub(crate) mod arm_linux_androideabi {
use crate::spec::{
Abi, Arch, FloatAbi, SanitizerSet, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "arm-linux-androideabi".into(),
metadata: TargetMetadata {
description: Some("Armv6 Android".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
features: "+strict-align,+v5te".into(),
supported_sanitizers: SanitizerSet::ADDRESS,
max_atomic_width: Some(32),
..base::android::opts()
},
}
}
}
pub(crate) mod armv7_linux_androideabi {
use crate::spec::{
Abi, Arch, Cc, FloatAbi, LinkerFlavor, Lld, SanitizerSet, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::android::opts();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-march=armv7-a"]);
Target {
llvm_target: "armv7-none-linux-android".into(),
metadata: TargetMetadata {
description: Some("Armv7-A Android".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
features: "+v7,+thumb-mode,+thumb2,+vfp3d16,-neon".into(),
supported_sanitizers: SanitizerSet::ADDRESS,
max_atomic_width: Some(64),
..base
},
}
}
}
pub(crate) mod thumbv7neon_linux_androideabi {
use crate::spec::{
Abi, Arch, Cc, FloatAbi, LinkerFlavor, Lld, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::android::opts();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-march=armv7-a"]);
Target {
llvm_target: "armv7-none-linux-android".into(),
metadata: TargetMetadata {
description: Some("Thumb2-mode ARMv7-A Android with NEON".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
features: "+v7,+thumb-mode,+thumb2,+vfp3,+neon".into(),
max_atomic_width: Some(64),
..base
},
}
}
}
pub(crate) mod aarch64_linux_android {
use crate::spec::{
Arch, FramePointer, SanitizerSet, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "aarch64-linux-android".into(),
metadata: TargetMetadata {
description: Some("ARM64 Android".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: TargetOptions {
max_atomic_width: Some(128),
features: "+v8a,+neon".into(),
frame_pointer: FramePointer::NonLeaf,
stack_probes: StackProbeType::Inline,
supported_sanitizers: SanitizerSet::CFI |
SanitizerSet::HWADDRESS | SanitizerSet::MEMTAG |
SanitizerSet::SHADOWCALLSTACK | SanitizerSet::ADDRESS,
supports_xray: true,
..base::android::opts()
},
}
}
}
pub(crate) mod riscv64_linux_android {
use std::borrow::Cow;
use crate::spec::{
Arch, CodeModel, SanitizerSet, SplitDebuginfo, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "riscv64-linux-android".into(),
metadata: TargetMetadata {
description: Some("RISC-V 64-bit Android".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::RiscV64,
options: TargetOptions {
code_model: Some(CodeModel::Medium),
cpu: "generic-rv64".into(),
features: "+m,+a,+f,+d,+c,+b,+v,+zicsr,+zifencei".into(),
llvm_abiname: "lp64d".into(),
supported_sanitizers: SanitizerSet::ADDRESS,
max_atomic_width: Some(64),
supported_split_debuginfo: Cow::Borrowed(&[SplitDebuginfo::Off]),
..base::android::opts()
},
}
}
}
pub(crate) mod aarch64_unknown_freebsd {
use crate::spec::{
Arch, SanitizerSet, StackProbeType, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "aarch64-unknown-freebsd".into(),
metadata: TargetMetadata {
description: Some("ARM64 FreeBSD".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: TargetOptions {
features: "+v8a".into(),
max_atomic_width: Some(128),
stack_probes: StackProbeType::Inline,
supported_sanitizers: SanitizerSet::ADDRESS |
SanitizerSet::CFI | SanitizerSet::MEMORY |
SanitizerSet::THREAD,
..base::freebsd::opts()
},
}
}
}
pub(crate) mod armv6_unknown_freebsd {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv6-unknown-freebsd-gnueabihf".into(),
metadata: TargetMetadata {
description: Some("Armv6 FreeBSD".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
features: "+v6,+vfp2".into(),
max_atomic_width: Some(64),
mcount: "\u{1}__gnu_mcount_nc".into(),
llvm_mcount_intrinsic: Some("llvm.arm.gnu.eabi.mcount".into()),
..base::freebsd::opts()
},
}
}
}
pub(crate) mod armv7_unknown_freebsd {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv7-unknown-freebsd-gnueabihf".into(),
metadata: TargetMetadata {
description: Some("Armv7-A FreeBSD".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
features: "+v7,+vfp3d16,+thumb2,-neon".into(),
max_atomic_width: Some(64),
mcount: "\u{1}__gnu_mcount_nc".into(),
..base::freebsd::opts()
},
}
}
}
pub(crate) mod i686_unknown_freebsd {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, RustcAbi, StackProbeType, Target,
TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::freebsd::opts();
base.rustc_abi = Some(RustcAbi::X86Sse2);
base.cpu = "pentium4".into();
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m32", "-Wl,-znotext"]);
base.stack_probes = StackProbeType::Inline;
Target {
llvm_target: "i686-unknown-freebsd".into(),
metadata: TargetMetadata {
description: Some("32-bit FreeBSD".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i128:128-f64:32:64-f80:32-n8:16:32-S128".into(),
arch: Arch::X86,
options: base,
}
}
}
pub(crate) mod powerpc_unknown_freebsd {
use rustc_abi::Endian;
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::freebsd::opts();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m32", "--target=powerpc-unknown-freebsd13.0"]);
base.max_atomic_width = Some(32);
base.stack_probes = StackProbeType::Inline;
Target {
llvm_target: "powerpc-unknown-freebsd13.0".into(),
metadata: TargetMetadata {
description: Some("PowerPC FreeBSD".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "E-m:e-p:32:32-Fn32-i64:64-n32".into(),
arch: Arch::PowerPC,
options: TargetOptions {
endian: Endian::Big,
features: "+secure-plt".into(),
mcount: "_mcount".into(),
..base
},
}
}
}
pub(crate) mod powerpc64_unknown_freebsd {
use rustc_abi::Endian;
use crate::spec::{
Abi, Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::freebsd::opts();
base.cpu = "ppc64".into();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.max_atomic_width = Some(64);
base.stack_probes = StackProbeType::Inline;
base.abi = Abi::ElfV2;
base.llvm_abiname = "elfv2".into();
Target {
llvm_target: "powerpc64-unknown-freebsd".into(),
metadata: TargetMetadata {
description: Some("PPC64 FreeBSD (ELFv2)".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "E-m:e-Fn32-i64:64-i128:128-n32:64".into(),
arch: Arch::PowerPC64,
options: TargetOptions {
endian: Endian::Big,
mcount: "_mcount".into(),
..base
},
}
}
}
pub(crate) mod powerpc64le_unknown_freebsd {
use crate::spec::{
Abi, Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::freebsd::opts();
base.cpu = "ppc64le".into();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.max_atomic_width = Some(64);
base.stack_probes = StackProbeType::Inline;
base.abi = Abi::ElfV2;
base.llvm_abiname = "elfv2".into();
Target {
llvm_target: "powerpc64le-unknown-freebsd".into(),
metadata: TargetMetadata {
description: Some("PPC64LE FreeBSD".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-Fn32-i64:64-i128:128-n32:64".into(),
arch: Arch::PowerPC64,
options: TargetOptions { mcount: "_mcount".into(), ..base },
}
}
}
pub(crate) mod riscv64gc_unknown_freebsd {
use crate::spec::{
Arch, CodeModel, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "riscv64-unknown-freebsd".into(),
metadata: TargetMetadata {
description: Some("RISC-V FreeBSD".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::RiscV64,
options: TargetOptions {
code_model: Some(CodeModel::Medium),
cpu: "generic-rv64".into(),
features: "+m,+a,+f,+d,+c,+zicsr,+zifencei".into(),
llvm_abiname: "lp64d".into(),
max_atomic_width: Some(64),
..base::freebsd::opts()
},
}
}
}
pub(crate) mod x86_64_unknown_freebsd {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, SanitizerSet, StackProbeType, Target,
TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::freebsd::opts();
base.cpu = "x86-64".into();
base.plt_by_default = false;
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.stack_probes = StackProbeType::Inline;
base.supported_sanitizers =
SanitizerSet::ADDRESS | SanitizerSet::CFI |
SanitizerSet::MEMORY | SanitizerSet::THREAD;
base.supports_xray = true;
Target {
llvm_target: "x86_64-unknown-freebsd".into(),
metadata: TargetMetadata {
description: Some("64-bit FreeBSD".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod x86_64_unknown_dragonfly {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::dragonfly::opts();
base.cpu = "x86-64".into();
base.plt_by_default = false;
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.stack_probes = StackProbeType::Inline;
Target {
llvm_target: "x86_64-unknown-dragonfly".into(),
metadata: TargetMetadata {
description: Some("64-bit DragonFlyBSD".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod aarch64_unknown_openbsd {
use crate::spec::{
Arch, StackProbeType, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "aarch64-unknown-openbsd".into(),
metadata: TargetMetadata {
description: Some("ARM64 OpenBSD".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: TargetOptions {
features: "+v8a".into(),
max_atomic_width: Some(128),
stack_probes: StackProbeType::Inline,
..base::openbsd::opts()
},
}
}
}
pub(crate) mod i686_unknown_openbsd {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, RustcAbi, StackProbeType, Target,
TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::openbsd::opts();
base.rustc_abi = Some(RustcAbi::X86Sse2);
base.cpu = "pentium4".into();
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m32", "-fuse-ld=lld"]);
base.stack_probes = StackProbeType::Inline;
Target {
llvm_target: "i686-unknown-openbsd".into(),
metadata: TargetMetadata {
description: Some("32-bit OpenBSD".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i128:128-f64:32:64-f80:32-n8:16:32-S128".into(),
arch: Arch::X86,
options: base,
}
}
}
pub(crate) mod powerpc_unknown_openbsd {
use rustc_abi::Endian;
use crate::spec::{Arch, StackProbeType, Target, TargetMetadata, base};
pub(crate) fn target() -> Target {
let mut base = base::openbsd::opts();
base.endian = Endian::Big;
base.max_atomic_width = Some(32);
base.stack_probes = StackProbeType::Inline;
Target {
llvm_target: "powerpc-unknown-openbsd".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "E-m:e-p:32:32-Fn32-i64:64-n32".into(),
arch: Arch::PowerPC,
options: base,
}
}
}
pub(crate) mod powerpc64_unknown_openbsd {
use rustc_abi::Endian;
use crate::spec::{
Abi, Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::openbsd::opts();
base.cpu = "ppc64".into();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.max_atomic_width = Some(64);
base.stack_probes = StackProbeType::Inline;
base.abi = Abi::ElfV2;
base.llvm_abiname = "elfv2".into();
Target {
llvm_target: "powerpc64-unknown-openbsd".into(),
metadata: TargetMetadata {
description: Some("OpenBSD/powerpc64".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "E-m:e-Fn32-i64:64-i128:128-n32:64".into(),
arch: Arch::PowerPC64,
options: TargetOptions {
endian: Endian::Big,
mcount: "_mcount".into(),
..base
},
}
}
}
pub(crate) mod riscv64gc_unknown_openbsd {
use crate::spec::{
Arch, CodeModel, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "riscv64-unknown-openbsd".into(),
metadata: TargetMetadata {
description: Some("OpenBSD/riscv64".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::RiscV64,
options: TargetOptions {
code_model: Some(CodeModel::Medium),
cpu: "generic-rv64".into(),
features: "+m,+a,+f,+d,+c,+zicsr,+zifencei".into(),
llvm_abiname: "lp64d".into(),
max_atomic_width: Some(64),
..base::openbsd::opts()
},
}
}
}
pub(crate) mod sparc64_unknown_openbsd {
use rustc_abi::Endian;
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, Target, TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::openbsd::opts();
base.endian = Endian::Big;
base.cpu = "v9".into();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.max_atomic_width = Some(64);
Target {
llvm_target: "sparc64-unknown-openbsd".into(),
metadata: TargetMetadata {
description: Some("OpenBSD/sparc64".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "E-m:e-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::Sparc64,
options: base,
}
}
}
pub(crate) mod x86_64_unknown_openbsd {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::openbsd::opts();
base.cpu = "x86-64".into();
base.plt_by_default = false;
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.stack_probes = StackProbeType::Inline;
base.supports_xray = true;
Target {
llvm_target: "x86_64-unknown-openbsd".into(),
metadata: TargetMetadata {
description: Some("64-bit OpenBSD".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod aarch64_unknown_netbsd {
use crate::spec::{
Arch, StackProbeType, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "aarch64-unknown-netbsd".into(),
metadata: TargetMetadata {
description: Some("ARM64 NetBSD".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: TargetOptions {
features: "+v8a".into(),
mcount: "__mcount".into(),
max_atomic_width: Some(128),
stack_probes: StackProbeType::Inline,
..base::netbsd::opts()
},
}
}
}
pub(crate) mod aarch64_be_unknown_netbsd {
use rustc_abi::Endian;
use crate::spec::{
Arch, StackProbeType, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "aarch64_be-unknown-netbsd".into(),
metadata: TargetMetadata {
description: Some("ARM64 NetBSD (big-endian)".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "E-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: TargetOptions {
mcount: "__mcount".into(),
max_atomic_width: Some(128),
stack_probes: StackProbeType::Inline,
endian: Endian::Big,
..base::netbsd::opts()
},
}
}
}
pub(crate) mod armv6_unknown_netbsd_eabihf {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv6-unknown-netbsdelf-eabihf".into(),
metadata: TargetMetadata {
description: Some("Armv6 NetBSD w/hard-float".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
features: "+v6,+vfp2".into(),
max_atomic_width: Some(64),
mcount: "__mcount".into(),
..base::netbsd::opts()
},
}
}
}
pub(crate) mod armv7_unknown_netbsd_eabihf {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv7-unknown-netbsdelf-eabihf".into(),
metadata: TargetMetadata {
description: Some("Armv7-A NetBSD w/hard-float".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
features: "+v7,+vfp3d16,+thumb2,-neon".into(),
max_atomic_width: Some(64),
mcount: "__mcount".into(),
..base::netbsd::opts()
},
}
}
}
pub(crate) mod i586_unknown_netbsd {
use crate::spec::{
Arch, StackProbeType, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::netbsd::opts();
base.cpu = "pentium".into();
base.max_atomic_width = Some(64);
base.stack_probes = StackProbeType::Inline;
Target {
llvm_target: "i586-unknown-netbsdelf".into(),
metadata: TargetMetadata {
description: Some("32-bit x86, resricted to Pentium".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i128:128-f64:32:64-f80:32-n8:16:32-S128".into(),
arch: Arch::X86,
options: TargetOptions { mcount: "__mcount".into(), ..base },
}
}
}
pub(crate) mod i686_unknown_netbsd {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, RustcAbi, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::netbsd::opts();
base.rustc_abi = Some(RustcAbi::X86Sse2);
base.cpu = "pentium4".into();
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m32"]);
base.stack_probes = StackProbeType::Inline;
Target {
llvm_target: "i686-unknown-netbsdelf".into(),
metadata: TargetMetadata {
description: Some("NetBSD/i386 with SSE2".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i128:128-f64:32:64-f80:32-n8:16:32-S128".into(),
arch: Arch::X86,
options: TargetOptions { mcount: "__mcount".into(), ..base },
}
}
}
pub(crate) mod mipsel_unknown_netbsd {
use rustc_abi::Endian;
use crate::spec::{Arch, Target, TargetMetadata, TargetOptions, base};
pub(crate) fn target() -> Target {
let mut base = base::netbsd::opts();
base.max_atomic_width = Some(32);
base.cpu = "mips32".into();
Target {
llvm_target: "mipsel-unknown-netbsd".into(),
metadata: TargetMetadata {
description: Some("32-bit MIPS (LE), requires mips32 cpu support".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64".into(),
arch: Arch::Mips,
options: TargetOptions {
features: "+soft-float".into(),
mcount: "__mcount".into(),
endian: Endian::Little,
..base
},
}
}
}
pub(crate) mod powerpc_unknown_netbsd {
use rustc_abi::Endian;
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::netbsd::opts();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m32"]);
base.max_atomic_width = Some(32);
base.stack_probes = StackProbeType::Inline;
Target {
llvm_target: "powerpc-unknown-netbsd".into(),
metadata: TargetMetadata {
description: Some("NetBSD 32-bit powerpc systems".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "E-m:e-p:32:32-Fn32-i64:64-n32".into(),
arch: Arch::PowerPC,
options: TargetOptions {
endian: Endian::Big,
mcount: "__mcount".into(),
..base
},
}
}
}
pub(crate) mod riscv64gc_unknown_netbsd {
use crate::spec::{
Arch, CodeModel, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "riscv64-unknown-netbsd".into(),
metadata: TargetMetadata {
description: Some("RISC-V NetBSD".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::RiscV64,
options: TargetOptions {
code_model: Some(CodeModel::Medium),
cpu: "generic-rv64".into(),
features: "+m,+a,+f,+d,+c,+zicsr,+zifencei".into(),
llvm_abiname: "lp64d".into(),
max_atomic_width: Some(64),
mcount: "__mcount".into(),
..base::netbsd::opts()
},
}
}
}
pub(crate) mod sparc64_unknown_netbsd {
use rustc_abi::Endian;
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::netbsd::opts();
base.cpu = "v9".into();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.max_atomic_width = Some(64);
Target {
llvm_target: "sparc64-unknown-netbsd".into(),
metadata: TargetMetadata {
description: Some("NetBSD/sparc64".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "E-m:e-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::Sparc64,
options: TargetOptions {
endian: Endian::Big,
mcount: "__mcount".into(),
..base
},
}
}
}
pub(crate) mod x86_64_unknown_netbsd {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, SanitizerSet, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::netbsd::opts();
base.cpu = "x86-64".into();
base.plt_by_default = false;
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.stack_probes = StackProbeType::Inline;
base.supported_sanitizers =
SanitizerSet::ADDRESS | SanitizerSet::CFI | SanitizerSet::LEAK
| SanitizerSet::MEMORY | SanitizerSet::THREAD;
base.supports_xray = true;
Target {
llvm_target: "x86_64-unknown-netbsd".into(),
metadata: TargetMetadata {
description: Some("NetBSD/amd64".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: TargetOptions { mcount: "__mcount".into(), ..base },
}
}
}
pub(crate) mod i686_unknown_haiku {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, RustcAbi, StackProbeType, Target,
TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::haiku::opts();
base.rustc_abi = Some(RustcAbi::X86Sse2);
base.cpu = "pentium4".into();
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m32"]);
base.stack_probes = StackProbeType::Inline;
Target {
llvm_target: "i686-unknown-haiku".into(),
metadata: TargetMetadata {
description: Some("32-bit Haiku".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i128:128-f64:32:64-f80:32-n8:16:32-S128".into(),
arch: Arch::X86,
options: base,
}
}
}
pub(crate) mod x86_64_unknown_haiku {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::haiku::opts();
base.cpu = "x86-64".into();
base.plt_by_default = false;
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.stack_probes = StackProbeType::Inline;
base.position_independent_executables = true;
Target {
llvm_target: "x86_64-unknown-haiku".into(),
metadata: TargetMetadata {
description: Some("64-bit Haiku".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod aarch64_unknown_helenos {
use crate::spec::{Arch, Target, base};
pub(crate) fn target() -> Target {
let mut base = base::helenos::opts();
base.max_atomic_width = Some(128);
base.features = "+v8a".into();
base.linker = Some("aarch64-helenos-gcc".into());
Target {
llvm_target: "aarch64-unknown-helenos".into(),
metadata: crate::spec::TargetMetadata {
description: Some("ARM64 HelenOS".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: base,
}
}
}
pub(crate) mod i686_unknown_helenos {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, RustcAbi, Target, base,
};
pub(crate) fn target() -> Target {
let mut base = base::helenos::opts();
base.cpu = "pentium4".into();
base.max_atomic_width = Some(64);
base.linker = Some("i686-helenos-gcc".into());
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m32"]);
base.rustc_abi = Some(RustcAbi::X86Sse2);
Target {
llvm_target: "i686-unknown-helenos".into(),
metadata: crate::spec::TargetMetadata {
description: Some("IA-32 (i686) HelenOS".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i128:128-f64:32:64-f80:32-n8:16:32-S128".into(),
arch: Arch::X86,
options: base,
}
}
}
pub(crate) mod powerpc_unknown_helenos {
use rustc_abi::Endian;
use crate::spec::{Arch, Target, TargetMetadata, base};
pub(crate) fn target() -> Target {
let mut base = base::helenos::opts();
base.endian = Endian::Big;
base.max_atomic_width = Some(32);
base.linker = Some("ppc-helenos-gcc".into());
Target {
llvm_target: "powerpc-unknown-helenos".into(),
metadata: TargetMetadata {
description: Some("PowerPC HelenOS".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "E-m:e-p:32:32-Fn32-i64:64-n32".into(),
arch: Arch::PowerPC,
options: base,
}
}
}
pub(crate) mod sparc64_unknown_helenos {
use rustc_abi::Endian;
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, Target, TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::helenos::opts();
base.endian = Endian::Big;
base.cpu = "v9".into();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.max_atomic_width = Some(64);
base.linker = Some("sparc64-helenos-gcc".into());
Target {
llvm_target: "sparc64-unknown-helenos".into(),
metadata: TargetMetadata {
description: Some("SPARC HelenOS".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "E-m:e-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::Sparc64,
options: base,
}
}
}
pub(crate) mod x86_64_unknown_helenos {
use crate::spec::{Arch, Cc, LinkerFlavor, Lld, Target, base};
pub(crate) fn target() -> Target {
let mut base = base::helenos::opts();
base.cpu = "x86-64".into();
base.plt_by_default = false;
base.max_atomic_width = Some(64);
base.linker = Some("amd64-helenos-gcc".into());
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
Target {
llvm_target: "x86_64-unknown-helenos".into(),
metadata: crate::spec::TargetMetadata {
description: Some("64-bit HelenOS".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod i686_unknown_hurd_gnu {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::hurd_gnu::opts();
base.cpu = "pentium4".into();
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m32"]);
base.stack_probes = StackProbeType::Inline;
Target {
llvm_target: "i686-unknown-hurd-gnu".into(),
metadata: TargetMetadata {
description: Some("32-bit GNU/Hurd".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i128:128-f64:32:64-f80:32-n8:16:32-S128".into(),
arch: Arch::X86,
options: base,
}
}
}
pub(crate) mod x86_64_unknown_hurd_gnu {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::hurd_gnu::opts();
base.cpu = "x86-64".into();
base.plt_by_default = false;
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.stack_probes = StackProbeType::Inline;
base.supports_xray = true;
Target {
llvm_target: "x86_64-unknown-hurd-gnu".into(),
metadata: TargetMetadata {
description: Some("64-bit GNU/Hurd".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod aarch64_apple_darwin {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{
Os, SanitizerSet, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::MacOs, Arch::Arm64, TargetEnv::Normal);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("ARM64 Apple macOS (11.0+, Big Sur+)".into()),
tier: Some(1),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch,
options: TargetOptions {
mcount: "\u{1}mcount".into(),
cpu: "apple-m1".into(),
max_atomic_width: Some(128),
supported_sanitizers: SanitizerSet::ADDRESS |
SanitizerSet::CFI | SanitizerSet::THREAD |
SanitizerSet::REALTIME,
supports_xray: true,
..opts
},
}
}
}
pub(crate) mod arm64e_apple_darwin {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{
Os, SanitizerSet, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::MacOs, Arch::Arm64e, TargetEnv::Normal);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("ARM64e Apple Darwin".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch,
options: TargetOptions {
mcount: "\u{1}mcount".into(),
cpu: "apple-m1".into(),
max_atomic_width: Some(128),
supported_sanitizers: SanitizerSet::ADDRESS |
SanitizerSet::CFI | SanitizerSet::THREAD,
..opts
},
}
}
}
pub(crate) mod x86_64_apple_darwin {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{
Os, SanitizerSet, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::MacOs, Arch::X86_64, TargetEnv::Normal);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("x86_64 Apple macOS (10.12+, Sierra+)".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch,
options: TargetOptions {
mcount: "\u{1}mcount".into(),
max_atomic_width: Some(128),
supported_sanitizers: SanitizerSet::ADDRESS |
SanitizerSet::CFI | SanitizerSet::LEAK |
SanitizerSet::THREAD | SanitizerSet::REALTIME,
supports_xray: true,
..opts
},
}
}
}
pub(crate) mod x86_64h_apple_darwin {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{
Os, SanitizerSet, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
let (mut opts, llvm_target, arch) =
base(Os::MacOs, Arch::X86_64h, TargetEnv::Normal);
opts.max_atomic_width = Some(128);
opts.supported_sanitizers =
SanitizerSet::ADDRESS | SanitizerSet::CFI | SanitizerSet::LEAK
| SanitizerSet::THREAD;
opts.features = "-rdrand,-aes,-pclmulqdq,-rtm,-fsgsbase".into();
match (&opts.cpu, &"core-avx2") {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val,
::core::option::Option::Some(format_args!("you need to adjust the feature list in x86_64h-apple-darwin if you change this")));
}
}
};
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("x86_64 Apple macOS with Intel Haswell+".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch,
options: TargetOptions {
mcount: "\u{1}mcount".into(),
..opts
},
}
}
}
pub(crate) mod i686_apple_darwin {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{Os, Target, TargetMetadata, TargetOptions};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::MacOs, Arch::I686, TargetEnv::Normal);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("x86 Apple macOS (10.12+, Sierra+)".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:o-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i128:128-f64:32:64-f80:128-n8:16:32-S128".into(),
arch,
options: TargetOptions {
mcount: "\u{1}mcount".into(),
max_atomic_width: Some(64),
..opts
},
}
}
}
pub(crate) mod aarch64_unknown_fuchsia {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, SanitizerSet, StackProbeType, Target,
TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::fuchsia::opts();
base.cpu = "generic".into();
base.features = "+v8a,+crc,+aes,+sha2,+neon".into();
base.max_atomic_width = Some(128);
base.stack_probes = StackProbeType::Inline;
base.supported_sanitizers =
SanitizerSet::ADDRESS | SanitizerSet::CFI | SanitizerSet::LEAK
| SanitizerSet::SHADOWCALLSTACK;
base.default_sanitizers = SanitizerSet::SHADOWCALLSTACK;
base.supports_xray = true;
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::No, Lld::No),
&["--execute-only", "--fix-cortex-a53-843419"]);
Target {
llvm_target: "aarch64-unknown-fuchsia".into(),
metadata: TargetMetadata {
description: Some("ARM64 Fuchsia".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: base,
}
}
}
pub(crate) mod riscv64gc_unknown_fuchsia {
use crate::spec::{
Arch, CodeModel, SanitizerSet, StackProbeType, Target,
TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::fuchsia::opts();
base.code_model = Some(CodeModel::Medium);
base.cpu = "generic-rv64".into();
base.features = "+m,+a,+f,+d,+c,+zicsr,+zifencei".into();
base.llvm_abiname = "lp64d".into();
base.max_atomic_width = Some(64);
base.stack_probes = StackProbeType::Inline;
base.supported_sanitizers = SanitizerSet::SHADOWCALLSTACK;
base.default_sanitizers = SanitizerSet::SHADOWCALLSTACK;
base.supports_xray = true;
Target {
llvm_target: "riscv64-unknown-fuchsia".into(),
metadata: TargetMetadata {
description: Some("RISC-V Fuchsia".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::RiscV64,
options: base,
}
}
}
pub(crate) mod x86_64_unknown_fuchsia {
use crate::spec::{
Arch, SanitizerSet, StackProbeType, Target, TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::fuchsia::opts();
base.cpu = "x86-64".into();
base.plt_by_default = false;
base.features =
"+cmpxchg16b,+lahfsahf,+popcnt,+sse3,+sse4.1,+sse4.2,+ssse3".into();
base.max_atomic_width = Some(128);
base.stack_probes = StackProbeType::Inline;
base.supported_sanitizers =
SanitizerSet::ADDRESS | SanitizerSet::CFI |
SanitizerSet::LEAK;
base.supports_xray = true;
Target {
llvm_target: "x86_64-unknown-fuchsia".into(),
metadata: TargetMetadata {
description: Some("64-bit x86 Fuchsia".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod avr_none {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, RelocModel, Target, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
arch: Arch::Avr,
metadata: crate::spec::TargetMetadata {
description: None,
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
data_layout: "e-P1-p:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8:16-a:8".into(),
llvm_target: "avr-unknown-unknown".into(),
pointer_width: 16,
options: TargetOptions {
c_int_width: 16,
exe_suffix: ".elf".into(),
linker: Some("avr-gcc".into()),
eh_frame_header: false,
pre_link_args: TargetOptions::link_args(LinkerFlavor::Gnu(Cc::Yes,
Lld::No), &[]),
late_link_args: TargetOptions::link_args(LinkerFlavor::Gnu(Cc::Yes,
Lld::No), &["-lgcc"]),
max_atomic_width: Some(16),
atomic_cas: false,
relocation_model: RelocModel::Static,
need_explicit_cpu: true,
..TargetOptions::default()
},
}
}
}
pub(crate) mod x86_64_unknown_l4re_uclibc {
use crate::spec::{Arch, PanicStrategy, Target, TargetMetadata, base};
pub(crate) fn target() -> Target {
let mut base = base::l4re::opts();
base.cpu = "x86-64".into();
base.plt_by_default = false;
base.max_atomic_width = Some(64);
base.panic_strategy = PanicStrategy::Abort;
Target {
llvm_target: "x86_64-unknown-l4re-gnu".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: Some(false),
std: None,
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod aarch64_unknown_redox {
use crate::spec::{Arch, StackProbeType, Target, TargetMetadata, base};
pub(crate) fn target() -> Target {
let mut base = base::redox::opts();
base.max_atomic_width = Some(128);
base.stack_probes = StackProbeType::Inline;
base.features = "+v8a".into();
Target {
llvm_target: "aarch64-unknown-redox".into(),
metadata: TargetMetadata {
description: Some("ARM64 RedoxOS".into()),
tier: Some(3),
host_tools: Some(false),
std: None,
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: base,
}
}
}
pub(crate) mod i586_unknown_redox {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::redox::opts();
base.cpu = "pentiumpro".into();
base.plt_by_default = false;
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m32"]);
base.stack_probes = StackProbeType::Call;
Target {
llvm_target: "i586-unknown-redox".into(),
metadata: TargetMetadata {
description: None,
tier: 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, Target, TargetMetadata, base};
pub(crate) fn target() -> Target {
let mut base = base::redox::opts();
base.code_model = Some(CodeModel::Medium);
base.cpu = "generic-rv64".into();
base.features = "+m,+a,+f,+d,+c".into();
base.llvm_abiname = "lp64d".into();
base.plt_by_default = false;
base.max_atomic_width = Some(64);
Target {
llvm_target: "riscv64-unknown-redox".into(),
metadata: TargetMetadata {
description: Some("Redox OS".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::RiscV64,
options: base,
}
}
}
pub(crate) mod x86_64_unknown_redox {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::redox::opts();
base.cpu = "x86-64".into();
base.plt_by_default = false;
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.stack_probes = StackProbeType::Inline;
Target {
llvm_target: "x86_64-unknown-redox".into(),
metadata: TargetMetadata {
description: Some("Redox OS".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod x86_64_unknown_managarm_mlibc {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target, base,
};
pub(crate) fn target() -> Target {
let mut base = base::managarm_mlibc::opts();
base.cpu = "x86-64".into();
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.stack_probes = StackProbeType::Inline;
Target {
llvm_target: "x86_64-unknown-managarm-mlibc".into(),
metadata: crate::spec::TargetMetadata {
description: Some("managarm/amd64".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod aarch64_unknown_managarm_mlibc {
use crate::spec::{Arch, StackProbeType, Target, base};
pub(crate) fn target() -> Target {
let mut base = base::managarm_mlibc::opts();
base.max_atomic_width = Some(128);
base.stack_probes = StackProbeType::Inline;
base.features = "+v8a".into();
Target {
llvm_target: "aarch64-unknown-managarm-mlibc".into(),
metadata: crate::spec::TargetMetadata {
description: Some("managarm/aarch64".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: base,
}
}
}
pub(crate) mod riscv64gc_unknown_managarm_mlibc {
use crate::spec::{Arch, CodeModel, Target, TargetOptions, base};
pub(crate) fn target() -> Target {
Target {
llvm_target: "riscv64-unknown-managarm-mlibc".into(),
metadata: crate::spec::TargetMetadata {
description: Some("managarm/riscv64".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 64,
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::RiscV64,
options: TargetOptions {
code_model: Some(CodeModel::Medium),
cpu: "generic-rv64".into(),
features: "+m,+a,+f,+d,+c".into(),
llvm_abiname: "lp64d".into(),
max_atomic_width: Some(64),
..base::managarm_mlibc::opts()
},
}
}
}
pub(crate) mod i386_apple_ios {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{Os, Target, TargetMetadata, TargetOptions};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::IOs, Arch::I386, TargetEnv::Simulator);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("x86 Apple iOS Simulator".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:o-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i128:128-f64:32:64-f80:128-n8:16:32-S128".into(),
arch,
options: TargetOptions { max_atomic_width: Some(64), ..opts },
}
}
}
pub(crate) mod x86_64_apple_ios {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{
Os, SanitizerSet, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::IOs, Arch::X86_64, TargetEnv::Simulator);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("x86_64 Apple iOS Simulator".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch,
options: TargetOptions {
max_atomic_width: Some(128),
supported_sanitizers: SanitizerSet::ADDRESS |
SanitizerSet::THREAD,
..opts
},
}
}
}
pub(crate) mod aarch64_apple_ios {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{
Os, SanitizerSet, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::IOs, Arch::Arm64, TargetEnv::Normal);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("ARM64 Apple iOS".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch,
options: TargetOptions {
features: "+neon,+apple-a7".into(),
max_atomic_width: Some(128),
supported_sanitizers: SanitizerSet::ADDRESS |
SanitizerSet::THREAD | SanitizerSet::REALTIME,
..opts
},
}
}
}
pub(crate) mod arm64e_apple_ios {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{
Os, SanitizerSet, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::IOs, Arch::Arm64e, TargetEnv::Normal);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("ARM64e Apple iOS".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch,
options: TargetOptions {
features: "+neon,+apple-a12,+v8.3a,+paca,+pacg".into(),
max_atomic_width: Some(128),
supported_sanitizers: SanitizerSet::ADDRESS |
SanitizerSet::THREAD,
..opts
},
}
}
}
pub(crate) mod armv7s_apple_ios {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{Os, Target, TargetMetadata, TargetOptions};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::IOs, Arch::Armv7s, TargetEnv::Normal);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("ARMv7-A Apple-A6 Apple iOS".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:o-p:32:32-Fi8-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32".into(),
arch,
options: TargetOptions {
features: "+v7,+vfp4,+neon".into(),
max_atomic_width: Some(64),
..opts
},
}
}
}
pub(crate) mod x86_64_apple_ios_macabi {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{
Os, SanitizerSet, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::IOs, Arch::X86_64, TargetEnv::MacCatalyst);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("x86_64 Apple Mac Catalyst".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch,
options: TargetOptions {
max_atomic_width: Some(128),
supported_sanitizers: SanitizerSet::ADDRESS |
SanitizerSet::LEAK | SanitizerSet::THREAD,
..opts
},
}
}
}
pub(crate) mod aarch64_apple_ios_macabi {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{
Os, SanitizerSet, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::IOs, Arch::Arm64, TargetEnv::MacCatalyst);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("ARM64 Apple Mac Catalyst".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch,
options: TargetOptions {
features: "+neon,+apple-a12".into(),
max_atomic_width: Some(128),
supported_sanitizers: SanitizerSet::ADDRESS |
SanitizerSet::LEAK | SanitizerSet::THREAD,
..opts
},
}
}
}
pub(crate) mod aarch64_apple_ios_sim {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{
Os, SanitizerSet, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::IOs, Arch::Arm64, TargetEnv::Simulator);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("ARM64 Apple iOS Simulator".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch,
options: TargetOptions {
features: "+neon,+apple-a7".into(),
max_atomic_width: Some(128),
supported_sanitizers: SanitizerSet::ADDRESS |
SanitizerSet::THREAD | SanitizerSet::REALTIME,
..opts
},
}
}
}
pub(crate) mod aarch64_apple_tvos {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{Os, Target, TargetMetadata, TargetOptions};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::TvOs, Arch::Arm64, TargetEnv::Normal);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("ARM64 Apple tvOS".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch,
options: TargetOptions {
features: "+neon,+apple-a7".into(),
max_atomic_width: Some(128),
..opts
},
}
}
}
pub(crate) mod aarch64_apple_tvos_sim {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{Os, Target, TargetMetadata, TargetOptions};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::TvOs, Arch::Arm64, TargetEnv::Simulator);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("ARM64 Apple tvOS Simulator".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch,
options: TargetOptions {
features: "+neon,+apple-a7".into(),
max_atomic_width: Some(128),
..opts
},
}
}
}
pub(crate) mod arm64e_apple_tvos {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{Os, Target, TargetMetadata, TargetOptions};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::TvOs, Arch::Arm64e, TargetEnv::Normal);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("ARM64e Apple tvOS".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch,
options: TargetOptions {
features: "+neon,+apple-a12,+v8.3a,+paca,+pacg".into(),
max_atomic_width: Some(128),
..opts
},
}
}
}
pub(crate) mod x86_64_apple_tvos {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{Os, Target, TargetMetadata, TargetOptions};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::TvOs, Arch::X86_64, TargetEnv::Simulator);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("x86_64 Apple tvOS Simulator".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch,
options: TargetOptions { max_atomic_width: Some(128), ..opts },
}
}
}
pub(crate) mod armv7k_apple_watchos {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{Os, Target, TargetMetadata, TargetOptions};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::WatchOs, Arch::Armv7k, TargetEnv::Normal);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("Armv7-A Apple WatchOS".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:o-p:32:32-Fi8-i64:64-a:0:32-n32-S128".into(),
arch,
options: TargetOptions {
features: "+v7,+vfp4,+neon".into(),
max_atomic_width: Some(64),
dynamic_linking: false,
position_independent_executables: true,
..opts
},
}
}
}
pub(crate) mod arm64_32_apple_watchos {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{Os, Target, TargetMetadata, TargetOptions};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::WatchOs, Arch::Arm64_32, TargetEnv::Normal);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("ARM64 Apple watchOS with 32-bit pointers".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:o-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch,
options: TargetOptions {
features: "+v8a,+neon,+apple-a7".into(),
max_atomic_width: Some(128),
dynamic_linking: false,
position_independent_executables: true,
..opts
},
}
}
}
pub(crate) mod x86_64_apple_watchos_sim {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{Os, Target, TargetMetadata, TargetOptions};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::WatchOs, Arch::X86_64, TargetEnv::Simulator);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("x86_64 Apple watchOS Simulator".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch,
options: TargetOptions { max_atomic_width: Some(128), ..opts },
}
}
}
pub(crate) mod aarch64_apple_watchos {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{Os, Target, TargetMetadata, TargetOptions};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::WatchOs, Arch::Arm64, TargetEnv::Normal);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("ARM64 Apple watchOS".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch,
options: TargetOptions {
features: "+v8a,+neon,+apple-a7".into(),
max_atomic_width: Some(128),
dynamic_linking: false,
position_independent_executables: true,
..opts
},
}
}
}
pub(crate) mod aarch64_apple_watchos_sim {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{Os, Target, TargetMetadata, TargetOptions};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::WatchOs, Arch::Arm64, TargetEnv::Simulator);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("ARM64 Apple watchOS Simulator".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch,
options: TargetOptions {
features: "+neon,+apple-a7".into(),
max_atomic_width: Some(128),
..opts
},
}
}
}
pub(crate) mod aarch64_apple_visionos {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{
Os, SanitizerSet, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::VisionOs, Arch::Arm64, TargetEnv::Normal);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("ARM64 Apple visionOS".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch,
options: TargetOptions {
features: "+neon,+apple-a16".into(),
max_atomic_width: Some(128),
supported_sanitizers: SanitizerSet::ADDRESS |
SanitizerSet::THREAD,
..opts
},
}
}
}
pub(crate) mod aarch64_apple_visionos_sim {
use crate::spec::base::apple::{Arch, TargetEnv, base};
use crate::spec::{
Os, SanitizerSet, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
let (opts, llvm_target, arch) =
base(Os::VisionOs, Arch::Arm64, TargetEnv::Simulator);
Target {
llvm_target,
metadata: TargetMetadata {
description: Some("ARM64 Apple visionOS simulator".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch,
options: TargetOptions {
features: "+neon,+apple-a16".into(),
max_atomic_width: Some(128),
supported_sanitizers: SanitizerSet::ADDRESS |
SanitizerSet::THREAD,
..opts
},
}
}
}
pub(crate) mod armebv7r_none_eabi {
use rustc_abi::Endian;
use crate::spec::{
Abi, Arch, Cc, FloatAbi, LinkerFlavor, Lld, PanicStrategy,
RelocModel, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armebv7r-none-eabi".into(),
metadata: TargetMetadata {
description: Some("Bare Armv7-R, Big Endian".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
data_layout: "E-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
endian: Endian::Big,
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
relocation_model: RelocModel::Static,
panic_strategy: PanicStrategy::Abort,
max_atomic_width: Some(64),
emit_debug_gdb_scripts: false,
c_enum_min_bits: Some(8),
has_thumb_interworking: true,
..Default::default()
},
}
}
}
pub(crate) mod armebv7r_none_eabihf {
use rustc_abi::Endian;
use crate::spec::{
Abi, Arch, Cc, FloatAbi, LinkerFlavor, Lld, PanicStrategy,
RelocModel, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armebv7r-none-eabihf".into(),
metadata: TargetMetadata {
description: Some("Bare Armv7-R, Big Endian, hardfloat".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
data_layout: "E-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
endian: Endian::Big,
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
relocation_model: RelocModel::Static,
panic_strategy: PanicStrategy::Abort,
features: "+vfp3d16".into(),
max_atomic_width: Some(64),
emit_debug_gdb_scripts: false,
c_enum_min_bits: Some(8),
has_thumb_interworking: true,
..Default::default()
},
}
}
}
pub(crate) mod armv7r_none_eabi {
use crate::spec::{
Abi, Arch, 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 {
abi: Abi::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::{
Abi, Arch, 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 {
abi: Abi::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::{
Abi, Arch, 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 {
abi: Abi::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::{
Abi, Arch, 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 {
abi: Abi::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::{
Abi, Arch, 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 {
abi: Abi::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::{
Abi, Arch, 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 {
abi: Abi::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::{
Abi, Arch, Cc, Env, FloatAbi, LinkerFlavor, Lld, Os,
PanicStrategy, RelocModel, Target, TargetMetadata, TargetOptions,
cvs,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv7-unknown-none-eabihf".into(),
metadata: TargetMetadata {
description: Some("Armv7 RTEMS (Requires RTEMS toolchain and kernel".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
os: Os::Rtems,
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
linker_flavor: LinkerFlavor::Gnu(Cc::Yes, Lld::No),
linker: None,
relocation_model: RelocModel::Static,
panic_strategy: PanicStrategy::Unwind,
features: "+thumb2,+neon,+vfp3".into(),
max_atomic_width: Some(64),
emit_debug_gdb_scripts: false,
c_enum_min_bits: Some(8),
eh_frame_header: false,
no_default_libraries: false,
env: Env::Newlib,
..Default::default()
},
}
}
}
pub(crate) mod x86_64_pc_solaris {
use crate::spec::{
Arch, Cc, LinkerFlavor, SanitizerSet, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base =
TargetOptions {
cpu: "x86-64".into(),
plt_by_default: false,
vendor: "pc".into(),
max_atomic_width: Some(64),
stack_probes: StackProbeType::Inline,
supported_sanitizers: SanitizerSet::ADDRESS |
SanitizerSet::CFI | SanitizerSet::THREAD,
..base::solaris::opts()
};
base.add_pre_link_args(LinkerFlavor::Unix(Cc::Yes), &["-m64"]);
Target {
llvm_target: "x86_64-pc-solaris".into(),
metadata: TargetMetadata {
description: Some("64-bit Solaris 11.4".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod sparcv9_sun_solaris {
use rustc_abi::Endian;
use crate::spec::{
Arch, Cc, LinkerFlavor, Target, TargetMetadata, TargetOptions,
base,
};
pub(crate) fn target() -> Target {
let mut base =
TargetOptions {
endian: Endian::Big,
cpu: "v9".into(),
vendor: "sun".into(),
max_atomic_width: Some(64),
..base::solaris::opts()
};
base.add_pre_link_args(LinkerFlavor::Unix(Cc::Yes), &["-m64"]);
Target {
llvm_target: "sparcv9-sun-solaris".into(),
metadata: TargetMetadata {
description: Some("SPARC Solaris 11.4".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "E-m:e-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::Sparc64,
options: base,
}
}
}
pub(crate) mod x86_64_unknown_illumos {
use crate::spec::{
Arch, Cc, LinkerFlavor, SanitizerSet, Target, TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::illumos::opts();
base.add_pre_link_args(LinkerFlavor::Unix(Cc::Yes),
&["-m64", "-std=c99"]);
base.cpu = "x86-64".into();
base.plt_by_default = false;
base.max_atomic_width = Some(64);
base.supported_sanitizers =
SanitizerSet::ADDRESS | SanitizerSet::CFI |
SanitizerSet::THREAD;
Target {
llvm_target: "x86_64-pc-solaris".into(),
metadata: TargetMetadata {
description: Some("illumos".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod aarch64_unknown_illumos {
use crate::spec::{
Arch, Cc, LinkerFlavor, SanitizerSet, Target, TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::illumos::opts();
base.add_pre_link_args(LinkerFlavor::Unix(Cc::Yes),
&["-std=c99"]);
base.max_atomic_width = Some(128);
base.supported_sanitizers =
SanitizerSet::ADDRESS | SanitizerSet::CFI;
base.features = "+v8a".into();
Target {
llvm_target: "aarch64-unknown-solaris2.11".into(),
metadata: TargetMetadata {
description: Some("ARM64 illumos".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: base,
}
}
}
pub(crate) mod x86_64_pc_windows_gnu {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, Target, TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::windows_gnu::opts();
base.cpu = "x86-64".into();
base.features = "+cmpxchg16b,+sse3,+lahfsahf".into();
base.plt_by_default = false;
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::No, Lld::No),
&["-m", "i386pep", "--high-entropy-va"]);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64", "-Wl,--high-entropy-va"]);
base.max_atomic_width = Some(128);
base.linker = Some("x86_64-w64-mingw32-gcc".into());
Target {
llvm_target: "x86_64-pc-windows-gnu".into(),
metadata: TargetMetadata {
description: Some("64-bit MinGW (Windows 10+)".into()),
tier: Some(1),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod x86_64_uwp_windows_gnu {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, Target, TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::windows_uwp_gnu::opts();
base.cpu = "x86-64".into();
base.features = "+cmpxchg16b,+sse3,+lahfsahf".into();
base.plt_by_default = false;
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::No, Lld::No),
&["-m", "i386pep", "--high-entropy-va"]);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64", "-Wl,--high-entropy-va"]);
base.max_atomic_width = Some(128);
Target {
llvm_target: "x86_64-pc-windows-gnu".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod x86_64_win7_windows_gnu {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base =
TargetOptions {
vendor: "win7".into(),
cpu: "x86-64".into(),
plt_by_default: false,
max_atomic_width: Some(64),
linker: Some("x86_64-w64-mingw32-gcc".into()),
..base::windows_gnu::opts()
};
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::No, Lld::No),
&["-m", "i386pep", "--high-entropy-va"]);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64", "-Wl,--high-entropy-va"]);
Target {
llvm_target: "x86_64-pc-windows-gnu".into(),
metadata: TargetMetadata {
description: Some("64-bit MinGW (Windows 7+)".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod i686_pc_windows_gnu {
use crate::spec::{
Arch, Cc, FramePointer, LinkerFlavor, Lld, RustcAbi, Target,
TargetMetadata, base, crt_objects,
};
pub(crate) fn target() -> Target {
let mut base = base::windows_gnu::opts();
base.rustc_abi = Some(RustcAbi::X86Sse2);
base.cpu = "pentium4".into();
base.max_atomic_width = Some(64);
base.frame_pointer = FramePointer::Always;
base.linker = Some("i686-w64-mingw32-gcc".into());
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::No, Lld::No),
&["-m", "i386pe", "--large-address-aware"]);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-Wl,--large-address-aware"]);
base.pre_link_objects = crt_objects::pre_i686_mingw();
base.post_link_objects = crt_objects::post_i686_mingw();
base.pre_link_objects_self_contained =
crt_objects::pre_i686_mingw_self_contained();
base.post_link_objects_self_contained =
crt_objects::post_i686_mingw_self_contained();
Target {
llvm_target: "i686-pc-windows-gnu".into(),
metadata: TargetMetadata {
description: Some("32-bit MinGW (Windows 10+)".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:x-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i64:64-i128:128-f80:32-n8:16:32-a:0:32-S32".into(),
arch: Arch::X86,
options: base,
}
}
}
pub(crate) mod i686_uwp_windows_gnu {
use crate::spec::{
Arch, Cc, FramePointer, LinkerFlavor, Lld, RustcAbi, Target,
TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::windows_uwp_gnu::opts();
base.rustc_abi = Some(RustcAbi::X86Sse2);
base.cpu = "pentium4".into();
base.max_atomic_width = Some(64);
base.frame_pointer = FramePointer::Always;
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::No, Lld::No),
&["-m", "i386pe", "--large-address-aware"]);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-Wl,--large-address-aware"]);
Target {
llvm_target: "i686-pc-windows-gnu".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: Some(false),
std: None,
},
pointer_width: 32,
data_layout: "e-m:x-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i64:64-i128:128-f80:32-n8:16:32-a:0:32-S32".into(),
arch: Arch::X86,
options: base,
}
}
}
pub(crate) mod i686_win7_windows_gnu {
use crate::spec::{
Arch, Cc, FramePointer, LinkerFlavor, Lld, RustcAbi, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base =
TargetOptions {
vendor: "win7".into(),
rustc_abi: Some(RustcAbi::X86Sse2),
cpu: "pentium4".into(),
max_atomic_width: Some(64),
frame_pointer: FramePointer::Always,
linker: Some("i686-w64-mingw32-gcc".into()),
..base::windows_gnu::opts()
};
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::No, Lld::No),
&["-m", "i386pe", "--large-address-aware"]);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-Wl,--large-address-aware"]);
Target {
llvm_target: "i686-pc-windows-gnu".into(),
metadata: TargetMetadata {
description: Some("32-bit MinGW (Windows 7+)".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:x-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i64:64-i128:128-f80:32-n8:16:32-a:0:32-S32".into(),
arch: Arch::X86,
options: base,
}
}
}
pub(crate) mod aarch64_pc_windows_gnullvm {
use crate::spec::{
Arch, Cc, FramePointer, LinkerFlavor, Lld, Target, TargetMetadata,
base,
};
pub(crate) fn target() -> Target {
let mut base = base::windows_gnullvm::opts();
base.max_atomic_width = Some(128);
base.features = "+v8a,+neon".into();
base.linker = Some("aarch64-w64-mingw32-clang".into());
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::No, Lld::No),
&["-m", "arm64pe"]);
base.frame_pointer = FramePointer::NonLeaf;
Target {
llvm_target: "aarch64-pc-windows-gnu".into(),
metadata: TargetMetadata {
description: Some("ARM64 MinGW (Windows 10+), LLVM ABI".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:w-p270:32:32-p271:32:32-p272:64:64-p:64:64-i32:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: base,
}
}
}
pub(crate) mod i686_pc_windows_gnullvm {
use crate::spec::{
Arch, Cc, FramePointer, LinkerFlavor, Lld, RustcAbi, Target,
TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::windows_gnullvm::opts();
base.rustc_abi = Some(RustcAbi::X86Sse2);
base.cpu = "pentium4".into();
base.max_atomic_width = Some(64);
base.frame_pointer = FramePointer::Always;
base.linker = Some("i686-w64-mingw32-clang".into());
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::No, Lld::No),
&["-m", "i386pe", "--large-address-aware"]);
Target {
llvm_target: "i686-pc-windows-gnu".into(),
metadata: TargetMetadata {
description: Some("32-bit x86 MinGW (Windows 10+), LLVM ABI".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:x-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i64:64-i128:128-f80:32-n8:16:32-a:0:32-S32".into(),
arch: Arch::X86,
options: base,
}
}
}
pub(crate) mod x86_64_pc_windows_gnullvm {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, Target, TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::windows_gnullvm::opts();
base.cpu = "x86-64".into();
base.features = "+cmpxchg16b,+sse3,+lahfsahf".into();
base.plt_by_default = false;
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::No, Lld::No),
&["-m", "i386pep"]);
base.max_atomic_width = Some(128);
base.linker = Some("x86_64-w64-mingw32-clang".into());
Target {
llvm_target: "x86_64-pc-windows-gnu".into(),
metadata: TargetMetadata {
description: Some("64-bit x86 MinGW (Windows 10+), LLVM ABI".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod aarch64_pc_windows_msvc {
use crate::spec::{Arch, FramePointer, Target, TargetMetadata, base};
pub(crate) fn target() -> Target {
let mut base = base::windows_msvc::opts();
base.max_atomic_width = Some(128);
base.features = "+v8a,+neon".into();
base.frame_pointer = FramePointer::NonLeaf;
Target {
llvm_target: "aarch64-pc-windows-msvc".into(),
metadata: TargetMetadata {
description: Some("ARM64 Windows MSVC".into()),
tier: Some(1),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:w-p270:32:32-p271:32:32-p272:64:64-p:64:64-i32:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: base,
}
}
}
pub(crate) mod aarch64_uwp_windows_msvc {
use crate::spec::{Arch, Target, TargetMetadata, base};
pub(crate) fn target() -> Target {
let mut base = base::windows_uwp_msvc::opts();
base.max_atomic_width = Some(128);
base.features = "+v8a".into();
Target {
llvm_target: "aarch64-pc-windows-msvc".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: Some(false),
std: None,
},
pointer_width: 64,
data_layout: "e-m:w-p270:32:32-p271:32:32-p272:64:64-p:64:64-i32:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: base,
}
}
}
pub(crate) mod arm64ec_pc_windows_msvc {
use crate::spec::{
Arch, FramePointer, LinkerFlavor, Lld, Target, TargetMetadata,
add_link_args, base,
};
pub(crate) fn target() -> Target {
let mut base = base::windows_msvc::opts();
base.max_atomic_width = Some(128);
base.features = "+v8a,+neon".into();
add_link_args(&mut base.late_link_args,
LinkerFlavor::Msvc(Lld::No),
&["/machine:arm64ec", "softintrin.lib"]);
base.frame_pointer = FramePointer::NonLeaf;
Target {
llvm_target: "arm64ec-pc-windows-msvc".into(),
metadata: TargetMetadata {
description: Some("Arm64EC Windows MSVC".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:w-p270:32:32-p271:32:32-p272:64:64-p:64:64-i32:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::Arm64EC,
options: base,
}
}
}
pub(crate) mod x86_64_pc_windows_msvc {
use crate::spec::{Arch, SanitizerSet, Target, TargetMetadata, base};
pub(crate) fn target() -> Target {
let mut base = base::windows_msvc::opts();
base.cpu = "x86-64".into();
base.features = "+cmpxchg16b,+sse3,+lahfsahf".into();
base.plt_by_default = false;
base.max_atomic_width = Some(128);
base.supported_sanitizers = SanitizerSet::ADDRESS;
Target {
llvm_target: "x86_64-pc-windows-msvc".into(),
metadata: TargetMetadata {
description: Some("64-bit MSVC (Windows 10+)".into()),
tier: Some(1),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod x86_64_uwp_windows_msvc {
use crate::spec::{Arch, Target, TargetMetadata, base};
pub(crate) fn target() -> Target {
let mut base = base::windows_uwp_msvc::opts();
base.cpu = "x86-64".into();
base.features = "+cmpxchg16b,+sse3,+lahfsahf".into();
base.plt_by_default = false;
base.max_atomic_width = Some(128);
Target {
llvm_target: "x86_64-pc-windows-msvc".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod x86_64_win7_windows_msvc {
use crate::spec::{
Arch, SanitizerSet, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let base =
TargetOptions {
vendor: "win7".into(),
cpu: "x86-64".into(),
plt_by_default: false,
max_atomic_width: Some(64),
supported_sanitizers: SanitizerSet::ADDRESS,
..base::windows_msvc::opts()
};
Target {
llvm_target: "x86_64-pc-windows-msvc".into(),
metadata: TargetMetadata {
description: Some("64-bit MSVC (Windows 7+)".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod i686_pc_windows_msvc {
use crate::spec::{
Arch, LinkerFlavor, Lld, RustcAbi, SanitizerSet, Target,
TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::windows_msvc::opts();
base.rustc_abi = Some(RustcAbi::X86Sse2);
base.cpu = "pentium4".into();
base.max_atomic_width = Some(64);
base.supported_sanitizers = SanitizerSet::ADDRESS;
base.add_pre_link_args(LinkerFlavor::Msvc(Lld::No),
&["/LARGEADDRESSAWARE", "/SAFESEH"]);
Target {
llvm_target: "i686-pc-windows-msvc".into(),
metadata: TargetMetadata {
description: Some("32-bit MSVC (Windows 10+)".into()),
tier: Some(1),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:x-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i64:64-i128:128-f80:128-n8:16:32-a:0:32-S32".into(),
arch: Arch::X86,
options: base,
}
}
}
pub(crate) mod i686_uwp_windows_msvc {
use crate::spec::{Arch, RustcAbi, Target, TargetMetadata, base};
pub(crate) fn target() -> Target {
let mut base = base::windows_uwp_msvc::opts();
base.rustc_abi = Some(RustcAbi::X86Sse2);
base.cpu = "pentium4".into();
base.max_atomic_width = Some(64);
Target {
llvm_target: "i686-pc-windows-msvc".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: Some(false),
std: None,
},
pointer_width: 32,
data_layout: "e-m:x-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i64:64-i128:128-f80:128-n8:16:32-a:0:32-S32".into(),
arch: Arch::X86,
options: base,
}
}
}
pub(crate) mod i686_win7_windows_msvc {
use crate::spec::{
Arch, LinkerFlavor, Lld, RustcAbi, SanitizerSet, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base =
TargetOptions {
vendor: "win7".into(),
rustc_abi: Some(RustcAbi::X86Sse2),
cpu: "pentium4".into(),
max_atomic_width: Some(64),
supported_sanitizers: SanitizerSet::ADDRESS,
has_thread_local: false,
..base::windows_msvc::opts()
};
base.add_pre_link_args(LinkerFlavor::Msvc(Lld::No),
&["/LARGEADDRESSAWARE", "/SAFESEH"]);
Target {
llvm_target: "i686-pc-windows-msvc".into(),
metadata: TargetMetadata {
description: Some("32-bit MSVC (Windows 7+)".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:x-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i64:64-i128:128-f80:128-n8:16:32-a:0:32-S32".into(),
arch: Arch::X86,
options: base,
}
}
}
pub(crate) mod thumbv7a_pc_windows_msvc {
use crate::spec::{
Arch, FloatAbi, LinkerFlavor, Lld, PanicStrategy, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::windows_msvc::opts();
base.add_pre_link_args(LinkerFlavor::Msvc(Lld::No),
&["/OPT:NOLBR"]);
Target {
llvm_target: "thumbv7a-pc-windows-msvc".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: Some(false),
std: None,
},
pointer_width: 32,
data_layout: "e-m:w-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
llvm_floatabi: Some(FloatAbi::Hard),
features: "+vfp3,+neon".into(),
max_atomic_width: Some(64),
panic_strategy: PanicStrategy::Abort,
..base
},
}
}
}
pub(crate) mod thumbv7a_uwp_windows_msvc {
use crate::spec::{
Arch, FloatAbi, PanicStrategy, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv7a-pc-windows-msvc".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:w-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
llvm_floatabi: Some(FloatAbi::Hard),
features: "+vfp3,+neon".into(),
max_atomic_width: Some(64),
panic_strategy: PanicStrategy::Abort,
..base::windows_uwp_msvc::opts()
},
}
}
}
pub(crate) mod wasm32_unknown_emscripten {
use crate::spec::{
Arch, LinkArgs, LinkerFlavor, Os, PanicStrategy, RelocModel,
Target, TargetMetadata, TargetOptions, base, cvs,
};
pub(crate) fn target() -> Target {
let pre_link_args = LinkArgs::new();
let post_link_args =
TargetOptions::link_args(LinkerFlavor::EmCc,
&["-sABORTING_MALLOC=0", "-sWASM_BIGINT"]);
let opts =
TargetOptions {
os: Os::Emscripten,
linker_flavor: LinkerFlavor::EmCc,
exe_suffix: ".js".into(),
linker: None,
pre_link_args,
post_link_args,
relocation_model: RelocModel::Pic,
crt_static_respected: true,
crt_static_default: true,
panic_strategy: PanicStrategy::Unwind,
no_default_libraries: false,
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix"),
::std::borrow::Cow::Borrowed("wasm")]),
..base::wasm::options()
};
Target {
llvm_target: "wasm32-unknown-emscripten".into(),
metadata: TargetMetadata {
description: Some("WebAssembly via Emscripten".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-i128:128-f128:64-n32:64-S128-ni:1:10:20".into(),
arch: Arch::Wasm32,
options: opts,
}
}
}
pub(crate) mod wasm32_unknown_unknown {
use crate::spec::{
Arch, Cc, LinkerFlavor, Os, Target, TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut options = base::wasm::options();
options.os = Os::Unknown;
options.add_pre_link_args(LinkerFlavor::WasmLld(Cc::No),
&["--no-entry"]);
options.add_pre_link_args(LinkerFlavor::WasmLld(Cc::Yes),
&["--target=wasm32-unknown-unknown", "-Wl,--no-entry"]);
Target {
llvm_target: "wasm32-unknown-unknown".into(),
metadata: TargetMetadata {
description: Some("WebAssembly".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-i128:128-n32:64-S128-ni:1:10:20".into(),
arch: Arch::Wasm32,
options,
}
}
}
pub(crate) mod wasm32v1_none {
use crate::spec::{
Arch, Cc, LinkerFlavor, Os, Target, TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut options = base::wasm::options();
options.os = Os::None;
options.cpu = "mvp".into();
options.features = "+mutable-globals".into();
options.add_pre_link_args(LinkerFlavor::WasmLld(Cc::No),
&["--no-entry"]);
options.add_pre_link_args(LinkerFlavor::WasmLld(Cc::Yes),
&["--target=wasm32-unknown-unknown", "-Wl,--no-entry"]);
Target {
llvm_target: "wasm32-unknown-unknown".into(),
metadata: TargetMetadata {
description: Some("WebAssembly".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-i128:128-n32:64-S128-ni:1:10:20".into(),
arch: Arch::Wasm32,
options,
}
}
}
pub(crate) mod wasm32_wasip1 {
use crate::spec::{
Arch, Cc, Env, LinkSelfContainedDefault, LinkerFlavor, Os, Target,
TargetMetadata, base, crt_objects,
};
pub(crate) fn target() -> Target {
let mut options = base::wasm::options();
options.os = Os::Wasi;
options.env = Env::P1;
options.add_pre_link_args(LinkerFlavor::WasmLld(Cc::Yes),
&["--target=wasm32-wasip1"]);
options.pre_link_objects_self_contained =
crt_objects::pre_wasi_self_contained();
options.post_link_objects_self_contained =
crt_objects::post_wasi_self_contained();
options.link_self_contained = LinkSelfContainedDefault::True;
options.crt_static_default = true;
options.crt_static_respected = true;
options.crt_static_allows_dylibs = true;
options.main_needs_argc_argv = false;
options.entry_name = "__main_void".into();
Target {
llvm_target: "wasm32-wasip1".into(),
metadata: TargetMetadata {
description: Some("WebAssembly with WASI".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-i128:128-n32:64-S128-ni:1:10:20".into(),
arch: Arch::Wasm32,
options,
}
}
}
pub(crate) mod wasm32_wasip2 {
use crate::spec::{
Arch, Env, LinkSelfContainedDefault, Os, RelocModel, Target,
TargetMetadata, base, crt_objects,
};
pub(crate) fn target() -> Target {
let mut options = base::wasm::options();
options.os = Os::Wasi;
options.env = Env::P2;
options.linker = Some("wasm-component-ld".into());
options.pre_link_objects_self_contained =
crt_objects::pre_wasi_self_contained();
options.post_link_objects_self_contained =
crt_objects::post_wasi_self_contained();
options.link_self_contained = LinkSelfContainedDefault::True;
options.crt_static_default = true;
options.crt_static_respected = true;
options.crt_static_allows_dylibs = true;
options.main_needs_argc_argv = false;
options.entry_name = "__main_void".into();
options.relocation_model = RelocModel::Pic;
Target {
llvm_target: "wasm32-wasip2".into(),
metadata: TargetMetadata {
description: Some("WebAssembly".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-i128:128-n32:64-S128-ni:1:10:20".into(),
arch: Arch::Wasm32,
options,
}
}
}
pub(crate) mod wasm32_wasip3 {
use crate::spec::{Env, Target};
pub(crate) fn target() -> Target {
let mut target = super::wasm32_wasip2::target();
target.llvm_target = "wasm32-wasip3".into();
target.metadata =
crate::spec::TargetMetadata {
description: Some("WebAssembly".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
};
target.options.env = Env::P3;
target
}
}
pub(crate) mod wasm32_wasip1_threads {
use crate::spec::{
Arch, Cc, Env, LinkSelfContainedDefault, LinkerFlavor, Os, Target,
TargetMetadata, base, crt_objects,
};
pub(crate) fn target() -> Target {
let mut options = base::wasm::options();
options.os = Os::Wasi;
options.env = Env::P1;
options.add_pre_link_args(LinkerFlavor::WasmLld(Cc::No),
&["--import-memory", "--export-memory", "--shared-memory",
"--max-memory=1073741824"]);
options.add_pre_link_args(LinkerFlavor::WasmLld(Cc::Yes),
&["--target=wasm32-wasip1-threads", "-Wl,--import-memory",
"-Wl,--export-memory,", "-Wl,--shared-memory",
"-Wl,--max-memory=1073741824"]);
options.pre_link_objects_self_contained =
crt_objects::pre_wasi_self_contained();
options.post_link_objects_self_contained =
crt_objects::post_wasi_self_contained();
options.link_self_contained = LinkSelfContainedDefault::True;
options.crt_static_default = true;
options.crt_static_respected = true;
options.crt_static_allows_dylibs = true;
options.main_needs_argc_argv = false;
options.entry_name = "__main_void".into();
options.singlethread = false;
options.features =
"+atomics,+bulk-memory,+mutable-globals".into();
Target {
llvm_target: "wasm32-wasi".into(),
metadata: TargetMetadata {
description: None,
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-i128:128-n32:64-S128-ni:1:10:20".into(),
arch: Arch::Wasm32,
options,
}
}
}
pub(crate) mod wasm32_wali_linux_musl {
use crate::spec::{
Arch, Cc, LinkerFlavor, Target, TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut options = base::linux_wasm::opts();
options.add_pre_link_args(LinkerFlavor::WasmLld(Cc::No),
&["--export-memory", "--shared-memory",
"--max-memory=1073741824"]);
options.add_pre_link_args(LinkerFlavor::WasmLld(Cc::Yes),
&["--target=wasm32-wasi-threads", "-Wl,--export-memory,",
"-Wl,--shared-memory", "-Wl,--max-memory=1073741824"]);
Target {
llvm_target: "wasm32-wasi".into(),
metadata: TargetMetadata {
description: Some("WebAssembly Linux Interface with musl-libc".into()),
tier: Some(3),
host_tools: Some(false),
std: None,
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-i128:128-n32:64-S128-ni:1:10:20".into(),
arch: Arch::Wasm32,
options,
}
}
}
pub(crate) mod wasm64_unknown_unknown {
use crate::spec::{
Arch, Cc, LinkerFlavor, Os, Target, TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut options = base::wasm::options();
options.os = Os::Unknown;
options.add_pre_link_args(LinkerFlavor::WasmLld(Cc::No),
&["--no-entry", "-mwasm64"]);
options.add_pre_link_args(LinkerFlavor::WasmLld(Cc::Yes),
&["--target=wasm64-unknown-unknown", "-Wl,--no-entry"]);
options.features =
"+bulk-memory,+mutable-globals,+sign-ext,+nontrapping-fptoint".into();
Target {
llvm_target: "wasm64-unknown-unknown".into(),
metadata: TargetMetadata {
description: Some("WebAssembly".into()),
tier: Some(3),
host_tools: Some(false),
std: None,
},
pointer_width: 64,
data_layout: "e-m:e-p:64:64-p10:8:8-p20:8:8-i64:64-i128:128-n32:64-S128-ni:1:10:20".into(),
arch: Arch::Wasm64,
options,
}
}
}
pub(crate) mod thumbv6m_none_eabi {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv6m-none-eabi".into(),
metadata: TargetMetadata {
description: Some("Bare ARMv6-M".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
features: "+strict-align,+atomics-32".into(),
atomic_cas: false,
..base::arm_none::opts()
},
}
}
}
pub(crate) mod thumbv7m_none_eabi {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv7m-none-eabi".into(),
metadata: TargetMetadata {
description: Some("Bare ARMv7-M".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
max_atomic_width: Some(32),
..base::arm_none::opts()
},
}
}
}
pub(crate) mod thumbv7em_none_eabi {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv7em-none-eabi".into(),
metadata: TargetMetadata {
description: Some("Bare ARMv7E-M".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
max_atomic_width: Some(32),
..base::arm_none::opts()
},
}
}
}
pub(crate) mod thumbv7em_none_eabihf {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv7em-none-eabihf".into(),
metadata: TargetMetadata {
description: Some("Bare ARMv7E-M, hardfloat".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
features: "+vfp4d16sp".into(),
max_atomic_width: Some(32),
..base::arm_none::opts()
},
}
}
}
pub(crate) mod thumbv8m_base_none_eabi {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv8m.base-none-eabi".into(),
metadata: TargetMetadata {
description: Some("Bare ARMv8-M Baseline".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
features: "+strict-align".into(),
max_atomic_width: Some(32),
..base::arm_none::opts()
},
}
}
}
pub(crate) mod thumbv8m_main_none_eabi {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv8m.main-none-eabi".into(),
metadata: TargetMetadata {
description: Some("Bare ARMv8-M Mainline".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
max_atomic_width: Some(32),
..base::arm_none::opts()
},
}
}
}
pub(crate) mod thumbv8m_main_none_eabihf {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv8m.main-none-eabihf".into(),
metadata: TargetMetadata {
description: Some("Bare ARMv8-M Mainline, hardfloat".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
features: "+fp-armv8d16sp".into(),
max_atomic_width: Some(32),
..base::arm_none::opts()
},
}
}
}
pub(crate) mod armv7a_none_eabi {
use crate::spec::{
Abi, Arch, 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 {
abi: Abi::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::{
Abi, Arch, 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 {
abi: Abi::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::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv7a-none-eabihf".into(),
metadata: TargetMetadata {
description: Some("Bare Armv7-A, hardfloat".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
features: "+vfp3d16,-neon,+strict-align".into(),
max_atomic_width: Some(64),
has_thumb_interworking: true,
..base::arm_none::opts()
},
}
}
}
pub(crate) mod thumbv7a_none_eabihf {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv7a-none-eabihf".into(),
metadata: TargetMetadata {
description: Some("Thumb-mode Bare Armv7-A, hardfloat".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
features: "+vfp3d16,-neon,+strict-align".into(),
max_atomic_width: Some(64),
has_thumb_interworking: true,
..base::arm_none::opts()
},
}
}
}
pub(crate) mod armv7a_nuttx_eabi {
use crate::spec::{
Abi, Arch, Cc, FloatAbi, LinkerFlavor, Lld, Os, PanicStrategy,
RelocModel, Target, TargetMetadata, TargetOptions, cvs,
};
pub(crate) fn target() -> Target {
let opts =
TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
features: "+v7,+thumb2,+soft-float,-neon,+strict-align".into(),
relocation_model: RelocModel::Static,
disable_redzone: true,
max_atomic_width: Some(64),
panic_strategy: PanicStrategy::Abort,
emit_debug_gdb_scripts: false,
c_enum_min_bits: Some(8),
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
os: Os::NuttX,
..Default::default()
};
Target {
llvm_target: "armv7a-none-eabi".into(),
metadata: TargetMetadata {
description: Some("ARMv7-A Cortex-A with NuttX".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: opts,
}
}
}
pub(crate) mod armv7a_nuttx_eabihf {
use crate::spec::{
Abi, Arch, Cc, FloatAbi, LinkerFlavor, Lld, Os, PanicStrategy,
RelocModel, Target, TargetMetadata, TargetOptions, cvs,
};
pub(crate) fn target() -> Target {
let opts =
TargetOptions {
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
features: "+v7,+thumb2,+vfp3,+neon,+strict-align".into(),
relocation_model: RelocModel::Static,
disable_redzone: true,
max_atomic_width: Some(64),
panic_strategy: PanicStrategy::Abort,
emit_debug_gdb_scripts: false,
c_enum_min_bits: Some(8),
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
os: Os::NuttX,
..Default::default()
};
Target {
llvm_target: "armv7a-none-eabihf".into(),
metadata: TargetMetadata {
description: Some("ARMv7-A Cortex-A with NuttX (hard float)".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: opts,
}
}
}
pub(crate) mod armv7a_vex_v5 {
use crate::spec::{
Abi, Arch, Cc, Env, FloatAbi, LinkerFlavor, Lld, Os,
PanicStrategy, RelocModel, Target, TargetMetadata, TargetOptions,
};
const LINKER_SCRIPT: &str =
"OUTPUT_FORMAT(\"elf32-littlearm\")\nENTRY(_boot)\n\n/*\n * PROVIDE() is used here so that users can override default values.\n * This is intended to give developers the option to use this Rust\n * target even if the default values in this linker script aren\'t\n * suitable for their needs.\n *\n * For example: `-C link-arg=--defsym=__stack_length=8M` could\n * be used to increase the stack size above the value set in this\n * file.\n */\n\nPROVIDE(__vcodesig_magic = 0x35585658); /* XVX5 */\nPROVIDE(__vcodesig_type = 0); /* V5_SIG_TYPE_USER */\nPROVIDE(__vcodesig_owner = 2); /* V5_SIG_OWNER_PARTNER */\nPROVIDE(__vcodesig_options = 0); /* none (0) */\n\n__user_ram_start = 0x03800000;\n__user_ram_end = 0x08000000;\n/* (0x48 =) 72 MiB length */\n__user_ram_length = __user_ram_start - __user_ram_end;\n\n/*\n * VEXos provides a method for pre-loading a \"linked file\" at a specified\n * address in User RAM, conventionally near the end, after the primary\n * program binary. We need to be sure not to place any data in that location,\n * so we allow the user of this linker script to inform the start address of\n * this blob.\n */\nPROVIDE(__linked_file_length = 0);\nPROVIDE(__linked_file_end = __user_ram_end);\nPROVIDE(__linked_file_start = __linked_file_end - __linked_file_length);\n\nPROVIDE(__stack_length = 4M);\nPROVIDE(__stack_top = __linked_file_start);\nPROVIDE(__stack_bottom = __linked_file_start - __stack_length);\n\nMEMORY {\n USER_RAM (RWX) : ORIGIN = __user_ram_start, LENGTH = __user_ram_length\n}\n\nSECTIONS {\n /*\n * VEXos expects program binaries to have a 32-byte header called a \"code signature\"\n * at their start which tells the OS that we are a valid program and configures some\n * miscellaneous startup behavior.\n */\n .code_signature : {\n LONG(__vcodesig_magic)\n LONG(__vcodesig_type)\n LONG(__vcodesig_owner)\n LONG(__vcodesig_options)\n\n FILL(0)\n . = __user_ram_start + 0x20;\n } > USER_RAM\n\n /*\n * Executable program instructions.\n */\n .text ALIGN(4) : {\n /* _boot routine (entry point from VEXos, must be at 0x03800020) */\n *(.boot)\n\n /* The rest of the program. */\n *(.text .text.*)\n } > USER_RAM\n\n /*\n * Global/uninitialized/static/constant data sections.\n */\n .rodata : {\n *(.rodata .rodata1 .rodata.*)\n *(.srodata .srodata.*)\n } > USER_RAM\n\n /*\n * ARM Stack Unwinding Sections\n *\n * These sections are added by the compiler in some cases to facilitate stack unwinding.\n * __eh_frame_start and similar symbols are used by libunwind.\n */\n\n .except_ordered : {\n PROVIDE(__extab_start = .);\n *(.gcc_except_table *.gcc_except_table.*)\n *(.ARM.extab*)\n PROVIDE(__extab_end = .);\n } > USER_RAM\n\n .eh_frame_hdr : {\n /* see https://github.com/llvm/llvm-project/blob/main/libunwind/src/AddressSpace.hpp#L78 */\n PROVIDE(__eh_frame_hdr_start = .);\n KEEP(*(.eh_frame_hdr))\n PROVIDE(__eh_frame_hdr_end = .);\n } > USER_RAM\n\n .eh_frame : {\n PROVIDE(__eh_frame_start = .);\n KEEP(*(.eh_frame))\n PROVIDE(__eh_frame_end = .);\n } > USER_RAM\n\n .except_unordered : {\n PROVIDE(__exidx_start = .);\n *(.ARM.exidx*)\n PROVIDE(__exidx_end = .);\n } > USER_RAM\n\n /* -- Data intended to be mutable at runtime begins here. -- */\n\n .data : {\n *(.data .data1 .data.*)\n *(.sdata .sdata.* .sdata2.*)\n } > USER_RAM\n\n /* -- End of loadable sections - anything beyond this point shouldn\'t go in the binary uploaded to the device. -- */\n\n .bss (NOLOAD) : {\n __bss_start = .;\n *(.sbss*)\n *(.bss .bss.*)\n\n /* Align the heap */\n . = ALIGN(8);\n __bss_end = .;\n } > USER_RAM\n\n /*\n * Active memory sections for the stack/heap.\n *\n * Because these are (NOLOAD), they will not influence the final size of the binary.\n */\n .heap (NOLOAD) : {\n __heap_start = .;\n . = __stack_bottom;\n __heap_end = .;\n } > USER_RAM\n\n .stack (NOLOAD) : ALIGN(8) {\n __stack_bottom = .;\n . += __stack_length;\n __stack_top = .;\n } > USER_RAM\n\n /*\n * `.ARM.attributes` contains arch metadata for compatibility purposes, but we\n * only target one hardware configuration, meaning it\'d just take up space.\n */\n /DISCARD/ : {\n *(.ARM.attributes*)\n }\n}\n";
pub(crate) fn target() -> Target {
let opts =
TargetOptions {
vendor: "vex".into(),
env: Env::V5,
os: Os::VexOs,
cpu: "cortex-a9".into(),
abi: Abi::EabiHf,
is_like_vexos: true,
llvm_floatabi: Some(FloatAbi::Hard),
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
features: "+v7,+neon,+vfp3d16,+thumb2".into(),
relocation_model: RelocModel::Static,
disable_redzone: true,
max_atomic_width: Some(64),
panic_strategy: PanicStrategy::Abort,
emit_debug_gdb_scripts: false,
c_enum_min_bits: Some(8),
default_uwtable: true,
has_thumb_interworking: true,
link_script: Some(LINKER_SCRIPT.into()),
..Default::default()
};
Target {
llvm_target: "armv7a-none-eabihf".into(),
metadata: TargetMetadata {
description: Some("ARMv7-A Cortex-A9 VEX V5 Brain".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: opts,
}
}
}
pub(crate) mod msp430_none_elf {
use crate::spec::{
Arch, Cc, LinkerFlavor, PanicStrategy, RelocModel, Target,
TargetMetadata, TargetOptions, cvs,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "msp430-none-elf".into(),
metadata: TargetMetadata {
description: Some("16-bit MSP430 microcontrollers".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 16,
data_layout: "e-m:e-p:16:16-i32:16-i64:16-f32:16-f64:16-a:8-n8:16-S16".into(),
arch: Arch::Msp430,
options: TargetOptions {
c_int_width: 16,
asm_args: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("-mcpu=msp430")]),
linker: Some("msp430-elf-gcc".into()),
linker_flavor: LinkerFlavor::Unix(Cc::Yes),
max_atomic_width: Some(0),
atomic_cas: false,
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
default_codegen_units: Some(1),
trap_unreachable: false,
emit_debug_gdb_scripts: false,
eh_frame_header: false,
..Default::default()
},
}
}
}
pub(crate) mod aarch64_be_unknown_hermit {
use rustc_abi::Endian;
use crate::spec::{
Arch, StackProbeType, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "aarch64_be-unknown-hermit".into(),
metadata: TargetMetadata {
description: Some("ARM64 Hermit (big-endian)".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
arch: Arch::AArch64,
data_layout: "E-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
options: TargetOptions {
features: "+v8a,+strict-align,+neon".into(),
max_atomic_width: Some(128),
stack_probes: StackProbeType::Inline,
endian: Endian::Big,
..base::hermit::opts()
},
}
}
}
pub(crate) mod aarch64_unknown_hermit {
use crate::spec::{
Arch, StackProbeType, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "aarch64-unknown-hermit".into(),
metadata: TargetMetadata {
description: Some("ARM64 Hermit".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
arch: Arch::AArch64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
options: TargetOptions {
features: "+v8a,+strict-align,+neon".into(),
max_atomic_width: Some(128),
stack_probes: StackProbeType::Inline,
..base::hermit::opts()
},
}
}
}
pub(crate) mod riscv64gc_unknown_hermit {
use crate::spec::{
Arch, CodeModel, RelocModel, Target, TargetMetadata,
TargetOptions, TlsModel, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "riscv64-unknown-hermit".into(),
metadata: TargetMetadata {
description: Some("RISC-V Hermit".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
arch: Arch::RiscV64,
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
options: TargetOptions {
cpu: "generic-rv64".into(),
features: "+m,+a,+f,+d,+c,+zicsr,+zifencei".into(),
relocation_model: RelocModel::Pic,
code_model: Some(CodeModel::Medium),
tls_model: TlsModel::LocalExec,
max_atomic_width: Some(64),
llvm_abiname: "lp64d".into(),
..base::hermit::opts()
},
}
}
}
pub(crate) mod x86_64_unknown_hermit {
use crate::spec::{
Arch, StackProbeType, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "x86_64-unknown-hermit".into(),
metadata: TargetMetadata {
description: Some("x86_64 Hermit".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
arch: Arch::X86_64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
options: TargetOptions {
cpu: "x86-64".into(),
features: "+rdrand,+rdseed".into(),
plt_by_default: false,
max_atomic_width: Some(64),
stack_probes: StackProbeType::Inline,
..base::hermit::opts()
},
}
}
}
pub(crate) mod x86_64_unknown_motor {
use crate::spec::{
Arch, CodeModel, LinkSelfContainedDefault, RelocModel, RelroLevel,
Target, base,
};
pub(crate) fn target() -> Target {
let mut base = base::motor::opts();
base.cpu = "x86-64".into();
base.max_atomic_width = Some(64);
base.code_model = Some(CodeModel::Small);
base.position_independent_executables = true;
base.relro_level = RelroLevel::Full;
base.static_position_independent_executables = true;
base.relocation_model = RelocModel::Pic;
base.link_self_contained = LinkSelfContainedDefault::True;
base.dynamic_linking = false;
base.crt_static_default = true;
base.crt_static_respected = true;
Target {
llvm_target: "x86_64-unknown-none-elf".into(),
metadata: crate::spec::TargetMetadata {
description: Some("Motor OS".into()),
tier: Some(3),
host_tools: None,
std: None,
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod x86_64_unikraft_linux_musl {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "x86_64-unknown-linux-musl".into(),
metadata: TargetMetadata {
description: Some("64-bit Unikraft with musl 1.2.5".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
arch: Arch::X86_64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
options: TargetOptions {
cpu: "x86-64".into(),
plt_by_default: false,
pre_link_args: TargetOptions::link_args(LinkerFlavor::Gnu(Cc::Yes,
Lld::No), &["-m64"]),
max_atomic_width: Some(64),
stack_probes: StackProbeType::Inline,
..base::unikraft_linux_musl::opts()
},
}
}
}
pub(crate) mod armv7_unknown_trusty {
use crate::spec::{
Abi, Arch, FloatAbi, LinkSelfContainedDefault, Os, PanicStrategy,
RelroLevel, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv7-unknown-unknown-gnueabi".into(),
metadata: TargetMetadata {
description: Some("Armv7-A Trusty".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
features: "+v7,+thumb2,+soft-float,-neon".into(),
max_atomic_width: Some(64),
mcount: "\u{1}mcount".into(),
os: Os::Trusty,
link_self_contained: LinkSelfContainedDefault::InferredForMusl,
dynamic_linking: false,
executables: true,
crt_static_default: true,
crt_static_respected: true,
relro_level: RelroLevel::Full,
panic_strategy: PanicStrategy::Abort,
position_independent_executables: true,
static_position_independent_executables: true,
..Default::default()
},
}
}
}
pub(crate) mod aarch64_unknown_trusty {
use crate::spec::{
Arch, LinkSelfContainedDefault, Os, PanicStrategy, RelroLevel,
Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "aarch64-unknown-unknown-musl".into(),
metadata: TargetMetadata {
description: Some("ARM64 Trusty".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: TargetOptions {
features: "+neon,+reserve-x18".into(),
executables: true,
max_atomic_width: Some(128),
panic_strategy: PanicStrategy::Abort,
os: Os::Trusty,
position_independent_executables: true,
static_position_independent_executables: true,
crt_static_default: true,
crt_static_respected: true,
dynamic_linking: false,
link_self_contained: LinkSelfContainedDefault::InferredForMusl,
relro_level: RelroLevel::Full,
mcount: "\u{1}_mcount".into(),
..Default::default()
},
}
}
}
pub(crate) mod x86_64_unknown_trusty {
use crate::spec::{
Arch, LinkSelfContainedDefault, Os, PanicStrategy, RelroLevel,
StackProbeType, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "x86_64-unknown-unknown-musl".into(),
metadata: TargetMetadata {
description: Some("x86_64 Trusty".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: TargetOptions {
executables: true,
max_atomic_width: Some(64),
panic_strategy: PanicStrategy::Abort,
os: Os::Trusty,
link_self_contained: LinkSelfContainedDefault::InferredForMusl,
position_independent_executables: true,
static_position_independent_executables: true,
crt_static_default: true,
crt_static_respected: true,
dynamic_linking: false,
plt_by_default: false,
relro_level: RelroLevel::Full,
stack_probes: StackProbeType::Inline,
mcount: "\u{1}_mcount".into(),
..Default::default()
},
}
}
}
pub(crate) mod riscv32i_unknown_none_elf {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel, Target,
TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:e-p:32:32-i64:64-n32-S128".into(),
llvm_target: "riscv32".into(),
metadata: TargetMetadata {
description: Some("Bare RISC-V (RV32I ISA)".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
arch: Arch::RiscV32,
options: TargetOptions {
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
cpu: "generic-rv32".into(),
max_atomic_width: Some(32),
atomic_cas: false,
features: "+forced-atomics".into(),
llvm_abiname: "ilp32".into(),
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
emit_debug_gdb_scripts: false,
eh_frame_header: false,
..Default::default()
},
}
}
}
pub(crate) mod riscv32im_risc0_zkvm_elf {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, Os, PanicStrategy, RelocModel,
Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:e-p:32:32-i64:64-n32-S128".into(),
llvm_target: "riscv32".into(),
metadata: TargetMetadata {
description: Some("RISC Zero's zero-knowledge Virtual Machine (RV32IM ISA)".into()),
tier: Some(3),
host_tools: Some(false),
std: None,
},
pointer_width: 32,
arch: Arch::RiscV32,
options: TargetOptions {
os: Os::Zkvm,
vendor: "risc0".into(),
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
cpu: "generic-rv32".into(),
max_atomic_width: Some(64),
atomic_cas: true,
features: "+m".into(),
llvm_abiname: "ilp32".into(),
executables: true,
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
emit_debug_gdb_scripts: false,
eh_frame_header: false,
singlethread: true,
..Default::default()
},
}
}
}
pub(crate) mod riscv32im_unknown_none_elf {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel, Target,
TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:e-p:32:32-i64:64-n32-S128".into(),
llvm_target: "riscv32".into(),
metadata: TargetMetadata {
description: None,
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
arch: Arch::RiscV32,
options: TargetOptions {
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
cpu: "generic-rv32".into(),
max_atomic_width: Some(32),
atomic_cas: false,
features: "+m,+forced-atomics".into(),
llvm_abiname: "ilp32".into(),
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
emit_debug_gdb_scripts: false,
eh_frame_header: false,
..Default::default()
},
}
}
}
pub(crate) mod riscv32ima_unknown_none_elf {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel, Target,
TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:e-p:32:32-i64:64-n32-S128".into(),
llvm_target: "riscv32".into(),
metadata: TargetMetadata {
description: Some("Bare RISC-V (RV32IMA ISA)".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
arch: Arch::RiscV32,
options: TargetOptions {
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
cpu: "generic-rv32".into(),
max_atomic_width: Some(32),
features: "+m,+a".into(),
llvm_abiname: "ilp32".into(),
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
emit_debug_gdb_scripts: false,
eh_frame_header: false,
..Default::default()
},
}
}
}
pub(crate) mod riscv32imc_unknown_none_elf {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel, Target,
TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:e-p:32:32-i64:64-n32-S128".into(),
llvm_target: "riscv32".into(),
metadata: TargetMetadata {
description: Some("Bare RISC-V (RV32IMC ISA)".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
arch: Arch::RiscV32,
options: TargetOptions {
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
cpu: "generic-rv32".into(),
max_atomic_width: Some(32),
atomic_cas: false,
features: "+m,+c,+forced-atomics".into(),
llvm_abiname: "ilp32".into(),
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
emit_debug_gdb_scripts: false,
eh_frame_header: false,
..Default::default()
},
}
}
}
pub(crate) mod riscv32imc_esp_espidf {
use crate::spec::{
Arch, Env, Os, PanicStrategy, RelocModel, Target, TargetMetadata,
TargetOptions, cvs,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:e-p:32:32-i64:64-n32-S128".into(),
llvm_target: "riscv32".into(),
metadata: TargetMetadata {
description: Some("RISC-V ESP-IDF".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
arch: Arch::RiscV32,
options: TargetOptions {
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
os: Os::EspIdf,
env: Env::Newlib,
vendor: "espressif".into(),
linker: Some("riscv32-esp-elf-gcc".into()),
cpu: "generic-rv32".into(),
max_atomic_width: Some(32),
atomic_cas: true,
features: "+m,+c".into(),
llvm_abiname: "ilp32".into(),
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
emit_debug_gdb_scripts: false,
eh_frame_header: false,
..Default::default()
},
}
}
}
pub(crate) mod riscv32imac_esp_espidf {
use crate::spec::{
Arch, Env, Os, PanicStrategy, RelocModel, Target, TargetMetadata,
TargetOptions, cvs,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:e-p:32:32-i64:64-n32-S128".into(),
llvm_target: "riscv32".into(),
metadata: TargetMetadata {
description: Some("RISC-V ESP-IDF".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
arch: Arch::RiscV32,
options: TargetOptions {
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
os: Os::EspIdf,
env: Env::Newlib,
vendor: "espressif".into(),
linker: Some("riscv32-esp-elf-gcc".into()),
cpu: "generic-rv32".into(),
max_atomic_width: Some(32),
atomic_cas: true,
features: "+m,+a,+c".into(),
llvm_abiname: "ilp32".into(),
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
emit_debug_gdb_scripts: false,
eh_frame_header: false,
..Default::default()
},
}
}
}
pub(crate) mod riscv32imafc_esp_espidf {
use crate::spec::{
Arch, Env, Os, PanicStrategy, RelocModel, Target, TargetMetadata,
TargetOptions, cvs,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:e-p:32:32-i64:64-n32-S128".into(),
llvm_target: "riscv32".into(),
metadata: TargetMetadata {
description: Some("RISC-V ESP-IDF".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
arch: Arch::RiscV32,
options: TargetOptions {
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
os: Os::EspIdf,
env: Env::Newlib,
vendor: "espressif".into(),
linker: Some("riscv32-esp-elf-gcc".into()),
cpu: "generic-rv32".into(),
max_atomic_width: Some(32),
atomic_cas: true,
llvm_abiname: "ilp32f".into(),
features: "+m,+a,+c,+f".into(),
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
emit_debug_gdb_scripts: false,
eh_frame_header: false,
..Default::default()
},
}
}
}
pub(crate) mod riscv32e_unknown_none_elf {
use crate::spec::{
Abi, Arch, Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel,
Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:e-p:32:32-i64:64-n32-S32".into(),
llvm_target: "riscv32".into(),
metadata: TargetMetadata {
description: Some("Bare RISC-V (RV32E ISA)".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
arch: Arch::RiscV32,
options: TargetOptions {
abi: Abi::Ilp32e,
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
cpu: "generic-rv32".into(),
llvm_abiname: "ilp32e".into(),
max_atomic_width: Some(32),
atomic_cas: false,
features: "+e,+forced-atomics".into(),
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
emit_debug_gdb_scripts: false,
eh_frame_header: false,
..Default::default()
},
}
}
}
pub(crate) mod riscv32em_unknown_none_elf {
use crate::spec::{
Abi, Arch, Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel,
Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:e-p:32:32-i64:64-n32-S32".into(),
llvm_target: "riscv32".into(),
metadata: TargetMetadata {
description: Some("Bare RISC-V (RV32EM ISA)".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
arch: Arch::RiscV32,
options: TargetOptions {
abi: Abi::Ilp32e,
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
cpu: "generic-rv32".into(),
llvm_abiname: "ilp32e".into(),
max_atomic_width: Some(32),
atomic_cas: false,
features: "+e,+m,+forced-atomics".into(),
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
emit_debug_gdb_scripts: false,
eh_frame_header: false,
..Default::default()
},
}
}
}
pub(crate) mod riscv32emc_unknown_none_elf {
use crate::spec::{
Abi, Arch, Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel,
Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:e-p:32:32-i64:64-n32-S32".into(),
llvm_target: "riscv32".into(),
metadata: TargetMetadata {
description: Some("Bare RISC-V (RV32EMC ISA)".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
arch: Arch::RiscV32,
options: TargetOptions {
abi: Abi::Ilp32e,
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
cpu: "generic-rv32".into(),
llvm_abiname: "ilp32e".into(),
max_atomic_width: Some(32),
atomic_cas: false,
features: "+e,+m,+c,+forced-atomics".into(),
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
emit_debug_gdb_scripts: false,
eh_frame_header: false,
..Default::default()
},
}
}
}
pub(crate) mod riscv32imac_unknown_none_elf {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel, Target,
TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:e-p:32:32-i64:64-n32-S128".into(),
llvm_target: "riscv32".into(),
metadata: TargetMetadata {
description: Some("Bare RISC-V (RV32IMAC ISA)".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
arch: Arch::RiscV32,
options: TargetOptions {
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
cpu: "generic-rv32".into(),
max_atomic_width: Some(32),
features: "+m,+a,+c".into(),
llvm_abiname: "ilp32".into(),
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
emit_debug_gdb_scripts: false,
eh_frame_header: false,
..Default::default()
},
}
}
}
pub(crate) mod riscv32imafc_unknown_none_elf {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel, Target,
TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:e-p:32:32-i64:64-n32-S128".into(),
llvm_target: "riscv32".into(),
metadata: TargetMetadata {
description: Some("Bare RISC-V (RV32IMAFC ISA)".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
arch: Arch::RiscV32,
options: TargetOptions {
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
cpu: "generic-rv32".into(),
max_atomic_width: Some(32),
llvm_abiname: "ilp32f".into(),
features: "+m,+a,+c,+f".into(),
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
emit_debug_gdb_scripts: false,
eh_frame_header: false,
..Default::default()
},
}
}
}
pub(crate) mod riscv32imac_unknown_xous_elf {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, Os, PanicStrategy, RelocModel,
Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:e-p:32:32-i64:64-n32-S128".into(),
llvm_target: "riscv32".into(),
metadata: TargetMetadata {
description: Some("RISC-V Xous (RV32IMAC ISA)".into()),
tier: Some(3),
host_tools: Some(false),
std: None,
},
pointer_width: 32,
arch: Arch::RiscV32,
options: TargetOptions {
os: Os::Xous,
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
cpu: "generic-rv32".into(),
max_atomic_width: Some(32),
features: "+m,+a,+c".into(),
llvm_abiname: "ilp32".into(),
panic_strategy: PanicStrategy::Unwind,
relocation_model: RelocModel::Static,
..Default::default()
},
}
}
}
pub(crate) mod riscv32gc_unknown_linux_gnu {
use std::borrow::Cow;
use crate::spec::{
Arch, CodeModel, SplitDebuginfo, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "riscv32-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: Some("RISC-V Linux (kernel 5.4, glibc 2.33)".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-i64:64-n32-S128".into(),
arch: Arch::RiscV32,
options: TargetOptions {
code_model: Some(CodeModel::Medium),
cpu: "generic-rv32".into(),
features: "+m,+a,+f,+d,+c,+zicsr,+zifencei".into(),
llvm_abiname: "ilp32d".into(),
max_atomic_width: Some(32),
supported_split_debuginfo: Cow::Borrowed(&[SplitDebuginfo::Off]),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod riscv32gc_unknown_linux_musl {
use std::borrow::Cow;
use crate::spec::{
Arch, CodeModel, SplitDebuginfo, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "riscv32-unknown-linux-musl".into(),
metadata: TargetMetadata {
description: Some("RISC-V Linux (kernel 5.4, musl 1.2.5)".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-i64:64-n32-S128".into(),
arch: Arch::RiscV32,
options: TargetOptions {
code_model: Some(CodeModel::Medium),
cpu: "generic-rv32".into(),
features: "+m,+a,+f,+d,+c,+zicsr,+zifencei".into(),
llvm_abiname: "ilp32d".into(),
max_atomic_width: Some(32),
supported_split_debuginfo: Cow::Borrowed(&[SplitDebuginfo::Off]),
..base::linux_musl::opts()
},
}
}
}
pub(crate) mod riscv64im_unknown_none_elf {
use crate::spec::{
Arch, Cc, CodeModel, LinkerFlavor, Lld, PanicStrategy, RelocModel,
Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
llvm_target: "riscv64".into(),
metadata: TargetMetadata {
description: Some("Bare RISC-V (RV64IM ISA)".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 64,
arch: Arch::RiscV64,
options: TargetOptions {
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
cpu: "generic-rv64".into(),
max_atomic_width: Some(64),
atomic_cas: false,
features: "+m,+forced-atomics".into(),
llvm_abiname: "lp64".into(),
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
code_model: Some(CodeModel::Medium),
emit_debug_gdb_scripts: false,
eh_frame_header: false,
..Default::default()
},
}
}
}
pub(crate) mod riscv64imac_unknown_none_elf {
use crate::spec::{
Arch, Cc, CodeModel, LinkerFlavor, Lld, PanicStrategy, RelocModel,
SanitizerSet, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
llvm_target: "riscv64".into(),
metadata: TargetMetadata {
description: Some("Bare RISC-V (RV64IMAC ISA)".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 64,
arch: Arch::RiscV64,
options: TargetOptions {
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
cpu: "generic-rv64".into(),
max_atomic_width: Some(64),
features: "+m,+a,+c".into(),
llvm_abiname: "lp64".into(),
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
code_model: Some(CodeModel::Medium),
emit_debug_gdb_scripts: false,
eh_frame_header: false,
supported_sanitizers: SanitizerSet::KERNELADDRESS |
SanitizerSet::SHADOWCALLSTACK,
..Default::default()
},
}
}
}
pub(crate) mod riscv64gc_unknown_none_elf {
use crate::spec::{
Arch, Cc, CodeModel, LinkerFlavor, Lld, PanicStrategy, RelocModel,
SanitizerSet, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
metadata: TargetMetadata {
description: Some("Bare RISC-V (RV64IMAFDC ISA)".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
llvm_target: "riscv64".into(),
pointer_width: 64,
arch: Arch::RiscV64,
options: TargetOptions {
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
llvm_abiname: "lp64d".into(),
cpu: "generic-rv64".into(),
max_atomic_width: Some(64),
features: "+m,+a,+f,+d,+c,+zicsr,+zifencei".into(),
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
code_model: Some(CodeModel::Medium),
emit_debug_gdb_scripts: false,
eh_frame_header: false,
supported_sanitizers: SanitizerSet::KERNELADDRESS |
SanitizerSet::SHADOWCALLSTACK,
..Default::default()
},
}
}
}
pub(crate) mod riscv64gc_unknown_linux_gnu {
use std::borrow::Cow;
use crate::spec::{
Arch, CodeModel, SplitDebuginfo, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "riscv64-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: Some("RISC-V Linux (kernel 4.20, glibc 2.29)".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::RiscV64,
options: TargetOptions {
code_model: Some(CodeModel::Medium),
cpu: "generic-rv64".into(),
features: "+m,+a,+f,+d,+c,+zicsr,+zifencei".into(),
llvm_abiname: "lp64d".into(),
max_atomic_width: Some(64),
supported_split_debuginfo: Cow::Borrowed(&[SplitDebuginfo::Off]),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod riscv64gc_unknown_linux_musl {
use std::borrow::Cow;
use crate::spec::{
Arch, CodeModel, SplitDebuginfo, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "riscv64-unknown-linux-musl".into(),
metadata: TargetMetadata {
description: Some("RISC-V Linux (kernel 4.20, musl 1.2.5)".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::RiscV64,
options: TargetOptions {
code_model: Some(CodeModel::Medium),
cpu: "generic-rv64".into(),
features: "+m,+a,+f,+d,+c,+zicsr,+zifencei".into(),
llvm_abiname: "lp64d".into(),
max_atomic_width: Some(64),
supported_split_debuginfo: Cow::Borrowed(&[SplitDebuginfo::Off]),
..base::linux_musl::opts()
},
}
}
}
pub(crate) mod riscv64a23_unknown_linux_gnu {
use std::borrow::Cow;
use crate::spec::{
Arch, CodeModel, SplitDebuginfo, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "riscv64-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: Some("RISC-V Linux (kernel 6.8.0, glibc 2.39)".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::RiscV64,
options: TargetOptions {
code_model: Some(CodeModel::Medium),
cpu: "generic-rv64".into(),
features: "+rva23u64".into(),
llvm_abiname: "lp64d".into(),
max_atomic_width: Some(64),
supported_split_debuginfo: Cow::Borrowed(&[SplitDebuginfo::Off]),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod sparc_unknown_none_elf {
use rustc_abi::Endian;
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel, Target,
TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
let options =
TargetOptions {
linker_flavor: LinkerFlavor::Gnu(Cc::Yes, Lld::No),
linker: Some("sparc-elf-gcc".into()),
endian: Endian::Big,
cpu: "v7".into(),
max_atomic_width: Some(32),
atomic_cas: true,
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
no_default_libraries: false,
emit_debug_gdb_scripts: false,
eh_frame_header: false,
..Default::default()
};
Target {
data_layout: "E-m:e-p:32:32-i64:64-i128:128-f128:64-n32-S64".into(),
llvm_target: "sparc-unknown-none-elf".into(),
metadata: TargetMetadata {
description: Some("Bare 32-bit SPARC V7+".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
arch: Arch::Sparc,
options,
}
}
}
pub(crate) mod loongarch32_unknown_none {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel, Target,
TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "loongarch32-unknown-none".into(),
metadata: TargetMetadata {
description: Some("Freestanding/bare-metal LoongArch32".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-i64:64-n32-S128".into(),
arch: Arch::LoongArch32,
options: TargetOptions {
cpu: "generic".into(),
features: "+f,+d".into(),
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
llvm_abiname: "ilp32d".into(),
max_atomic_width: Some(32),
relocation_model: RelocModel::Static,
panic_strategy: PanicStrategy::Abort,
..Default::default()
},
}
}
}
pub(crate) mod loongarch32_unknown_none_softfloat {
use crate::spec::{
Abi, Arch, Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel,
Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "loongarch32-unknown-none".into(),
metadata: TargetMetadata {
description: Some("Freestanding/bare-metal LoongArch32 softfloat".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-i64:64-n32-S128".into(),
arch: Arch::LoongArch32,
options: TargetOptions {
cpu: "generic".into(),
features: "-f,-d".into(),
abi: Abi::SoftFloat,
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
llvm_abiname: "ilp32s".into(),
max_atomic_width: Some(32),
relocation_model: RelocModel::Static,
panic_strategy: PanicStrategy::Abort,
..Default::default()
},
}
}
}
pub(crate) mod loongarch64_unknown_none {
use crate::spec::{
Arch, Cc, CodeModel, LinkerFlavor, Lld, PanicStrategy, RelocModel,
Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "loongarch64-unknown-none".into(),
metadata: TargetMetadata {
description: Some("Freestanding/bare-metal LoongArch64".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 64,
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::LoongArch64,
options: TargetOptions {
cpu: "generic".into(),
features: "+f,+d,-lsx".into(),
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
llvm_abiname: "lp64d".into(),
max_atomic_width: Some(64),
relocation_model: RelocModel::Static,
panic_strategy: PanicStrategy::Abort,
code_model: Some(CodeModel::Medium),
..Default::default()
},
}
}
}
pub(crate) mod loongarch64_unknown_none_softfloat {
use crate::spec::{
Abi, Arch, Cc, CodeModel, LinkerFlavor, Lld, PanicStrategy,
RelocModel, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "loongarch64-unknown-none".into(),
metadata: TargetMetadata {
description: Some("Freestanding/bare-metal LoongArch64 softfloat".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 64,
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::LoongArch64,
options: TargetOptions {
cpu: "generic".into(),
features: "-f,-d".into(),
abi: Abi::SoftFloat,
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
llvm_abiname: "lp64s".into(),
max_atomic_width: Some(64),
relocation_model: RelocModel::Static,
panic_strategy: PanicStrategy::Abort,
code_model: Some(CodeModel::Medium),
..Default::default()
},
}
}
}
pub(crate) mod aarch64_unknown_none {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel,
SanitizerSet, StackProbeType, Target, TargetMetadata,
TargetOptions,
};
pub(crate) fn target() -> Target {
let opts =
TargetOptions {
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
pre_link_args: TargetOptions::link_args(LinkerFlavor::Gnu(Cc::No,
Lld::No), &["--fix-cortex-a53-843419"]),
features: "+v8a,+strict-align,+neon".into(),
supported_sanitizers: SanitizerSet::KCFI |
SanitizerSet::KERNELADDRESS,
relocation_model: RelocModel::Static,
disable_redzone: true,
max_atomic_width: Some(128),
stack_probes: StackProbeType::Inline,
panic_strategy: PanicStrategy::Abort,
default_uwtable: true,
..Default::default()
};
Target {
llvm_target: "aarch64-unknown-none".into(),
metadata: TargetMetadata {
description: Some("Bare ARM64, hardfloat".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: opts,
}
}
}
pub(crate) mod aarch64_unknown_none_softfloat {
use crate::spec::{
Abi, Arch, Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel,
SanitizerSet, StackProbeType, Target, TargetMetadata,
TargetOptions,
};
pub(crate) fn target() -> Target {
let opts =
TargetOptions {
abi: Abi::SoftFloat,
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
features: "+v8a,+strict-align,-neon".into(),
relocation_model: RelocModel::Static,
disable_redzone: true,
max_atomic_width: Some(128),
supported_sanitizers: SanitizerSet::KCFI |
SanitizerSet::KERNELADDRESS,
stack_probes: StackProbeType::Inline,
panic_strategy: PanicStrategy::Abort,
default_uwtable: true,
..Default::default()
};
Target {
llvm_target: "aarch64-unknown-none".into(),
metadata: TargetMetadata {
description: Some("Bare ARM64, softfloat".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: opts,
}
}
}
pub(crate) mod aarch64_be_unknown_none_softfloat {
use rustc_abi::Endian;
use crate::spec::{
Abi, Arch, Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel,
SanitizerSet, StackProbeType, Target, TargetMetadata,
TargetOptions,
};
pub(crate) fn target() -> Target {
let opts =
TargetOptions {
abi: Abi::SoftFloat,
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
features: "+v8a,+strict-align,-neon".into(),
relocation_model: RelocModel::Static,
disable_redzone: true,
max_atomic_width: Some(128),
supported_sanitizers: SanitizerSet::KCFI |
SanitizerSet::KERNELADDRESS,
stack_probes: StackProbeType::Inline,
panic_strategy: PanicStrategy::Abort,
endian: Endian::Big,
..Default::default()
};
Target {
llvm_target: "aarch64_be-unknown-none".into(),
metadata: TargetMetadata {
description: Some("Bare ARM64 (big-endian), softfloat".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 64,
data_layout: "E-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: opts,
}
}
}
pub(crate) mod aarch64_unknown_nuttx {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, Os, PanicStrategy, RelocModel,
SanitizerSet, StackProbeType, Target, TargetMetadata,
TargetOptions, cvs,
};
pub(crate) fn target() -> Target {
let opts =
TargetOptions {
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
pre_link_args: TargetOptions::link_args(LinkerFlavor::Gnu(Cc::No,
Lld::No), &["--fix-cortex-a53-843419"]),
features: "+v8a,+strict-align,+neon".into(),
supported_sanitizers: SanitizerSet::KCFI |
SanitizerSet::KERNELADDRESS,
relocation_model: RelocModel::Static,
disable_redzone: true,
max_atomic_width: Some(128),
stack_probes: StackProbeType::Inline,
panic_strategy: PanicStrategy::Abort,
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
os: Os::NuttX,
..Default::default()
};
Target {
llvm_target: "aarch64-unknown-none".into(),
metadata: TargetMetadata {
description: Some("AArch64 NuttX".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: opts,
}
}
}
pub(crate) mod 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,
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::{
Abi, Arch, Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel,
SanitizerSet, StackProbeType, Target, TargetMetadata,
TargetOptions,
};
pub(crate) fn target() -> Target {
let opts =
TargetOptions {
abi: Abi::SoftFloat,
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
relocation_model: RelocModel::Static,
disable_redzone: true,
max_atomic_width: Some(128),
supported_sanitizers: SanitizerSet::KCFI |
SanitizerSet::KERNELADDRESS,
stack_probes: StackProbeType::Inline,
panic_strategy: PanicStrategy::Abort,
default_uwtable: true,
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::{
Abi, Arch, Cc, Env, LinkerFlavor, Lld, Os, Target, TargetMetadata,
TargetOptions, cvs,
};
pub(crate) fn target() -> Target {
let pre_link_args =
TargetOptions::link_args(LinkerFlavor::Gnu(Cc::No, Lld::No),
&["-e", "elf_entry", "-Bstatic", "--gc-sections", "-z",
"text", "-z", "norelro", "--no-undefined",
"--error-unresolved-symbols", "--no-undefined-version",
"-Bsymbolic", "--export-dynamic", "-u", "__rust_abort",
"-u", "__rust_c_alloc", "-u", "__rust_c_dealloc", "-u",
"__rust_print_err", "-u", "__rust_rwlock_rdlock", "-u",
"__rust_rwlock_unlock", "-u", "__rust_rwlock_wrlock"]);
const EXPORT_SYMBOLS: &[&str] =
&["sgx_entry", "HEAP_BASE", "HEAP_SIZE", "RELA", "RELACOUNT",
"ENCLAVE_SIZE", "CFGDATA_BASE", "DEBUG",
"EH_FRM_HDR_OFFSET", "EH_FRM_HDR_LEN", "EH_FRM_OFFSET",
"EH_FRM_LEN", "TEXT_BASE", "TEXT_SIZE"];
let opts =
TargetOptions {
os: Os::Unknown,
env: Env::Sgx,
vendor: "fortanix".into(),
abi: Abi::Fortanix,
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
max_atomic_width: Some(64),
cpu: "x86-64".into(),
plt_by_default: false,
features: "+rdrand,+rdseed,+lvi-cfi,+lvi-load-hardening".into(),
llvm_args: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("--x86-experimental-lvi-inline-asm-hardening")]),
position_independent_executables: true,
pre_link_args,
override_export_symbols: Some(EXPORT_SYMBOLS.iter().cloned().map(Cow::from).collect()),
relax_elf_relocations: true,
..Default::default()
};
Target {
llvm_target: "x86_64-elf".into(),
metadata: TargetMetadata {
description: Some("Fortanix ABI for 64-bit Intel SGX".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: opts,
}
}
}
pub(crate) mod x86_64_unknown_uefi {
use rustc_abi::{CanonAbi, X86Call};
use crate::spec::{Arch, RustcAbi, Target, TargetMetadata, base};
pub(crate) fn target() -> Target {
let mut base = base::uefi_msvc::opts();
base.cpu = "x86-64".into();
base.plt_by_default = false;
base.max_atomic_width = Some(64);
base.entry_abi = CanonAbi::X86(X86Call::Win64);
base.features = "-mmx,-sse,+soft-float".into();
base.rustc_abi = Some(RustcAbi::X86Softfloat);
Target {
llvm_target: "x86_64-unknown-windows".into(),
metadata: TargetMetadata {
description: Some("64-bit UEFI".into()),
tier: Some(2),
host_tools: Some(false),
std: None,
},
pointer_width: 64,
data_layout: "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod i686_unknown_uefi {
use crate::spec::{
Arch, LinkerFlavor, Lld, RustcAbi, Target, TargetMetadata,
add_link_args, base,
};
pub(crate) fn target() -> Target {
let mut base = base::uefi_msvc::opts();
base.cpu = "pentium4".into();
base.max_atomic_width = Some(64);
base.features = "-mmx,-sse,+soft-float".into();
base.rustc_abi = Some(RustcAbi::X86Softfloat);
add_link_args(&mut base.post_link_args,
LinkerFlavor::Msvc(Lld::No), &["/DEBUG:NODWARF"]);
Target {
llvm_target: "i686-unknown-windows-gnu".into(),
metadata: TargetMetadata {
description: Some("32-bit UEFI".into()),
tier: Some(2),
host_tools: Some(false),
std: None,
},
pointer_width: 32,
data_layout: "e-m:x-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i64:64-i128:128-f80:32-n8:16:32-a:0:32-S32".into(),
arch: Arch::X86,
options: base,
}
}
}
pub(crate) mod aarch64_unknown_uefi {
use crate::spec::{
Arch, LinkerFlavor, Lld, Target, TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::uefi_msvc::opts();
base.max_atomic_width = Some(128);
base.add_pre_link_args(LinkerFlavor::Msvc(Lld::No),
&["/machine:arm64"]);
base.features = "+v8a".into();
Target {
llvm_target: "aarch64-unknown-windows".into(),
metadata: TargetMetadata {
description: Some("ARM64 UEFI".into()),
tier: Some(2),
host_tools: Some(false),
std: None,
},
pointer_width: 64,
data_layout: "e-m:w-p270:32:32-p271:32:32-p272:64:64-p:64:64-i32:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: base,
}
}
}
pub(crate) mod nvptx64_nvidia_cuda {
use crate::spec::{
Arch, LinkSelfContainedDefault, LinkerFlavor, MergeFunctions, Os,
PanicStrategy, Target, TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
arch: Arch::Nvptx64,
data_layout: "e-p6:32:32-i64:64-i128:128-i256:256-v16:16-v32:32-n16:32:64".into(),
llvm_target: "nvptx64-nvidia-cuda".into(),
metadata: TargetMetadata {
description: Some("--emit=asm generates PTX code that runs on NVIDIA GPUs".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 64,
options: TargetOptions {
os: Os::Cuda,
vendor: "nvidia".into(),
linker_flavor: LinkerFlavor::Llbc,
cpu: "sm_30".into(),
max_atomic_width: Some(64),
panic_strategy: PanicStrategy::Abort,
dynamic_linking: true,
only_cdylib: true,
obj_is_bitcode: true,
is_like_gpu: true,
dll_prefix: "".into(),
dll_suffix: ".ptx".into(),
exe_suffix: ".ptx".into(),
merge_functions: MergeFunctions::Disabled,
supports_stack_protector: false,
link_self_contained: LinkSelfContainedDefault::True,
static_initializer_must_be_acyclic: true,
..Default::default()
},
}
}
}
pub(crate) mod amdgcn_amd_amdhsa {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, Os, PanicStrategy, Target,
TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
arch: Arch::AmdGpu,
data_layout: "e-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,
max_atomic_width: Some(64),
panic_strategy: PanicStrategy::Abort,
no_builtins: true,
simd_types_indirect: false,
is_like_gpu: true,
dynamic_linking: true,
only_cdylib: true,
executables: false,
dll_prefix: "".into(),
dll_suffix: ".elf".into(),
supports_stack_protector: false,
requires_lto: true,
..Default::default()
},
}
}
}
pub(crate) mod xtensa_esp32_none_elf {
use crate::spec::base::xtensa;
use crate::spec::{Arch, Target, TargetMetadata, TargetOptions};
pub(crate) fn target() -> Target {
Target {
llvm_target: "xtensa-none-elf".into(),
pointer_width: 32,
data_layout: "e-m:e-p:32:32-v1:8:8-i64:64-i128:128-n32".into(),
arch: Arch::Xtensa,
metadata: TargetMetadata {
description: Some("Xtensa ESP32".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
options: TargetOptions {
vendor: "espressif".into(),
cpu: "esp32".into(),
linker: Some("xtensa-esp32-elf-gcc".into()),
max_atomic_width: Some(32),
atomic_cas: true,
..xtensa::opts()
},
}
}
}
pub(crate) mod xtensa_esp32_espidf {
use rustc_abi::Endian;
use crate::spec::base::xtensa;
use crate::spec::{
Arch, Env, Os, Target, TargetMetadata, TargetOptions, cvs,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "xtensa-none-elf".into(),
pointer_width: 32,
data_layout: "e-m:e-p:32:32-v1:8:8-i64:64-i128:128-n32".into(),
arch: Arch::Xtensa,
metadata: TargetMetadata {
description: None,
tier: 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-v1:8:8-i64:64-i128:128-n32".into(),
arch: Arch::Xtensa,
metadata: TargetMetadata {
description: Some("Xtensa ESP32-S2".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
options: TargetOptions {
vendor: "espressif".into(),
cpu: "esp32s2".into(),
linker: Some("xtensa-esp32s2-elf-gcc".into()),
max_atomic_width: Some(32),
features: "+forced-atomics".into(),
..xtensa::opts()
},
}
}
}
pub(crate) mod xtensa_esp32s2_espidf {
use rustc_abi::Endian;
use crate::spec::base::xtensa;
use crate::spec::{
Arch, Env, Os, Target, TargetMetadata, TargetOptions, cvs,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "xtensa-none-elf".into(),
pointer_width: 32,
data_layout: "e-m:e-p:32:32-v1:8:8-i64:64-i128:128-n32".into(),
arch: Arch::Xtensa,
metadata: TargetMetadata {
description: None,
tier: 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-v1:8:8-i64:64-i128:128-n32".into(),
arch: Arch::Xtensa,
metadata: TargetMetadata {
description: Some("Xtensa ESP32-S3".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
options: TargetOptions {
vendor: "espressif".into(),
cpu: "esp32s3".into(),
linker: Some("xtensa-esp32s3-elf-gcc".into()),
max_atomic_width: Some(32),
atomic_cas: true,
..xtensa::opts()
},
}
}
}
pub(crate) mod xtensa_esp32s3_espidf {
use rustc_abi::Endian;
use crate::spec::base::xtensa;
use crate::spec::{
Arch, Env, Os, Target, TargetMetadata, TargetOptions, cvs,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "xtensa-none-elf".into(),
pointer_width: 32,
data_layout: "e-m:e-p:32:32-v1:8:8-i64:64-i128:128-n32".into(),
arch: Arch::Xtensa,
metadata: TargetMetadata {
description: None,
tier: 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::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv7-unknown-linux-gnueabihf".into(),
metadata: TargetMetadata {
description: Some("Armv7-A for VxWorks".into()),
tier: Some(3),
host_tools: Some(false),
std: None,
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
features: "+v7,+vfp3d16,+thumb2,-neon".into(),
max_atomic_width: Some(64),
..base::vxworks::opts()
},
}
}
}
pub(crate) mod aarch64_wrs_vxworks {
use crate::spec::{
Arch, StackProbeType, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "aarch64-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: TargetOptions {
features: "+v8a,+reserve-x18".into(),
max_atomic_width: Some(128),
stack_probes: StackProbeType::Inline,
..base::vxworks::opts()
},
}
}
}
pub(crate) mod powerpc_wrs_vxworks {
use rustc_abi::Endian;
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::vxworks::opts();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m32", "--secure-plt"]);
base.max_atomic_width = Some(32);
base.stack_probes = StackProbeType::Inline;
Target {
llvm_target: "powerpc-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "E-m:e-p:32:32-Fn32-i64:64-n32".into(),
arch: Arch::PowerPC,
options: TargetOptions {
endian: Endian::Big,
features: "+secure-plt".into(),
..base
},
}
}
}
pub(crate) mod powerpc_wrs_vxworks_spe {
use rustc_abi::Endian;
use crate::spec::{
Abi, Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::vxworks::opts();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-mspe", "--secure-plt"]);
base.max_atomic_width = Some(32);
base.stack_probes = StackProbeType::Inline;
Target {
llvm_target: "powerpc-unknown-linux-gnuspe".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: Some(false),
std: None,
},
pointer_width: 32,
data_layout: "E-m:e-p:32:32-Fn32-i64:64-n32".into(),
arch: Arch::PowerPC,
options: TargetOptions {
abi: Abi::Spe,
endian: Endian::Big,
features: "+secure-plt,+msync".into(),
..base
},
}
}
}
pub(crate) mod powerpc64_wrs_vxworks {
use rustc_abi::Endian;
use crate::spec::{
Abi, Arch, Cc, LinkerFlavor, Lld, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::vxworks::opts();
base.cpu = "ppc64".into();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.max_atomic_width = Some(64);
base.stack_probes = StackProbeType::Inline;
base.abi = Abi::ElfV1;
base.llvm_abiname = "elfv1".into();
Target {
llvm_target: "powerpc64-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "E-m:e-Fi64-i64:64-i128:128-n32:64-S128-v256:256:256-v512:512:512".into(),
arch: Arch::PowerPC64,
options: TargetOptions { endian: Endian::Big, ..base },
}
}
}
pub(crate) mod riscv32_wrs_vxworks {
use crate::spec::{
Arch, StackProbeType, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "riscv32-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-i64:64-n32-S128".into(),
arch: Arch::RiscV32,
options: TargetOptions {
cpu: "generic-rv32".into(),
llvm_abiname: "ilp32d".into(),
max_atomic_width: Some(32),
features: "+m,+a,+f,+d,+c,+zicsr,+zifencei".into(),
stack_probes: StackProbeType::Inline,
..base::vxworks::opts()
},
}
}
}
pub(crate) mod riscv64_wrs_vxworks {
use crate::spec::{
Arch, StackProbeType, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "riscv64-unknown-linux-gnu".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::RiscV64,
options: TargetOptions {
cpu: "generic-rv64".into(),
llvm_abiname: "lp64d".into(),
max_atomic_width: Some(64),
features: "+m,+a,+f,+d,+c,+zicsr,+zifencei".into(),
stack_probes: StackProbeType::Inline,
..base::vxworks::opts()
},
}
}
}
pub(crate) mod aarch64_kmc_solid_asp3 {
use crate::spec::{
Arch, RelocModel, StackProbeType, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
let base = base::solid::opts();
Target {
llvm_target: "aarch64-unknown-none".into(),
metadata: TargetMetadata {
description: Some("ARM64 SOLID with TOPPERS/ASP3".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: TargetOptions {
linker: Some("aarch64-kmc-elf-gcc".into()),
features: "+v8a,+neon".into(),
relocation_model: RelocModel::Static,
disable_redzone: true,
max_atomic_width: Some(128),
stack_probes: StackProbeType::Inline,
..base
},
}
}
}
pub(crate) mod armv7a_kmc_solid_asp3_eabi {
use crate::spec::{
Abi, Arch, FloatAbi, RelocModel, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
let base = base::solid::opts();
Target {
llvm_target: "armv7a-none-eabi".into(),
metadata: TargetMetadata {
description: Some("Arm SOLID with TOPPERS/ASP3".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
linker: Some("arm-kmc-eabi-gcc".into()),
features: "+v7,+soft-float,+thumb2,-neon".into(),
relocation_model: RelocModel::Static,
disable_redzone: true,
max_atomic_width: Some(64),
..base
},
}
}
}
pub(crate) mod armv7a_kmc_solid_asp3_eabihf {
use crate::spec::{
Abi, Arch, FloatAbi, RelocModel, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
let base = base::solid::opts();
Target {
llvm_target: "armv7a-none-eabihf".into(),
metadata: TargetMetadata {
description: Some("Arm SOLID with TOPPERS/ASP3, hardfloat".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
linker: Some("arm-kmc-eabi-gcc".into()),
features: "+v7,+vfp3d16,+thumb2,-neon".into(),
relocation_model: RelocModel::Static,
disable_redzone: true,
max_atomic_width: Some(64),
..base
},
}
}
}
pub(crate) mod mipsel_sony_psp {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, Os, RelocModel, Target,
TargetMetadata, TargetOptions, cvs,
};
const LINKER_SCRIPT: &str =
"ENTRY(module_start)\nSECTIONS\n{\n /* PRX format requires text to begin at 0 */\n .text 0 : { *(.text .text.*) }\n\n /* Sort stubs for convenient ordering */\n .sceStub.text : { *(.sceStub.text) *(SORT(.sceStub.text.*)) }\n\n /* PSP import library stub sections. Bundles together `.lib.stub.entry.*`\n * sections for better `--gc-sections` support. */\n .lib.stub.top : { *(.lib.stub.top) }\n .lib.stub : { *(.lib.stub) *(.lib.stub.entry.*) }\n .lib.stub.btm : { *(.lib.stub.btm) }\n\n /* Keep these sections around, even though they may appear unused to the linker */\n .lib.ent.top : { KEEP(*(.lib.ent.top)) }\n .lib.ent : { KEEP(*(.lib.ent)) }\n .lib.ent.btm : { KEEP(*(.lib.ent.btm)) }\n\n .eh_frame_hdr : { *(.eh_frame_hdr) }\n\n /* Add symbols for LLVM\'s libunwind */\n __eh_frame_hdr_start = SIZEOF(.eh_frame_hdr) > 0 ? ADDR(.eh_frame_hdr) : 0;\n __eh_frame_hdr_end = SIZEOF(.eh_frame_hdr) > 0 ? . : 0;\n .eh_frame :\n {\n __eh_frame_start = .;\n KEEP(*(.eh_frame))\n __eh_frame_end = .;\n }\n\n /* These are explicitly listed to avoid being merged into .rodata */\n .rodata.sceResident : { *(.rodata.sceResident) *(.rodata.sceResident.*) }\n .rodata.sceModuleInfo : { *(.rodata.sceModuleInfo) }\n /* Sort NIDs for convenient ordering */\n .rodata.sceNid : { *(.rodata.sceNid) *(SORT(.rodata.sceNid.*)) }\n\n .rodata : { *(.rodata .rodata.*) }\n .data : { *(.data .data.*) }\n .gcc_except_table : { *(.gcc_except_table .gcc_except_table.*) }\n .bss : { *(.bss .bss.*) }\n\n /DISCARD/ : { *(.rel.sceStub.text .MIPS.abiflags .reginfo) }\n}\n";
pub(crate) fn target() -> Target {
let pre_link_args =
TargetOptions::link_args(LinkerFlavor::Gnu(Cc::No, Lld::No),
&["--emit-relocs", "--nmagic"]);
Target {
llvm_target: "mipsel-sony-psp".into(),
metadata: TargetMetadata {
description: Some("MIPS (LE) Sony PlatStation Portable (PSP)".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
data_layout: "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64".into(),
arch: Arch::Mips,
options: TargetOptions {
os: Os::Psp,
vendor: "sony".into(),
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
cpu: "mips2".into(),
linker: Some("rust-lld".into()),
relocation_model: RelocModel::Static,
features: "+single-float".into(),
llvm_args: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("-mno-check-zero-division")]),
pre_link_args,
link_script: Some(LINKER_SCRIPT.into()),
..Default::default()
},
}
}
}
pub(crate) mod mipsel_sony_psx {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, Os, PanicStrategy, RelocModel,
Target, TargetMetadata, TargetOptions, cvs,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "mipsel-sony-psx".into(),
metadata: TargetMetadata {
description: Some("MIPS (LE) Sony PlayStation 1 (PSX)".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
data_layout: "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64".into(),
arch: Arch::Mips,
options: TargetOptions {
os: Os::Psx,
vendor: "sony".into(),
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
cpu: "mips1".into(),
executables: true,
linker: Some("rust-lld".into()),
relocation_model: RelocModel::Static,
exe_suffix: ".exe".into(),
features: "+soft-float".into(),
max_atomic_width: Some(0),
llvm_args: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("-mno-check-zero-division")]),
llvm_abiname: "o32".into(),
panic_strategy: PanicStrategy::Abort,
..Default::default()
},
}
}
}
pub(crate) mod mipsel_unknown_none {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel, Target,
TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "mipsel-unknown-none".into(),
metadata: TargetMetadata {
description: Some("Bare MIPS (LE) softfloat".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
data_layout: "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64".into(),
arch: Arch::Mips,
options: TargetOptions {
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
cpu: "mips32r2".into(),
features: "+mips32r2,+soft-float,+noabicalls".into(),
max_atomic_width: Some(32),
linker: Some("rust-lld".into()),
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
emit_debug_gdb_scripts: false,
..Default::default()
},
}
}
}
pub(crate) mod mips_mti_none_elf {
use rustc_abi::Endian;
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel, Target,
TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64".into(),
llvm_target: "mips".into(),
metadata: TargetMetadata {
description: Some("MIPS32r2 BE Baremetal Softfloat".into()),
tier: Some(3),
host_tools: Some(false),
std: None,
},
pointer_width: 32,
arch: Arch::Mips,
options: TargetOptions {
vendor: "mti".into(),
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
endian: Endian::Big,
cpu: "mips32r2".into(),
max_atomic_width: Some(32),
features: "+mips32r2,+soft-float,+noabicalls".into(),
executables: true,
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
emit_debug_gdb_scripts: false,
eh_frame_header: false,
singlethread: true,
..Default::default()
},
}
}
}
pub(crate) mod mipsel_mti_none_elf {
use rustc_abi::Endian;
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel, Target,
TargetMetadata, TargetOptions,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64".into(),
llvm_target: "mipsel".into(),
metadata: TargetMetadata {
description: Some("MIPS32r2 LE Baremetal Softfloat".into()),
tier: Some(3),
host_tools: Some(false),
std: None,
},
pointer_width: 32,
arch: Arch::Mips,
options: TargetOptions {
vendor: "mti".into(),
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
endian: Endian::Little,
cpu: "mips32r2".into(),
max_atomic_width: Some(32),
features: "+mips32r2,+soft-float,+noabicalls".into(),
executables: true,
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
emit_debug_gdb_scripts: false,
eh_frame_header: false,
singlethread: true,
..Default::default()
},
}
}
}
pub(crate) mod armv4t_none_eabi {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
cvs,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv4t-none-eabi".into(),
metadata: TargetMetadata {
description: Some("Bare Armv4T".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
arch: Arch::Arm,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
asm_args: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("-mthumb-interwork"),
::std::borrow::Cow::Borrowed("-march=armv4t"),
::std::borrow::Cow::Borrowed("-mlittle-endian")]),
features: "+soft-float,+strict-align".into(),
atomic_cas: false,
max_atomic_width: Some(0),
has_thumb_interworking: true,
..base::arm_none::opts()
},
}
}
}
pub(crate) mod armv5te_none_eabi {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
cvs,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv5te-none-eabi".into(),
metadata: TargetMetadata {
description: Some("Bare Armv5TE".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
arch: Arch::Arm,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
asm_args: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("-mthumb-interwork"),
::std::borrow::Cow::Borrowed("-march=armv5te"),
::std::borrow::Cow::Borrowed("-mlittle-endian")]),
features: "+soft-float,+strict-align".into(),
atomic_cas: false,
max_atomic_width: Some(0),
has_thumb_interworking: true,
..base::arm_none::opts()
},
}
}
}
pub(crate) mod armv6_none_eabi {
use crate::spec::{
Abi, Arch, 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 {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
asm_args: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("-mthumb-interwork"),
::std::borrow::Cow::Borrowed("-march=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::{
Abi, Arch, 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 {
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
asm_args: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("-mthumb-interwork"),
::std::borrow::Cow::Borrowed("-march=armv6"),
::std::borrow::Cow::Borrowed("-mlittle-endian")]),
features: "+strict-align,+v6k,+vfp2,-d32".into(),
atomic_cas: true,
has_thumb_interworking: true,
max_atomic_width: Some(64),
..base::arm_none::opts()
},
}
}
}
pub(crate) mod thumbv4t_none_eabi {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
cvs,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv4t-none-eabi".into(),
metadata: TargetMetadata {
description: Some("Thumb-mode Bare ARMv4T".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
arch: Arch::Arm,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
asm_args: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("-mthumb-interwork"),
::std::borrow::Cow::Borrowed("-march=armv4t"),
::std::borrow::Cow::Borrowed("-mlittle-endian")]),
features: "+soft-float,+strict-align".into(),
atomic_cas: false,
max_atomic_width: Some(0),
has_thumb_interworking: true,
..base::arm_none::opts()
},
}
}
}
pub(crate) mod thumbv5te_none_eabi {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
cvs,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv5te-none-eabi".into(),
metadata: TargetMetadata {
description: Some("Thumb-mode Bare ARMv5TE".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 32,
arch: Arch::Arm,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
asm_args: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("-mthumb-interwork"),
::std::borrow::Cow::Borrowed("-march=armv5te"),
::std::borrow::Cow::Borrowed("-mlittle-endian")]),
features: "+soft-float,+strict-align".into(),
atomic_cas: false,
max_atomic_width: Some(0),
has_thumb_interworking: true,
..base::arm_none::opts()
},
}
}
}
pub(crate) mod thumbv6_none_eabi {
use crate::spec::{
Abi, Arch, 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 {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
asm_args: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("-mthumb-interwork"),
::std::borrow::Cow::Borrowed("-march=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::{
Abi, Arch, FramePointer, StackProbeType, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "aarch64-unknown-linux-gnu_ilp32".into(),
metadata: TargetMetadata {
description: Some("ARM64 Linux (ILP32 ABI)".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: TargetOptions {
abi: Abi::Ilp32,
features: "+v8a,+outline-atomics".into(),
frame_pointer: FramePointer::NonLeaf,
max_atomic_width: Some(128),
stack_probes: StackProbeType::Inline,
mcount: "\u{1}_mcount".into(),
..base::linux_gnu::opts()
},
}
}
}
pub(crate) mod aarch64_be_unknown_linux_gnu_ilp32 {
use rustc_abi::Endian;
use crate::spec::{
Abi, Arch, FramePointer, StackProbeType, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_gnu::opts();
base.max_atomic_width = Some(128);
Target {
llvm_target: "aarch64_be-unknown-linux-gnu_ilp32".into(),
metadata: TargetMetadata {
description: Some("ARM64 Linux (big-endian, ILP32 ABI)".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "E-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: TargetOptions {
abi: Abi::Ilp32,
features: "+v8a,+outline-atomics".into(),
frame_pointer: FramePointer::NonLeaf,
stack_probes: StackProbeType::Inline,
mcount: "\u{1}_mcount".into(),
endian: Endian::Big,
..base
},
}
}
}
pub(crate) mod bpfeb_unknown_none {
use rustc_abi::Endian;
use crate::spec::{Arch, Target, TargetMetadata, base};
pub(crate) fn target() -> Target {
Target {
llvm_target: "bpfeb".into(),
metadata: TargetMetadata {
description: Some("BPF (big endian)".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
data_layout: "E-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
pointer_width: 64,
arch: Arch::Bpf,
options: base::bpf::opts(Endian::Big),
}
}
}
pub(crate) mod bpfel_unknown_none {
use rustc_abi::Endian;
use crate::spec::{Arch, Target, TargetMetadata, base};
pub(crate) fn target() -> Target {
Target {
llvm_target: "bpfel".into(),
metadata: TargetMetadata {
description: Some("BPF (little endian)".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
pointer_width: 64,
arch: Arch::Bpf,
options: base::bpf::opts(Endian::Little),
}
}
}
pub(crate) mod armv6k_nintendo_3ds {
use crate::spec::{
Abi, Arch, Cc, Env, FloatAbi, LinkerFlavor, Lld, Os, RelocModel,
Target, TargetMetadata, TargetOptions, cvs,
};
pub(crate) fn target() -> Target {
let pre_link_args =
TargetOptions::link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-specs=3dsx.specs", "-mtune=mpcore", "-mfloat-abi=hard",
"-mtp=soft"]);
Target {
llvm_target: "armv6k-none-eabihf".into(),
metadata: TargetMetadata {
description: Some("Armv6K Nintendo 3DS, Horizon (Requires devkitARM toolchain)".into()),
tier: Some(3),
host_tools: Some(false),
std: None,
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
os: Os::Horizon,
env: Env::Newlib,
vendor: "nintendo".into(),
cpu: "mpcore".into(),
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
linker: Some("arm-none-eabi-gcc".into()),
relocation_model: RelocModel::Static,
features: "+vfp2".into(),
pre_link_args,
exe_suffix: ".elf".into(),
no_default_libraries: false,
has_thread_local: true,
..Default::default()
},
}
}
}
pub(crate) mod aarch64_nintendo_switch_freestanding {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, Os, PanicStrategy, RelroLevel,
StackProbeType, Target, TargetMetadata, TargetOptions,
};
const LINKER_SCRIPT: &str =
"OUTPUT_FORMAT(elf64-littleaarch64)\nOUTPUT_ARCH(aarch64)\nENTRY(_start)\n\nPHDRS\n{\n text PT_LOAD FLAGS(5);\n rodata PT_LOAD FLAGS(4);\n data PT_LOAD FLAGS(6);\n bss PT_LOAD FLAGS(6);\n dynamic PT_DYNAMIC;\n}\n\nSECTIONS\n{\n . = 0;\n\n .text : ALIGN(0x1000) {\n HIDDEN(__text_start = .);\n KEEP(*(.text.jmp))\n\n . = 0x80;\n\n *(.text .text.*)\n *(.plt .plt.*)\n }\n\n /* Read-only sections */\n\n . = ALIGN(0x1000);\n\n .module_name : { *(.module_name) } :rodata\n\n .rodata : { *(.rodata .rodata.*) } :rodata\n .hash : { *(.hash) }\n .dynsym : { *(.dynsym .dynsym.*) }\n .dynstr : { *(.dynstr .dynstr.*) }\n .rela.dyn : { *(.rela.dyn) }\n\n .eh_frame : {\n HIDDEN(__eh_frame_start = .);\n *(.eh_frame .eh_frame.*)\n HIDDEN(__eh_frame_end = .);\n }\n\n .eh_frame_hdr : {\n HIDDEN(__eh_frame_hdr_start = .);\n *(.eh_frame_hdr .eh_frame_hdr.*)\n HIDDEN(__eh_frame_hdr_end = .);\n }\n\n /* Read-write sections */\n\n . = ALIGN(0x1000);\n\n .data : {\n *(.data .data.*)\n *(.got .got.*)\n *(.got.plt .got.plt.*)\n } :data\n\n .dynamic : {\n HIDDEN(__dynamic_start = .);\n *(.dynamic)\n }\n\n /* BSS section */\n\n . = ALIGN(0x1000);\n\n .bss : {\n HIDDEN(__bss_start = .);\n *(.bss .bss.*)\n *(COMMON)\n . = ALIGN(8);\n HIDDEN(__bss_end = .);\n } :bss\n}\n";
pub(crate) fn target() -> Target {
Target {
llvm_target: "aarch64-unknown-none".into(),
metadata: TargetMetadata {
description: Some("ARM64 Nintendo Switch, Horizon".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: TargetOptions {
features: "+v8a,+neon,+crypto,+crc".into(),
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
link_script: Some(LINKER_SCRIPT.into()),
os: Os::Horizon,
vendor: "nintendo".into(),
max_atomic_width: Some(128),
stack_probes: StackProbeType::Inline,
panic_strategy: PanicStrategy::Abort,
position_independent_executables: true,
dynamic_linking: true,
relro_level: RelroLevel::Off,
..Default::default()
},
}
}
}
pub(crate) mod armv7_sony_vita_newlibeabihf {
use rustc_abi::Endian;
use crate::spec::{
Abi, Arch, Cc, Env, FloatAbi, LinkerFlavor, Lld, Os, RelocModel,
Target, TargetMetadata, TargetOptions, cvs,
};
pub(crate) fn target() -> Target {
let pre_link_args =
TargetOptions::link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-Wl,-q", "-Wl,--pic-veneer"]);
Target {
llvm_target: "thumbv7a-sony-vita-eabihf".into(),
metadata: TargetMetadata {
description: Some("Armv7-A Cortex-A9 Sony PlayStation Vita (requires VITASDK toolchain)".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
os: Os::Vita,
endian: Endian::Little,
c_int_width: 32,
env: Env::Newlib,
vendor: "sony".into(),
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
linker_flavor: LinkerFlavor::Gnu(Cc::Yes, Lld::No),
no_default_libraries: false,
cpu: "cortex-a9".into(),
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
linker: Some("arm-vita-eabi-gcc".into()),
relocation_model: RelocModel::Static,
features: "+v7,+neon,+vfp3,+thumb2,+thumb-mode".into(),
pre_link_args,
exe_suffix: ".elf".into(),
has_thumb_interworking: true,
max_atomic_width: Some(64),
..Default::default()
},
}
}
}
pub(crate) mod armv7_unknown_linux_uclibceabi {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let base = base::linux_uclibc::opts();
Target {
llvm_target: "armv7-unknown-linux-gnueabi".into(),
metadata: TargetMetadata {
description: Some("Armv7-A Linux with uClibc, softfloat".into()),
tier: Some(3),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
features: "+v7,+thumb2,+soft-float,-neon".into(),
cpu: "generic".into(),
max_atomic_width: Some(64),
mcount: "_mcount".into(),
..base
},
}
}
}
pub(crate) mod armv7_unknown_linux_uclibceabihf {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let base = base::linux_uclibc::opts();
Target {
llvm_target: "armv7-unknown-linux-gnueabihf".into(),
metadata: TargetMetadata {
description: Some("Armv7-A Linux with uClibc, hardfloat".into()),
tier: Some(3),
host_tools: None,
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
features: "+v7,+vfp3d16,+thumb2,-neon".into(),
cpu: "generic".into(),
max_atomic_width: Some(64),
mcount: "_mcount".into(),
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
..base
},
}
}
}
pub(crate) mod x86_64_unknown_none {
use crate::spec::{
Arch, Cc, CodeModel, LinkerFlavor, Lld, PanicStrategy, RelroLevel,
RustcAbi, SanitizerSet, StackProbeType, Target, TargetMetadata,
TargetOptions,
};
pub(crate) fn target() -> Target {
let opts =
TargetOptions {
cpu: "x86-64".into(),
plt_by_default: false,
max_atomic_width: Some(64),
stack_probes: StackProbeType::Inline,
position_independent_executables: true,
static_position_independent_executables: true,
relro_level: RelroLevel::Full,
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
rustc_abi: Some(RustcAbi::X86Softfloat),
features: "-mmx,-sse,-sse2,-sse3,-ssse3,-sse4.1,-sse4.2,-avx,-avx2,+soft-float".into(),
supported_sanitizers: SanitizerSet::KCFI |
SanitizerSet::KERNELADDRESS,
disable_redzone: true,
panic_strategy: PanicStrategy::Abort,
code_model: Some(CodeModel::Kernel),
..Default::default()
};
Target {
llvm_target: "x86_64-unknown-none-elf".into(),
metadata: TargetMetadata {
description: Some("Freestanding/bare-metal x86_64 softfloat".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: opts,
}
}
}
pub(crate) mod aarch64_unknown_teeos {
use crate::spec::{Arch, StackProbeType, Target, TargetMetadata, base};
pub(crate) fn target() -> Target {
let mut base = base::teeos::opts();
base.features = "+strict-align,+neon".into();
base.max_atomic_width = Some(128);
base.stack_probes = StackProbeType::Inline;
Target {
llvm_target: "aarch64-unknown-none".into(),
metadata: TargetMetadata {
description: Some("ARM64 TEEOS".into()),
tier: Some(3),
host_tools: Some(false),
std: None,
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: base,
}
}
}
pub(crate) mod mips64_openwrt_linux_musl {
use rustc_abi::Endian;
use crate::spec::{
Abi, Arch, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_musl::opts();
base.cpu = "mips64r2".into();
base.features = "+mips64r2,+soft-float".into();
base.max_atomic_width = Some(64);
Target {
llvm_target: "mips64-unknown-linux-musl".into(),
metadata: TargetMetadata {
description: Some("MIPS64 for OpenWrt Linux musl 1.2.5".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::Mips64,
options: TargetOptions {
vendor: "openwrt".into(),
abi: Abi::Abi64,
endian: Endian::Big,
mcount: "_mcount".into(),
llvm_abiname: "n64".into(),
..base
},
}
}
}
pub(crate) mod aarch64_unknown_nto_qnx700 {
use crate::spec::base::nto_qnx;
use crate::spec::{Env, Target};
pub(crate) fn target() -> Target {
let mut target = nto_qnx::aarch64();
target.metadata.description =
Some("ARM64 QNX Neutrino 7.0 RTOS".into());
target.options.pre_link_args =
nto_qnx::pre_link_args(nto_qnx::ApiVariant::Default,
nto_qnx::Arch::Aarch64);
target.options.env = Env::Nto70;
target
}
}
pub(crate) mod aarch64_unknown_nto_qnx710 {
use crate::spec::base::nto_qnx;
use crate::spec::{Env, Target};
pub(crate) fn target() -> Target {
let mut target = nto_qnx::aarch64();
target.metadata.description =
Some("ARM64 QNX Neutrino 7.1 RTOS with io-pkt network stack".into());
target.options.pre_link_args =
nto_qnx::pre_link_args(nto_qnx::ApiVariant::Default,
nto_qnx::Arch::Aarch64);
target.options.env = Env::Nto71;
target
}
}
pub(crate) mod aarch64_unknown_nto_qnx710_iosock {
use crate::spec::base::nto_qnx;
use crate::spec::{Env, Target};
pub(crate) fn target() -> Target {
let mut target = nto_qnx::aarch64();
target.metadata.description =
Some("ARM64 QNX Neutrino 7.1 RTOS with io-sock network stack".into());
target.options.pre_link_args =
nto_qnx::pre_link_args(nto_qnx::ApiVariant::IoSock,
nto_qnx::Arch::Aarch64);
target.options.env = Env::Nto71IoSock;
target
}
}
pub(crate) mod aarch64_unknown_nto_qnx800 {
use crate::spec::base::nto_qnx;
use crate::spec::{Env, Target};
pub(crate) fn target() -> Target {
let mut target = nto_qnx::aarch64();
target.metadata.description =
Some("ARM64 QNX Neutrino 8.0 RTOS".into());
target.options.pre_link_args =
nto_qnx::pre_link_args(nto_qnx::ApiVariant::Default,
nto_qnx::Arch::Aarch64);
target.options.env = Env::Nto80;
target
}
}
pub(crate) mod x86_64_pc_nto_qnx710 {
use crate::spec::base::nto_qnx;
use crate::spec::{Env, Target};
pub(crate) fn target() -> Target {
let mut target = nto_qnx::x86_64();
target.metadata.description =
Some("x86 64-bit QNX Neutrino 7.1 RTOS with io-pkt network stack".into());
target.options.pre_link_args =
nto_qnx::pre_link_args(nto_qnx::ApiVariant::Default,
nto_qnx::Arch::X86_64);
target.options.env = Env::Nto71;
target
}
}
pub(crate) mod x86_64_pc_nto_qnx710_iosock {
use crate::spec::base::nto_qnx;
use crate::spec::{Env, Target};
pub(crate) fn target() -> Target {
let mut target = nto_qnx::x86_64();
target.metadata.description =
Some("x86 64-bit QNX Neutrino 7.1 RTOS with io-sock network stack".into());
target.options.pre_link_args =
nto_qnx::pre_link_args(nto_qnx::ApiVariant::IoSock,
nto_qnx::Arch::X86_64);
target.options.env = Env::Nto71IoSock;
target
}
}
pub(crate) mod x86_64_pc_nto_qnx800 {
use crate::spec::base::nto_qnx;
use crate::spec::{Env, Target};
pub(crate) fn target() -> Target {
let mut target = nto_qnx::x86_64();
target.metadata.description =
Some("x86 64-bit QNX Neutrino 8.0 RTOS".into());
target.options.pre_link_args =
nto_qnx::pre_link_args(nto_qnx::ApiVariant::Default,
nto_qnx::Arch::X86_64);
target.options.env = Env::Nto80;
target
}
}
pub(crate) mod i686_pc_nto_qnx700 {
use crate::spec::base::nto_qnx;
use crate::spec::{
Arch, Env, RustcAbi, StackProbeType, Target, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut meta = nto_qnx::meta();
meta.description =
Some("32-bit x86 QNX Neutrino 7.0 RTOS".into());
meta.std = Some(false);
Target {
llvm_target: "i586-pc-unknown".into(),
metadata: meta,
pointer_width: 32,
data_layout: "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
i128:128-f64:32:64-f80:32-n8:16:32-S128".into(),
arch: Arch::X86,
options: TargetOptions {
rustc_abi: Some(RustcAbi::X86Sse2),
cpu: "pentium4".into(),
max_atomic_width: Some(64),
pre_link_args: nto_qnx::pre_link_args(nto_qnx::ApiVariant::Default,
nto_qnx::Arch::I586),
env: Env::Nto70,
vendor: "pc".into(),
stack_probes: StackProbeType::Inline,
..base::nto_qnx::opts()
},
}
}
}
pub(crate) mod aarch64_unknown_linux_ohos {
use crate::spec::{
Arch, FramePointer, SanitizerSet, StackProbeType, Target,
TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_ohos::opts();
base.max_atomic_width = Some(128);
Target {
llvm_target: "aarch64-unknown-linux-ohos".into(),
metadata: TargetMetadata {
description: Some("ARM64 OpenHarmony".into()),
tier: Some(2),
host_tools: Some(true),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
arch: Arch::AArch64,
options: TargetOptions {
frame_pointer: FramePointer::NonLeaf,
mcount: "\u{1}_mcount".into(),
stack_probes: StackProbeType::Inline,
supported_sanitizers: SanitizerSet::ADDRESS |
SanitizerSet::CFI | SanitizerSet::LEAK |
SanitizerSet::MEMORY | SanitizerSet::MEMTAG |
SanitizerSet::THREAD | SanitizerSet::HWADDRESS,
..base
},
}
}
}
pub(crate) mod armv7_unknown_linux_ohos {
use crate::spec::{
Abi, Arch, FloatAbi, Target, TargetMetadata, TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "armv7-unknown-linux-ohos".into(),
metadata: TargetMetadata {
description: Some("Armv7-A OpenHarmony".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
features: "+v7,+thumb2,+soft-float,-neon".into(),
max_atomic_width: Some(64),
mcount: "\u{1}mcount".into(),
..base::linux_ohos::opts()
},
}
}
}
pub(crate) mod loongarch64_unknown_linux_ohos {
use crate::spec::{
Arch, CodeModel, SanitizerSet, Target, TargetMetadata,
TargetOptions, base,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "loongarch64-unknown-linux-ohos".into(),
metadata: TargetMetadata {
description: Some("LoongArch64 OpenHarmony".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
arch: Arch::LoongArch64,
options: TargetOptions {
code_model: Some(CodeModel::Medium),
cpu: "generic".into(),
features: "+f,+d,+lsx".into(),
llvm_abiname: "lp64d".into(),
max_atomic_width: Some(64),
supported_sanitizers: SanitizerSet::ADDRESS |
SanitizerSet::CFI | SanitizerSet::LEAK |
SanitizerSet::MEMORY | SanitizerSet::THREAD,
supports_xray: true,
direct_access_external_data: Some(false),
..base::linux_ohos::opts()
},
}
}
}
pub(crate) mod x86_64_unknown_linux_ohos {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, SanitizerSet, StackProbeType, Target,
TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux_ohos::opts();
base.cpu = "x86-64".into();
base.max_atomic_width = Some(64);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.stack_probes = StackProbeType::Inline;
base.static_position_independent_executables = true;
base.supported_sanitizers =
SanitizerSet::ADDRESS | SanitizerSet::CFI | SanitizerSet::LEAK
| SanitizerSet::MEMORY | SanitizerSet::THREAD;
base.supports_xray = true;
Target {
llvm_target: "x86_64-unknown-linux-ohos".into(),
metadata: TargetMetadata {
description: Some("x86_64 OpenHarmony".into()),
tier: Some(2),
host_tools: Some(false),
std: Some(true),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod x86_64_unknown_linux_none {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, PanicStrategy, StackProbeType,
Target, TargetMetadata, base,
};
pub(crate) fn target() -> Target {
let mut base = base::linux::opts();
base.cpu = "x86-64".into();
base.max_atomic_width = Some(64);
base.stack_probes = StackProbeType::Inline;
base.linker_flavor = LinkerFlavor::Gnu(Cc::No, Lld::Yes);
base.linker = Some("rust-lld".into());
base.panic_strategy = PanicStrategy::Abort;
Target {
llvm_target: "x86_64-unknown-linux-none".into(),
metadata: TargetMetadata {
description: None,
tier: 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::{
Abi, Arch, FloatAbi, Os, Target, TargetMetadata, TargetOptions,
base, cvs,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv6m-none-eabi".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: None,
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
os: Os::NuttX,
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
features: "+strict-align".into(),
max_atomic_width: Some(32),
..base::arm_none::opts()
},
}
}
}
pub(crate) mod thumbv7a_nuttx_eabi {
use crate::spec::{
Abi, Arch, FloatAbi, Os, Target, TargetMetadata, TargetOptions,
base, cvs,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv7a-none-eabi".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: None,
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
os: Os::NuttX,
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
features: "+soft-float,-neon".into(),
max_atomic_width: Some(64),
..base::arm_none::opts()
},
}
}
}
pub(crate) mod thumbv7a_nuttx_eabihf {
use crate::spec::{
Abi, Arch, FloatAbi, Os, Target, TargetMetadata, TargetOptions,
base, cvs,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv7a-none-eabihf".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: None,
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
os: Os::NuttX,
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
features: "+vfp3,+neon".into(),
max_atomic_width: Some(64),
..base::arm_none::opts()
},
}
}
}
pub(crate) mod thumbv7m_nuttx_eabi {
use crate::spec::{
Abi, Arch, FloatAbi, Os, Target, TargetMetadata, TargetOptions,
base, cvs,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv7m-none-eabi".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: None,
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
os: Os::NuttX,
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
max_atomic_width: Some(32),
..base::arm_none::opts()
},
}
}
}
pub(crate) mod thumbv7em_nuttx_eabi {
use crate::spec::{
Abi, Arch, FloatAbi, Os, Target, TargetMetadata, TargetOptions,
base, cvs,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv7em-none-eabi".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: None,
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
os: Os::NuttX,
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
max_atomic_width: Some(32),
..base::arm_none::opts()
},
}
}
}
pub(crate) mod thumbv7em_nuttx_eabihf {
use crate::spec::{
Abi, Arch, FloatAbi, Os, Target, TargetMetadata, TargetOptions,
base, cvs,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv7em-none-eabihf".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: None,
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
os: Os::NuttX,
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
features: "+vfp4d16sp".into(),
max_atomic_width: Some(32),
..base::arm_none::opts()
},
}
}
}
pub(crate) mod thumbv8m_base_nuttx_eabi {
use crate::spec::{
Abi, Arch, FloatAbi, Os, Target, TargetMetadata, TargetOptions,
base, cvs,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv8m.base-none-eabi".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: None,
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
os: Os::NuttX,
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
features: "+strict-align".into(),
max_atomic_width: Some(32),
..base::arm_none::opts()
},
}
}
}
pub(crate) mod thumbv8m_main_nuttx_eabi {
use crate::spec::{
Abi, Arch, FloatAbi, Os, Target, TargetMetadata, TargetOptions,
base, cvs,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv8m.main-none-eabi".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: None,
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
os: Os::NuttX,
abi: Abi::Eabi,
llvm_floatabi: Some(FloatAbi::Soft),
max_atomic_width: Some(32),
..base::arm_none::opts()
},
}
}
}
pub(crate) mod thumbv8m_main_nuttx_eabihf {
use crate::spec::{
Abi, Arch, FloatAbi, Os, Target, TargetMetadata, TargetOptions,
base, cvs,
};
pub(crate) fn target() -> Target {
Target {
llvm_target: "thumbv8m.main-none-eabihf".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: None,
std: Some(true),
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".into(),
arch: Arch::Arm,
options: TargetOptions {
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
os: Os::NuttX,
abi: Abi::EabiHf,
llvm_floatabi: Some(FloatAbi::Hard),
features: "+fp-armv8d16sp".into(),
max_atomic_width: Some(32),
..base::arm_none::opts()
},
}
}
}
pub(crate) mod riscv32imc_unknown_nuttx_elf {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, Os, PanicStrategy, RelocModel,
Target, TargetMetadata, TargetOptions, cvs,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:e-p:32:32-i64:64-n32-S128".into(),
llvm_target: "riscv32".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: None,
std: Some(true),
},
pointer_width: 32,
arch: Arch::RiscV32,
options: TargetOptions {
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
os: Os::NuttX,
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
cpu: "generic-rv32".into(),
max_atomic_width: Some(32),
features: "+m,+c".into(),
llvm_abiname: "ilp32".into(),
panic_strategy: PanicStrategy::Unwind,
relocation_model: RelocModel::Static,
..Default::default()
},
}
}
}
pub(crate) mod riscv32imac_unknown_nuttx_elf {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, Os, PanicStrategy, RelocModel,
Target, TargetMetadata, TargetOptions, cvs,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:e-p:32:32-i64:64-n32-S128".into(),
llvm_target: "riscv32".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: None,
std: Some(true),
},
pointer_width: 32,
arch: Arch::RiscV32,
options: TargetOptions {
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
os: Os::NuttX,
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
cpu: "generic-rv32".into(),
max_atomic_width: Some(32),
features: "+m,+a,+c".into(),
llvm_abiname: "ilp32".into(),
panic_strategy: PanicStrategy::Unwind,
relocation_model: RelocModel::Static,
..Default::default()
},
}
}
}
pub(crate) mod riscv32imafc_unknown_nuttx_elf {
use crate::spec::{
Arch, Cc, LinkerFlavor, Lld, Os, PanicStrategy, RelocModel,
Target, TargetMetadata, TargetOptions, cvs,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:e-p:32:32-i64:64-n32-S128".into(),
llvm_target: "riscv32".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: None,
std: Some(true),
},
pointer_width: 32,
arch: Arch::RiscV32,
options: TargetOptions {
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
os: Os::NuttX,
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
cpu: "generic-rv32".into(),
max_atomic_width: Some(32),
llvm_abiname: "ilp32f".into(),
features: "+m,+a,+c,+f".into(),
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
emit_debug_gdb_scripts: false,
eh_frame_header: false,
..Default::default()
},
}
}
}
pub(crate) mod riscv64imac_unknown_nuttx_elf {
use crate::spec::{
Arch, Cc, CodeModel, LinkerFlavor, Lld, Os, PanicStrategy,
RelocModel, SanitizerSet, Target, TargetMetadata, TargetOptions,
cvs,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: None,
std: Some(true),
},
llvm_target: "riscv64".into(),
pointer_width: 64,
arch: Arch::RiscV64,
options: TargetOptions {
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
os: Os::NuttX,
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
cpu: "generic-rv64".into(),
max_atomic_width: Some(64),
features: "+m,+a,+c".into(),
llvm_abiname: "lp64".into(),
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
code_model: Some(CodeModel::Medium),
emit_debug_gdb_scripts: false,
eh_frame_header: false,
supported_sanitizers: SanitizerSet::KERNELADDRESS,
..Default::default()
},
}
}
}
pub(crate) mod riscv64gc_unknown_nuttx_elf {
use crate::spec::{
Arch, Cc, CodeModel, LinkerFlavor, Lld, Os, PanicStrategy,
RelocModel, SanitizerSet, Target, TargetMetadata, TargetOptions,
cvs,
};
pub(crate) fn target() -> Target {
Target {
data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
metadata: TargetMetadata {
description: None,
tier: Some(3),
host_tools: None,
std: Some(true),
},
llvm_target: "riscv64".into(),
pointer_width: 64,
arch: Arch::RiscV64,
options: TargetOptions {
families: ::std::borrow::Cow::Borrowed(&[::std::borrow::Cow::Borrowed("unix")]),
os: Os::NuttX,
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
linker: Some("rust-lld".into()),
llvm_abiname: "lp64d".into(),
cpu: "generic-rv64".into(),
max_atomic_width: Some(64),
features: "+m,+a,+f,+d,+c,+zicsr,+zifencei".into(),
panic_strategy: PanicStrategy::Abort,
relocation_model: RelocModel::Static,
code_model: Some(CodeModel::Medium),
emit_debug_gdb_scripts: false,
eh_frame_header: false,
supported_sanitizers: SanitizerSet::KERNELADDRESS,
..Default::default()
},
}
}
}
pub(crate) mod x86_64_lynx_lynxos178 {
use crate::spec::{Arch, SanitizerSet, StackProbeType, Target, base};
pub(crate) fn target() -> Target {
let mut base = base::lynxos178::opts();
base.cpu = "x86-64".into();
base.plt_by_default = false;
base.max_atomic_width = Some(64);
base.stack_probes = StackProbeType::Inline;
base.static_position_independent_executables = false;
base.supported_sanitizers =
SanitizerSet::ADDRESS | SanitizerSet::CFI | SanitizerSet::KCFI
| SanitizerSet::DATAFLOW | SanitizerSet::LEAK |
SanitizerSet::MEMORY | SanitizerSet::SAFESTACK |
SanitizerSet::THREAD;
base.supports_xray = true;
Target {
llvm_target: "x86_64-unknown-unknown-gnu".into(),
metadata: crate::spec::TargetMetadata {
description: Some("LynxOS-178".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(false),
},
pointer_width: 64,
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
}
}
}
pub(crate) mod x86_64_pc_cygwin {
use crate::spec::{Arch, Cc, LinkerFlavor, Lld, Target, base};
pub(crate) fn target() -> Target {
let mut base = base::cygwin::opts();
base.cpu = "x86-64".into();
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::No, Lld::No),
&["-m", "i386pep"]);
base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No),
&["-m64"]);
base.max_atomic_width = Some(64);
base.linker = Some("x86_64-pc-cygwin-gcc".into());
Target {
llvm_target: "x86_64-pc-cygwin".into(),
pointer_width: 64,
data_layout: "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
arch: Arch::X86_64,
options: base,
metadata: crate::spec::TargetMetadata {
description: Some("64-bit x86 Cygwin".into()),
tier: Some(3),
host_tools: Some(false),
std: Some(true),
},
}
}
}
pub(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 static TARGETS: &[&str] =
&["x86_64-unknown-linux-gnu", "x86_64-unknown-linux-gnux32",
"i686-unknown-linux-gnu", "i586-unknown-linux-gnu",
"loongarch64-unknown-linux-gnu",
"loongarch64-unknown-linux-musl", "m68k-unknown-linux-gnu",
"m68k-unknown-none-elf", "csky-unknown-linux-gnuabiv2",
"csky-unknown-linux-gnuabiv2hf", "mips-unknown-linux-gnu",
"mips64-unknown-linux-gnuabi64",
"mips64el-unknown-linux-gnuabi64",
"mipsisa32r6-unknown-linux-gnu",
"mipsisa32r6el-unknown-linux-gnu",
"mipsisa64r6-unknown-linux-gnuabi64",
"mipsisa64r6el-unknown-linux-gnuabi64",
"mipsel-unknown-linux-gnu", "powerpc-unknown-linux-gnu",
"powerpc-unknown-linux-gnuspe", "powerpc-unknown-linux-musl",
"powerpc-unknown-linux-muslspe", "powerpc64-ibm-aix",
"powerpc64-unknown-linux-gnu", "powerpc64-unknown-linux-musl",
"powerpc64le-unknown-linux-gnu",
"powerpc64le-unknown-linux-musl", "s390x-unknown-linux-gnu",
"s390x-unknown-linux-musl", "sparc-unknown-linux-gnu",
"sparc64-unknown-linux-gnu", "arm-unknown-linux-gnueabi",
"arm-unknown-linux-gnueabihf", "armeb-unknown-linux-gnueabi",
"arm-unknown-linux-musleabi", "arm-unknown-linux-musleabihf",
"armv4t-unknown-linux-gnueabi",
"armv5te-unknown-linux-gnueabi",
"armv5te-unknown-linux-musleabi",
"armv5te-unknown-linux-uclibceabi",
"armv7-unknown-linux-gnueabi",
"armv7-unknown-linux-gnueabihf",
"thumbv7neon-unknown-linux-gnueabihf",
"thumbv7neon-unknown-linux-musleabihf",
"armv7-unknown-linux-musleabi",
"armv7-unknown-linux-musleabihf", "aarch64-unknown-linux-gnu",
"aarch64-unknown-linux-musl", "aarch64_be-unknown-linux-musl",
"x86_64-unknown-linux-musl", "i686-unknown-linux-musl",
"i586-unknown-linux-musl", "mips-unknown-linux-musl",
"mipsel-unknown-linux-musl", "mips64-unknown-linux-muslabi64",
"mips64el-unknown-linux-muslabi64",
"hexagon-unknown-linux-musl", "hexagon-unknown-none-elf",
"hexagon-unknown-qurt", "mips-unknown-linux-uclibc",
"mipsel-unknown-linux-uclibc", "i686-linux-android",
"x86_64-linux-android", "arm-linux-androideabi",
"armv7-linux-androideabi", "thumbv7neon-linux-androideabi",
"aarch64-linux-android", "riscv64-linux-android",
"aarch64-unknown-freebsd", "armv6-unknown-freebsd",
"armv7-unknown-freebsd", "i686-unknown-freebsd",
"powerpc-unknown-freebsd", "powerpc64-unknown-freebsd",
"powerpc64le-unknown-freebsd", "riscv64gc-unknown-freebsd",
"x86_64-unknown-freebsd", "x86_64-unknown-dragonfly",
"aarch64-unknown-openbsd", "i686-unknown-openbsd",
"powerpc-unknown-openbsd", "powerpc64-unknown-openbsd",
"riscv64gc-unknown-openbsd", "sparc64-unknown-openbsd",
"x86_64-unknown-openbsd", "aarch64-unknown-netbsd",
"aarch64_be-unknown-netbsd", "armv6-unknown-netbsd-eabihf",
"armv7-unknown-netbsd-eabihf", "i586-unknown-netbsd",
"i686-unknown-netbsd", "mipsel-unknown-netbsd",
"powerpc-unknown-netbsd", "riscv64gc-unknown-netbsd",
"sparc64-unknown-netbsd", "x86_64-unknown-netbsd",
"i686-unknown-haiku", "x86_64-unknown-haiku",
"aarch64-unknown-helenos", "i686-unknown-helenos",
"powerpc-unknown-helenos", "sparc64-unknown-helenos",
"x86_64-unknown-helenos", "i686-unknown-hurd-gnu",
"x86_64-unknown-hurd-gnu", "aarch64-apple-darwin",
"arm64e-apple-darwin", "x86_64-apple-darwin",
"x86_64h-apple-darwin", "i686-apple-darwin",
"aarch64-unknown-fuchsia", "riscv64gc-unknown-fuchsia",
"x86_64-unknown-fuchsia", "avr-none",
"x86_64-unknown-l4re-uclibc", "aarch64-unknown-redox",
"i586-unknown-redox", "riscv64gc-unknown-redox",
"x86_64-unknown-redox", "x86_64-unknown-managarm-mlibc",
"aarch64-unknown-managarm-mlibc",
"riscv64gc-unknown-managarm-mlibc", "i386-apple-ios",
"x86_64-apple-ios", "aarch64-apple-ios", "arm64e-apple-ios",
"armv7s-apple-ios", "x86_64-apple-ios-macabi",
"aarch64-apple-ios-macabi", "aarch64-apple-ios-sim",
"aarch64-apple-tvos", "aarch64-apple-tvos-sim",
"arm64e-apple-tvos", "x86_64-apple-tvos",
"armv7k-apple-watchos", "arm64_32-apple-watchos",
"x86_64-apple-watchos-sim", "aarch64-apple-watchos",
"aarch64-apple-watchos-sim", "aarch64-apple-visionos",
"aarch64-apple-visionos-sim", "armebv7r-none-eabi",
"armebv7r-none-eabihf", "armv7r-none-eabi",
"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", "armv7a-vex-v5", "msp430-none-elf",
"aarch64_be-unknown-hermit", "aarch64-unknown-hermit",
"riscv64gc-unknown-hermit", "x86_64-unknown-hermit",
"x86_64-unknown-motor", "x86_64-unikraft-linux-musl",
"armv7-unknown-trusty", "aarch64-unknown-trusty",
"x86_64-unknown-trusty", "riscv32i-unknown-none-elf",
"riscv32im-risc0-zkvm-elf", "riscv32im-unknown-none-elf",
"riscv32ima-unknown-none-elf", "riscv32imc-unknown-none-elf",
"riscv32imc-esp-espidf", "riscv32imac-esp-espidf",
"riscv32imafc-esp-espidf", "riscv32e-unknown-none-elf",
"riscv32em-unknown-none-elf", "riscv32emc-unknown-none-elf",
"riscv32imac-unknown-none-elf",
"riscv32imafc-unknown-none-elf",
"riscv32imac-unknown-xous-elf", "riscv32gc-unknown-linux-gnu",
"riscv32gc-unknown-linux-musl", "riscv64im-unknown-none-elf",
"riscv64imac-unknown-none-elf", "riscv64gc-unknown-none-elf",
"riscv64gc-unknown-linux-gnu", "riscv64gc-unknown-linux-musl",
"riscv64a23-unknown-linux-gnu", "sparc-unknown-none-elf",
"loongarch32-unknown-none",
"loongarch32-unknown-none-softfloat",
"loongarch64-unknown-none",
"loongarch64-unknown-none-softfloat", "aarch64-unknown-none",
"aarch64-unknown-none-softfloat",
"aarch64_be-unknown-none-softfloat", "aarch64-unknown-nuttx",
"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",
"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-nto-qnx800", "x86_64-pc-nto-qnx710",
"x86_64-pc-nto-qnx710_iosock", "x86_64-pc-nto-qnx800",
"i686-pc-nto-qnx700", "aarch64-unknown-linux-ohos",
"armv7-unknown-linux-ohos", "loongarch64-unknown-linux-ohos",
"x86_64-unknown-linux-ohos", "x86_64-unknown-linux-none",
"thumbv6m-nuttx-eabi", "thumbv7a-nuttx-eabi",
"thumbv7a-nuttx-eabihf", "thumbv7m-nuttx-eabi",
"thumbv7em-nuttx-eabi", "thumbv7em-nuttx-eabihf",
"thumbv8m.base-nuttx-eabi", "thumbv8m.main-nuttx-eabi",
"thumbv8m.main-nuttx-eabihf", "riscv32imc-unknown-nuttx-elf",
"riscv32imac-unknown-nuttx-elf",
"riscv32imafc-unknown-nuttx-elf",
"riscv64imac-unknown-nuttx-elf",
"riscv64gc-unknown-nuttx-elf", "x86_64-lynx-lynxos178",
"x86_64-pc-cygwin", "x86_64-unknown-linux-gnuasan"];
fn load_builtin(target: &str) -> Option<Target> {
let t =
match target {
"x86_64-unknown-linux-gnu" =>
targets::x86_64_unknown_linux_gnu::target(),
"x86_64-unknown-linux-gnux32" =>
targets::x86_64_unknown_linux_gnux32::target(),
"i686-unknown-linux-gnu" =>
targets::i686_unknown_linux_gnu::target(),
"i586-unknown-linux-gnu" =>
targets::i586_unknown_linux_gnu::target(),
"loongarch64-unknown-linux-gnu" =>
targets::loongarch64_unknown_linux_gnu::target(),
"loongarch64-unknown-linux-musl" =>
targets::loongarch64_unknown_linux_musl::target(),
"m68k-unknown-linux-gnu" =>
targets::m68k_unknown_linux_gnu::target(),
"m68k-unknown-none-elf" =>
targets::m68k_unknown_none_elf::target(),
"csky-unknown-linux-gnuabiv2" =>
targets::csky_unknown_linux_gnuabiv2::target(),
"csky-unknown-linux-gnuabiv2hf" =>
targets::csky_unknown_linux_gnuabiv2hf::target(),
"mips-unknown-linux-gnu" =>
targets::mips_unknown_linux_gnu::target(),
"mips64-unknown-linux-gnuabi64" =>
targets::mips64_unknown_linux_gnuabi64::target(),
"mips64el-unknown-linux-gnuabi64" =>
targets::mips64el_unknown_linux_gnuabi64::target(),
"mipsisa32r6-unknown-linux-gnu" =>
targets::mipsisa32r6_unknown_linux_gnu::target(),
"mipsisa32r6el-unknown-linux-gnu" =>
targets::mipsisa32r6el_unknown_linux_gnu::target(),
"mipsisa64r6-unknown-linux-gnuabi64" =>
targets::mipsisa64r6_unknown_linux_gnuabi64::target(),
"mipsisa64r6el-unknown-linux-gnuabi64" =>
targets::mipsisa64r6el_unknown_linux_gnuabi64::target(),
"mipsel-unknown-linux-gnu" =>
targets::mipsel_unknown_linux_gnu::target(),
"powerpc-unknown-linux-gnu" =>
targets::powerpc_unknown_linux_gnu::target(),
"powerpc-unknown-linux-gnuspe" =>
targets::powerpc_unknown_linux_gnuspe::target(),
"powerpc-unknown-linux-musl" =>
targets::powerpc_unknown_linux_musl::target(),
"powerpc-unknown-linux-muslspe" =>
targets::powerpc_unknown_linux_muslspe::target(),
"powerpc64-ibm-aix" => targets::powerpc64_ibm_aix::target(),
"powerpc64-unknown-linux-gnu" =>
targets::powerpc64_unknown_linux_gnu::target(),
"powerpc64-unknown-linux-musl" =>
targets::powerpc64_unknown_linux_musl::target(),
"powerpc64le-unknown-linux-gnu" =>
targets::powerpc64le_unknown_linux_gnu::target(),
"powerpc64le-unknown-linux-musl" =>
targets::powerpc64le_unknown_linux_musl::target(),
"s390x-unknown-linux-gnu" =>
targets::s390x_unknown_linux_gnu::target(),
"s390x-unknown-linux-musl" =>
targets::s390x_unknown_linux_musl::target(),
"sparc-unknown-linux-gnu" =>
targets::sparc_unknown_linux_gnu::target(),
"sparc64-unknown-linux-gnu" =>
targets::sparc64_unknown_linux_gnu::target(),
"arm-unknown-linux-gnueabi" =>
targets::arm_unknown_linux_gnueabi::target(),
"arm-unknown-linux-gnueabihf" =>
targets::arm_unknown_linux_gnueabihf::target(),
"armeb-unknown-linux-gnueabi" =>
targets::armeb_unknown_linux_gnueabi::target(),
"arm-unknown-linux-musleabi" =>
targets::arm_unknown_linux_musleabi::target(),
"arm-unknown-linux-musleabihf" =>
targets::arm_unknown_linux_musleabihf::target(),
"armv4t-unknown-linux-gnueabi" =>
targets::armv4t_unknown_linux_gnueabi::target(),
"armv5te-unknown-linux-gnueabi" =>
targets::armv5te_unknown_linux_gnueabi::target(),
"armv5te-unknown-linux-musleabi" =>
targets::armv5te_unknown_linux_musleabi::target(),
"armv5te-unknown-linux-uclibceabi" =>
targets::armv5te_unknown_linux_uclibceabi::target(),
"armv7-unknown-linux-gnueabi" =>
targets::armv7_unknown_linux_gnueabi::target(),
"armv7-unknown-linux-gnueabihf" =>
targets::armv7_unknown_linux_gnueabihf::target(),
"thumbv7neon-unknown-linux-gnueabihf" =>
targets::thumbv7neon_unknown_linux_gnueabihf::target(),
"thumbv7neon-unknown-linux-musleabihf" =>
targets::thumbv7neon_unknown_linux_musleabihf::target(),
"armv7-unknown-linux-musleabi" =>
targets::armv7_unknown_linux_musleabi::target(),
"armv7-unknown-linux-musleabihf" =>
targets::armv7_unknown_linux_musleabihf::target(),
"aarch64-unknown-linux-gnu" =>
targets::aarch64_unknown_linux_gnu::target(),
"aarch64-unknown-linux-musl" =>
targets::aarch64_unknown_linux_musl::target(),
"aarch64_be-unknown-linux-musl" =>
targets::aarch64_be_unknown_linux_musl::target(),
"x86_64-unknown-linux-musl" =>
targets::x86_64_unknown_linux_musl::target(),
"i686-unknown-linux-musl" =>
targets::i686_unknown_linux_musl::target(),
"i586-unknown-linux-musl" =>
targets::i586_unknown_linux_musl::target(),
"mips-unknown-linux-musl" =>
targets::mips_unknown_linux_musl::target(),
"mipsel-unknown-linux-musl" =>
targets::mipsel_unknown_linux_musl::target(),
"mips64-unknown-linux-muslabi64" =>
targets::mips64_unknown_linux_muslabi64::target(),
"mips64el-unknown-linux-muslabi64" =>
targets::mips64el_unknown_linux_muslabi64::target(),
"hexagon-unknown-linux-musl" =>
targets::hexagon_unknown_linux_musl::target(),
"hexagon-unknown-none-elf" =>
targets::hexagon_unknown_none_elf::target(),
"hexagon-unknown-qurt" => targets::hexagon_unknown_qurt::target(),
"mips-unknown-linux-uclibc" =>
targets::mips_unknown_linux_uclibc::target(),
"mipsel-unknown-linux-uclibc" =>
targets::mipsel_unknown_linux_uclibc::target(),
"i686-linux-android" => targets::i686_linux_android::target(),
"x86_64-linux-android" => targets::x86_64_linux_android::target(),
"arm-linux-androideabi" =>
targets::arm_linux_androideabi::target(),
"armv7-linux-androideabi" =>
targets::armv7_linux_androideabi::target(),
"thumbv7neon-linux-androideabi" =>
targets::thumbv7neon_linux_androideabi::target(),
"aarch64-linux-android" =>
targets::aarch64_linux_android::target(),
"riscv64-linux-android" =>
targets::riscv64_linux_android::target(),
"aarch64-unknown-freebsd" =>
targets::aarch64_unknown_freebsd::target(),
"armv6-unknown-freebsd" =>
targets::armv6_unknown_freebsd::target(),
"armv7-unknown-freebsd" =>
targets::armv7_unknown_freebsd::target(),
"i686-unknown-freebsd" => targets::i686_unknown_freebsd::target(),
"powerpc-unknown-freebsd" =>
targets::powerpc_unknown_freebsd::target(),
"powerpc64-unknown-freebsd" =>
targets::powerpc64_unknown_freebsd::target(),
"powerpc64le-unknown-freebsd" =>
targets::powerpc64le_unknown_freebsd::target(),
"riscv64gc-unknown-freebsd" =>
targets::riscv64gc_unknown_freebsd::target(),
"x86_64-unknown-freebsd" =>
targets::x86_64_unknown_freebsd::target(),
"x86_64-unknown-dragonfly" =>
targets::x86_64_unknown_dragonfly::target(),
"aarch64-unknown-openbsd" =>
targets::aarch64_unknown_openbsd::target(),
"i686-unknown-openbsd" => targets::i686_unknown_openbsd::target(),
"powerpc-unknown-openbsd" =>
targets::powerpc_unknown_openbsd::target(),
"powerpc64-unknown-openbsd" =>
targets::powerpc64_unknown_openbsd::target(),
"riscv64gc-unknown-openbsd" =>
targets::riscv64gc_unknown_openbsd::target(),
"sparc64-unknown-openbsd" =>
targets::sparc64_unknown_openbsd::target(),
"x86_64-unknown-openbsd" =>
targets::x86_64_unknown_openbsd::target(),
"aarch64-unknown-netbsd" =>
targets::aarch64_unknown_netbsd::target(),
"aarch64_be-unknown-netbsd" =>
targets::aarch64_be_unknown_netbsd::target(),
"armv6-unknown-netbsd-eabihf" =>
targets::armv6_unknown_netbsd_eabihf::target(),
"armv7-unknown-netbsd-eabihf" =>
targets::armv7_unknown_netbsd_eabihf::target(),
"i586-unknown-netbsd" => targets::i586_unknown_netbsd::target(),
"i686-unknown-netbsd" => targets::i686_unknown_netbsd::target(),
"mipsel-unknown-netbsd" =>
targets::mipsel_unknown_netbsd::target(),
"powerpc-unknown-netbsd" =>
targets::powerpc_unknown_netbsd::target(),
"riscv64gc-unknown-netbsd" =>
targets::riscv64gc_unknown_netbsd::target(),
"sparc64-unknown-netbsd" =>
targets::sparc64_unknown_netbsd::target(),
"x86_64-unknown-netbsd" =>
targets::x86_64_unknown_netbsd::target(),
"i686-unknown-haiku" => targets::i686_unknown_haiku::target(),
"x86_64-unknown-haiku" => targets::x86_64_unknown_haiku::target(),
"aarch64-unknown-helenos" =>
targets::aarch64_unknown_helenos::target(),
"i686-unknown-helenos" => targets::i686_unknown_helenos::target(),
"powerpc-unknown-helenos" =>
targets::powerpc_unknown_helenos::target(),
"sparc64-unknown-helenos" =>
targets::sparc64_unknown_helenos::target(),
"x86_64-unknown-helenos" =>
targets::x86_64_unknown_helenos::target(),
"i686-unknown-hurd-gnu" =>
targets::i686_unknown_hurd_gnu::target(),
"x86_64-unknown-hurd-gnu" =>
targets::x86_64_unknown_hurd_gnu::target(),
"aarch64-apple-darwin" => targets::aarch64_apple_darwin::target(),
"arm64e-apple-darwin" => targets::arm64e_apple_darwin::target(),
"x86_64-apple-darwin" => targets::x86_64_apple_darwin::target(),
"x86_64h-apple-darwin" => targets::x86_64h_apple_darwin::target(),
"i686-apple-darwin" => targets::i686_apple_darwin::target(),
"aarch64-unknown-fuchsia" =>
targets::aarch64_unknown_fuchsia::target(),
"riscv64gc-unknown-fuchsia" =>
targets::riscv64gc_unknown_fuchsia::target(),
"x86_64-unknown-fuchsia" =>
targets::x86_64_unknown_fuchsia::target(),
"avr-none" => targets::avr_none::target(),
"x86_64-unknown-l4re-uclibc" =>
targets::x86_64_unknown_l4re_uclibc::target(),
"aarch64-unknown-redox" =>
targets::aarch64_unknown_redox::target(),
"i586-unknown-redox" => targets::i586_unknown_redox::target(),
"riscv64gc-unknown-redox" =>
targets::riscv64gc_unknown_redox::target(),
"x86_64-unknown-redox" => targets::x86_64_unknown_redox::target(),
"x86_64-unknown-managarm-mlibc" =>
targets::x86_64_unknown_managarm_mlibc::target(),
"aarch64-unknown-managarm-mlibc" =>
targets::aarch64_unknown_managarm_mlibc::target(),
"riscv64gc-unknown-managarm-mlibc" =>
targets::riscv64gc_unknown_managarm_mlibc::target(),
"i386-apple-ios" => targets::i386_apple_ios::target(),
"x86_64-apple-ios" => targets::x86_64_apple_ios::target(),
"aarch64-apple-ios" => targets::aarch64_apple_ios::target(),
"arm64e-apple-ios" => targets::arm64e_apple_ios::target(),
"armv7s-apple-ios" => targets::armv7s_apple_ios::target(),
"x86_64-apple-ios-macabi" =>
targets::x86_64_apple_ios_macabi::target(),
"aarch64-apple-ios-macabi" =>
targets::aarch64_apple_ios_macabi::target(),
"aarch64-apple-ios-sim" =>
targets::aarch64_apple_ios_sim::target(),
"aarch64-apple-tvos" => targets::aarch64_apple_tvos::target(),
"aarch64-apple-tvos-sim" =>
targets::aarch64_apple_tvos_sim::target(),
"arm64e-apple-tvos" => targets::arm64e_apple_tvos::target(),
"x86_64-apple-tvos" => targets::x86_64_apple_tvos::target(),
"armv7k-apple-watchos" => targets::armv7k_apple_watchos::target(),
"arm64_32-apple-watchos" =>
targets::arm64_32_apple_watchos::target(),
"x86_64-apple-watchos-sim" =>
targets::x86_64_apple_watchos_sim::target(),
"aarch64-apple-watchos" =>
targets::aarch64_apple_watchos::target(),
"aarch64-apple-watchos-sim" =>
targets::aarch64_apple_watchos_sim::target(),
"aarch64-apple-visionos" =>
targets::aarch64_apple_visionos::target(),
"aarch64-apple-visionos-sim" =>
targets::aarch64_apple_visionos_sim::target(),
"armebv7r-none-eabi" => targets::armebv7r_none_eabi::target(),
"armebv7r-none-eabihf" => targets::armebv7r_none_eabihf::target(),
"armv7r-none-eabi" => targets::armv7r_none_eabi::target(),
"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(),
"armv7a-vex-v5" => targets::armv7a_vex_v5::target(),
"msp430-none-elf" => targets::msp430_none_elf::target(),
"aarch64_be-unknown-hermit" =>
targets::aarch64_be_unknown_hermit::target(),
"aarch64-unknown-hermit" =>
targets::aarch64_unknown_hermit::target(),
"riscv64gc-unknown-hermit" =>
targets::riscv64gc_unknown_hermit::target(),
"x86_64-unknown-hermit" =>
targets::x86_64_unknown_hermit::target(),
"x86_64-unknown-motor" => targets::x86_64_unknown_motor::target(),
"x86_64-unikraft-linux-musl" =>
targets::x86_64_unikraft_linux_musl::target(),
"armv7-unknown-trusty" => targets::armv7_unknown_trusty::target(),
"aarch64-unknown-trusty" =>
targets::aarch64_unknown_trusty::target(),
"x86_64-unknown-trusty" =>
targets::x86_64_unknown_trusty::target(),
"riscv32i-unknown-none-elf" =>
targets::riscv32i_unknown_none_elf::target(),
"riscv32im-risc0-zkvm-elf" =>
targets::riscv32im_risc0_zkvm_elf::target(),
"riscv32im-unknown-none-elf" =>
targets::riscv32im_unknown_none_elf::target(),
"riscv32ima-unknown-none-elf" =>
targets::riscv32ima_unknown_none_elf::target(),
"riscv32imc-unknown-none-elf" =>
targets::riscv32imc_unknown_none_elf::target(),
"riscv32imc-esp-espidf" =>
targets::riscv32imc_esp_espidf::target(),
"riscv32imac-esp-espidf" =>
targets::riscv32imac_esp_espidf::target(),
"riscv32imafc-esp-espidf" =>
targets::riscv32imafc_esp_espidf::target(),
"riscv32e-unknown-none-elf" =>
targets::riscv32e_unknown_none_elf::target(),
"riscv32em-unknown-none-elf" =>
targets::riscv32em_unknown_none_elf::target(),
"riscv32emc-unknown-none-elf" =>
targets::riscv32emc_unknown_none_elf::target(),
"riscv32imac-unknown-none-elf" =>
targets::riscv32imac_unknown_none_elf::target(),
"riscv32imafc-unknown-none-elf" =>
targets::riscv32imafc_unknown_none_elf::target(),
"riscv32imac-unknown-xous-elf" =>
targets::riscv32imac_unknown_xous_elf::target(),
"riscv32gc-unknown-linux-gnu" =>
targets::riscv32gc_unknown_linux_gnu::target(),
"riscv32gc-unknown-linux-musl" =>
targets::riscv32gc_unknown_linux_musl::target(),
"riscv64im-unknown-none-elf" =>
targets::riscv64im_unknown_none_elf::target(),
"riscv64imac-unknown-none-elf" =>
targets::riscv64imac_unknown_none_elf::target(),
"riscv64gc-unknown-none-elf" =>
targets::riscv64gc_unknown_none_elf::target(),
"riscv64gc-unknown-linux-gnu" =>
targets::riscv64gc_unknown_linux_gnu::target(),
"riscv64gc-unknown-linux-musl" =>
targets::riscv64gc_unknown_linux_musl::target(),
"riscv64a23-unknown-linux-gnu" =>
targets::riscv64a23_unknown_linux_gnu::target(),
"sparc-unknown-none-elf" =>
targets::sparc_unknown_none_elf::target(),
"loongarch32-unknown-none" =>
targets::loongarch32_unknown_none::target(),
"loongarch32-unknown-none-softfloat" =>
targets::loongarch32_unknown_none_softfloat::target(),
"loongarch64-unknown-none" =>
targets::loongarch64_unknown_none::target(),
"loongarch64-unknown-none-softfloat" =>
targets::loongarch64_unknown_none_softfloat::target(),
"aarch64-unknown-none" => targets::aarch64_unknown_none::target(),
"aarch64-unknown-none-softfloat" =>
targets::aarch64_unknown_none_softfloat::target(),
"aarch64_be-unknown-none-softfloat" =>
targets::aarch64_be_unknown_none_softfloat::target(),
"aarch64-unknown-nuttx" =>
targets::aarch64_unknown_nuttx::target(),
"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(),
"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-nto-qnx800" =>
targets::aarch64_unknown_nto_qnx800::target(),
"x86_64-pc-nto-qnx710" => targets::x86_64_pc_nto_qnx710::target(),
"x86_64-pc-nto-qnx710_iosock" =>
targets::x86_64_pc_nto_qnx710_iosock::target(),
"x86_64-pc-nto-qnx800" => targets::x86_64_pc_nto_qnx800::target(),
"i686-pc-nto-qnx700" => targets::i686_pc_nto_qnx700::target(),
"aarch64-unknown-linux-ohos" =>
targets::aarch64_unknown_linux_ohos::target(),
"armv7-unknown-linux-ohos" =>
targets::armv7_unknown_linux_ohos::target(),
"loongarch64-unknown-linux-ohos" =>
targets::loongarch64_unknown_linux_ohos::target(),
"x86_64-unknown-linux-ohos" =>
targets::x86_64_unknown_linux_ohos::target(),
"x86_64-unknown-linux-none" =>
targets::x86_64_unknown_linux_none::target(),
"thumbv6m-nuttx-eabi" => targets::thumbv6m_nuttx_eabi::target(),
"thumbv7a-nuttx-eabi" => targets::thumbv7a_nuttx_eabi::target(),
"thumbv7a-nuttx-eabihf" =>
targets::thumbv7a_nuttx_eabihf::target(),
"thumbv7m-nuttx-eabi" => targets::thumbv7m_nuttx_eabi::target(),
"thumbv7em-nuttx-eabi" => targets::thumbv7em_nuttx_eabi::target(),
"thumbv7em-nuttx-eabihf" =>
targets::thumbv7em_nuttx_eabihf::target(),
"thumbv8m.base-nuttx-eabi" =>
targets::thumbv8m_base_nuttx_eabi::target(),
"thumbv8m.main-nuttx-eabi" =>
targets::thumbv8m_main_nuttx_eabi::target(),
"thumbv8m.main-nuttx-eabihf" =>
targets::thumbv8m_main_nuttx_eabihf::target(),
"riscv32imc-unknown-nuttx-elf" =>
targets::riscv32imc_unknown_nuttx_elf::target(),
"riscv32imac-unknown-nuttx-elf" =>
targets::riscv32imac_unknown_nuttx_elf::target(),
"riscv32imafc-unknown-nuttx-elf" =>
targets::riscv32imafc_unknown_nuttx_elf::target(),
"riscv64imac-unknown-nuttx-elf" =>
targets::riscv64imac_unknown_nuttx_elf::target(),
"riscv64gc-unknown-nuttx-elf" =>
targets::riscv64gc_unknown_nuttx_elf::target(),
"x86_64-lynx-lynxos178" =>
targets::x86_64_lynx_lynxos178::target(),
"x86_64-pc-cygwin" => targets::x86_64_pc_cygwin::target(),
"x86_64-unknown-linux-gnuasan" =>
targets::x86_64_unknown_linux_gnuasan::target(),
_ => return None,
};
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_target/src/spec/mod.rs:1434",
"rustc_target::spec", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_target/src/spec/mod.rs"),
::tracing_core::__macro_support::Option::Some(1434u32),
::tracing_core::__macro_support::Option::Some("rustc_target::spec"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("got builtin target: {0:?}",
t) as &dyn Value))])
});
} else { ; }
};
Some(t)
}
fn load_all_builtins() -> impl Iterator<Item = Target> {
[targets::x86_64_unknown_linux_gnu::target,
targets::x86_64_unknown_linux_gnux32::target,
targets::i686_unknown_linux_gnu::target,
targets::i586_unknown_linux_gnu::target,
targets::loongarch64_unknown_linux_gnu::target,
targets::loongarch64_unknown_linux_musl::target,
targets::m68k_unknown_linux_gnu::target,
targets::m68k_unknown_none_elf::target,
targets::csky_unknown_linux_gnuabiv2::target,
targets::csky_unknown_linux_gnuabiv2hf::target,
targets::mips_unknown_linux_gnu::target,
targets::mips64_unknown_linux_gnuabi64::target,
targets::mips64el_unknown_linux_gnuabi64::target,
targets::mipsisa32r6_unknown_linux_gnu::target,
targets::mipsisa32r6el_unknown_linux_gnu::target,
targets::mipsisa64r6_unknown_linux_gnuabi64::target,
targets::mipsisa64r6el_unknown_linux_gnuabi64::target,
targets::mipsel_unknown_linux_gnu::target,
targets::powerpc_unknown_linux_gnu::target,
targets::powerpc_unknown_linux_gnuspe::target,
targets::powerpc_unknown_linux_musl::target,
targets::powerpc_unknown_linux_muslspe::target,
targets::powerpc64_ibm_aix::target,
targets::powerpc64_unknown_linux_gnu::target,
targets::powerpc64_unknown_linux_musl::target,
targets::powerpc64le_unknown_linux_gnu::target,
targets::powerpc64le_unknown_linux_musl::target,
targets::s390x_unknown_linux_gnu::target,
targets::s390x_unknown_linux_musl::target,
targets::sparc_unknown_linux_gnu::target,
targets::sparc64_unknown_linux_gnu::target,
targets::arm_unknown_linux_gnueabi::target,
targets::arm_unknown_linux_gnueabihf::target,
targets::armeb_unknown_linux_gnueabi::target,
targets::arm_unknown_linux_musleabi::target,
targets::arm_unknown_linux_musleabihf::target,
targets::armv4t_unknown_linux_gnueabi::target,
targets::armv5te_unknown_linux_gnueabi::target,
targets::armv5te_unknown_linux_musleabi::target,
targets::armv5te_unknown_linux_uclibceabi::target,
targets::armv7_unknown_linux_gnueabi::target,
targets::armv7_unknown_linux_gnueabihf::target,
targets::thumbv7neon_unknown_linux_gnueabihf::target,
targets::thumbv7neon_unknown_linux_musleabihf::target,
targets::armv7_unknown_linux_musleabi::target,
targets::armv7_unknown_linux_musleabihf::target,
targets::aarch64_unknown_linux_gnu::target,
targets::aarch64_unknown_linux_musl::target,
targets::aarch64_be_unknown_linux_musl::target,
targets::x86_64_unknown_linux_musl::target,
targets::i686_unknown_linux_musl::target,
targets::i586_unknown_linux_musl::target,
targets::mips_unknown_linux_musl::target,
targets::mipsel_unknown_linux_musl::target,
targets::mips64_unknown_linux_muslabi64::target,
targets::mips64el_unknown_linux_muslabi64::target,
targets::hexagon_unknown_linux_musl::target,
targets::hexagon_unknown_none_elf::target,
targets::hexagon_unknown_qurt::target,
targets::mips_unknown_linux_uclibc::target,
targets::mipsel_unknown_linux_uclibc::target,
targets::i686_linux_android::target,
targets::x86_64_linux_android::target,
targets::arm_linux_androideabi::target,
targets::armv7_linux_androideabi::target,
targets::thumbv7neon_linux_androideabi::target,
targets::aarch64_linux_android::target,
targets::riscv64_linux_android::target,
targets::aarch64_unknown_freebsd::target,
targets::armv6_unknown_freebsd::target,
targets::armv7_unknown_freebsd::target,
targets::i686_unknown_freebsd::target,
targets::powerpc_unknown_freebsd::target,
targets::powerpc64_unknown_freebsd::target,
targets::powerpc64le_unknown_freebsd::target,
targets::riscv64gc_unknown_freebsd::target,
targets::x86_64_unknown_freebsd::target,
targets::x86_64_unknown_dragonfly::target,
targets::aarch64_unknown_openbsd::target,
targets::i686_unknown_openbsd::target,
targets::powerpc_unknown_openbsd::target,
targets::powerpc64_unknown_openbsd::target,
targets::riscv64gc_unknown_openbsd::target,
targets::sparc64_unknown_openbsd::target,
targets::x86_64_unknown_openbsd::target,
targets::aarch64_unknown_netbsd::target,
targets::aarch64_be_unknown_netbsd::target,
targets::armv6_unknown_netbsd_eabihf::target,
targets::armv7_unknown_netbsd_eabihf::target,
targets::i586_unknown_netbsd::target,
targets::i686_unknown_netbsd::target,
targets::mipsel_unknown_netbsd::target,
targets::powerpc_unknown_netbsd::target,
targets::riscv64gc_unknown_netbsd::target,
targets::sparc64_unknown_netbsd::target,
targets::x86_64_unknown_netbsd::target,
targets::i686_unknown_haiku::target,
targets::x86_64_unknown_haiku::target,
targets::aarch64_unknown_helenos::target,
targets::i686_unknown_helenos::target,
targets::powerpc_unknown_helenos::target,
targets::sparc64_unknown_helenos::target,
targets::x86_64_unknown_helenos::target,
targets::i686_unknown_hurd_gnu::target,
targets::x86_64_unknown_hurd_gnu::target,
targets::aarch64_apple_darwin::target,
targets::arm64e_apple_darwin::target,
targets::x86_64_apple_darwin::target,
targets::x86_64h_apple_darwin::target,
targets::i686_apple_darwin::target,
targets::aarch64_unknown_fuchsia::target,
targets::riscv64gc_unknown_fuchsia::target,
targets::x86_64_unknown_fuchsia::target,
targets::avr_none::target,
targets::x86_64_unknown_l4re_uclibc::target,
targets::aarch64_unknown_redox::target,
targets::i586_unknown_redox::target,
targets::riscv64gc_unknown_redox::target,
targets::x86_64_unknown_redox::target,
targets::x86_64_unknown_managarm_mlibc::target,
targets::aarch64_unknown_managarm_mlibc::target,
targets::riscv64gc_unknown_managarm_mlibc::target,
targets::i386_apple_ios::target,
targets::x86_64_apple_ios::target,
targets::aarch64_apple_ios::target,
targets::arm64e_apple_ios::target,
targets::armv7s_apple_ios::target,
targets::x86_64_apple_ios_macabi::target,
targets::aarch64_apple_ios_macabi::target,
targets::aarch64_apple_ios_sim::target,
targets::aarch64_apple_tvos::target,
targets::aarch64_apple_tvos_sim::target,
targets::arm64e_apple_tvos::target,
targets::x86_64_apple_tvos::target,
targets::armv7k_apple_watchos::target,
targets::arm64_32_apple_watchos::target,
targets::x86_64_apple_watchos_sim::target,
targets::aarch64_apple_watchos::target,
targets::aarch64_apple_watchos_sim::target,
targets::aarch64_apple_visionos::target,
targets::aarch64_apple_visionos_sim::target,
targets::armebv7r_none_eabi::target,
targets::armebv7r_none_eabihf::target,
targets::armv7r_none_eabi::target,
targets::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::armv7a_vex_v5::target,
targets::msp430_none_elf::target,
targets::aarch64_be_unknown_hermit::target,
targets::aarch64_unknown_hermit::target,
targets::riscv64gc_unknown_hermit::target,
targets::x86_64_unknown_hermit::target,
targets::x86_64_unknown_motor::target,
targets::x86_64_unikraft_linux_musl::target,
targets::armv7_unknown_trusty::target,
targets::aarch64_unknown_trusty::target,
targets::x86_64_unknown_trusty::target,
targets::riscv32i_unknown_none_elf::target,
targets::riscv32im_risc0_zkvm_elf::target,
targets::riscv32im_unknown_none_elf::target,
targets::riscv32ima_unknown_none_elf::target,
targets::riscv32imc_unknown_none_elf::target,
targets::riscv32imc_esp_espidf::target,
targets::riscv32imac_esp_espidf::target,
targets::riscv32imafc_esp_espidf::target,
targets::riscv32e_unknown_none_elf::target,
targets::riscv32em_unknown_none_elf::target,
targets::riscv32emc_unknown_none_elf::target,
targets::riscv32imac_unknown_none_elf::target,
targets::riscv32imafc_unknown_none_elf::target,
targets::riscv32imac_unknown_xous_elf::target,
targets::riscv32gc_unknown_linux_gnu::target,
targets::riscv32gc_unknown_linux_musl::target,
targets::riscv64im_unknown_none_elf::target,
targets::riscv64imac_unknown_none_elf::target,
targets::riscv64gc_unknown_none_elf::target,
targets::riscv64gc_unknown_linux_gnu::target,
targets::riscv64gc_unknown_linux_musl::target,
targets::riscv64a23_unknown_linux_gnu::target,
targets::sparc_unknown_none_elf::target,
targets::loongarch32_unknown_none::target,
targets::loongarch32_unknown_none_softfloat::target,
targets::loongarch64_unknown_none::target,
targets::loongarch64_unknown_none_softfloat::target,
targets::aarch64_unknown_none::target,
targets::aarch64_unknown_none_softfloat::target,
targets::aarch64_be_unknown_none_softfloat::target,
targets::aarch64_unknown_nuttx::target,
targets::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::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_nto_qnx800::target,
targets::x86_64_pc_nto_qnx710::target,
targets::x86_64_pc_nto_qnx710_iosock::target,
targets::x86_64_pc_nto_qnx800::target,
targets::i686_pc_nto_qnx700::target,
targets::aarch64_unknown_linux_ohos::target,
targets::armv7_unknown_linux_ohos::target,
targets::loongarch64_unknown_linux_ohos::target,
targets::x86_64_unknown_linux_ohos::target,
targets::x86_64_unknown_linux_none::target,
targets::thumbv6m_nuttx_eabi::target,
targets::thumbv7a_nuttx_eabi::target,
targets::thumbv7a_nuttx_eabihf::target,
targets::thumbv7m_nuttx_eabi::target,
targets::thumbv7em_nuttx_eabi::target,
targets::thumbv7em_nuttx_eabihf::target,
targets::thumbv8m_base_nuttx_eabi::target,
targets::thumbv8m_main_nuttx_eabi::target,
targets::thumbv8m_main_nuttx_eabihf::target,
targets::riscv32imc_unknown_nuttx_elf::target,
targets::riscv32imac_unknown_nuttx_elf::target,
targets::riscv32imafc_unknown_nuttx_elf::target,
targets::riscv64imac_unknown_nuttx_elf::target,
targets::riscv64gc_unknown_nuttx_elf::target,
targets::x86_64_lynx_lynxos178::target,
targets::x86_64_pc_cygwin::target,
targets::x86_64_unknown_linux_gnuasan::target].into_iter().map(|f|
f())
}supported_targets! {
1435 ("x86_64-unknown-linux-gnu", x86_64_unknown_linux_gnu),
1436 ("x86_64-unknown-linux-gnux32", x86_64_unknown_linux_gnux32),
1437 ("i686-unknown-linux-gnu", i686_unknown_linux_gnu),
1438 ("i586-unknown-linux-gnu", i586_unknown_linux_gnu),
1439 ("loongarch64-unknown-linux-gnu", loongarch64_unknown_linux_gnu),
1440 ("loongarch64-unknown-linux-musl", loongarch64_unknown_linux_musl),
1441 ("m68k-unknown-linux-gnu", m68k_unknown_linux_gnu),
1442 ("m68k-unknown-none-elf", m68k_unknown_none_elf),
1443 ("csky-unknown-linux-gnuabiv2", csky_unknown_linux_gnuabiv2),
1444 ("csky-unknown-linux-gnuabiv2hf", csky_unknown_linux_gnuabiv2hf),
1445 ("mips-unknown-linux-gnu", mips_unknown_linux_gnu),
1446 ("mips64-unknown-linux-gnuabi64", mips64_unknown_linux_gnuabi64),
1447 ("mips64el-unknown-linux-gnuabi64", mips64el_unknown_linux_gnuabi64),
1448 ("mipsisa32r6-unknown-linux-gnu", mipsisa32r6_unknown_linux_gnu),
1449 ("mipsisa32r6el-unknown-linux-gnu", mipsisa32r6el_unknown_linux_gnu),
1450 ("mipsisa64r6-unknown-linux-gnuabi64", mipsisa64r6_unknown_linux_gnuabi64),
1451 ("mipsisa64r6el-unknown-linux-gnuabi64", mipsisa64r6el_unknown_linux_gnuabi64),
1452 ("mipsel-unknown-linux-gnu", mipsel_unknown_linux_gnu),
1453 ("powerpc-unknown-linux-gnu", powerpc_unknown_linux_gnu),
1454 ("powerpc-unknown-linux-gnuspe", powerpc_unknown_linux_gnuspe),
1455 ("powerpc-unknown-linux-musl", powerpc_unknown_linux_musl),
1456 ("powerpc-unknown-linux-muslspe", powerpc_unknown_linux_muslspe),
1457 ("powerpc64-ibm-aix", powerpc64_ibm_aix),
1458 ("powerpc64-unknown-linux-gnu", powerpc64_unknown_linux_gnu),
1459 ("powerpc64-unknown-linux-musl", powerpc64_unknown_linux_musl),
1460 ("powerpc64le-unknown-linux-gnu", powerpc64le_unknown_linux_gnu),
1461 ("powerpc64le-unknown-linux-musl", powerpc64le_unknown_linux_musl),
1462 ("s390x-unknown-linux-gnu", s390x_unknown_linux_gnu),
1463 ("s390x-unknown-linux-musl", s390x_unknown_linux_musl),
1464 ("sparc-unknown-linux-gnu", sparc_unknown_linux_gnu),
1465 ("sparc64-unknown-linux-gnu", sparc64_unknown_linux_gnu),
1466 ("arm-unknown-linux-gnueabi", arm_unknown_linux_gnueabi),
1467 ("arm-unknown-linux-gnueabihf", arm_unknown_linux_gnueabihf),
1468 ("armeb-unknown-linux-gnueabi", armeb_unknown_linux_gnueabi),
1469 ("arm-unknown-linux-musleabi", arm_unknown_linux_musleabi),
1470 ("arm-unknown-linux-musleabihf", arm_unknown_linux_musleabihf),
1471 ("armv4t-unknown-linux-gnueabi", armv4t_unknown_linux_gnueabi),
1472 ("armv5te-unknown-linux-gnueabi", armv5te_unknown_linux_gnueabi),
1473 ("armv5te-unknown-linux-musleabi", armv5te_unknown_linux_musleabi),
1474 ("armv5te-unknown-linux-uclibceabi", armv5te_unknown_linux_uclibceabi),
1475 ("armv7-unknown-linux-gnueabi", armv7_unknown_linux_gnueabi),
1476 ("armv7-unknown-linux-gnueabihf", armv7_unknown_linux_gnueabihf),
1477 ("thumbv7neon-unknown-linux-gnueabihf", thumbv7neon_unknown_linux_gnueabihf),
1478 ("thumbv7neon-unknown-linux-musleabihf", thumbv7neon_unknown_linux_musleabihf),
1479 ("armv7-unknown-linux-musleabi", armv7_unknown_linux_musleabi),
1480 ("armv7-unknown-linux-musleabihf", armv7_unknown_linux_musleabihf),
1481 ("aarch64-unknown-linux-gnu", aarch64_unknown_linux_gnu),
1482 ("aarch64-unknown-linux-musl", aarch64_unknown_linux_musl),
1483 ("aarch64_be-unknown-linux-musl", aarch64_be_unknown_linux_musl),
1484 ("x86_64-unknown-linux-musl", x86_64_unknown_linux_musl),
1485 ("i686-unknown-linux-musl", i686_unknown_linux_musl),
1486 ("i586-unknown-linux-musl", i586_unknown_linux_musl),
1487 ("mips-unknown-linux-musl", mips_unknown_linux_musl),
1488 ("mipsel-unknown-linux-musl", mipsel_unknown_linux_musl),
1489 ("mips64-unknown-linux-muslabi64", mips64_unknown_linux_muslabi64),
1490 ("mips64el-unknown-linux-muslabi64", mips64el_unknown_linux_muslabi64),
1491 ("hexagon-unknown-linux-musl", hexagon_unknown_linux_musl),
1492 ("hexagon-unknown-none-elf", hexagon_unknown_none_elf),
1493 ("hexagon-unknown-qurt", hexagon_unknown_qurt),
1494
1495 ("mips-unknown-linux-uclibc", mips_unknown_linux_uclibc),
1496 ("mipsel-unknown-linux-uclibc", mipsel_unknown_linux_uclibc),
1497
1498 ("i686-linux-android", i686_linux_android),
1499 ("x86_64-linux-android", x86_64_linux_android),
1500 ("arm-linux-androideabi", arm_linux_androideabi),
1501 ("armv7-linux-androideabi", armv7_linux_androideabi),
1502 ("thumbv7neon-linux-androideabi", thumbv7neon_linux_androideabi),
1503 ("aarch64-linux-android", aarch64_linux_android),
1504 ("riscv64-linux-android", riscv64_linux_android),
1505
1506 ("aarch64-unknown-freebsd", aarch64_unknown_freebsd),
1507 ("armv6-unknown-freebsd", armv6_unknown_freebsd),
1508 ("armv7-unknown-freebsd", armv7_unknown_freebsd),
1509 ("i686-unknown-freebsd", i686_unknown_freebsd),
1510 ("powerpc-unknown-freebsd", powerpc_unknown_freebsd),
1511 ("powerpc64-unknown-freebsd", powerpc64_unknown_freebsd),
1512 ("powerpc64le-unknown-freebsd", powerpc64le_unknown_freebsd),
1513 ("riscv64gc-unknown-freebsd", riscv64gc_unknown_freebsd),
1514 ("x86_64-unknown-freebsd", x86_64_unknown_freebsd),
1515
1516 ("x86_64-unknown-dragonfly", x86_64_unknown_dragonfly),
1517
1518 ("aarch64-unknown-openbsd", aarch64_unknown_openbsd),
1519 ("i686-unknown-openbsd", i686_unknown_openbsd),
1520 ("powerpc-unknown-openbsd", powerpc_unknown_openbsd),
1521 ("powerpc64-unknown-openbsd", powerpc64_unknown_openbsd),
1522 ("riscv64gc-unknown-openbsd", riscv64gc_unknown_openbsd),
1523 ("sparc64-unknown-openbsd", sparc64_unknown_openbsd),
1524 ("x86_64-unknown-openbsd", x86_64_unknown_openbsd),
1525
1526 ("aarch64-unknown-netbsd", aarch64_unknown_netbsd),
1527 ("aarch64_be-unknown-netbsd", aarch64_be_unknown_netbsd),
1528 ("armv6-unknown-netbsd-eabihf", armv6_unknown_netbsd_eabihf),
1529 ("armv7-unknown-netbsd-eabihf", armv7_unknown_netbsd_eabihf),
1530 ("i586-unknown-netbsd", i586_unknown_netbsd),
1531 ("i686-unknown-netbsd", i686_unknown_netbsd),
1532 ("mipsel-unknown-netbsd", mipsel_unknown_netbsd),
1533 ("powerpc-unknown-netbsd", powerpc_unknown_netbsd),
1534 ("riscv64gc-unknown-netbsd", riscv64gc_unknown_netbsd),
1535 ("sparc64-unknown-netbsd", sparc64_unknown_netbsd),
1536 ("x86_64-unknown-netbsd", x86_64_unknown_netbsd),
1537
1538 ("i686-unknown-haiku", i686_unknown_haiku),
1539 ("x86_64-unknown-haiku", x86_64_unknown_haiku),
1540
1541 ("aarch64-unknown-helenos", aarch64_unknown_helenos),
1542 ("i686-unknown-helenos", i686_unknown_helenos),
1543 ("powerpc-unknown-helenos", powerpc_unknown_helenos),
1544 ("sparc64-unknown-helenos", sparc64_unknown_helenos),
1545 ("x86_64-unknown-helenos", x86_64_unknown_helenos),
1546
1547 ("i686-unknown-hurd-gnu", i686_unknown_hurd_gnu),
1548 ("x86_64-unknown-hurd-gnu", x86_64_unknown_hurd_gnu),
1549
1550 ("aarch64-apple-darwin", aarch64_apple_darwin),
1551 ("arm64e-apple-darwin", arm64e_apple_darwin),
1552 ("x86_64-apple-darwin", x86_64_apple_darwin),
1553 ("x86_64h-apple-darwin", x86_64h_apple_darwin),
1554 ("i686-apple-darwin", i686_apple_darwin),
1555
1556 ("aarch64-unknown-fuchsia", aarch64_unknown_fuchsia),
1557 ("riscv64gc-unknown-fuchsia", riscv64gc_unknown_fuchsia),
1558 ("x86_64-unknown-fuchsia", x86_64_unknown_fuchsia),
1559
1560 ("avr-none", avr_none),
1561
1562 ("x86_64-unknown-l4re-uclibc", x86_64_unknown_l4re_uclibc),
1563
1564 ("aarch64-unknown-redox", aarch64_unknown_redox),
1565 ("i586-unknown-redox", i586_unknown_redox),
1566 ("riscv64gc-unknown-redox", riscv64gc_unknown_redox),
1567 ("x86_64-unknown-redox", x86_64_unknown_redox),
1568
1569 ("x86_64-unknown-managarm-mlibc", x86_64_unknown_managarm_mlibc),
1570 ("aarch64-unknown-managarm-mlibc", aarch64_unknown_managarm_mlibc),
1571 ("riscv64gc-unknown-managarm-mlibc", riscv64gc_unknown_managarm_mlibc),
1572
1573 ("i386-apple-ios", i386_apple_ios),
1574 ("x86_64-apple-ios", x86_64_apple_ios),
1575 ("aarch64-apple-ios", aarch64_apple_ios),
1576 ("arm64e-apple-ios", arm64e_apple_ios),
1577 ("armv7s-apple-ios", armv7s_apple_ios),
1578 ("x86_64-apple-ios-macabi", x86_64_apple_ios_macabi),
1579 ("aarch64-apple-ios-macabi", aarch64_apple_ios_macabi),
1580 ("aarch64-apple-ios-sim", aarch64_apple_ios_sim),
1581
1582 ("aarch64-apple-tvos", aarch64_apple_tvos),
1583 ("aarch64-apple-tvos-sim", aarch64_apple_tvos_sim),
1584 ("arm64e-apple-tvos", arm64e_apple_tvos),
1585 ("x86_64-apple-tvos", x86_64_apple_tvos),
1586
1587 ("armv7k-apple-watchos", armv7k_apple_watchos),
1588 ("arm64_32-apple-watchos", arm64_32_apple_watchos),
1589 ("x86_64-apple-watchos-sim", x86_64_apple_watchos_sim),
1590 ("aarch64-apple-watchos", aarch64_apple_watchos),
1591 ("aarch64-apple-watchos-sim", aarch64_apple_watchos_sim),
1592
1593 ("aarch64-apple-visionos", aarch64_apple_visionos),
1594 ("aarch64-apple-visionos-sim", aarch64_apple_visionos_sim),
1595
1596 ("armebv7r-none-eabi", armebv7r_none_eabi),
1597 ("armebv7r-none-eabihf", armebv7r_none_eabihf),
1598 ("armv7r-none-eabi", armv7r_none_eabi),
1599 ("thumbv7r-none-eabi", thumbv7r_none_eabi),
1600 ("armv7r-none-eabihf", armv7r_none_eabihf),
1601 ("thumbv7r-none-eabihf", thumbv7r_none_eabihf),
1602 ("armv8r-none-eabihf", armv8r_none_eabihf),
1603 ("thumbv8r-none-eabihf", thumbv8r_none_eabihf),
1604
1605 ("armv7-rtems-eabihf", armv7_rtems_eabihf),
1606
1607 ("x86_64-pc-solaris", x86_64_pc_solaris),
1608 ("sparcv9-sun-solaris", sparcv9_sun_solaris),
1609
1610 ("x86_64-unknown-illumos", x86_64_unknown_illumos),
1611 ("aarch64-unknown-illumos", aarch64_unknown_illumos),
1612
1613 ("x86_64-pc-windows-gnu", x86_64_pc_windows_gnu),
1614 ("x86_64-uwp-windows-gnu", x86_64_uwp_windows_gnu),
1615 ("x86_64-win7-windows-gnu", x86_64_win7_windows_gnu),
1616 ("i686-pc-windows-gnu", i686_pc_windows_gnu),
1617 ("i686-uwp-windows-gnu", i686_uwp_windows_gnu),
1618 ("i686-win7-windows-gnu", i686_win7_windows_gnu),
1619
1620 ("aarch64-pc-windows-gnullvm", aarch64_pc_windows_gnullvm),
1621 ("i686-pc-windows-gnullvm", i686_pc_windows_gnullvm),
1622 ("x86_64-pc-windows-gnullvm", x86_64_pc_windows_gnullvm),
1623
1624 ("aarch64-pc-windows-msvc", aarch64_pc_windows_msvc),
1625 ("aarch64-uwp-windows-msvc", aarch64_uwp_windows_msvc),
1626 ("arm64ec-pc-windows-msvc", arm64ec_pc_windows_msvc),
1627 ("x86_64-pc-windows-msvc", x86_64_pc_windows_msvc),
1628 ("x86_64-uwp-windows-msvc", x86_64_uwp_windows_msvc),
1629 ("x86_64-win7-windows-msvc", x86_64_win7_windows_msvc),
1630 ("i686-pc-windows-msvc", i686_pc_windows_msvc),
1631 ("i686-uwp-windows-msvc", i686_uwp_windows_msvc),
1632 ("i686-win7-windows-msvc", i686_win7_windows_msvc),
1633 ("thumbv7a-pc-windows-msvc", thumbv7a_pc_windows_msvc),
1634 ("thumbv7a-uwp-windows-msvc", thumbv7a_uwp_windows_msvc),
1635
1636 ("wasm32-unknown-emscripten", wasm32_unknown_emscripten),
1637 ("wasm32-unknown-unknown", wasm32_unknown_unknown),
1638 ("wasm32v1-none", wasm32v1_none),
1639 ("wasm32-wasip1", wasm32_wasip1),
1640 ("wasm32-wasip2", wasm32_wasip2),
1641 ("wasm32-wasip3", wasm32_wasip3),
1642 ("wasm32-wasip1-threads", wasm32_wasip1_threads),
1643 ("wasm32-wali-linux-musl", wasm32_wali_linux_musl),
1644 ("wasm64-unknown-unknown", wasm64_unknown_unknown),
1645
1646 ("thumbv6m-none-eabi", thumbv6m_none_eabi),
1647 ("thumbv7m-none-eabi", thumbv7m_none_eabi),
1648 ("thumbv7em-none-eabi", thumbv7em_none_eabi),
1649 ("thumbv7em-none-eabihf", thumbv7em_none_eabihf),
1650 ("thumbv8m.base-none-eabi", thumbv8m_base_none_eabi),
1651 ("thumbv8m.main-none-eabi", thumbv8m_main_none_eabi),
1652 ("thumbv8m.main-none-eabihf", thumbv8m_main_none_eabihf),
1653
1654 ("armv7a-none-eabi", armv7a_none_eabi),
1655 ("thumbv7a-none-eabi", thumbv7a_none_eabi),
1656 ("armv7a-none-eabihf", armv7a_none_eabihf),
1657 ("thumbv7a-none-eabihf", thumbv7a_none_eabihf),
1658 ("armv7a-nuttx-eabi", armv7a_nuttx_eabi),
1659 ("armv7a-nuttx-eabihf", armv7a_nuttx_eabihf),
1660 ("armv7a-vex-v5", armv7a_vex_v5),
1661
1662 ("msp430-none-elf", msp430_none_elf),
1663
1664 ("aarch64_be-unknown-hermit", aarch64_be_unknown_hermit),
1665 ("aarch64-unknown-hermit", aarch64_unknown_hermit),
1666 ("riscv64gc-unknown-hermit", riscv64gc_unknown_hermit),
1667 ("x86_64-unknown-hermit", x86_64_unknown_hermit),
1668 ("x86_64-unknown-motor", x86_64_unknown_motor),
1669
1670 ("x86_64-unikraft-linux-musl", x86_64_unikraft_linux_musl),
1671
1672 ("armv7-unknown-trusty", armv7_unknown_trusty),
1673 ("aarch64-unknown-trusty", aarch64_unknown_trusty),
1674 ("x86_64-unknown-trusty", x86_64_unknown_trusty),
1675
1676 ("riscv32i-unknown-none-elf", riscv32i_unknown_none_elf),
1677 ("riscv32im-risc0-zkvm-elf", riscv32im_risc0_zkvm_elf),
1678 ("riscv32im-unknown-none-elf", riscv32im_unknown_none_elf),
1679 ("riscv32ima-unknown-none-elf", riscv32ima_unknown_none_elf),
1680 ("riscv32imc-unknown-none-elf", riscv32imc_unknown_none_elf),
1681 ("riscv32imc-esp-espidf", riscv32imc_esp_espidf),
1682 ("riscv32imac-esp-espidf", riscv32imac_esp_espidf),
1683 ("riscv32imafc-esp-espidf", riscv32imafc_esp_espidf),
1684
1685 ("riscv32e-unknown-none-elf", riscv32e_unknown_none_elf),
1686 ("riscv32em-unknown-none-elf", riscv32em_unknown_none_elf),
1687 ("riscv32emc-unknown-none-elf", riscv32emc_unknown_none_elf),
1688
1689 ("riscv32imac-unknown-none-elf", riscv32imac_unknown_none_elf),
1690 ("riscv32imafc-unknown-none-elf", riscv32imafc_unknown_none_elf),
1691 ("riscv32imac-unknown-xous-elf", riscv32imac_unknown_xous_elf),
1692 ("riscv32gc-unknown-linux-gnu", riscv32gc_unknown_linux_gnu),
1693 ("riscv32gc-unknown-linux-musl", riscv32gc_unknown_linux_musl),
1694 ("riscv64im-unknown-none-elf", riscv64im_unknown_none_elf),
1695 ("riscv64imac-unknown-none-elf", riscv64imac_unknown_none_elf),
1696 ("riscv64gc-unknown-none-elf", riscv64gc_unknown_none_elf),
1697 ("riscv64gc-unknown-linux-gnu", riscv64gc_unknown_linux_gnu),
1698 ("riscv64gc-unknown-linux-musl", riscv64gc_unknown_linux_musl),
1699 ("riscv64a23-unknown-linux-gnu", riscv64a23_unknown_linux_gnu),
1700
1701 ("sparc-unknown-none-elf", sparc_unknown_none_elf),
1702
1703 ("loongarch32-unknown-none", loongarch32_unknown_none),
1704 ("loongarch32-unknown-none-softfloat", loongarch32_unknown_none_softfloat),
1705 ("loongarch64-unknown-none", loongarch64_unknown_none),
1706 ("loongarch64-unknown-none-softfloat", loongarch64_unknown_none_softfloat),
1707
1708 ("aarch64-unknown-none", aarch64_unknown_none),
1709 ("aarch64-unknown-none-softfloat", aarch64_unknown_none_softfloat),
1710 ("aarch64_be-unknown-none-softfloat", aarch64_be_unknown_none_softfloat),
1711 ("aarch64-unknown-nuttx", aarch64_unknown_nuttx),
1712 ("aarch64v8r-unknown-none", aarch64v8r_unknown_none),
1713 ("aarch64v8r-unknown-none-softfloat", aarch64v8r_unknown_none_softfloat),
1714
1715 ("x86_64-fortanix-unknown-sgx", x86_64_fortanix_unknown_sgx),
1716
1717 ("x86_64-unknown-uefi", x86_64_unknown_uefi),
1718 ("i686-unknown-uefi", i686_unknown_uefi),
1719 ("aarch64-unknown-uefi", aarch64_unknown_uefi),
1720
1721 ("nvptx64-nvidia-cuda", nvptx64_nvidia_cuda),
1722
1723 ("amdgcn-amd-amdhsa", amdgcn_amd_amdhsa),
1724
1725 ("xtensa-esp32-none-elf", xtensa_esp32_none_elf),
1726 ("xtensa-esp32-espidf", xtensa_esp32_espidf),
1727 ("xtensa-esp32s2-none-elf", xtensa_esp32s2_none_elf),
1728 ("xtensa-esp32s2-espidf", xtensa_esp32s2_espidf),
1729 ("xtensa-esp32s3-none-elf", xtensa_esp32s3_none_elf),
1730 ("xtensa-esp32s3-espidf", xtensa_esp32s3_espidf),
1731
1732 ("i686-wrs-vxworks", i686_wrs_vxworks),
1733 ("x86_64-wrs-vxworks", x86_64_wrs_vxworks),
1734 ("armv7-wrs-vxworks-eabihf", armv7_wrs_vxworks_eabihf),
1735 ("aarch64-wrs-vxworks", aarch64_wrs_vxworks),
1736 ("powerpc-wrs-vxworks", powerpc_wrs_vxworks),
1737 ("powerpc-wrs-vxworks-spe", powerpc_wrs_vxworks_spe),
1738 ("powerpc64-wrs-vxworks", powerpc64_wrs_vxworks),
1739 ("riscv32-wrs-vxworks", riscv32_wrs_vxworks),
1740 ("riscv64-wrs-vxworks", riscv64_wrs_vxworks),
1741
1742 ("aarch64-kmc-solid_asp3", aarch64_kmc_solid_asp3),
1743 ("armv7a-kmc-solid_asp3-eabi", armv7a_kmc_solid_asp3_eabi),
1744 ("armv7a-kmc-solid_asp3-eabihf", armv7a_kmc_solid_asp3_eabihf),
1745
1746 ("mipsel-sony-psp", mipsel_sony_psp),
1747 ("mipsel-sony-psx", mipsel_sony_psx),
1748 ("mipsel-unknown-none", mipsel_unknown_none),
1749 ("mips-mti-none-elf", mips_mti_none_elf),
1750 ("mipsel-mti-none-elf", mipsel_mti_none_elf),
1751
1752 ("armv4t-none-eabi", armv4t_none_eabi),
1753 ("armv5te-none-eabi", armv5te_none_eabi),
1754 ("armv6-none-eabi", armv6_none_eabi),
1755 ("armv6-none-eabihf", armv6_none_eabihf),
1756 ("thumbv4t-none-eabi", thumbv4t_none_eabi),
1757 ("thumbv5te-none-eabi", thumbv5te_none_eabi),
1758 ("thumbv6-none-eabi", thumbv6_none_eabi),
1759
1760 ("aarch64_be-unknown-linux-gnu", aarch64_be_unknown_linux_gnu),
1761 ("aarch64-unknown-linux-gnu_ilp32", aarch64_unknown_linux_gnu_ilp32),
1762 ("aarch64_be-unknown-linux-gnu_ilp32", aarch64_be_unknown_linux_gnu_ilp32),
1763
1764 ("bpfeb-unknown-none", bpfeb_unknown_none),
1765 ("bpfel-unknown-none", bpfel_unknown_none),
1766
1767 ("armv6k-nintendo-3ds", armv6k_nintendo_3ds),
1768
1769 ("aarch64-nintendo-switch-freestanding", aarch64_nintendo_switch_freestanding),
1770
1771 ("armv7-sony-vita-newlibeabihf", armv7_sony_vita_newlibeabihf),
1772
1773 ("armv7-unknown-linux-uclibceabi", armv7_unknown_linux_uclibceabi),
1774 ("armv7-unknown-linux-uclibceabihf", armv7_unknown_linux_uclibceabihf),
1775
1776 ("x86_64-unknown-none", x86_64_unknown_none),
1777
1778 ("aarch64-unknown-teeos", aarch64_unknown_teeos),
1779
1780 ("mips64-openwrt-linux-musl", mips64_openwrt_linux_musl),
1781
1782 ("aarch64-unknown-nto-qnx700", aarch64_unknown_nto_qnx700),
1783 ("aarch64-unknown-nto-qnx710", aarch64_unknown_nto_qnx710),
1784 ("aarch64-unknown-nto-qnx710_iosock", aarch64_unknown_nto_qnx710_iosock),
1785 ("aarch64-unknown-nto-qnx800", aarch64_unknown_nto_qnx800),
1786 ("x86_64-pc-nto-qnx710", x86_64_pc_nto_qnx710),
1787 ("x86_64-pc-nto-qnx710_iosock", x86_64_pc_nto_qnx710_iosock),
1788 ("x86_64-pc-nto-qnx800", x86_64_pc_nto_qnx800),
1789 ("i686-pc-nto-qnx700", i686_pc_nto_qnx700),
1790
1791 ("aarch64-unknown-linux-ohos", aarch64_unknown_linux_ohos),
1792 ("armv7-unknown-linux-ohos", armv7_unknown_linux_ohos),
1793 ("loongarch64-unknown-linux-ohos", loongarch64_unknown_linux_ohos),
1794 ("x86_64-unknown-linux-ohos", x86_64_unknown_linux_ohos),
1795
1796 ("x86_64-unknown-linux-none", x86_64_unknown_linux_none),
1797
1798 ("thumbv6m-nuttx-eabi", thumbv6m_nuttx_eabi),
1799 ("thumbv7a-nuttx-eabi", thumbv7a_nuttx_eabi),
1800 ("thumbv7a-nuttx-eabihf", thumbv7a_nuttx_eabihf),
1801 ("thumbv7m-nuttx-eabi", thumbv7m_nuttx_eabi),
1802 ("thumbv7em-nuttx-eabi", thumbv7em_nuttx_eabi),
1803 ("thumbv7em-nuttx-eabihf", thumbv7em_nuttx_eabihf),
1804 ("thumbv8m.base-nuttx-eabi", thumbv8m_base_nuttx_eabi),
1805 ("thumbv8m.main-nuttx-eabi", thumbv8m_main_nuttx_eabi),
1806 ("thumbv8m.main-nuttx-eabihf", thumbv8m_main_nuttx_eabihf),
1807 ("riscv32imc-unknown-nuttx-elf", riscv32imc_unknown_nuttx_elf),
1808 ("riscv32imac-unknown-nuttx-elf", riscv32imac_unknown_nuttx_elf),
1809 ("riscv32imafc-unknown-nuttx-elf", riscv32imafc_unknown_nuttx_elf),
1810 ("riscv64imac-unknown-nuttx-elf", riscv64imac_unknown_nuttx_elf),
1811 ("riscv64gc-unknown-nuttx-elf", riscv64gc_unknown_nuttx_elf),
1812 ("x86_64-lynx-lynxos178", x86_64_lynx_lynxos178),
1813
1814 ("x86_64-pc-cygwin", x86_64_pc_cygwin),
1815
1816 ("x86_64-unknown-linux-gnuasan", x86_64_unknown_linux_gnuasan),
1817}
1818
1819macro_rules! cvs {
1821 () => {
1822 ::std::borrow::Cow::Borrowed(&[])
1823 };
1824 ($($x:expr),+ $(,)?) => {
1825 ::std::borrow::Cow::Borrowed(&[
1826 $(
1827 ::std::borrow::Cow::Borrowed($x),
1828 )*
1829 ])
1830 };
1831}
1832
1833pub(crate) use cvs;
1834
1835#[derive(#[automatically_derived]
impl ::core::fmt::Debug for TargetWarnings {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f,
"TargetWarnings", "unused_fields", &&self.unused_fields)
}
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for TargetWarnings {
#[inline]
fn eq(&self, other: &TargetWarnings) -> bool {
self.unused_fields == other.unused_fields
}
}PartialEq)]
1839pub struct TargetWarnings {
1840 unused_fields: Vec<String>,
1841}
1842
1843impl TargetWarnings {
1844 pub fn empty() -> Self {
1845 Self { unused_fields: Vec::new() }
1846 }
1847
1848 pub fn warning_messages(&self) -> Vec<String> {
1849 let mut warnings = ::alloc::vec::Vec::new()vec![];
1850 if !self.unused_fields.is_empty() {
1851 warnings.push(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("target json file contains unused fields: {0}",
self.unused_fields.join(", ")))
})format!(
1852 "target json file contains unused fields: {}",
1853 self.unused_fields.join(", ")
1854 ));
1855 }
1856 warnings
1857 }
1858}
1859
1860#[derive(#[automatically_derived]
impl ::core::marker::Copy for TargetKind { }Copy, #[automatically_derived]
impl ::core::clone::Clone for TargetKind {
#[inline]
fn clone(&self) -> TargetKind { *self }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for TargetKind {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
TargetKind::Json => "Json",
TargetKind::Builtin => "Builtin",
})
}
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for TargetKind {
#[inline]
fn eq(&self, other: &TargetKind) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}PartialEq)]
1863enum TargetKind {
1864 Json,
1865 Builtin,
1866}
1867
1868pub enum Arch {
AArch64,
AmdGpu,
Arm,
Arm64EC,
Avr,
Bpf,
CSky,
Hexagon,
LoongArch32,
LoongArch64,
M68k,
Mips,
Mips32r6,
Mips64,
Mips64r6,
Msp430,
Nvptx64,
PowerPC,
PowerPC64,
RiscV32,
RiscV64,
S390x,
Sparc,
Sparc64,
SpirV,
Wasm32,
Wasm64,
X86,
X86_64,
Xtensa,
Other(crate::spec::StaticCow<str>),
}
#[automatically_derived]
impl ::core::clone::Clone for Arch {
#[inline]
fn clone(&self) -> Arch {
match self {
Arch::AArch64 => Arch::AArch64,
Arch::AmdGpu => Arch::AmdGpu,
Arch::Arm => Arch::Arm,
Arch::Arm64EC => Arch::Arm64EC,
Arch::Avr => Arch::Avr,
Arch::Bpf => Arch::Bpf,
Arch::CSky => Arch::CSky,
Arch::Hexagon => Arch::Hexagon,
Arch::LoongArch32 => Arch::LoongArch32,
Arch::LoongArch64 => Arch::LoongArch64,
Arch::M68k => Arch::M68k,
Arch::Mips => Arch::Mips,
Arch::Mips32r6 => Arch::Mips32r6,
Arch::Mips64 => Arch::Mips64,
Arch::Mips64r6 => Arch::Mips64r6,
Arch::Msp430 => Arch::Msp430,
Arch::Nvptx64 => Arch::Nvptx64,
Arch::PowerPC => Arch::PowerPC,
Arch::PowerPC64 => Arch::PowerPC64,
Arch::RiscV32 => Arch::RiscV32,
Arch::RiscV64 => Arch::RiscV64,
Arch::S390x => Arch::S390x,
Arch::Sparc => Arch::Sparc,
Arch::Sparc64 => Arch::Sparc64,
Arch::SpirV => Arch::SpirV,
Arch::Wasm32 => Arch::Wasm32,
Arch::Wasm64 => Arch::Wasm64,
Arch::X86 => Arch::X86,
Arch::X86_64 => Arch::X86_64,
Arch::Xtensa => Arch::Xtensa,
Arch::Other(__self_0) =>
Arch::Other(::core::clone::Clone::clone(__self_0)),
}
}
}
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for Arch { }
#[automatically_derived]
impl ::core::cmp::PartialEq for Arch {
#[inline]
fn eq(&self, other: &Arch) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(Arch::Other(__self_0), Arch::Other(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}
#[automatically_derived]
impl ::core::cmp::Eq for Arch {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<crate::spec::StaticCow<str>>;
}
}
#[automatically_derived]
impl ::core::hash::Hash for Arch {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state);
match self {
Arch::Other(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}
#[automatically_derived]
impl ::core::fmt::Debug for Arch {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Arch::AArch64 => ::core::fmt::Formatter::write_str(f, "AArch64"),
Arch::AmdGpu => ::core::fmt::Formatter::write_str(f, "AmdGpu"),
Arch::Arm => ::core::fmt::Formatter::write_str(f, "Arm"),
Arch::Arm64EC => ::core::fmt::Formatter::write_str(f, "Arm64EC"),
Arch::Avr => ::core::fmt::Formatter::write_str(f, "Avr"),
Arch::Bpf => ::core::fmt::Formatter::write_str(f, "Bpf"),
Arch::CSky => ::core::fmt::Formatter::write_str(f, "CSky"),
Arch::Hexagon => ::core::fmt::Formatter::write_str(f, "Hexagon"),
Arch::LoongArch32 =>
::core::fmt::Formatter::write_str(f, "LoongArch32"),
Arch::LoongArch64 =>
::core::fmt::Formatter::write_str(f, "LoongArch64"),
Arch::M68k => ::core::fmt::Formatter::write_str(f, "M68k"),
Arch::Mips => ::core::fmt::Formatter::write_str(f, "Mips"),
Arch::Mips32r6 =>
::core::fmt::Formatter::write_str(f, "Mips32r6"),
Arch::Mips64 => ::core::fmt::Formatter::write_str(f, "Mips64"),
Arch::Mips64r6 =>
::core::fmt::Formatter::write_str(f, "Mips64r6"),
Arch::Msp430 => ::core::fmt::Formatter::write_str(f, "Msp430"),
Arch::Nvptx64 => ::core::fmt::Formatter::write_str(f, "Nvptx64"),
Arch::PowerPC => ::core::fmt::Formatter::write_str(f, "PowerPC"),
Arch::PowerPC64 =>
::core::fmt::Formatter::write_str(f, "PowerPC64"),
Arch::RiscV32 => ::core::fmt::Formatter::write_str(f, "RiscV32"),
Arch::RiscV64 => ::core::fmt::Formatter::write_str(f, "RiscV64"),
Arch::S390x => ::core::fmt::Formatter::write_str(f, "S390x"),
Arch::Sparc => ::core::fmt::Formatter::write_str(f, "Sparc"),
Arch::Sparc64 => ::core::fmt::Formatter::write_str(f, "Sparc64"),
Arch::SpirV => ::core::fmt::Formatter::write_str(f, "SpirV"),
Arch::Wasm32 => ::core::fmt::Formatter::write_str(f, "Wasm32"),
Arch::Wasm64 => ::core::fmt::Formatter::write_str(f, "Wasm64"),
Arch::X86 => ::core::fmt::Formatter::write_str(f, "X86"),
Arch::X86_64 => ::core::fmt::Formatter::write_str(f, "X86_64"),
Arch::Xtensa => ::core::fmt::Formatter::write_str(f, "Xtensa"),
Arch::Other(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Other",
&__self_0),
}
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for Arch {
#[inline]
fn partial_cmp(&self, other: &Arch)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
match (self, other) {
(Arch::Other(__self_0), Arch::Other(__arg1_0)) =>
::core::cmp::PartialOrd::partial_cmp(__self_0, __arg1_0),
_ =>
::core::cmp::PartialOrd::partial_cmp(&__self_discr,
&__arg1_discr),
}
}
}
#[automatically_derived]
impl ::core::cmp::Ord for Arch {
#[inline]
fn cmp(&self, other: &Arch) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
match ::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr) {
::core::cmp::Ordering::Equal =>
match (self, other) {
(Arch::Other(__self_0), Arch::Other(__arg1_0)) =>
::core::cmp::Ord::cmp(__self_0, __arg1_0),
_ => ::core::cmp::Ordering::Equal,
},
cmp => cmp,
}
}
}
impl schemars::JsonSchema for Arch {
fn schema_name() -> std::borrow::Cow<'static, str> {
std::borrow::Cow::Borrowed("Arch")
}
fn json_schema(_: &mut schemars::SchemaGenerator) -> schemars::Schema {
<::schemars::Schema as
::core::convert::TryFrom<_>>::try_from(::serde_json::Value::Object({
let mut object = ::serde_json::Map::new();
let _ =
object.insert(("type").into(),
::serde_json::to_value(&"string").unwrap());
object
})).unwrap()
}
}
impl FromStr for Arch {
type Err = core::convert::Infallible;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"aarch64" => Self::AArch64,
"amdgpu" => Self::AmdGpu,
"arm" => Self::Arm,
"arm64ec" => Self::Arm64EC,
"avr" => Self::Avr,
"bpf" => Self::Bpf,
"csky" => Self::CSky,
"hexagon" => Self::Hexagon,
"loongarch32" => Self::LoongArch32,
"loongarch64" => Self::LoongArch64,
"m68k" => Self::M68k,
"mips" => Self::Mips,
"mips32r6" => Self::Mips32r6,
"mips64" => Self::Mips64,
"mips64r6" => Self::Mips64r6,
"msp430" => Self::Msp430,
"nvptx64" => Self::Nvptx64,
"powerpc" => Self::PowerPC,
"powerpc64" => Self::PowerPC64,
"riscv32" => Self::RiscV32,
"riscv64" => Self::RiscV64,
"s390x" => Self::S390x,
"sparc" => Self::Sparc,
"sparc64" => Self::Sparc64,
"spirv" => Self::SpirV,
"wasm32" => Self::Wasm32,
"wasm64" => Self::Wasm64,
"x86" => Self::X86,
"x86_64" => Self::X86_64,
"xtensa" => Self::Xtensa,
_ => Self::Other(s.to_owned().into()),
})
}
}
impl Arch {
pub fn desc(&self) -> &str {
match self {
Self::AArch64 => "aarch64",
Self::AmdGpu => "amdgpu",
Self::Arm => "arm",
Self::Arm64EC => "arm64ec",
Self::Avr => "avr",
Self::Bpf => "bpf",
Self::CSky => "csky",
Self::Hexagon => "hexagon",
Self::LoongArch32 => "loongarch32",
Self::LoongArch64 => "loongarch64",
Self::M68k => "m68k",
Self::Mips => "mips",
Self::Mips32r6 => "mips32r6",
Self::Mips64 => "mips64",
Self::Mips64r6 => "mips64r6",
Self::Msp430 => "msp430",
Self::Nvptx64 => "nvptx64",
Self::PowerPC => "powerpc",
Self::PowerPC64 => "powerpc64",
Self::RiscV32 => "riscv32",
Self::RiscV64 => "riscv64",
Self::S390x => "s390x",
Self::Sparc => "sparc",
Self::Sparc64 => "sparc64",
Self::SpirV => "spirv",
Self::Wasm32 => "wasm32",
Self::Wasm64 => "wasm64",
Self::X86 => "x86",
Self::X86_64 => "x86_64",
Self::Xtensa => "xtensa",
Self::Other(name) => name.as_ref(),
}
}
}
impl crate::json::ToJson for Arch {
fn to_json(&self) -> crate::json::Json { self.desc().to_json() }
}
impl<'de> serde::Deserialize<'de> for Arch {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}
impl std::fmt::Display for Arch {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.desc())
}
}crate::target_spec_enum! {
1869 pub enum Arch {
1870 AArch64 = "aarch64",
1871 AmdGpu = "amdgpu",
1872 Arm = "arm",
1873 Arm64EC = "arm64ec",
1874 Avr = "avr",
1875 Bpf = "bpf",
1876 CSky = "csky",
1877 Hexagon = "hexagon",
1878 LoongArch32 = "loongarch32",
1879 LoongArch64 = "loongarch64",
1880 M68k = "m68k",
1881 Mips = "mips",
1882 Mips32r6 = "mips32r6",
1883 Mips64 = "mips64",
1884 Mips64r6 = "mips64r6",
1885 Msp430 = "msp430",
1886 Nvptx64 = "nvptx64",
1887 PowerPC = "powerpc",
1888 PowerPC64 = "powerpc64",
1889 RiscV32 = "riscv32",
1890 RiscV64 = "riscv64",
1891 S390x = "s390x",
1892 Sparc = "sparc",
1893 Sparc64 = "sparc64",
1894 SpirV = "spirv",
1895 Wasm32 = "wasm32",
1896 Wasm64 = "wasm64",
1897 X86 = "x86",
1898 X86_64 = "x86_64",
1899 Xtensa = "xtensa",
1900 }
1901 other_variant = Other;
1902}
1903
1904impl Arch {
1905 pub fn desc_symbol(&self) -> Symbol {
1906 match self {
1907 Self::AArch64 => sym::aarch64,
1908 Self::AmdGpu => sym::amdgpu,
1909 Self::Arm => sym::arm,
1910 Self::Arm64EC => sym::arm64ec,
1911 Self::Avr => sym::avr,
1912 Self::Bpf => sym::bpf,
1913 Self::CSky => sym::csky,
1914 Self::Hexagon => sym::hexagon,
1915 Self::LoongArch32 => sym::loongarch32,
1916 Self::LoongArch64 => sym::loongarch64,
1917 Self::M68k => sym::m68k,
1918 Self::Mips => sym::mips,
1919 Self::Mips32r6 => sym::mips32r6,
1920 Self::Mips64 => sym::mips64,
1921 Self::Mips64r6 => sym::mips64r6,
1922 Self::Msp430 => sym::msp430,
1923 Self::Nvptx64 => sym::nvptx64,
1924 Self::PowerPC => sym::powerpc,
1925 Self::PowerPC64 => sym::powerpc64,
1926 Self::RiscV32 => sym::riscv32,
1927 Self::RiscV64 => sym::riscv64,
1928 Self::S390x => sym::s390x,
1929 Self::Sparc => sym::sparc,
1930 Self::Sparc64 => sym::sparc64,
1931 Self::SpirV => sym::spirv,
1932 Self::Wasm32 => sym::wasm32,
1933 Self::Wasm64 => sym::wasm64,
1934 Self::X86 => sym::x86,
1935 Self::X86_64 => sym::x86_64,
1936 Self::Xtensa => sym::xtensa,
1937 Self::Other(name) => rustc_span::Symbol::intern(name),
1938 }
1939 }
1940
1941 pub fn supports_c_variadic_definitions(&self) -> bool {
1942 use Arch::*;
1943
1944 match self {
1945 Bpf | SpirV => false,
1947
1948 Other(_) => true,
1951
1952 AArch64 | AmdGpu | Arm | Arm64EC | Avr | CSky | Hexagon | LoongArch32 | LoongArch64
1953 | M68k | Mips | Mips32r6 | Mips64 | Mips64r6 | Msp430 | Nvptx64 | PowerPC
1954 | PowerPC64 | RiscV32 | RiscV64 | S390x | Sparc | Sparc64 | Wasm32 | Wasm64 | X86
1955 | X86_64 | Xtensa => true,
1956 }
1957 }
1958}
1959
1960pub enum Os {
Aix,
AmdHsa,
Android,
Cuda,
Cygwin,
Dragonfly,
Emscripten,
EspIdf,
FreeBsd,
Fuchsia,
Haiku,
HelenOs,
Hermit,
Horizon,
Hurd,
Illumos,
IOs,
L4Re,
Linux,
LynxOs178,
MacOs,
Managarm,
Motor,
NetBsd,
None,
Nto,
NuttX,
OpenBsd,
Psp,
Psx,
Qurt,
Redox,
Rtems,
Solaris,
SolidAsp3,
TeeOs,
Trusty,
TvOs,
Uefi,
VexOs,
VisionOs,
Vita,
VxWorks,
Wasi,
WatchOs,
Windows,
Xous,
Zkvm,
Unknown,
Other(crate::spec::StaticCow<str>),
}
#[automatically_derived]
impl ::core::clone::Clone for Os {
#[inline]
fn clone(&self) -> Os {
match self {
Os::Aix => Os::Aix,
Os::AmdHsa => Os::AmdHsa,
Os::Android => Os::Android,
Os::Cuda => Os::Cuda,
Os::Cygwin => Os::Cygwin,
Os::Dragonfly => Os::Dragonfly,
Os::Emscripten => Os::Emscripten,
Os::EspIdf => Os::EspIdf,
Os::FreeBsd => Os::FreeBsd,
Os::Fuchsia => Os::Fuchsia,
Os::Haiku => Os::Haiku,
Os::HelenOs => Os::HelenOs,
Os::Hermit => Os::Hermit,
Os::Horizon => Os::Horizon,
Os::Hurd => Os::Hurd,
Os::Illumos => Os::Illumos,
Os::IOs => Os::IOs,
Os::L4Re => Os::L4Re,
Os::Linux => Os::Linux,
Os::LynxOs178 => Os::LynxOs178,
Os::MacOs => Os::MacOs,
Os::Managarm => Os::Managarm,
Os::Motor => Os::Motor,
Os::NetBsd => Os::NetBsd,
Os::None => Os::None,
Os::Nto => Os::Nto,
Os::NuttX => Os::NuttX,
Os::OpenBsd => Os::OpenBsd,
Os::Psp => Os::Psp,
Os::Psx => Os::Psx,
Os::Qurt => Os::Qurt,
Os::Redox => Os::Redox,
Os::Rtems => Os::Rtems,
Os::Solaris => Os::Solaris,
Os::SolidAsp3 => Os::SolidAsp3,
Os::TeeOs => Os::TeeOs,
Os::Trusty => Os::Trusty,
Os::TvOs => Os::TvOs,
Os::Uefi => Os::Uefi,
Os::VexOs => Os::VexOs,
Os::VisionOs => Os::VisionOs,
Os::Vita => Os::Vita,
Os::VxWorks => Os::VxWorks,
Os::Wasi => Os::Wasi,
Os::WatchOs => Os::WatchOs,
Os::Windows => Os::Windows,
Os::Xous => Os::Xous,
Os::Zkvm => Os::Zkvm,
Os::Unknown => Os::Unknown,
Os::Other(__self_0) =>
Os::Other(::core::clone::Clone::clone(__self_0)),
}
}
}
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for Os { }
#[automatically_derived]
impl ::core::cmp::PartialEq for Os {
#[inline]
fn eq(&self, other: &Os) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(Os::Other(__self_0), Os::Other(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}
#[automatically_derived]
impl ::core::cmp::Eq for Os {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<crate::spec::StaticCow<str>>;
}
}
#[automatically_derived]
impl ::core::hash::Hash for Os {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state);
match self {
Os::Other(__self_0) => ::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}
#[automatically_derived]
impl ::core::fmt::Debug for Os {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Os::Aix => ::core::fmt::Formatter::write_str(f, "Aix"),
Os::AmdHsa => ::core::fmt::Formatter::write_str(f, "AmdHsa"),
Os::Android => ::core::fmt::Formatter::write_str(f, "Android"),
Os::Cuda => ::core::fmt::Formatter::write_str(f, "Cuda"),
Os::Cygwin => ::core::fmt::Formatter::write_str(f, "Cygwin"),
Os::Dragonfly =>
::core::fmt::Formatter::write_str(f, "Dragonfly"),
Os::Emscripten =>
::core::fmt::Formatter::write_str(f, "Emscripten"),
Os::EspIdf => ::core::fmt::Formatter::write_str(f, "EspIdf"),
Os::FreeBsd => ::core::fmt::Formatter::write_str(f, "FreeBsd"),
Os::Fuchsia => ::core::fmt::Formatter::write_str(f, "Fuchsia"),
Os::Haiku => ::core::fmt::Formatter::write_str(f, "Haiku"),
Os::HelenOs => ::core::fmt::Formatter::write_str(f, "HelenOs"),
Os::Hermit => ::core::fmt::Formatter::write_str(f, "Hermit"),
Os::Horizon => ::core::fmt::Formatter::write_str(f, "Horizon"),
Os::Hurd => ::core::fmt::Formatter::write_str(f, "Hurd"),
Os::Illumos => ::core::fmt::Formatter::write_str(f, "Illumos"),
Os::IOs => ::core::fmt::Formatter::write_str(f, "IOs"),
Os::L4Re => ::core::fmt::Formatter::write_str(f, "L4Re"),
Os::Linux => ::core::fmt::Formatter::write_str(f, "Linux"),
Os::LynxOs178 =>
::core::fmt::Formatter::write_str(f, "LynxOs178"),
Os::MacOs => ::core::fmt::Formatter::write_str(f, "MacOs"),
Os::Managarm => ::core::fmt::Formatter::write_str(f, "Managarm"),
Os::Motor => ::core::fmt::Formatter::write_str(f, "Motor"),
Os::NetBsd => ::core::fmt::Formatter::write_str(f, "NetBsd"),
Os::None => ::core::fmt::Formatter::write_str(f, "None"),
Os::Nto => ::core::fmt::Formatter::write_str(f, "Nto"),
Os::NuttX => ::core::fmt::Formatter::write_str(f, "NuttX"),
Os::OpenBsd => ::core::fmt::Formatter::write_str(f, "OpenBsd"),
Os::Psp => ::core::fmt::Formatter::write_str(f, "Psp"),
Os::Psx => ::core::fmt::Formatter::write_str(f, "Psx"),
Os::Qurt => ::core::fmt::Formatter::write_str(f, "Qurt"),
Os::Redox => ::core::fmt::Formatter::write_str(f, "Redox"),
Os::Rtems => ::core::fmt::Formatter::write_str(f, "Rtems"),
Os::Solaris => ::core::fmt::Formatter::write_str(f, "Solaris"),
Os::SolidAsp3 =>
::core::fmt::Formatter::write_str(f, "SolidAsp3"),
Os::TeeOs => ::core::fmt::Formatter::write_str(f, "TeeOs"),
Os::Trusty => ::core::fmt::Formatter::write_str(f, "Trusty"),
Os::TvOs => ::core::fmt::Formatter::write_str(f, "TvOs"),
Os::Uefi => ::core::fmt::Formatter::write_str(f, "Uefi"),
Os::VexOs => ::core::fmt::Formatter::write_str(f, "VexOs"),
Os::VisionOs => ::core::fmt::Formatter::write_str(f, "VisionOs"),
Os::Vita => ::core::fmt::Formatter::write_str(f, "Vita"),
Os::VxWorks => ::core::fmt::Formatter::write_str(f, "VxWorks"),
Os::Wasi => ::core::fmt::Formatter::write_str(f, "Wasi"),
Os::WatchOs => ::core::fmt::Formatter::write_str(f, "WatchOs"),
Os::Windows => ::core::fmt::Formatter::write_str(f, "Windows"),
Os::Xous => ::core::fmt::Formatter::write_str(f, "Xous"),
Os::Zkvm => ::core::fmt::Formatter::write_str(f, "Zkvm"),
Os::Unknown => ::core::fmt::Formatter::write_str(f, "Unknown"),
Os::Other(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Other",
&__self_0),
}
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for Os {
#[inline]
fn partial_cmp(&self, other: &Os)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
match (self, other) {
(Os::Other(__self_0), Os::Other(__arg1_0)) =>
::core::cmp::PartialOrd::partial_cmp(__self_0, __arg1_0),
_ =>
::core::cmp::PartialOrd::partial_cmp(&__self_discr,
&__arg1_discr),
}
}
}
#[automatically_derived]
impl ::core::cmp::Ord for Os {
#[inline]
fn cmp(&self, other: &Os) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
match ::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr) {
::core::cmp::Ordering::Equal =>
match (self, other) {
(Os::Other(__self_0), Os::Other(__arg1_0)) =>
::core::cmp::Ord::cmp(__self_0, __arg1_0),
_ => ::core::cmp::Ordering::Equal,
},
cmp => cmp,
}
}
}
impl schemars::JsonSchema for Os {
fn schema_name() -> std::borrow::Cow<'static, str> {
std::borrow::Cow::Borrowed("Os")
}
fn json_schema(_: &mut schemars::SchemaGenerator) -> schemars::Schema {
<::schemars::Schema as
::core::convert::TryFrom<_>>::try_from(::serde_json::Value::Object({
let mut object = ::serde_json::Map::new();
let _ =
object.insert(("type").into(),
::serde_json::to_value(&"string").unwrap());
object
})).unwrap()
}
}
impl FromStr for Os {
type Err = core::convert::Infallible;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"aix" => Self::Aix,
"amdhsa" => Self::AmdHsa,
"android" => Self::Android,
"cuda" => Self::Cuda,
"cygwin" => Self::Cygwin,
"dragonfly" => Self::Dragonfly,
"emscripten" => Self::Emscripten,
"espidf" => Self::EspIdf,
"freebsd" => Self::FreeBsd,
"fuchsia" => Self::Fuchsia,
"haiku" => Self::Haiku,
"helenos" => Self::HelenOs,
"hermit" => Self::Hermit,
"horizon" => Self::Horizon,
"hurd" => Self::Hurd,
"illumos" => Self::Illumos,
"ios" => Self::IOs,
"l4re" => Self::L4Re,
"linux" => Self::Linux,
"lynxos178" => Self::LynxOs178,
"macos" => Self::MacOs,
"managarm" => Self::Managarm,
"motor" => Self::Motor,
"netbsd" => Self::NetBsd,
"none" => Self::None,
"nto" => Self::Nto,
"nuttx" => Self::NuttX,
"openbsd" => Self::OpenBsd,
"psp" => Self::Psp,
"psx" => Self::Psx,
"qurt" => Self::Qurt,
"redox" => Self::Redox,
"rtems" => Self::Rtems,
"solaris" => Self::Solaris,
"solid_asp3" => Self::SolidAsp3,
"teeos" => Self::TeeOs,
"trusty" => Self::Trusty,
"tvos" => Self::TvOs,
"uefi" => Self::Uefi,
"vexos" => Self::VexOs,
"visionos" => Self::VisionOs,
"vita" => Self::Vita,
"vxworks" => Self::VxWorks,
"wasi" => Self::Wasi,
"watchos" => Self::WatchOs,
"windows" => Self::Windows,
"xous" => Self::Xous,
"zkvm" => Self::Zkvm,
"unknown" => Self::Unknown,
_ => Self::Other(s.to_owned().into()),
})
}
}
impl Os {
pub fn desc(&self) -> &str {
match self {
Self::Aix => "aix",
Self::AmdHsa => "amdhsa",
Self::Android => "android",
Self::Cuda => "cuda",
Self::Cygwin => "cygwin",
Self::Dragonfly => "dragonfly",
Self::Emscripten => "emscripten",
Self::EspIdf => "espidf",
Self::FreeBsd => "freebsd",
Self::Fuchsia => "fuchsia",
Self::Haiku => "haiku",
Self::HelenOs => "helenos",
Self::Hermit => "hermit",
Self::Horizon => "horizon",
Self::Hurd => "hurd",
Self::Illumos => "illumos",
Self::IOs => "ios",
Self::L4Re => "l4re",
Self::Linux => "linux",
Self::LynxOs178 => "lynxos178",
Self::MacOs => "macos",
Self::Managarm => "managarm",
Self::Motor => "motor",
Self::NetBsd => "netbsd",
Self::None => "none",
Self::Nto => "nto",
Self::NuttX => "nuttx",
Self::OpenBsd => "openbsd",
Self::Psp => "psp",
Self::Psx => "psx",
Self::Qurt => "qurt",
Self::Redox => "redox",
Self::Rtems => "rtems",
Self::Solaris => "solaris",
Self::SolidAsp3 => "solid_asp3",
Self::TeeOs => "teeos",
Self::Trusty => "trusty",
Self::TvOs => "tvos",
Self::Uefi => "uefi",
Self::VexOs => "vexos",
Self::VisionOs => "visionos",
Self::Vita => "vita",
Self::VxWorks => "vxworks",
Self::Wasi => "wasi",
Self::WatchOs => "watchos",
Self::Windows => "windows",
Self::Xous => "xous",
Self::Zkvm => "zkvm",
Self::Unknown => "unknown",
Self::Other(name) => name.as_ref(),
}
}
}
impl crate::json::ToJson for Os {
fn to_json(&self) -> crate::json::Json { self.desc().to_json() }
}
impl<'de> serde::Deserialize<'de> for Os {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}
impl std::fmt::Display for Os {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.desc())
}
}crate::target_spec_enum! {
1961 pub enum Os {
1962 Aix = "aix",
1963 AmdHsa = "amdhsa",
1964 Android = "android",
1965 Cuda = "cuda",
1966 Cygwin = "cygwin",
1967 Dragonfly = "dragonfly",
1968 Emscripten = "emscripten",
1969 EspIdf = "espidf",
1970 FreeBsd = "freebsd",
1971 Fuchsia = "fuchsia",
1972 Haiku = "haiku",
1973 HelenOs = "helenos",
1974 Hermit = "hermit",
1975 Horizon = "horizon",
1976 Hurd = "hurd",
1977 Illumos = "illumos",
1978 IOs = "ios",
1979 L4Re = "l4re",
1980 Linux = "linux",
1981 LynxOs178 = "lynxos178",
1982 MacOs = "macos",
1983 Managarm = "managarm",
1984 Motor = "motor",
1985 NetBsd = "netbsd",
1986 None = "none",
1987 Nto = "nto",
1988 NuttX = "nuttx",
1989 OpenBsd = "openbsd",
1990 Psp = "psp",
1991 Psx = "psx",
1992 Qurt = "qurt",
1993 Redox = "redox",
1994 Rtems = "rtems",
1995 Solaris = "solaris",
1996 SolidAsp3 = "solid_asp3",
1997 TeeOs = "teeos",
1998 Trusty = "trusty",
1999 TvOs = "tvos",
2000 Uefi = "uefi",
2001 VexOs = "vexos",
2002 VisionOs = "visionos",
2003 Vita = "vita",
2004 VxWorks = "vxworks",
2005 Wasi = "wasi",
2006 WatchOs = "watchos",
2007 Windows = "windows",
2008 Xous = "xous",
2009 Zkvm = "zkvm",
2010 Unknown = "unknown",
2011 }
2012 other_variant = Other;
2013}
2014
2015impl Os {
2016 pub fn desc_symbol(&self) -> Symbol {
2017 Symbol::intern(self.desc())
2018 }
2019}
2020
2021pub enum Env {
Gnu,
MacAbi,
Mlibc,
Msvc,
Musl,
Newlib,
Nto70,
Nto71,
Nto71IoSock,
Nto80,
Ohos,
Relibc,
Sgx,
Sim,
P1,
P2,
P3,
Uclibc,
V5,
Unspecified,
Other(crate::spec::StaticCow<str>),
}
#[automatically_derived]
impl ::core::clone::Clone for Env {
#[inline]
fn clone(&self) -> Env {
match self {
Env::Gnu => Env::Gnu,
Env::MacAbi => Env::MacAbi,
Env::Mlibc => Env::Mlibc,
Env::Msvc => Env::Msvc,
Env::Musl => Env::Musl,
Env::Newlib => Env::Newlib,
Env::Nto70 => Env::Nto70,
Env::Nto71 => Env::Nto71,
Env::Nto71IoSock => Env::Nto71IoSock,
Env::Nto80 => Env::Nto80,
Env::Ohos => Env::Ohos,
Env::Relibc => Env::Relibc,
Env::Sgx => Env::Sgx,
Env::Sim => Env::Sim,
Env::P1 => Env::P1,
Env::P2 => Env::P2,
Env::P3 => Env::P3,
Env::Uclibc => Env::Uclibc,
Env::V5 => Env::V5,
Env::Unspecified => Env::Unspecified,
Env::Other(__self_0) =>
Env::Other(::core::clone::Clone::clone(__self_0)),
}
}
}
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for Env { }
#[automatically_derived]
impl ::core::cmp::PartialEq for Env {
#[inline]
fn eq(&self, other: &Env) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(Env::Other(__self_0), Env::Other(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}
#[automatically_derived]
impl ::core::cmp::Eq for Env {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<crate::spec::StaticCow<str>>;
}
}
#[automatically_derived]
impl ::core::hash::Hash for Env {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state);
match self {
Env::Other(__self_0) => ::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}
#[automatically_derived]
impl ::core::fmt::Debug for Env {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Env::Gnu => ::core::fmt::Formatter::write_str(f, "Gnu"),
Env::MacAbi => ::core::fmt::Formatter::write_str(f, "MacAbi"),
Env::Mlibc => ::core::fmt::Formatter::write_str(f, "Mlibc"),
Env::Msvc => ::core::fmt::Formatter::write_str(f, "Msvc"),
Env::Musl => ::core::fmt::Formatter::write_str(f, "Musl"),
Env::Newlib => ::core::fmt::Formatter::write_str(f, "Newlib"),
Env::Nto70 => ::core::fmt::Formatter::write_str(f, "Nto70"),
Env::Nto71 => ::core::fmt::Formatter::write_str(f, "Nto71"),
Env::Nto71IoSock =>
::core::fmt::Formatter::write_str(f, "Nto71IoSock"),
Env::Nto80 => ::core::fmt::Formatter::write_str(f, "Nto80"),
Env::Ohos => ::core::fmt::Formatter::write_str(f, "Ohos"),
Env::Relibc => ::core::fmt::Formatter::write_str(f, "Relibc"),
Env::Sgx => ::core::fmt::Formatter::write_str(f, "Sgx"),
Env::Sim => ::core::fmt::Formatter::write_str(f, "Sim"),
Env::P1 => ::core::fmt::Formatter::write_str(f, "P1"),
Env::P2 => ::core::fmt::Formatter::write_str(f, "P2"),
Env::P3 => ::core::fmt::Formatter::write_str(f, "P3"),
Env::Uclibc => ::core::fmt::Formatter::write_str(f, "Uclibc"),
Env::V5 => ::core::fmt::Formatter::write_str(f, "V5"),
Env::Unspecified =>
::core::fmt::Formatter::write_str(f, "Unspecified"),
Env::Other(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Other",
&__self_0),
}
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for Env {
#[inline]
fn partial_cmp(&self, other: &Env)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
match (self, other) {
(Env::Other(__self_0), Env::Other(__arg1_0)) =>
::core::cmp::PartialOrd::partial_cmp(__self_0, __arg1_0),
_ =>
::core::cmp::PartialOrd::partial_cmp(&__self_discr,
&__arg1_discr),
}
}
}
#[automatically_derived]
impl ::core::cmp::Ord for Env {
#[inline]
fn cmp(&self, other: &Env) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
match ::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr) {
::core::cmp::Ordering::Equal =>
match (self, other) {
(Env::Other(__self_0), Env::Other(__arg1_0)) =>
::core::cmp::Ord::cmp(__self_0, __arg1_0),
_ => ::core::cmp::Ordering::Equal,
},
cmp => cmp,
}
}
}
impl schemars::JsonSchema for Env {
fn schema_name() -> std::borrow::Cow<'static, str> {
std::borrow::Cow::Borrowed("Env")
}
fn json_schema(_: &mut schemars::SchemaGenerator) -> schemars::Schema {
<::schemars::Schema as
::core::convert::TryFrom<_>>::try_from(::serde_json::Value::Object({
let mut object = ::serde_json::Map::new();
let _ =
object.insert(("type").into(),
::serde_json::to_value(&"string").unwrap());
object
})).unwrap()
}
}
impl FromStr for Env {
type Err = core::convert::Infallible;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"gnu" => Self::Gnu,
"macabi" => Self::MacAbi,
"mlibc" => Self::Mlibc,
"msvc" => Self::Msvc,
"musl" => Self::Musl,
"newlib" => Self::Newlib,
"nto70" => Self::Nto70,
"nto71" => Self::Nto71,
"nto71_iosock" => Self::Nto71IoSock,
"nto80" => Self::Nto80,
"ohos" => Self::Ohos,
"relibc" => Self::Relibc,
"sgx" => Self::Sgx,
"sim" => Self::Sim,
"p1" => Self::P1,
"p2" => Self::P2,
"p3" => Self::P3,
"uclibc" => Self::Uclibc,
"v5" => Self::V5,
"" => Self::Unspecified,
_ => Self::Other(s.to_owned().into()),
})
}
}
impl Env {
pub fn desc(&self) -> &str {
match self {
Self::Gnu => "gnu",
Self::MacAbi => "macabi",
Self::Mlibc => "mlibc",
Self::Msvc => "msvc",
Self::Musl => "musl",
Self::Newlib => "newlib",
Self::Nto70 => "nto70",
Self::Nto71 => "nto71",
Self::Nto71IoSock => "nto71_iosock",
Self::Nto80 => "nto80",
Self::Ohos => "ohos",
Self::Relibc => "relibc",
Self::Sgx => "sgx",
Self::Sim => "sim",
Self::P1 => "p1",
Self::P2 => "p2",
Self::P3 => "p3",
Self::Uclibc => "uclibc",
Self::V5 => "v5",
Self::Unspecified => "",
Self::Other(name) => name.as_ref(),
}
}
}
impl crate::json::ToJson for Env {
fn to_json(&self) -> crate::json::Json { self.desc().to_json() }
}
impl<'de> serde::Deserialize<'de> for Env {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}
impl std::fmt::Display for Env {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.desc())
}
}crate::target_spec_enum! {
2022 pub enum Env {
2023 Gnu = "gnu",
2024 MacAbi = "macabi",
2025 Mlibc = "mlibc",
2026 Msvc = "msvc",
2027 Musl = "musl",
2028 Newlib = "newlib",
2029 Nto70 = "nto70",
2030 Nto71 = "nto71",
2031 Nto71IoSock = "nto71_iosock",
2032 Nto80 = "nto80",
2033 Ohos = "ohos",
2034 Relibc = "relibc",
2035 Sgx = "sgx",
2036 Sim = "sim",
2037 P1 = "p1",
2038 P2 = "p2",
2039 P3 = "p3",
2040 Uclibc = "uclibc",
2041 V5 = "v5",
2042 Unspecified = "",
2043 }
2044 other_variant = Other;
2045}
2046
2047impl Env {
2048 pub fn desc_symbol(&self) -> Symbol {
2049 Symbol::intern(self.desc())
2050 }
2051}
2052
2053pub enum Abi {
Abi64,
AbiV2,
AbiV2Hf,
Eabi,
EabiHf,
ElfV1,
ElfV2,
Fortanix,
Ilp32,
Ilp32e,
Llvm,
MacAbi,
Sim,
SoftFloat,
Spe,
Uwp,
VecDefault,
VecExtAbi,
X32,
Unspecified,
Other(crate::spec::StaticCow<str>),
}
#[automatically_derived]
impl ::core::clone::Clone for Abi {
#[inline]
fn clone(&self) -> Abi {
match self {
Abi::Abi64 => Abi::Abi64,
Abi::AbiV2 => Abi::AbiV2,
Abi::AbiV2Hf => Abi::AbiV2Hf,
Abi::Eabi => Abi::Eabi,
Abi::EabiHf => Abi::EabiHf,
Abi::ElfV1 => Abi::ElfV1,
Abi::ElfV2 => Abi::ElfV2,
Abi::Fortanix => Abi::Fortanix,
Abi::Ilp32 => Abi::Ilp32,
Abi::Ilp32e => Abi::Ilp32e,
Abi::Llvm => Abi::Llvm,
Abi::MacAbi => Abi::MacAbi,
Abi::Sim => Abi::Sim,
Abi::SoftFloat => Abi::SoftFloat,
Abi::Spe => Abi::Spe,
Abi::Uwp => Abi::Uwp,
Abi::VecDefault => Abi::VecDefault,
Abi::VecExtAbi => Abi::VecExtAbi,
Abi::X32 => Abi::X32,
Abi::Unspecified => Abi::Unspecified,
Abi::Other(__self_0) =>
Abi::Other(::core::clone::Clone::clone(__self_0)),
}
}
}
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for Abi { }
#[automatically_derived]
impl ::core::cmp::PartialEq for Abi {
#[inline]
fn eq(&self, other: &Abi) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(Abi::Other(__self_0), Abi::Other(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}
#[automatically_derived]
impl ::core::cmp::Eq for Abi {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<crate::spec::StaticCow<str>>;
}
}
#[automatically_derived]
impl ::core::hash::Hash for Abi {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state);
match self {
Abi::Other(__self_0) => ::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}
#[automatically_derived]
impl ::core::fmt::Debug for Abi {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Abi::Abi64 => ::core::fmt::Formatter::write_str(f, "Abi64"),
Abi::AbiV2 => ::core::fmt::Formatter::write_str(f, "AbiV2"),
Abi::AbiV2Hf => ::core::fmt::Formatter::write_str(f, "AbiV2Hf"),
Abi::Eabi => ::core::fmt::Formatter::write_str(f, "Eabi"),
Abi::EabiHf => ::core::fmt::Formatter::write_str(f, "EabiHf"),
Abi::ElfV1 => ::core::fmt::Formatter::write_str(f, "ElfV1"),
Abi::ElfV2 => ::core::fmt::Formatter::write_str(f, "ElfV2"),
Abi::Fortanix => ::core::fmt::Formatter::write_str(f, "Fortanix"),
Abi::Ilp32 => ::core::fmt::Formatter::write_str(f, "Ilp32"),
Abi::Ilp32e => ::core::fmt::Formatter::write_str(f, "Ilp32e"),
Abi::Llvm => ::core::fmt::Formatter::write_str(f, "Llvm"),
Abi::MacAbi => ::core::fmt::Formatter::write_str(f, "MacAbi"),
Abi::Sim => ::core::fmt::Formatter::write_str(f, "Sim"),
Abi::SoftFloat =>
::core::fmt::Formatter::write_str(f, "SoftFloat"),
Abi::Spe => ::core::fmt::Formatter::write_str(f, "Spe"),
Abi::Uwp => ::core::fmt::Formatter::write_str(f, "Uwp"),
Abi::VecDefault =>
::core::fmt::Formatter::write_str(f, "VecDefault"),
Abi::VecExtAbi =>
::core::fmt::Formatter::write_str(f, "VecExtAbi"),
Abi::X32 => ::core::fmt::Formatter::write_str(f, "X32"),
Abi::Unspecified =>
::core::fmt::Formatter::write_str(f, "Unspecified"),
Abi::Other(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Other",
&__self_0),
}
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for Abi {
#[inline]
fn partial_cmp(&self, other: &Abi)
-> ::core::option::Option<::core::cmp::Ordering> {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
match (self, other) {
(Abi::Other(__self_0), Abi::Other(__arg1_0)) =>
::core::cmp::PartialOrd::partial_cmp(__self_0, __arg1_0),
_ =>
::core::cmp::PartialOrd::partial_cmp(&__self_discr,
&__arg1_discr),
}
}
}
#[automatically_derived]
impl ::core::cmp::Ord for Abi {
#[inline]
fn cmp(&self, other: &Abi) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
match ::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr) {
::core::cmp::Ordering::Equal =>
match (self, other) {
(Abi::Other(__self_0), Abi::Other(__arg1_0)) =>
::core::cmp::Ord::cmp(__self_0, __arg1_0),
_ => ::core::cmp::Ordering::Equal,
},
cmp => cmp,
}
}
}
impl schemars::JsonSchema for Abi {
fn schema_name() -> std::borrow::Cow<'static, str> {
std::borrow::Cow::Borrowed("Abi")
}
fn json_schema(_: &mut schemars::SchemaGenerator) -> schemars::Schema {
<::schemars::Schema as
::core::convert::TryFrom<_>>::try_from(::serde_json::Value::Object({
let mut object = ::serde_json::Map::new();
let _ =
object.insert(("type").into(),
::serde_json::to_value(&"string").unwrap());
object
})).unwrap()
}
}
impl FromStr for Abi {
type Err = core::convert::Infallible;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(match s {
"abi64" => Self::Abi64,
"abiv2" => Self::AbiV2,
"abiv2hf" => Self::AbiV2Hf,
"eabi" => Self::Eabi,
"eabihf" => Self::EabiHf,
"elfv1" => Self::ElfV1,
"elfv2" => Self::ElfV2,
"fortanix" => Self::Fortanix,
"ilp32" => Self::Ilp32,
"ilp32e" => Self::Ilp32e,
"llvm" => Self::Llvm,
"macabi" => Self::MacAbi,
"sim" => Self::Sim,
"softfloat" => Self::SoftFloat,
"spe" => Self::Spe,
"uwp" => Self::Uwp,
"vec-default" => Self::VecDefault,
"vec-extabi" => Self::VecExtAbi,
"x32" => Self::X32,
"" => Self::Unspecified,
_ => Self::Other(s.to_owned().into()),
})
}
}
impl Abi {
pub fn desc(&self) -> &str {
match self {
Self::Abi64 => "abi64",
Self::AbiV2 => "abiv2",
Self::AbiV2Hf => "abiv2hf",
Self::Eabi => "eabi",
Self::EabiHf => "eabihf",
Self::ElfV1 => "elfv1",
Self::ElfV2 => "elfv2",
Self::Fortanix => "fortanix",
Self::Ilp32 => "ilp32",
Self::Ilp32e => "ilp32e",
Self::Llvm => "llvm",
Self::MacAbi => "macabi",
Self::Sim => "sim",
Self::SoftFloat => "softfloat",
Self::Spe => "spe",
Self::Uwp => "uwp",
Self::VecDefault => "vec-default",
Self::VecExtAbi => "vec-extabi",
Self::X32 => "x32",
Self::Unspecified => "",
Self::Other(name) => name.as_ref(),
}
}
}
impl crate::json::ToJson for Abi {
fn to_json(&self) -> crate::json::Json { self.desc().to_json() }
}
impl<'de> serde::Deserialize<'de> for Abi {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where
D: serde::Deserializer<'de> {
let s = String::deserialize(deserializer)?;
FromStr::from_str(&s).map_err(serde::de::Error::custom)
}
}
impl std::fmt::Display for Abi {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.desc())
}
}crate::target_spec_enum! {
2054 pub enum Abi {
2055 Abi64 = "abi64",
2056 AbiV2 = "abiv2",
2057 AbiV2Hf = "abiv2hf",
2058 Eabi = "eabi",
2059 EabiHf = "eabihf",
2060 ElfV1 = "elfv1",
2061 ElfV2 = "elfv2",
2062 Fortanix = "fortanix",
2063 Ilp32 = "ilp32",
2064 Ilp32e = "ilp32e",
2065 Llvm = "llvm",
2066 MacAbi = "macabi",
2067 Sim = "sim",
2068 SoftFloat = "softfloat",
2069 Spe = "spe",
2070 Uwp = "uwp",
2071 VecDefault = "vec-default",
2072 VecExtAbi = "vec-extabi",
2073 X32 = "x32",
2074 Unspecified = "",
2075 }
2076 other_variant = Other;
2077}
2078
2079impl Abi {
2080 pub fn desc_symbol(&self) -> Symbol {
2081 Symbol::intern(self.desc())
2082 }
2083}
2084
2085#[derive(#[automatically_derived]
impl ::core::cmp::PartialEq for Target {
#[inline]
fn eq(&self, other: &Target) -> bool {
self.pointer_width == other.pointer_width &&
self.llvm_target == other.llvm_target &&
self.metadata == other.metadata && self.arch == other.arch
&& self.data_layout == other.data_layout &&
self.options == other.options
}
}PartialEq, #[automatically_derived]
impl ::core::clone::Clone for Target {
#[inline]
fn clone(&self) -> Target {
Target {
llvm_target: ::core::clone::Clone::clone(&self.llvm_target),
metadata: ::core::clone::Clone::clone(&self.metadata),
pointer_width: ::core::clone::Clone::clone(&self.pointer_width),
arch: ::core::clone::Clone::clone(&self.arch),
data_layout: ::core::clone::Clone::clone(&self.data_layout),
options: ::core::clone::Clone::clone(&self.options),
}
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for Target {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
&["llvm_target", "metadata", "pointer_width", "arch",
"data_layout", "options"];
let values: &[&dyn ::core::fmt::Debug] =
&[&self.llvm_target, &self.metadata, &self.pointer_width,
&self.arch, &self.data_layout, &&self.options];
::core::fmt::Formatter::debug_struct_fields_finish(f, "Target", names,
values)
}
}Debug)]
2089pub struct Target {
2090 pub llvm_target: StaticCow<str>,
2097 pub metadata: TargetMetadata,
2100 pub pointer_width: u16,
2102 pub arch: Arch,
2105 pub data_layout: StaticCow<str>,
2107 pub options: TargetOptions,
2109}
2110
2111#[derive(#[automatically_derived]
impl ::core::default::Default for TargetMetadata {
#[inline]
fn default() -> TargetMetadata {
TargetMetadata {
description: ::core::default::Default::default(),
tier: ::core::default::Default::default(),
host_tools: ::core::default::Default::default(),
std: ::core::default::Default::default(),
}
}
}Default, #[automatically_derived]
impl ::core::cmp::PartialEq for TargetMetadata {
#[inline]
fn eq(&self, other: &TargetMetadata) -> bool {
self.description == other.description && self.tier == other.tier &&
self.host_tools == other.host_tools && self.std == other.std
}
}PartialEq, #[automatically_derived]
impl ::core::clone::Clone for TargetMetadata {
#[inline]
fn clone(&self) -> TargetMetadata {
TargetMetadata {
description: ::core::clone::Clone::clone(&self.description),
tier: ::core::clone::Clone::clone(&self.tier),
host_tools: ::core::clone::Clone::clone(&self.host_tools),
std: ::core::clone::Clone::clone(&self.std),
}
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for TargetMetadata {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field4_finish(f,
"TargetMetadata", "description", &self.description, "tier",
&self.tier, "host_tools", &self.host_tools, "std", &&self.std)
}
}Debug)]
2115pub struct TargetMetadata {
2116 pub description: Option<StaticCow<str>>,
2119 pub tier: Option<u64>,
2121 pub host_tools: Option<bool>,
2123 pub std: Option<bool>,
2126}
2127
2128impl Target {
2129 pub fn parse_data_layout(&self) -> Result<TargetDataLayout, TargetDataLayoutErrors<'_>> {
2130 let mut dl = TargetDataLayout::parse_from_llvm_datalayout_string(
2131 &self.data_layout,
2132 self.options.default_address_space,
2133 )?;
2134
2135 if dl.endian != self.endian {
2137 return Err(TargetDataLayoutErrors::InconsistentTargetArchitecture {
2138 dl: dl.endian.as_str(),
2139 target: self.endian.as_str(),
2140 });
2141 }
2142
2143 let target_pointer_width: u64 = self.pointer_width.into();
2144 let dl_pointer_size: u64 = dl.pointer_size().bits();
2145 if dl_pointer_size != target_pointer_width {
2146 return Err(TargetDataLayoutErrors::InconsistentTargetPointerWidth {
2147 pointer_size: dl_pointer_size,
2148 target: self.pointer_width,
2149 });
2150 }
2151
2152 dl.c_enum_min_size = Integer::from_size(Size::from_bits(
2153 self.c_enum_min_bits.unwrap_or(self.c_int_width as _),
2154 ))
2155 .map_err(|err| TargetDataLayoutErrors::InvalidBitsSize { err })?;
2156
2157 Ok(dl)
2158 }
2159}
2160
2161pub trait HasTargetSpec {
2162 fn target_spec(&self) -> &Target;
2163}
2164
2165impl HasTargetSpec for Target {
2166 #[inline]
2167 fn target_spec(&self) -> &Target {
2168 self
2169 }
2170}
2171
2172#[derive(#[automatically_derived]
impl ::core::fmt::Debug for X86Abi {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f, "X86Abi",
"regparm", &self.regparm, "reg_struct_return",
&&self.reg_struct_return)
}
}Debug, #[automatically_derived]
impl ::core::marker::Copy for X86Abi { }Copy, #[automatically_derived]
impl ::core::clone::Clone for X86Abi {
#[inline]
fn clone(&self) -> X86Abi {
let _: ::core::clone::AssertParamIsClone<Option<u32>>;
let _: ::core::clone::AssertParamIsClone<bool>;
*self
}
}Clone, #[automatically_derived]
impl ::core::hash::Hash for X86Abi {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.regparm, state);
::core::hash::Hash::hash(&self.reg_struct_return, state)
}
}Hash, #[automatically_derived]
impl ::core::cmp::PartialEq for X86Abi {
#[inline]
fn eq(&self, other: &X86Abi) -> bool {
self.reg_struct_return == other.reg_struct_return &&
self.regparm == other.regparm
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for X86Abi {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<Option<u32>>;
let _: ::core::cmp::AssertParamIsEq<bool>;
}
}Eq)]
2174pub struct X86Abi {
2175 pub regparm: Option<u32>,
2178 pub reg_struct_return: bool,
2180}
2181
2182pub trait HasX86AbiOpt {
2183 fn x86_abi_opt(&self) -> X86Abi;
2184}
2185
2186type StaticCow<T> = Cow<'static, T>;
2187
2188#[derive(#[automatically_derived]
impl ::core::cmp::PartialEq for TargetOptions {
#[inline]
fn eq(&self, other: &TargetOptions) -> bool {
self.c_int_width == other.c_int_width &&
self.linker_is_gnu_json == other.linker_is_gnu_json &&
self.need_explicit_cpu == other.need_explicit_cpu &&
self.dynamic_linking == other.dynamic_linking &&
self.dll_tls_export == other.dll_tls_export &&
self.only_cdylib == other.only_cdylib &&
self.executables == other.executables &&
self.disable_redzone == other.disable_redzone &&
self.function_sections == other.function_sections &&
self.abi_return_struct_as_int ==
other.abi_return_struct_as_int &&
self.is_like_aix == other.is_like_aix &&
self.is_like_darwin == other.is_like_darwin &&
self.is_like_gpu == other.is_like_gpu &&
self.is_like_solaris == other.is_like_solaris &&
self.is_like_windows == other.is_like_windows &&
self.is_like_msvc == other.is_like_msvc &&
self.is_like_wasm == other.is_like_wasm &&
self.is_like_android == other.is_like_android &&
self.is_like_vexos == other.is_like_vexos &&
self.default_dwarf_version == other.default_dwarf_version &&
self.allows_weak_linkage == other.allows_weak_linkage &&
self.has_rpath == other.has_rpath &&
self.no_default_libraries == other.no_default_libraries &&
self.position_independent_executables ==
other.position_independent_executables &&
self.static_position_independent_executables ==
other.static_position_independent_executables &&
self.plt_by_default == other.plt_by_default &&
self.allow_asm == other.allow_asm &&
self.static_initializer_must_be_acyclic ==
other.static_initializer_must_be_acyclic &&
self.main_needs_argc_argv == other.main_needs_argc_argv &&
self.has_thread_local == other.has_thread_local &&
self.obj_is_bitcode == other.obj_is_bitcode &&
self.atomic_cas == other.atomic_cas &&
self.crt_static_allows_dylibs ==
other.crt_static_allows_dylibs &&
self.crt_static_default == other.crt_static_default &&
self.crt_static_respected == other.crt_static_respected &&
self.trap_unreachable == other.trap_unreachable &&
self.requires_lto == other.requires_lto &&
self.singlethread == other.singlethread &&
self.no_builtins == other.no_builtins &&
self.emit_debug_gdb_scripts == other.emit_debug_gdb_scripts
&& self.requires_uwtable == other.requires_uwtable &&
self.default_uwtable == other.default_uwtable &&
self.simd_types_indirect == other.simd_types_indirect &&
self.limit_rdylib_exports == other.limit_rdylib_exports &&
self.relax_elf_relocations == other.relax_elf_relocations &&
self.use_ctors_section == other.use_ctors_section &&
self.eh_frame_header == other.eh_frame_header &&
self.has_thumb_interworking == other.has_thumb_interworking
&&
self.generate_arange_section ==
other.generate_arange_section &&
self.supports_stack_protector ==
other.supports_stack_protector &&
self.supports_xray == other.supports_xray &&
self.endian == other.endian && self.os == other.os &&
self.env == other.env && self.abi == other.abi &&
self.vendor == other.vendor && self.linker == other.linker
&& self.linker_flavor == other.linker_flavor &&
self.linker_flavor_json == other.linker_flavor_json &&
self.lld_flavor_json == other.lld_flavor_json &&
self.pre_link_objects == other.pre_link_objects &&
self.post_link_objects == other.post_link_objects &&
self.pre_link_objects_self_contained ==
other.pre_link_objects_self_contained &&
self.post_link_objects_self_contained ==
other.post_link_objects_self_contained &&
self.link_self_contained == other.link_self_contained &&
self.pre_link_args == other.pre_link_args &&
self.pre_link_args_json == other.pre_link_args_json &&
self.late_link_args == other.late_link_args &&
self.late_link_args_json == other.late_link_args_json &&
self.late_link_args_dynamic == other.late_link_args_dynamic
&&
self.late_link_args_dynamic_json ==
other.late_link_args_dynamic_json &&
self.late_link_args_static == other.late_link_args_static &&
self.late_link_args_static_json ==
other.late_link_args_static_json &&
self.post_link_args == other.post_link_args &&
self.post_link_args_json == other.post_link_args_json &&
self.link_script == other.link_script &&
self.link_env == other.link_env &&
self.link_env_remove == other.link_env_remove &&
self.asm_args == other.asm_args && self.cpu == other.cpu &&
self.features == other.features &&
self.direct_access_external_data ==
other.direct_access_external_data &&
self.relocation_model == other.relocation_model &&
self.code_model == other.code_model &&
self.tls_model == other.tls_model &&
self.frame_pointer == other.frame_pointer &&
self.dll_prefix == other.dll_prefix &&
self.dll_suffix == other.dll_suffix &&
self.exe_suffix == other.exe_suffix &&
self.staticlib_prefix == other.staticlib_prefix &&
self.staticlib_suffix == other.staticlib_suffix &&
self.families == other.families &&
self.binary_format == other.binary_format &&
self.relro_level == other.relro_level &&
self.archive_format == other.archive_format &&
self.min_atomic_width == other.min_atomic_width &&
self.max_atomic_width == other.max_atomic_width &&
self.panic_strategy == other.panic_strategy &&
self.stack_probes == other.stack_probes &&
self.min_global_align == other.min_global_align &&
self.default_codegen_units == other.default_codegen_units &&
self.default_codegen_backend ==
other.default_codegen_backend &&
self.default_visibility == other.default_visibility &&
self.override_export_symbols ==
other.override_export_symbols &&
self.merge_functions == other.merge_functions &&
self.mcount == other.mcount &&
self.llvm_mcount_intrinsic == other.llvm_mcount_intrinsic &&
self.llvm_abiname == other.llvm_abiname &&
self.llvm_floatabi == other.llvm_floatabi &&
self.rustc_abi == other.rustc_abi &&
self.llvm_args == other.llvm_args &&
self.debuginfo_kind == other.debuginfo_kind &&
self.split_debuginfo == other.split_debuginfo &&
self.supported_split_debuginfo ==
other.supported_split_debuginfo &&
self.supported_sanitizers == other.supported_sanitizers &&
self.default_sanitizers == other.default_sanitizers &&
self.c_enum_min_bits == other.c_enum_min_bits &&
self.entry_name == other.entry_name &&
self.entry_abi == other.entry_abi &&
self.default_address_space == other.default_address_space &&
self.small_data_threshold_support ==
other.small_data_threshold_support
}
}PartialEq, #[automatically_derived]
impl ::core::clone::Clone for TargetOptions {
#[inline]
fn clone(&self) -> TargetOptions {
TargetOptions {
endian: ::core::clone::Clone::clone(&self.endian),
c_int_width: ::core::clone::Clone::clone(&self.c_int_width),
os: ::core::clone::Clone::clone(&self.os),
env: ::core::clone::Clone::clone(&self.env),
abi: ::core::clone::Clone::clone(&self.abi),
vendor: ::core::clone::Clone::clone(&self.vendor),
linker: ::core::clone::Clone::clone(&self.linker),
linker_flavor: ::core::clone::Clone::clone(&self.linker_flavor),
linker_flavor_json: ::core::clone::Clone::clone(&self.linker_flavor_json),
lld_flavor_json: ::core::clone::Clone::clone(&self.lld_flavor_json),
linker_is_gnu_json: ::core::clone::Clone::clone(&self.linker_is_gnu_json),
pre_link_objects: ::core::clone::Clone::clone(&self.pre_link_objects),
post_link_objects: ::core::clone::Clone::clone(&self.post_link_objects),
pre_link_objects_self_contained: ::core::clone::Clone::clone(&self.pre_link_objects_self_contained),
post_link_objects_self_contained: ::core::clone::Clone::clone(&self.post_link_objects_self_contained),
link_self_contained: ::core::clone::Clone::clone(&self.link_self_contained),
pre_link_args: ::core::clone::Clone::clone(&self.pre_link_args),
pre_link_args_json: ::core::clone::Clone::clone(&self.pre_link_args_json),
late_link_args: ::core::clone::Clone::clone(&self.late_link_args),
late_link_args_json: ::core::clone::Clone::clone(&self.late_link_args_json),
late_link_args_dynamic: ::core::clone::Clone::clone(&self.late_link_args_dynamic),
late_link_args_dynamic_json: ::core::clone::Clone::clone(&self.late_link_args_dynamic_json),
late_link_args_static: ::core::clone::Clone::clone(&self.late_link_args_static),
late_link_args_static_json: ::core::clone::Clone::clone(&self.late_link_args_static_json),
post_link_args: ::core::clone::Clone::clone(&self.post_link_args),
post_link_args_json: ::core::clone::Clone::clone(&self.post_link_args_json),
link_script: ::core::clone::Clone::clone(&self.link_script),
link_env: ::core::clone::Clone::clone(&self.link_env),
link_env_remove: ::core::clone::Clone::clone(&self.link_env_remove),
asm_args: ::core::clone::Clone::clone(&self.asm_args),
cpu: ::core::clone::Clone::clone(&self.cpu),
need_explicit_cpu: ::core::clone::Clone::clone(&self.need_explicit_cpu),
features: ::core::clone::Clone::clone(&self.features),
direct_access_external_data: ::core::clone::Clone::clone(&self.direct_access_external_data),
dynamic_linking: ::core::clone::Clone::clone(&self.dynamic_linking),
dll_tls_export: ::core::clone::Clone::clone(&self.dll_tls_export),
only_cdylib: ::core::clone::Clone::clone(&self.only_cdylib),
executables: ::core::clone::Clone::clone(&self.executables),
relocation_model: ::core::clone::Clone::clone(&self.relocation_model),
code_model: ::core::clone::Clone::clone(&self.code_model),
tls_model: ::core::clone::Clone::clone(&self.tls_model),
disable_redzone: ::core::clone::Clone::clone(&self.disable_redzone),
frame_pointer: ::core::clone::Clone::clone(&self.frame_pointer),
function_sections: ::core::clone::Clone::clone(&self.function_sections),
dll_prefix: ::core::clone::Clone::clone(&self.dll_prefix),
dll_suffix: ::core::clone::Clone::clone(&self.dll_suffix),
exe_suffix: ::core::clone::Clone::clone(&self.exe_suffix),
staticlib_prefix: ::core::clone::Clone::clone(&self.staticlib_prefix),
staticlib_suffix: ::core::clone::Clone::clone(&self.staticlib_suffix),
families: ::core::clone::Clone::clone(&self.families),
abi_return_struct_as_int: ::core::clone::Clone::clone(&self.abi_return_struct_as_int),
is_like_aix: ::core::clone::Clone::clone(&self.is_like_aix),
is_like_darwin: ::core::clone::Clone::clone(&self.is_like_darwin),
is_like_gpu: ::core::clone::Clone::clone(&self.is_like_gpu),
is_like_solaris: ::core::clone::Clone::clone(&self.is_like_solaris),
is_like_windows: ::core::clone::Clone::clone(&self.is_like_windows),
is_like_msvc: ::core::clone::Clone::clone(&self.is_like_msvc),
is_like_wasm: ::core::clone::Clone::clone(&self.is_like_wasm),
is_like_android: ::core::clone::Clone::clone(&self.is_like_android),
is_like_vexos: ::core::clone::Clone::clone(&self.is_like_vexos),
binary_format: ::core::clone::Clone::clone(&self.binary_format),
default_dwarf_version: ::core::clone::Clone::clone(&self.default_dwarf_version),
allows_weak_linkage: ::core::clone::Clone::clone(&self.allows_weak_linkage),
has_rpath: ::core::clone::Clone::clone(&self.has_rpath),
no_default_libraries: ::core::clone::Clone::clone(&self.no_default_libraries),
position_independent_executables: ::core::clone::Clone::clone(&self.position_independent_executables),
static_position_independent_executables: ::core::clone::Clone::clone(&self.static_position_independent_executables),
plt_by_default: ::core::clone::Clone::clone(&self.plt_by_default),
relro_level: ::core::clone::Clone::clone(&self.relro_level),
archive_format: ::core::clone::Clone::clone(&self.archive_format),
allow_asm: ::core::clone::Clone::clone(&self.allow_asm),
static_initializer_must_be_acyclic: ::core::clone::Clone::clone(&self.static_initializer_must_be_acyclic),
main_needs_argc_argv: ::core::clone::Clone::clone(&self.main_needs_argc_argv),
has_thread_local: ::core::clone::Clone::clone(&self.has_thread_local),
obj_is_bitcode: ::core::clone::Clone::clone(&self.obj_is_bitcode),
min_atomic_width: ::core::clone::Clone::clone(&self.min_atomic_width),
max_atomic_width: ::core::clone::Clone::clone(&self.max_atomic_width),
atomic_cas: ::core::clone::Clone::clone(&self.atomic_cas),
panic_strategy: ::core::clone::Clone::clone(&self.panic_strategy),
crt_static_allows_dylibs: ::core::clone::Clone::clone(&self.crt_static_allows_dylibs),
crt_static_default: ::core::clone::Clone::clone(&self.crt_static_default),
crt_static_respected: ::core::clone::Clone::clone(&self.crt_static_respected),
stack_probes: ::core::clone::Clone::clone(&self.stack_probes),
min_global_align: ::core::clone::Clone::clone(&self.min_global_align),
default_codegen_units: ::core::clone::Clone::clone(&self.default_codegen_units),
default_codegen_backend: ::core::clone::Clone::clone(&self.default_codegen_backend),
trap_unreachable: ::core::clone::Clone::clone(&self.trap_unreachable),
requires_lto: ::core::clone::Clone::clone(&self.requires_lto),
singlethread: ::core::clone::Clone::clone(&self.singlethread),
no_builtins: ::core::clone::Clone::clone(&self.no_builtins),
default_visibility: ::core::clone::Clone::clone(&self.default_visibility),
emit_debug_gdb_scripts: ::core::clone::Clone::clone(&self.emit_debug_gdb_scripts),
requires_uwtable: ::core::clone::Clone::clone(&self.requires_uwtable),
default_uwtable: ::core::clone::Clone::clone(&self.default_uwtable),
simd_types_indirect: ::core::clone::Clone::clone(&self.simd_types_indirect),
limit_rdylib_exports: ::core::clone::Clone::clone(&self.limit_rdylib_exports),
override_export_symbols: ::core::clone::Clone::clone(&self.override_export_symbols),
merge_functions: ::core::clone::Clone::clone(&self.merge_functions),
mcount: ::core::clone::Clone::clone(&self.mcount),
llvm_mcount_intrinsic: ::core::clone::Clone::clone(&self.llvm_mcount_intrinsic),
llvm_abiname: ::core::clone::Clone::clone(&self.llvm_abiname),
llvm_floatabi: ::core::clone::Clone::clone(&self.llvm_floatabi),
rustc_abi: ::core::clone::Clone::clone(&self.rustc_abi),
relax_elf_relocations: ::core::clone::Clone::clone(&self.relax_elf_relocations),
llvm_args: ::core::clone::Clone::clone(&self.llvm_args),
use_ctors_section: ::core::clone::Clone::clone(&self.use_ctors_section),
eh_frame_header: ::core::clone::Clone::clone(&self.eh_frame_header),
has_thumb_interworking: ::core::clone::Clone::clone(&self.has_thumb_interworking),
debuginfo_kind: ::core::clone::Clone::clone(&self.debuginfo_kind),
split_debuginfo: ::core::clone::Clone::clone(&self.split_debuginfo),
supported_split_debuginfo: ::core::clone::Clone::clone(&self.supported_split_debuginfo),
supported_sanitizers: ::core::clone::Clone::clone(&self.supported_sanitizers),
default_sanitizers: ::core::clone::Clone::clone(&self.default_sanitizers),
c_enum_min_bits: ::core::clone::Clone::clone(&self.c_enum_min_bits),
generate_arange_section: ::core::clone::Clone::clone(&self.generate_arange_section),
supports_stack_protector: ::core::clone::Clone::clone(&self.supports_stack_protector),
entry_name: ::core::clone::Clone::clone(&self.entry_name),
entry_abi: ::core::clone::Clone::clone(&self.entry_abi),
supports_xray: ::core::clone::Clone::clone(&self.supports_xray),
default_address_space: ::core::clone::Clone::clone(&self.default_address_space),
small_data_threshold_support: ::core::clone::Clone::clone(&self.small_data_threshold_support),
}
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for TargetOptions {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
&["endian", "c_int_width", "os", "env", "abi", "vendor", "linker",
"linker_flavor", "linker_flavor_json", "lld_flavor_json",
"linker_is_gnu_json", "pre_link_objects",
"post_link_objects", "pre_link_objects_self_contained",
"post_link_objects_self_contained", "link_self_contained",
"pre_link_args", "pre_link_args_json", "late_link_args",
"late_link_args_json", "late_link_args_dynamic",
"late_link_args_dynamic_json", "late_link_args_static",
"late_link_args_static_json", "post_link_args",
"post_link_args_json", "link_script", "link_env",
"link_env_remove", "asm_args", "cpu", "need_explicit_cpu",
"features", "direct_access_external_data",
"dynamic_linking", "dll_tls_export", "only_cdylib",
"executables", "relocation_model", "code_model",
"tls_model", "disable_redzone", "frame_pointer",
"function_sections", "dll_prefix", "dll_suffix",
"exe_suffix", "staticlib_prefix", "staticlib_suffix",
"families", "abi_return_struct_as_int", "is_like_aix",
"is_like_darwin", "is_like_gpu", "is_like_solaris",
"is_like_windows", "is_like_msvc", "is_like_wasm",
"is_like_android", "is_like_vexos", "binary_format",
"default_dwarf_version", "allows_weak_linkage", "has_rpath",
"no_default_libraries", "position_independent_executables",
"static_position_independent_executables", "plt_by_default",
"relro_level", "archive_format", "allow_asm",
"static_initializer_must_be_acyclic",
"main_needs_argc_argv", "has_thread_local",
"obj_is_bitcode", "min_atomic_width", "max_atomic_width",
"atomic_cas", "panic_strategy", "crt_static_allows_dylibs",
"crt_static_default", "crt_static_respected",
"stack_probes", "min_global_align", "default_codegen_units",
"default_codegen_backend", "trap_unreachable",
"requires_lto", "singlethread", "no_builtins",
"default_visibility", "emit_debug_gdb_scripts",
"requires_uwtable", "default_uwtable",
"simd_types_indirect", "limit_rdylib_exports",
"override_export_symbols", "merge_functions", "mcount",
"llvm_mcount_intrinsic", "llvm_abiname", "llvm_floatabi",
"rustc_abi", "relax_elf_relocations", "llvm_args",
"use_ctors_section", "eh_frame_header",
"has_thumb_interworking", "debuginfo_kind",
"split_debuginfo", "supported_split_debuginfo",
"supported_sanitizers", "default_sanitizers",
"c_enum_min_bits", "generate_arange_section",
"supports_stack_protector", "entry_name", "entry_abi",
"supports_xray", "default_address_space",
"small_data_threshold_support"];
let values: &[&dyn ::core::fmt::Debug] =
&[&self.endian, &self.c_int_width, &self.os, &self.env, &self.abi,
&self.vendor, &self.linker, &self.linker_flavor,
&self.linker_flavor_json, &self.lld_flavor_json,
&self.linker_is_gnu_json, &self.pre_link_objects,
&self.post_link_objects,
&self.pre_link_objects_self_contained,
&self.post_link_objects_self_contained,
&self.link_self_contained, &self.pre_link_args,
&self.pre_link_args_json, &self.late_link_args,
&self.late_link_args_json, &self.late_link_args_dynamic,
&self.late_link_args_dynamic_json,
&self.late_link_args_static,
&self.late_link_args_static_json, &self.post_link_args,
&self.post_link_args_json, &self.link_script,
&self.link_env, &self.link_env_remove, &self.asm_args,
&self.cpu, &self.need_explicit_cpu, &self.features,
&self.direct_access_external_data, &self.dynamic_linking,
&self.dll_tls_export, &self.only_cdylib, &self.executables,
&self.relocation_model, &self.code_model, &self.tls_model,
&self.disable_redzone, &self.frame_pointer,
&self.function_sections, &self.dll_prefix, &self.dll_suffix,
&self.exe_suffix, &self.staticlib_prefix,
&self.staticlib_suffix, &self.families,
&self.abi_return_struct_as_int, &self.is_like_aix,
&self.is_like_darwin, &self.is_like_gpu,
&self.is_like_solaris, &self.is_like_windows,
&self.is_like_msvc, &self.is_like_wasm,
&self.is_like_android, &self.is_like_vexos,
&self.binary_format, &self.default_dwarf_version,
&self.allows_weak_linkage, &self.has_rpath,
&self.no_default_libraries,
&self.position_independent_executables,
&self.static_position_independent_executables,
&self.plt_by_default, &self.relro_level,
&self.archive_format, &self.allow_asm,
&self.static_initializer_must_be_acyclic,
&self.main_needs_argc_argv, &self.has_thread_local,
&self.obj_is_bitcode, &self.min_atomic_width,
&self.max_atomic_width, &self.atomic_cas,
&self.panic_strategy, &self.crt_static_allows_dylibs,
&self.crt_static_default, &self.crt_static_respected,
&self.stack_probes, &self.min_global_align,
&self.default_codegen_units, &self.default_codegen_backend,
&self.trap_unreachable, &self.requires_lto,
&self.singlethread, &self.no_builtins,
&self.default_visibility, &self.emit_debug_gdb_scripts,
&self.requires_uwtable, &self.default_uwtable,
&self.simd_types_indirect, &self.limit_rdylib_exports,
&self.override_export_symbols, &self.merge_functions,
&self.mcount, &self.llvm_mcount_intrinsic,
&self.llvm_abiname, &self.llvm_floatabi, &self.rustc_abi,
&self.relax_elf_relocations, &self.llvm_args,
&self.use_ctors_section, &self.eh_frame_header,
&self.has_thumb_interworking, &self.debuginfo_kind,
&self.split_debuginfo, &self.supported_split_debuginfo,
&self.supported_sanitizers, &self.default_sanitizers,
&self.c_enum_min_bits, &self.generate_arange_section,
&self.supports_stack_protector, &self.entry_name,
&self.entry_abi, &self.supports_xray,
&self.default_address_space,
&&self.small_data_threshold_support];
::core::fmt::Formatter::debug_struct_fields_finish(f, "TargetOptions",
names, values)
}
}Debug)]
2197#[rustc_lint_opt_ty]
2198pub struct TargetOptions {
2199 pub endian: Endian,
2201 pub c_int_width: u16,
2203 pub os: Os,
2208 pub env: Env,
2210 pub abi: Abi,
2215 #[rustc_lint_opt_deny_field_access(
2217 "use `Target::is_like_*` instead of this field; see https://github.com/rust-lang/rust/issues/100343 for rationale"
2218 )]
2219 vendor: StaticCow<str>,
2220
2221 pub linker: Option<StaticCow<str>>,
2223 pub linker_flavor: LinkerFlavor,
2226 linker_flavor_json: LinkerFlavorCli,
2227 lld_flavor_json: LldFlavor,
2228 linker_is_gnu_json: bool,
2229
2230 pub pre_link_objects: CrtObjects,
2232 pub post_link_objects: CrtObjects,
2233 pub pre_link_objects_self_contained: CrtObjects,
2235 pub post_link_objects_self_contained: CrtObjects,
2236 pub link_self_contained: LinkSelfContainedDefault,
2239
2240 pub pre_link_args: LinkArgs,
2242 pre_link_args_json: LinkArgsCli,
2243 pub late_link_args: LinkArgs,
2247 late_link_args_json: LinkArgsCli,
2248 pub late_link_args_dynamic: LinkArgs,
2251 late_link_args_dynamic_json: LinkArgsCli,
2252 pub late_link_args_static: LinkArgs,
2255 late_link_args_static_json: LinkArgsCli,
2256 pub post_link_args: LinkArgs,
2259 post_link_args_json: LinkArgsCli,
2260
2261 pub link_script: Option<StaticCow<str>>,
2265 pub link_env: StaticCow<[(StaticCow<str>, StaticCow<str>)]>,
2267 pub link_env_remove: StaticCow<[StaticCow<str>]>,
2269
2270 pub asm_args: StaticCow<[StaticCow<str>]>,
2272
2273 pub cpu: StaticCow<str>,
2276 pub need_explicit_cpu: bool,
2279 pub features: StaticCow<str>,
2288 pub direct_access_external_data: Option<bool>,
2290 pub dynamic_linking: bool,
2292 pub dll_tls_export: bool,
2294 pub only_cdylib: bool,
2296 pub executables: bool,
2298 pub relocation_model: RelocModel,
2301 pub code_model: Option<CodeModel>,
2304 pub tls_model: TlsModel,
2307 pub disable_redzone: bool,
2309 pub frame_pointer: FramePointer,
2311 pub function_sections: bool,
2313 pub dll_prefix: StaticCow<str>,
2315 pub dll_suffix: StaticCow<str>,
2317 pub exe_suffix: StaticCow<str>,
2319 pub staticlib_prefix: StaticCow<str>,
2321 pub staticlib_suffix: StaticCow<str>,
2323 pub families: StaticCow<[StaticCow<str>]>,
2329 pub abi_return_struct_as_int: bool,
2331 pub is_like_aix: bool,
2334 pub is_like_darwin: bool,
2339 pub is_like_gpu: bool,
2341 pub is_like_solaris: bool,
2345 pub is_like_windows: bool,
2353 pub is_like_msvc: bool,
2363 pub is_like_wasm: bool,
2365 pub is_like_android: bool,
2367 pub is_like_vexos: bool,
2369 pub binary_format: BinaryFormat,
2371 pub default_dwarf_version: u32,
2374 pub allows_weak_linkage: bool,
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 pub singlethread: bool,
2471
2472 pub no_builtins: bool,
2475
2476 pub default_visibility: Option<SymbolVisibility>,
2482
2483 pub emit_debug_gdb_scripts: bool,
2485
2486 pub requires_uwtable: bool,
2490
2491 pub default_uwtable: bool,
2494
2495 pub simd_types_indirect: bool,
2500
2501 pub limit_rdylib_exports: bool,
2503
2504 pub override_export_symbols: Option<StaticCow<[StaticCow<str>]>>,
2507
2508 pub merge_functions: MergeFunctions,
2515
2516 pub mcount: StaticCow<str>,
2518
2519 pub llvm_mcount_intrinsic: Option<StaticCow<str>>,
2521
2522 pub llvm_abiname: StaticCow<str>,
2525
2526 pub llvm_floatabi: Option<FloatAbi>,
2533
2534 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_xray: bool,
2601
2602 pub default_address_space: rustc_abi::AddressSpace,
2606
2607 small_data_threshold_support: SmallDataThresholdSupport,
2609}
2610
2611fn add_link_args_iter(
2614 link_args: &mut LinkArgs,
2615 flavor: LinkerFlavor,
2616 args: impl Iterator<Item = StaticCow<str>> + Clone,
2617) {
2618 let mut insert = |flavor| link_args.entry(flavor).or_default().extend(args.clone());
2619 insert(flavor);
2620 match flavor {
2621 LinkerFlavor::Gnu(cc, lld) => {
2622 match (&lld, &Lld::No) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val, &*right_val,
::core::option::Option::None);
}
}
};assert_eq!(lld, Lld::No);
2623 insert(LinkerFlavor::Gnu(cc, Lld::Yes));
2624 }
2625 LinkerFlavor::Darwin(cc, lld) => {
2626 match (&lld, &Lld::No) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val, &*right_val,
::core::option::Option::None);
}
}
};assert_eq!(lld, Lld::No);
2627 insert(LinkerFlavor::Darwin(cc, Lld::Yes));
2628 }
2629 LinkerFlavor::Msvc(lld) => {
2630 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);
2631 insert(LinkerFlavor::Msvc(Lld::Yes));
2632 }
2633 LinkerFlavor::WasmLld(..)
2634 | LinkerFlavor::Unix(..)
2635 | LinkerFlavor::EmCc
2636 | LinkerFlavor::Bpf
2637 | LinkerFlavor::Llbc
2638 | LinkerFlavor::Ptx => {}
2639 }
2640}
2641
2642fn add_link_args(link_args: &mut LinkArgs, flavor: LinkerFlavor, args: &[&'static str]) {
2643 add_link_args_iter(link_args, flavor, args.iter().copied().map(Cow::Borrowed))
2644}
2645
2646impl TargetOptions {
2647 pub fn supports_comdat(&self) -> bool {
2648 !self.is_like_aix && !self.is_like_darwin
2650 }
2651
2652 pub fn uses_pdb_debuginfo(&self) -> bool {
2653 self.debuginfo_kind == DebuginfoKind::Pdb
2654 }
2655}
2656
2657impl TargetOptions {
2658 fn link_args(flavor: LinkerFlavor, args: &[&'static str]) -> LinkArgs {
2659 let mut link_args = LinkArgs::new();
2660 add_link_args(&mut link_args, flavor, args);
2661 link_args
2662 }
2663
2664 fn add_pre_link_args(&mut self, flavor: LinkerFlavor, args: &[&'static str]) {
2665 add_link_args(&mut self.pre_link_args, flavor, args);
2666 }
2667
2668 fn update_from_cli(&mut self) {
2669 self.linker_flavor = LinkerFlavor::from_cli_json(
2670 self.linker_flavor_json,
2671 self.lld_flavor_json,
2672 self.linker_is_gnu_json,
2673 );
2674 for (args, args_json) in [
2675 (&mut self.pre_link_args, &self.pre_link_args_json),
2676 (&mut self.late_link_args, &self.late_link_args_json),
2677 (&mut self.late_link_args_dynamic, &self.late_link_args_dynamic_json),
2678 (&mut self.late_link_args_static, &self.late_link_args_static_json),
2679 (&mut self.post_link_args, &self.post_link_args_json),
2680 ] {
2681 args.clear();
2682 for (flavor, args_json) in args_json {
2683 let linker_flavor = self.linker_flavor.with_cli_hints(*flavor);
2684 let linker_flavor = match linker_flavor {
2686 LinkerFlavor::Gnu(cc, _) => LinkerFlavor::Gnu(cc, Lld::No),
2687 LinkerFlavor::Darwin(cc, _) => LinkerFlavor::Darwin(cc, Lld::No),
2688 LinkerFlavor::Msvc(_) => LinkerFlavor::Msvc(Lld::No),
2689 _ => linker_flavor,
2690 };
2691 if !args.contains_key(&linker_flavor) {
2692 add_link_args_iter(args, linker_flavor, args_json.iter().cloned());
2693 }
2694 }
2695 }
2696 }
2697
2698 fn update_to_cli(&mut self) {
2699 self.linker_flavor_json = self.linker_flavor.to_cli_counterpart();
2700 self.lld_flavor_json = self.linker_flavor.lld_flavor();
2701 self.linker_is_gnu_json = self.linker_flavor.is_gnu();
2702 for (args, args_json) in [
2703 (&self.pre_link_args, &mut self.pre_link_args_json),
2704 (&self.late_link_args, &mut self.late_link_args_json),
2705 (&self.late_link_args_dynamic, &mut self.late_link_args_dynamic_json),
2706 (&self.late_link_args_static, &mut self.late_link_args_static_json),
2707 (&self.post_link_args, &mut self.post_link_args_json),
2708 ] {
2709 *args_json = args
2710 .iter()
2711 .map(|(flavor, args)| (flavor.to_cli_counterpart(), args.clone()))
2712 .collect();
2713 }
2714 }
2715}
2716
2717impl Default for TargetOptions {
2718 fn default() -> TargetOptions {
2721 TargetOptions {
2722 endian: Endian::Little,
2723 c_int_width: 32,
2724 os: Os::None,
2725 env: Env::Unspecified,
2726 abi: Abi::Unspecified,
2727 vendor: "unknown".into(),
2728 linker: ::core::option::Option::None::<&'static str>option_env!("CFG_DEFAULT_LINKER").map(|s| s.into()),
2729 linker_flavor: LinkerFlavor::Gnu(Cc::Yes, Lld::No),
2730 linker_flavor_json: LinkerFlavorCli::Gcc,
2731 lld_flavor_json: LldFlavor::Ld,
2732 linker_is_gnu_json: true,
2733 link_script: None,
2734 asm_args: ::std::borrow::Cow::Borrowed(&[])cvs![],
2735 cpu: "generic".into(),
2736 need_explicit_cpu: false,
2737 features: "".into(),
2738 direct_access_external_data: None,
2739 dynamic_linking: false,
2740 dll_tls_export: true,
2741 only_cdylib: false,
2742 executables: true,
2743 relocation_model: RelocModel::Pic,
2744 code_model: None,
2745 tls_model: TlsModel::GeneralDynamic,
2746 disable_redzone: false,
2747 frame_pointer: FramePointer::MayOmit,
2748 function_sections: true,
2749 dll_prefix: "lib".into(),
2750 dll_suffix: ".so".into(),
2751 exe_suffix: "".into(),
2752 staticlib_prefix: "lib".into(),
2753 staticlib_suffix: ".a".into(),
2754 families: ::std::borrow::Cow::Borrowed(&[])cvs![],
2755 abi_return_struct_as_int: false,
2756 is_like_aix: false,
2757 is_like_darwin: false,
2758 is_like_gpu: false,
2759 is_like_solaris: false,
2760 is_like_windows: false,
2761 is_like_msvc: false,
2762 is_like_wasm: false,
2763 is_like_android: false,
2764 is_like_vexos: false,
2765 binary_format: BinaryFormat::Elf,
2766 default_dwarf_version: 4,
2767 allows_weak_linkage: true,
2768 has_rpath: false,
2769 no_default_libraries: true,
2770 position_independent_executables: false,
2771 static_position_independent_executables: false,
2772 plt_by_default: true,
2773 relro_level: RelroLevel::None,
2774 pre_link_objects: Default::default(),
2775 post_link_objects: Default::default(),
2776 pre_link_objects_self_contained: Default::default(),
2777 post_link_objects_self_contained: Default::default(),
2778 link_self_contained: LinkSelfContainedDefault::False,
2779 pre_link_args: LinkArgs::new(),
2780 pre_link_args_json: LinkArgsCli::new(),
2781 late_link_args: LinkArgs::new(),
2782 late_link_args_json: LinkArgsCli::new(),
2783 late_link_args_dynamic: LinkArgs::new(),
2784 late_link_args_dynamic_json: LinkArgsCli::new(),
2785 late_link_args_static: LinkArgs::new(),
2786 late_link_args_static_json: LinkArgsCli::new(),
2787 post_link_args: LinkArgs::new(),
2788 post_link_args_json: LinkArgsCli::new(),
2789 link_env: ::std::borrow::Cow::Borrowed(&[])cvs![],
2790 link_env_remove: ::std::borrow::Cow::Borrowed(&[])cvs![],
2791 archive_format: "gnu".into(),
2792 main_needs_argc_argv: true,
2793 allow_asm: true,
2794 static_initializer_must_be_acyclic: false,
2795 has_thread_local: false,
2796 obj_is_bitcode: false,
2797 min_atomic_width: None,
2798 max_atomic_width: None,
2799 atomic_cas: true,
2800 panic_strategy: PanicStrategy::Unwind,
2801 crt_static_allows_dylibs: false,
2802 crt_static_default: false,
2803 crt_static_respected: false,
2804 stack_probes: StackProbeType::None,
2805 min_global_align: None,
2806 default_codegen_units: None,
2807 default_codegen_backend: None,
2808 trap_unreachable: true,
2809 requires_lto: false,
2810 singlethread: false,
2811 no_builtins: false,
2812 default_visibility: None,
2813 emit_debug_gdb_scripts: true,
2814 requires_uwtable: false,
2815 default_uwtable: false,
2816 simd_types_indirect: true,
2817 limit_rdylib_exports: true,
2818 override_export_symbols: None,
2819 merge_functions: MergeFunctions::Aliases,
2820 mcount: "mcount".into(),
2821 llvm_mcount_intrinsic: None,
2822 llvm_abiname: "".into(),
2823 llvm_floatabi: None,
2824 rustc_abi: None,
2825 relax_elf_relocations: false,
2826 llvm_args: ::std::borrow::Cow::Borrowed(&[])cvs![],
2827 use_ctors_section: false,
2828 eh_frame_header: true,
2829 has_thumb_interworking: false,
2830 debuginfo_kind: Default::default(),
2831 split_debuginfo: Default::default(),
2832 supported_split_debuginfo: Cow::Borrowed(&[SplitDebuginfo::Off]),
2834 supported_sanitizers: SanitizerSet::empty(),
2835 default_sanitizers: SanitizerSet::empty(),
2836 c_enum_min_bits: None,
2837 generate_arange_section: true,
2838 supports_stack_protector: true,
2839 entry_name: "main".into(),
2840 entry_abi: CanonAbi::C,
2841 supports_xray: false,
2842 default_address_space: rustc_abi::AddressSpace::ZERO,
2843 small_data_threshold_support: SmallDataThresholdSupport::DefaultForArch,
2844 }
2845 }
2846}
2847
2848impl Deref for Target {
2852 type Target = TargetOptions;
2853
2854 #[inline]
2855 fn deref(&self) -> &Self::Target {
2856 &self.options
2857 }
2858}
2859impl DerefMut for Target {
2860 #[inline]
2861 fn deref_mut(&mut self) -> &mut Self::Target {
2862 &mut self.options
2863 }
2864}
2865
2866impl Target {
2867 pub fn is_abi_supported(&self, abi: ExternAbi) -> bool {
2868 let abi_map = AbiMap::from_target(self);
2869 abi_map.canonize_abi(abi, false).is_mapped()
2870 }
2871
2872 pub fn min_atomic_width(&self) -> u64 {
2875 self.min_atomic_width.unwrap_or(8)
2876 }
2877
2878 pub fn max_atomic_width(&self) -> u64 {
2881 self.max_atomic_width.unwrap_or_else(|| self.pointer_width.into())
2882 }
2883
2884 fn check_consistency(&self, kind: TargetKind) -> Result<(), String> {
2887 macro_rules! check {
2888 ($b:expr, $($msg:tt)*) => {
2889 if !$b {
2890 return Err(format!($($msg)*));
2891 }
2892 }
2893 }
2894 macro_rules! check_eq {
2895 ($left:expr, $right:expr, $($msg:tt)*) => {
2896 if ($left) != ($right) {
2897 return Err(format!($($msg)*));
2898 }
2899 }
2900 }
2901 macro_rules! check_ne {
2902 ($left:expr, $right:expr, $($msg:tt)*) => {
2903 if ($left) == ($right) {
2904 return Err(format!($($msg)*));
2905 }
2906 }
2907 }
2908 macro_rules! check_matches {
2909 ($left:expr, $right:pat, $($msg:tt)*) => {
2910 if !matches!($left, $right) {
2911 return Err(format!($($msg)*));
2912 }
2913 }
2914 }
2915
2916 if (self.is_like_darwin) != (self.vendor == "apple") {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`is_like_darwin` must be set if and only if `vendor` is `apple`"))
}));
};check_eq!(
2917 self.is_like_darwin,
2918 self.vendor == "apple",
2919 "`is_like_darwin` must be set if and only if `vendor` is `apple`"
2920 );
2921 if (self.is_like_solaris) !=
(#[allow(non_exhaustive_omitted_patterns)] match self.os {
Os::Solaris | Os::Illumos => true,
_ => false,
}) {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`is_like_solaris` must be set if and only if `os` is `solaris` or `illumos`"))
}));
};check_eq!(
2922 self.is_like_solaris,
2923 matches!(self.os, Os::Solaris | Os::Illumos),
2924 "`is_like_solaris` must be set if and only if `os` is `solaris` or `illumos`"
2925 );
2926 if (self.is_like_gpu) !=
(self.arch == Arch::Nvptx64 || self.arch == Arch::AmdGpu) {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`is_like_gpu` must be set if and only if `target` is `nvptx64` or `amdgcn`"))
}));
};check_eq!(
2927 self.is_like_gpu,
2928 self.arch == Arch::Nvptx64 || self.arch == Arch::AmdGpu,
2929 "`is_like_gpu` must be set if and only if `target` is `nvptx64` or `amdgcn`"
2930 );
2931 if (self.is_like_windows) !=
(#[allow(non_exhaustive_omitted_patterns)] match self.os {
Os::Windows | Os::Uefi | Os::Cygwin => true,
_ => false,
}) {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`is_like_windows` must be set if and only if `os` is `windows`, `uefi` or `cygwin`"))
}));
};check_eq!(
2932 self.is_like_windows,
2933 matches!(self.os, Os::Windows | Os::Uefi | Os::Cygwin),
2934 "`is_like_windows` must be set if and only if `os` is `windows`, `uefi` or `cygwin`"
2935 );
2936 if (self.is_like_wasm) !=
(#[allow(non_exhaustive_omitted_patterns)] match self.arch {
Arch::Wasm32 | Arch::Wasm64 => true,
_ => false,
}) {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`is_like_wasm` must be set if and only if `arch` is `wasm32` or `wasm64`"))
}));
};check_eq!(
2937 self.is_like_wasm,
2938 matches!(self.arch, Arch::Wasm32 | Arch::Wasm64),
2939 "`is_like_wasm` must be set if and only if `arch` is `wasm32` or `wasm64`"
2940 );
2941 if self.is_like_msvc {
2942 if !self.is_like_windows {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("if `is_like_msvc` is set, `is_like_windows` must be set"))
}));
};check!(self.is_like_windows, "if `is_like_msvc` is set, `is_like_windows` must be set");
2943 }
2944 if self.os == Os::Emscripten {
2945 if !self.is_like_wasm {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("the `emcscripten` os only makes sense on wasm-like targets"))
}));
};check!(self.is_like_wasm, "the `emcscripten` os only makes sense on wasm-like targets");
2946 }
2947
2948 if (self.is_like_darwin) !=
(#[allow(non_exhaustive_omitted_patterns)] match self.linker_flavor {
LinkerFlavor::Darwin(..) => true,
_ => false,
}) {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`linker_flavor` must be `darwin` if and only if `is_like_darwin` is set"))
}));
};check_eq!(
2950 self.is_like_darwin,
2951 matches!(self.linker_flavor, LinkerFlavor::Darwin(..)),
2952 "`linker_flavor` must be `darwin` if and only if `is_like_darwin` is set"
2953 );
2954 if (self.is_like_msvc) !=
(#[allow(non_exhaustive_omitted_patterns)] match self.linker_flavor {
LinkerFlavor::Msvc(..) => true,
_ => false,
}) {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`linker_flavor` must be `msvc` if and only if `is_like_msvc` is set"))
}));
};check_eq!(
2955 self.is_like_msvc,
2956 matches!(self.linker_flavor, LinkerFlavor::Msvc(..)),
2957 "`linker_flavor` must be `msvc` if and only if `is_like_msvc` is set"
2958 );
2959 if (self.is_like_wasm && self.os != Os::Emscripten) !=
(#[allow(non_exhaustive_omitted_patterns)] match self.linker_flavor {
LinkerFlavor::WasmLld(..) => true,
_ => false,
}) {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`linker_flavor` must be `wasm-lld` if and only if `is_like_wasm` is set and the `os` is not `emscripten`"))
}));
};check_eq!(
2960 self.is_like_wasm && self.os != Os::Emscripten,
2961 matches!(self.linker_flavor, LinkerFlavor::WasmLld(..)),
2962 "`linker_flavor` must be `wasm-lld` if and only if `is_like_wasm` is set and the `os` is not `emscripten`",
2963 );
2964 if (self.os == Os::Emscripten) !=
(#[allow(non_exhaustive_omitted_patterns)] match self.linker_flavor {
LinkerFlavor::EmCc => true,
_ => false,
}) {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`linker_flavor` must be `em-cc` if and only if `os` is `emscripten`"))
}));
};check_eq!(
2965 self.os == Os::Emscripten,
2966 matches!(self.linker_flavor, LinkerFlavor::EmCc),
2967 "`linker_flavor` must be `em-cc` if and only if `os` is `emscripten`"
2968 );
2969 if (self.arch == Arch::Bpf) !=
(#[allow(non_exhaustive_omitted_patterns)] match self.linker_flavor {
LinkerFlavor::Bpf => true,
_ => false,
}) {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`linker_flavor` must be `bpf` if and only if `arch` is `bpf`"))
}));
};check_eq!(
2970 self.arch == Arch::Bpf,
2971 matches!(self.linker_flavor, LinkerFlavor::Bpf),
2972 "`linker_flavor` must be `bpf` if and only if `arch` is `bpf`"
2973 );
2974
2975 for args in [
2976 &self.pre_link_args,
2977 &self.late_link_args,
2978 &self.late_link_args_dynamic,
2979 &self.late_link_args_static,
2980 &self.post_link_args,
2981 ] {
2982 for (&flavor, flavor_args) in args {
2983 if !(!flavor_args.is_empty() || self.arch == Arch::Avr) {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("linker flavor args must not be empty"))
}));
};check!(
2984 !flavor_args.is_empty() || self.arch == Arch::Avr,
2985 "linker flavor args must not be empty"
2986 );
2987 match self.linker_flavor {
2989 LinkerFlavor::Gnu(..) => {
2990 if !#[allow(non_exhaustive_omitted_patterns)] match flavor {
LinkerFlavor::Gnu(..) => true,
_ => false,
} {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("mixing GNU and non-GNU linker flavors"))
}));
};check_matches!(
2991 flavor,
2992 LinkerFlavor::Gnu(..),
2993 "mixing GNU and non-GNU linker flavors"
2994 );
2995 }
2996 LinkerFlavor::Darwin(..) => {
2997 if !#[allow(non_exhaustive_omitted_patterns)] match flavor {
LinkerFlavor::Darwin(..) => true,
_ => false,
} {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("mixing Darwin and non-Darwin linker flavors"))
}));
}check_matches!(
2998 flavor,
2999 LinkerFlavor::Darwin(..),
3000 "mixing Darwin and non-Darwin linker flavors"
3001 )
3002 }
3003 LinkerFlavor::WasmLld(..) => {
3004 if !#[allow(non_exhaustive_omitted_patterns)] match flavor {
LinkerFlavor::WasmLld(..) => true,
_ => false,
} {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("mixing wasm and non-wasm linker flavors"))
}));
}check_matches!(
3005 flavor,
3006 LinkerFlavor::WasmLld(..),
3007 "mixing wasm and non-wasm linker flavors"
3008 )
3009 }
3010 LinkerFlavor::Unix(..) => {
3011 if !#[allow(non_exhaustive_omitted_patterns)] match flavor {
LinkerFlavor::Unix(..) => true,
_ => false,
} {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("mixing unix and non-unix linker flavors"))
}));
};check_matches!(
3012 flavor,
3013 LinkerFlavor::Unix(..),
3014 "mixing unix and non-unix linker flavors"
3015 );
3016 }
3017 LinkerFlavor::Msvc(..) => {
3018 if !#[allow(non_exhaustive_omitted_patterns)] match flavor {
LinkerFlavor::Msvc(..) => true,
_ => false,
} {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("mixing MSVC and non-MSVC linker flavors"))
}));
};check_matches!(
3019 flavor,
3020 LinkerFlavor::Msvc(..),
3021 "mixing MSVC and non-MSVC linker flavors"
3022 );
3023 }
3024 LinkerFlavor::EmCc
3025 | LinkerFlavor::Bpf
3026 | LinkerFlavor::Ptx
3027 | LinkerFlavor::Llbc => {
3028 if (flavor) != (self.linker_flavor) {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("mixing different linker flavors"))
}));
}check_eq!(flavor, self.linker_flavor, "mixing different linker flavors")
3029 }
3030 }
3031
3032 let check_noncc = |noncc_flavor| -> Result<(), String> {
3034 if let Some(noncc_args) = args.get(&noncc_flavor) {
3035 for arg in flavor_args {
3036 if let Some(suffix) = arg.strip_prefix("-Wl,") {
3037 if !noncc_args.iter().any(|a| a == suffix) {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!(" link args for cc and non-cc versions of flavors are not consistent"))
}));
};check!(
3038 noncc_args.iter().any(|a| a == suffix),
3039 " link args for cc and non-cc versions of flavors are not consistent"
3040 );
3041 }
3042 }
3043 }
3044 Ok(())
3045 };
3046
3047 match self.linker_flavor {
3048 LinkerFlavor::Gnu(Cc::Yes, lld) => check_noncc(LinkerFlavor::Gnu(Cc::No, lld))?,
3049 LinkerFlavor::WasmLld(Cc::Yes) => check_noncc(LinkerFlavor::WasmLld(Cc::No))?,
3050 LinkerFlavor::Unix(Cc::Yes) => check_noncc(LinkerFlavor::Unix(Cc::No))?,
3051 _ => {}
3052 }
3053 }
3054
3055 for cc in [Cc::No, Cc::Yes] {
3057 if (args.get(&LinkerFlavor::Gnu(cc, Lld::No))) !=
(args.get(&LinkerFlavor::Gnu(cc, Lld::Yes))) {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("link args for lld and non-lld versions of flavors are not consistent"))
}));
};check_eq!(
3058 args.get(&LinkerFlavor::Gnu(cc, Lld::No)),
3059 args.get(&LinkerFlavor::Gnu(cc, Lld::Yes)),
3060 "link args for lld and non-lld versions of flavors are not consistent",
3061 );
3062 if (args.get(&LinkerFlavor::Darwin(cc, Lld::No))) !=
(args.get(&LinkerFlavor::Darwin(cc, Lld::Yes))) {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("link args for lld and non-lld versions of flavors are not consistent"))
}));
};check_eq!(
3063 args.get(&LinkerFlavor::Darwin(cc, Lld::No)),
3064 args.get(&LinkerFlavor::Darwin(cc, Lld::Yes)),
3065 "link args for lld and non-lld versions of flavors are not consistent",
3066 );
3067 }
3068 if (args.get(&LinkerFlavor::Msvc(Lld::No))) !=
(args.get(&LinkerFlavor::Msvc(Lld::Yes))) {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("link args for lld and non-lld versions of flavors are not consistent"))
}));
};check_eq!(
3069 args.get(&LinkerFlavor::Msvc(Lld::No)),
3070 args.get(&LinkerFlavor::Msvc(Lld::Yes)),
3071 "link args for lld and non-lld versions of flavors are not consistent",
3072 );
3073 }
3074
3075 if self.link_self_contained.is_disabled() {
3076 if !(self.pre_link_objects_self_contained.is_empty() &&
self.post_link_objects_self_contained.is_empty()) {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("if `link_self_contained` is disabled, then `pre_link_objects_self_contained` and `post_link_objects_self_contained` must be empty"))
}));
};check!(
3077 self.pre_link_objects_self_contained.is_empty()
3078 && self.post_link_objects_self_contained.is_empty(),
3079 "if `link_self_contained` is disabled, then `pre_link_objects_self_contained` and `post_link_objects_self_contained` must be empty",
3080 );
3081 }
3082
3083 if (self.vendor) == ("") {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`vendor` cannot be empty"))
}));
};check_ne!(self.vendor, "", "`vendor` cannot be empty");
3087 if let Os::Other(s) = &self.os {
3088 if !!s.is_empty() {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`os` cannot be empty"))
}));
};check!(!s.is_empty(), "`os` cannot be empty");
3089 }
3090 if !self.can_use_os_unknown() {
3091 if (self.os) == (Os::Unknown) {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`unknown` os can only be used on particular targets; use `none` for bare-metal targets"))
}));
};check_ne!(
3093 self.os,
3094 Os::Unknown,
3095 "`unknown` os can only be used on particular targets; use `none` for bare-metal targets"
3096 );
3097 }
3098
3099 if kind == TargetKind::Builtin {
3105 if self.os == Os::None
3109 && !#[allow(non_exhaustive_omitted_patterns)] match self.arch {
Arch::Bpf | Arch::Hexagon | Arch::Wasm32 | Arch::Wasm64 => true,
_ => false,
}matches!(self.arch, Arch::Bpf | Arch::Hexagon | Arch::Wasm32 | Arch::Wasm64)
3110 {
3111 if !!self.dynamic_linking {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("dynamic linking is not supported on this OS/architecture"))
}));
};check!(
3112 !self.dynamic_linking,
3113 "dynamic linking is not supported on this OS/architecture"
3114 );
3115 }
3116 if self.only_cdylib
3117 || self.crt_static_allows_dylibs
3118 || !self.late_link_args_dynamic.is_empty()
3119 {
3120 if !self.dynamic_linking {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("dynamic linking must be allowed when `only_cdylib` or `crt_static_allows_dylibs` or `late_link_args_dynamic` are set"))
}));
};check!(
3121 self.dynamic_linking,
3122 "dynamic linking must be allowed when `only_cdylib` or `crt_static_allows_dylibs` or `late_link_args_dynamic` are set"
3123 );
3124 }
3125 if self.dynamic_linking && !self.is_like_wasm {
3127 if (self.relocation_model) != (RelocModel::Pic) {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("targets that support dynamic linking must use the `pic` relocation model"))
}));
};check_eq!(
3128 self.relocation_model,
3129 RelocModel::Pic,
3130 "targets that support dynamic linking must use the `pic` relocation model"
3131 );
3132 }
3133 if self.position_independent_executables {
3134 if (self.relocation_model) != (RelocModel::Pic) {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("targets that support position-independent executables must use the `pic` relocation model"))
}));
};check_eq!(
3135 self.relocation_model,
3136 RelocModel::Pic,
3137 "targets that support position-independent executables must use the `pic` relocation model"
3138 );
3139 }
3140 if self.relocation_model == RelocModel::Pic && self.os != Os::Uefi {
3142 if !(self.dynamic_linking || self.position_independent_executables) {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("when the relocation model is `pic`, the target must support dynamic linking or use position-independent executables. Set the relocation model to `static` to avoid this requirement"))
}));
};check!(
3143 self.dynamic_linking || self.position_independent_executables,
3144 "when the relocation model is `pic`, the target must support dynamic linking or use position-independent executables. \
3145 Set the relocation model to `static` to avoid this requirement"
3146 );
3147 }
3148 if self.static_position_independent_executables {
3149 if !self.position_independent_executables {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("if `static_position_independent_executables` is set, then `position_independent_executables` must be set"))
}));
};check!(
3150 self.position_independent_executables,
3151 "if `static_position_independent_executables` is set, then `position_independent_executables` must be set"
3152 );
3153 }
3154 if self.position_independent_executables {
3155 if !self.executables {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("if `position_independent_executables` is set then `executables` must be set"))
}));
};check!(
3156 self.executables,
3157 "if `position_independent_executables` is set then `executables` must be set"
3158 );
3159 }
3160 }
3161
3162 if self.crt_static_default || self.crt_static_allows_dylibs {
3164 if !self.crt_static_respected {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("static CRT can be enabled but `crt_static_respected` is not set"))
}));
};check!(
3165 self.crt_static_respected,
3166 "static CRT can be enabled but `crt_static_respected` is not set"
3167 );
3168 }
3169
3170 match self.arch {
3173 Arch::RiscV32 => {
3174 if !#[allow(non_exhaustive_omitted_patterns)] match &*self.llvm_abiname {
"ilp32" | "ilp32f" | "ilp32d" | "ilp32e" => true,
_ => false,
} {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid RISC-V ABI name: {0}",
self.llvm_abiname))
}));
};check_matches!(
3175 &*self.llvm_abiname,
3176 "ilp32" | "ilp32f" | "ilp32d" | "ilp32e",
3177 "invalid RISC-V ABI name: {}",
3178 self.llvm_abiname,
3179 );
3180 }
3181 Arch::RiscV64 => {
3182 if !#[allow(non_exhaustive_omitted_patterns)] match &*self.llvm_abiname {
"lp64" | "lp64f" | "lp64d" | "lp64e" => true,
_ => false,
} {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid RISC-V ABI name: {0}",
self.llvm_abiname))
}));
};check_matches!(
3184 &*self.llvm_abiname,
3185 "lp64" | "lp64f" | "lp64d" | "lp64e",
3186 "invalid RISC-V ABI name: {}",
3187 self.llvm_abiname,
3188 );
3189 }
3190 Arch::Arm => {
3191 if !self.llvm_floatabi.is_some() {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("ARM targets must set `llvm-floatabi` to `hard` or `soft`"))
}));
}check!(
3192 self.llvm_floatabi.is_some(),
3193 "ARM targets must set `llvm-floatabi` to `hard` or `soft`",
3194 )
3195 }
3196 _ => {}
3197 }
3198
3199 if let Some(rust_abi) = self.rustc_abi {
3201 match rust_abi {
3202 RustcAbi::X86Sse2 => if !#[allow(non_exhaustive_omitted_patterns)] match self.arch {
Arch::X86 => true,
_ => false,
} {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`x86-sse2` ABI is only valid for x86-32 targets"))
}));
}check_matches!(
3203 self.arch,
3204 Arch::X86,
3205 "`x86-sse2` ABI is only valid for x86-32 targets"
3206 ),
3207 RustcAbi::X86Softfloat => if !#[allow(non_exhaustive_omitted_patterns)] match self.arch {
Arch::X86 | Arch::X86_64 => true,
_ => false,
} {
return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`x86-softfloat` ABI is only valid for x86 targets"))
}));
}check_matches!(
3208 self.arch,
3209 Arch::X86 | Arch::X86_64,
3210 "`x86-softfloat` ABI is only valid for x86 targets"
3211 ),
3212 }
3213 }
3214
3215 if !self.features.is_empty() {
3217 let mut features_enabled = FxHashSet::default();
3218 let mut features_disabled = FxHashSet::default();
3219 for feat in self.features.split(',') {
3220 if let Some(feat) = feat.strip_prefix("+") {
3221 features_enabled.insert(feat);
3222 if features_disabled.contains(feat) {
3223 return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("target feature `{0}` is both enabled and disabled",
feat))
})format!(
3224 "target feature `{feat}` is both enabled and disabled"
3225 ));
3226 }
3227 } else if let Some(feat) = feat.strip_prefix("-") {
3228 features_disabled.insert(feat);
3229 if features_enabled.contains(feat) {
3230 return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("target feature `{0}` is both enabled and disabled",
feat))
})format!(
3231 "target feature `{feat}` is both enabled and disabled"
3232 ));
3233 }
3234 } else {
3235 return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("target feature `{0}` is invalid, must start with `+` or `-`",
feat))
})format!(
3236 "target feature `{feat}` is invalid, must start with `+` or `-`"
3237 ));
3238 }
3239 }
3240 let abi_feature_constraints = self.abi_required_features();
3242 for feat in abi_feature_constraints.required {
3243 if features_disabled.contains(feat) {
3246 return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("target feature `{0}` is required by the ABI but gets disabled in target spec",
feat))
})format!(
3247 "target feature `{feat}` is required by the ABI but gets disabled in target spec"
3248 ));
3249 }
3250 }
3251 for feat in abi_feature_constraints.incompatible {
3252 if features_enabled.contains(feat) {
3255 return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("target feature `{0}` is incompatible with the ABI but gets enabled in target spec",
feat))
})format!(
3256 "target feature `{feat}` is incompatible with the ABI but gets enabled in target spec"
3257 ));
3258 }
3259 }
3260 }
3261
3262 Ok(())
3263 }
3264
3265 #[cfg(test)]
3267 fn test_target(mut self) {
3268 let recycled_target =
3269 Target::from_json(&serde_json::to_string(&self.to_json()).unwrap()).map(|(j, _)| j);
3270 self.update_to_cli();
3271 self.check_consistency(TargetKind::Builtin).unwrap();
3272 assert_eq!(recycled_target, Ok(self));
3273 }
3274
3275 fn can_use_os_unknown(&self) -> bool {
3278 self.llvm_target == "wasm32-unknown-unknown"
3279 || self.llvm_target == "wasm64-unknown-unknown"
3280 || (self.env == Env::Sgx && self.vendor == "fortanix")
3281 }
3282
3283 pub fn expect_builtin(target_tuple: &TargetTuple) -> Target {
3285 match *target_tuple {
3286 TargetTuple::TargetTuple(ref target_tuple) => {
3287 load_builtin(target_tuple).expect("built-in target")
3288 }
3289 TargetTuple::TargetJson { .. } => {
3290 {
::core::panicking::panic_fmt(format_args!("built-in targets doesn\'t support target-paths"));
}panic!("built-in targets doesn't support target-paths")
3291 }
3292 }
3293 }
3294
3295 pub fn builtins() -> impl Iterator<Item = Target> {
3297 load_all_builtins()
3298 }
3299
3300 pub fn search(
3310 target_tuple: &TargetTuple,
3311 sysroot: &Path,
3312 unstable_options: bool,
3313 ) -> Result<(Target, TargetWarnings), String> {
3314 use std::{env, fs};
3315
3316 fn load_file(
3317 path: &Path,
3318 unstable_options: bool,
3319 ) -> Result<(Target, TargetWarnings), String> {
3320 if !unstable_options {
3321 return Err(
3322 "custom targets are unstable and require `-Zunstable-options`".to_string()
3323 );
3324 }
3325 let contents = fs::read_to_string(path).map_err(|e| e.to_string())?;
3326 Target::from_json(&contents)
3327 }
3328
3329 match *target_tuple {
3330 TargetTuple::TargetTuple(ref target_tuple) => {
3331 if let Some(t) = load_builtin(target_tuple) {
3333 return Ok((t, TargetWarnings::empty()));
3334 }
3335
3336 let path = {
3338 let mut target = target_tuple.to_string();
3339 target.push_str(".json");
3340 PathBuf::from(target)
3341 };
3342
3343 let target_path = env::var_os("RUST_TARGET_PATH").unwrap_or_default();
3344
3345 for dir in env::split_paths(&target_path) {
3346 let p = dir.join(&path);
3347 if p.is_file() {
3348 return load_file(&p, unstable_options);
3349 }
3350 }
3351
3352 let rustlib_path = crate::relative_target_rustlib_path(sysroot, target_tuple);
3355 let p = PathBuf::from_iter([
3356 Path::new(sysroot),
3357 Path::new(&rustlib_path),
3358 Path::new("target.json"),
3359 ]);
3360 if p.is_file() {
3361 return load_file(&p, unstable_options);
3362 }
3363
3364 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:?}"))
3365 }
3366 TargetTuple::TargetJson { ref contents, .. } => Target::from_json(contents),
3367 }
3368 }
3369
3370 pub fn small_data_threshold_support(&self) -> SmallDataThresholdSupport {
3373 match &self.options.small_data_threshold_support {
3374 SmallDataThresholdSupport::DefaultForArch => match self.arch {
3378 Arch::Mips | Arch::Mips64 | Arch::Mips32r6 => {
3379 SmallDataThresholdSupport::LlvmArg("mips-ssection-threshold".into())
3380 }
3381 Arch::Hexagon => {
3382 SmallDataThresholdSupport::LlvmArg("hexagon-small-data-threshold".into())
3383 }
3384 Arch::M68k => SmallDataThresholdSupport::LlvmArg("m68k-ssection-threshold".into()),
3385 Arch::RiscV32 | Arch::RiscV64 => {
3386 SmallDataThresholdSupport::LlvmModuleFlag("SmallDataLimit".into())
3387 }
3388 _ => SmallDataThresholdSupport::None,
3389 },
3390 s => s.clone(),
3391 }
3392 }
3393
3394 pub fn object_architecture(
3395 &self,
3396 unstable_target_features: &FxIndexSet<Symbol>,
3397 ) -> Option<(object::Architecture, Option<object::SubArchitecture>)> {
3398 use object::Architecture;
3399 Some(match self.arch {
3400 Arch::Arm => (Architecture::Arm, None),
3401 Arch::AArch64 => (
3402 if self.pointer_width == 32 {
3403 Architecture::Aarch64_Ilp32
3404 } else {
3405 Architecture::Aarch64
3406 },
3407 None,
3408 ),
3409 Arch::X86 => (Architecture::I386, None),
3410 Arch::S390x => (Architecture::S390x, None),
3411 Arch::M68k => (Architecture::M68k, None),
3412 Arch::Mips | Arch::Mips32r6 => (Architecture::Mips, None),
3413 Arch::Mips64 | Arch::Mips64r6 => (
3414 if self.options.llvm_abiname.as_ref() == "n32" {
3420 Architecture::Mips64_N32
3421 } else {
3422 Architecture::Mips64
3423 },
3424 None,
3425 ),
3426 Arch::X86_64 => (
3427 if self.pointer_width == 32 {
3428 Architecture::X86_64_X32
3429 } else {
3430 Architecture::X86_64
3431 },
3432 None,
3433 ),
3434 Arch::PowerPC => (Architecture::PowerPc, None),
3435 Arch::PowerPC64 => (Architecture::PowerPc64, None),
3436 Arch::RiscV32 => (Architecture::Riscv32, None),
3437 Arch::RiscV64 => (Architecture::Riscv64, None),
3438 Arch::Sparc => {
3439 if unstable_target_features.contains(&sym::v8plus) {
3440 (Architecture::Sparc32Plus, None)
3442 } else {
3443 (Architecture::Sparc, None)
3445 }
3446 }
3447 Arch::Sparc64 => (Architecture::Sparc64, None),
3448 Arch::Avr => (Architecture::Avr, None),
3449 Arch::Msp430 => (Architecture::Msp430, None),
3450 Arch::Hexagon => (Architecture::Hexagon, None),
3451 Arch::Xtensa => (Architecture::Xtensa, None),
3452 Arch::Bpf => (Architecture::Bpf, None),
3453 Arch::LoongArch32 => (Architecture::LoongArch32, None),
3454 Arch::LoongArch64 => (Architecture::LoongArch64, None),
3455 Arch::CSky => (Architecture::Csky, None),
3456 Arch::Arm64EC => (Architecture::Aarch64, Some(object::SubArchitecture::Arm64EC)),
3457 Arch::AmdGpu
3458 | Arch::Nvptx64
3459 | Arch::SpirV
3460 | Arch::Wasm32
3461 | Arch::Wasm64
3462 | Arch::Other(_) => return None,
3463 })
3464 }
3465
3466 pub fn max_reliable_alignment(&self) -> Align {
3475 if self.is_like_windows && self.arch == Arch::X86 {
3479 Align::from_bytes(4).unwrap()
3480 } else {
3481 Align::MAX
3482 }
3483 }
3484
3485 pub fn vendor_symbol(&self) -> Symbol {
3486 Symbol::intern(&self.vendor)
3487 }
3488}
3489
3490#[derive(#[automatically_derived]
impl ::core::clone::Clone for TargetTuple {
#[inline]
fn clone(&self) -> TargetTuple {
match self {
TargetTuple::TargetTuple(__self_0) =>
TargetTuple::TargetTuple(::core::clone::Clone::clone(__self_0)),
TargetTuple::TargetJson {
path_for_rustdoc: __self_0,
tuple: __self_1,
contents: __self_2 } =>
TargetTuple::TargetJson {
path_for_rustdoc: ::core::clone::Clone::clone(__self_0),
tuple: ::core::clone::Clone::clone(__self_1),
contents: ::core::clone::Clone::clone(__self_2),
},
}
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for TargetTuple {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
TargetTuple::TargetTuple(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"TargetTuple", &__self_0),
TargetTuple::TargetJson {
path_for_rustdoc: __self_0,
tuple: __self_1,
contents: __self_2 } =>
::core::fmt::Formatter::debug_struct_field3_finish(f,
"TargetJson", "path_for_rustdoc", __self_0, "tuple",
__self_1, "contents", &__self_2),
}
}
}Debug)]
3492pub enum TargetTuple {
3493 TargetTuple(String),
3494 TargetJson {
3495 path_for_rustdoc: PathBuf,
3498 tuple: String,
3499 contents: String,
3500 },
3501}
3502
3503impl PartialEq for TargetTuple {
3505 fn eq(&self, other: &Self) -> bool {
3506 match (self, other) {
3507 (Self::TargetTuple(l0), Self::TargetTuple(r0)) => l0 == r0,
3508 (
3509 Self::TargetJson { path_for_rustdoc: _, tuple: l_tuple, contents: l_contents },
3510 Self::TargetJson { path_for_rustdoc: _, tuple: r_tuple, contents: r_contents },
3511 ) => l_tuple == r_tuple && l_contents == r_contents,
3512 _ => false,
3513 }
3514 }
3515}
3516
3517impl Hash for TargetTuple {
3519 fn hash<H: Hasher>(&self, state: &mut H) -> () {
3520 match self {
3521 TargetTuple::TargetTuple(tuple) => {
3522 0u8.hash(state);
3523 tuple.hash(state)
3524 }
3525 TargetTuple::TargetJson { path_for_rustdoc: _, tuple, contents } => {
3526 1u8.hash(state);
3527 tuple.hash(state);
3528 contents.hash(state)
3529 }
3530 }
3531 }
3532}
3533
3534impl<S: Encoder> Encodable<S> for TargetTuple {
3536 fn encode(&self, s: &mut S) {
3537 match self {
3538 TargetTuple::TargetTuple(tuple) => {
3539 s.emit_u8(0);
3540 s.emit_str(tuple);
3541 }
3542 TargetTuple::TargetJson { path_for_rustdoc: _, tuple, contents } => {
3543 s.emit_u8(1);
3544 s.emit_str(tuple);
3545 s.emit_str(contents);
3546 }
3547 }
3548 }
3549}
3550
3551impl<D: Decoder> Decodable<D> for TargetTuple {
3552 fn decode(d: &mut D) -> Self {
3553 match d.read_u8() {
3554 0 => TargetTuple::TargetTuple(d.read_str().to_owned()),
3555 1 => TargetTuple::TargetJson {
3556 path_for_rustdoc: PathBuf::new(),
3557 tuple: d.read_str().to_owned(),
3558 contents: d.read_str().to_owned(),
3559 },
3560 _ => {
3561 {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `TargetTuple`, expected 0..2"));
};panic!("invalid enum variant tag while decoding `TargetTuple`, expected 0..2");
3562 }
3563 }
3564 }
3565}
3566
3567impl TargetTuple {
3568 pub fn from_tuple(tuple: &str) -> Self {
3570 TargetTuple::TargetTuple(tuple.into())
3571 }
3572
3573 pub fn from_path(path: &Path) -> Result<Self, io::Error> {
3575 let canonicalized_path = try_canonicalize(path)?;
3576 let contents = std::fs::read_to_string(&canonicalized_path).map_err(|err| {
3577 io::Error::new(
3578 io::ErrorKind::InvalidInput,
3579 ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("target path {0:?} is not a valid file: {1}",
canonicalized_path, err))
})format!("target path {canonicalized_path:?} is not a valid file: {err}"),
3580 )
3581 })?;
3582 let tuple = canonicalized_path
3583 .file_stem()
3584 .expect("target path must not be empty")
3585 .to_str()
3586 .expect("target path must be valid unicode")
3587 .to_owned();
3588 Ok(TargetTuple::TargetJson { path_for_rustdoc: canonicalized_path, tuple, contents })
3589 }
3590
3591 pub fn tuple(&self) -> &str {
3595 match *self {
3596 TargetTuple::TargetTuple(ref tuple) | TargetTuple::TargetJson { ref tuple, .. } => {
3597 tuple
3598 }
3599 }
3600 }
3601
3602 pub fn debug_tuple(&self) -> String {
3607 use std::hash::DefaultHasher;
3608
3609 match self {
3610 TargetTuple::TargetTuple(tuple) => tuple.to_owned(),
3611 TargetTuple::TargetJson { path_for_rustdoc: _, tuple, contents: content } => {
3612 let mut hasher = DefaultHasher::new();
3613 content.hash(&mut hasher);
3614 let hash = hasher.finish();
3615 ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0}-{1}", tuple, hash))
})format!("{tuple}-{hash}")
3616 }
3617 }
3618 }
3619}
3620
3621impl fmt::Display for TargetTuple {
3622 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
3623 f.write_fmt(format_args!("{0}", self.debug_tuple()))write!(f, "{}", self.debug_tuple())
3624 }
3625}
3626
3627impl ::rustc_error_messages::IntoDiagArg for &TargetTuple {
fn into_diag_arg(self, path: &mut Option<std::path::PathBuf>)
-> ::rustc_error_messages::DiagArgValue {
self.to_string().into_diag_arg(path)
}
}into_diag_arg_using_display!(&TargetTuple);