1use std::collections::btree_map::{
5 Iter as BTreeMapIter, Keys as BTreeMapKeysIter, Values as BTreeMapValuesIter,
6};
7use std::collections::{BTreeMap, BTreeSet};
8use std::ffi::OsStr;
9use std::hash::Hash;
10use std::num::NonZero;
11use std::path::{Path, PathBuf};
12use std::str::{self, FromStr};
13use std::sync::LazyLock;
14use std::{cmp, fs, iter, thread};
15
16use externs::{ExternOpt, split_extern_opt};
17use rustc_data_structures::fx::FxHashSet;
18use rustc_data_structures::stable_hash::{StableHasher, StableOrd};
19use rustc_errors::emitter::HumanReadableErrorType;
20use rustc_errors::{ColorConfig, DiagCtxtFlags};
21use rustc_feature::UnstableFeatures;
22use rustc_hashes::Hash64;
23use rustc_macros::{BlobDecodable, Decodable, Encodable, StableHash};
24use rustc_span::edition::{
25 DEFAULT_EDITION, EDITION_NAME_LIST, EDITION_NAME_LIST_STABLE, Edition, LATEST_STABLE_EDITION,
26};
27use rustc_span::source_map::FilePathMapping;
28use rustc_span::{
29 FileName, RealFileName, RemapPathScopeComponents, SourceFileHashAlgorithm, Symbol, sym,
30};
31use rustc_structures::CrateType;
32use rustc_target::spec::{
33 FramePointer, LinkSelfContainedComponents, LinkerFeatures, PanicStrategy, SplitDebuginfo,
34 Target, TargetTuple,
35};
36use tracing::debug;
37
38pub use crate::config::cfg::{Cfg, CheckCfg, ExpectedValues};
39use crate::config::native_libs::parse_native_libs;
40pub use crate::config::print_request::{
41 PrintCategory, PrintKind, PrintRequest, collect_print_requests,
42};
43use crate::diagnostics::FileWriteFail;
44use crate::macros::AllVariants;
45pub use crate::options::*;
46use crate::search_paths::SearchPath;
47use crate::utils::CanonicalizedPath;
48use crate::{EarlyDiagCtxt, Session, filesearch, lint};
49
50mod cfg;
51mod externs;
52mod native_libs;
53mod print_request;
54pub mod sigpipe;
55
56pub const DEFAULT_STACK_SIZE: usize = 17 * 1024 * 1024;
58
59pub const NATIVE_CPU: &str = "native";
61
62#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for Strip { }
#[automatically_derived]
impl ::core::clone::Clone for Strip {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for Strip { }Copy, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for Strip { }
#[automatically_derived]
impl ::core::cmp::PartialEq for Strip {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for Strip {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for Strip {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
Strip::None => "None",
Strip::Debuginfo => "Debuginfo",
Strip::Symbols => "Symbols",
})
}
}Debug)]
64pub enum Strip {
65 None,
67
68 Debuginfo,
70
71 Symbols,
73}
74
75#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for CFGuard { }
#[automatically_derived]
impl ::core::clone::Clone for CFGuard {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for CFGuard { }Copy, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for CFGuard { }
#[automatically_derived]
impl ::core::cmp::PartialEq for CFGuard {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for CFGuard {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for CFGuard {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
CFGuard::Disabled => "Disabled",
CFGuard::NoChecks => "NoChecks",
CFGuard::Checks => "Checks",
})
}
}Debug)]
77pub enum CFGuard {
78 Disabled,
80
81 NoChecks,
83
84 Checks,
86}
87
88#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for CFProtection { }
#[automatically_derived]
impl ::core::clone::Clone for CFProtection {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for CFProtection { }Copy, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for CFProtection { }
#[automatically_derived]
impl ::core::cmp::PartialEq for CFProtection {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for CFProtection {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for CFProtection {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
CFProtection::None => "None",
CFProtection::Branch => "Branch",
CFProtection::Return => "Return",
CFProtection::Full => "Full",
})
}
}Debug)]
90pub enum CFProtection {
91 None,
93
94 Branch,
96
97 Return,
99
100 Full,
102}
103
104#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for OptLevel { }
#[automatically_derived]
impl ::core::clone::Clone for OptLevel {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for OptLevel { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for OptLevel {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
OptLevel::No => "No",
OptLevel::Less => "Less",
OptLevel::More => "More",
OptLevel::Aggressive => "Aggressive",
OptLevel::Size => "Size",
OptLevel::SizeMin => "SizeMin",
})
}
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for OptLevel { }
#[automatically_derived]
impl ::core::cmp::PartialEq for OptLevel {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for OptLevel {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for OptLevel {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
OptLevel::No => {}
OptLevel::Less => {}
OptLevel::More => {}
OptLevel::Aggressive => {}
OptLevel::Size => {}
OptLevel::SizeMin => {}
}
}
}
};StableHash, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for OptLevel {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
OptLevel::No => { 0usize }
OptLevel::Less => { 1usize }
OptLevel::More => { 2usize }
OptLevel::Aggressive => { 3usize }
OptLevel::Size => { 4usize }
OptLevel::SizeMin => { 5usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for OptLevel {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { OptLevel::No }
1usize => { OptLevel::Less }
2usize => { OptLevel::More }
3usize => { OptLevel::Aggressive }
4usize => { OptLevel::Size }
5usize => { OptLevel::SizeMin }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `OptLevel`, expected 0..6, actual {0}",
n));
}
}
}
}
};Decodable)]
105pub enum OptLevel {
106 No,
108 Less,
110 More,
112 Aggressive,
114 Size,
116 SizeMin,
118}
119
120impl OptLevel {
121 pub fn mir_opt_level(&self) -> usize {
124 match self {
125 OptLevel::No => 1,
126 _ => 2,
127 }
128 }
129}
130
131#[derive(#[automatically_derived]
impl ::core::clone::Clone for Lto {
#[inline]
fn clone(&self) -> Self {
match self {
Self::No => Lto::No,
Self::Thin => Lto::Thin,
Self::ThinLocal => Lto::ThinLocal,
Self::Fat => Lto::Fat,
}
}
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for Lto { }
#[automatically_derived]
impl ::core::cmp::PartialEq for Lto {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for Lto {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
Lto::No => { 0usize }
Lto::Thin => { 1usize }
Lto::ThinLocal => { 2usize }
Lto::Fat => { 3usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for Lto {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { Lto::No }
1usize => { Lto::Thin }
2usize => { Lto::ThinLocal }
3usize => { Lto::Fat }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `Lto`, expected 0..4, actual {0}",
n));
}
}
}
}
};Decodable)]
136pub enum Lto {
137 No,
139
140 Thin,
142
143 ThinLocal,
146
147 Fat,
149}
150
151#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for LtoCli { }
#[automatically_derived]
impl ::core::clone::Clone for LtoCli {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for LtoCli { }Copy, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for LtoCli { }
#[automatically_derived]
impl ::core::cmp::PartialEq for LtoCli {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for LtoCli {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for LtoCli {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
LtoCli::No => "No",
LtoCli::Yes => "Yes",
LtoCli::NoParam => "NoParam",
LtoCli::Thin => "Thin",
LtoCli::Fat => "Fat",
LtoCli::Unspecified => "Unspecified",
})
}
}Debug)]
153pub enum LtoCli {
154 No,
156 Yes,
158 NoParam,
160 Thin,
162 Fat,
164 Unspecified,
166}
167
168#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for InstrumentCoverage { }
#[automatically_derived]
impl ::core::clone::Clone for InstrumentCoverage {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for InstrumentCoverage { }Copy, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for InstrumentCoverage { }
#[automatically_derived]
impl ::core::cmp::PartialEq for InstrumentCoverage {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for InstrumentCoverage {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for InstrumentCoverage {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
InstrumentCoverage::No => "No",
InstrumentCoverage::Yes => "Yes",
})
}
}Debug)]
170pub enum InstrumentCoverage {
171 No,
173 Yes,
175}
176
177#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for CoverageOptions { }
#[automatically_derived]
impl ::core::clone::Clone for CoverageOptions {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<CoverageLevel>;
let _: ::core::clone::AssertParamIsClone<bool>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for CoverageOptions { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for CoverageOptions {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"CoverageOptions", "level", &self.level,
"discard_all_spans_in_codegen",
&&self.discard_all_spans_in_codegen)
}
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for CoverageOptions { }
#[automatically_derived]
impl ::core::cmp::PartialEq for CoverageOptions {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.discard_all_spans_in_codegen ==
other.discard_all_spans_in_codegen &&
self.level == other.level
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for CoverageOptions {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<CoverageLevel>;
let _: ::core::cmp::AssertParamIsEq<bool>;
}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for CoverageOptions {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.level, state);
::core::hash::Hash::hash(&self.discard_all_spans_in_codegen, state)
}
}Hash, #[automatically_derived]
impl ::core::default::Default for CoverageOptions {
#[inline]
fn default() -> Self {
CoverageOptions {
level: ::core::default::Default::default(),
discard_all_spans_in_codegen: ::core::default::Default::default(),
}
}
}Default)]
179pub struct CoverageOptions {
180 pub level: CoverageLevel,
181
182 pub discard_all_spans_in_codegen: bool,
188}
189
190#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for CoverageLevel { }
#[automatically_derived]
impl ::core::clone::Clone for CoverageLevel {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for CoverageLevel { }Copy, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for CoverageLevel { }
#[automatically_derived]
impl ::core::cmp::PartialEq for CoverageLevel {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for CoverageLevel { }Eq, #[automatically_derived]
impl ::core::cmp::PartialOrd for CoverageLevel {
#[inline]
fn partial_cmp(&self, other: &Self)
-> ::core::option::Option<::core::cmp::Ordering> {
::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
}
}PartialOrd, #[automatically_derived]
impl ::core::cmp::Ord for CoverageLevel {
#[inline]
fn cmp(&self, other: &Self) -> ::core::cmp::Ordering {
::core::cmp::Ord::cmp(&::core::intrinsics::discriminant_value(self),
&::core::intrinsics::discriminant_value(other))
}
}Ord, #[automatically_derived]
impl ::core::hash::Hash for CoverageLevel {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for CoverageLevel {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
CoverageLevel::Block => "Block",
CoverageLevel::Branch => "Branch",
CoverageLevel::Condition => "Condition",
})
}
}Debug, #[automatically_derived]
impl ::core::default::Default for CoverageLevel {
#[inline]
fn default() -> Self { Self::Block }
}Default)]
192pub enum CoverageLevel {
193 #[default]
195 Block,
196 Branch,
198 Condition,
214}
215
216#[derive(#[automatically_derived]
impl ::core::clone::Clone for Offload {
#[inline]
fn clone(&self) -> Self {
match self {
Self::Device(__self_0) =>
Offload::Device(::core::clone::Clone::clone(__self_0)),
Self::Host(__self_0) =>
Offload::Host(::core::clone::Clone::clone(__self_0)),
Self::Test => Offload::Test,
Self::HostMetadata(__self_0) =>
Offload::HostMetadata(::core::clone::Clone::clone(__self_0)),
}
}
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for Offload { }
#[automatically_derived]
impl ::core::cmp::PartialEq for Offload {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Device(__self_0), Self::Device(__arg1_0)) =>
__self_0 == __arg1_0,
(Self::Host(__self_0), Self::Host(__arg1_0)) =>
__self_0 == __arg1_0,
(Self::HostMetadata(__self_0), Self::HostMetadata(__arg1_0))
=> __self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for Offload {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state);
match self {
Self::Device(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
Self::Host(__self_0) => ::core::hash::Hash::hash(__self_0, state),
Self::HostMetadata(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for Offload {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Device(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Device",
&__self_0),
Self::Host(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Host",
&__self_0),
Self::Test => ::core::fmt::Formatter::write_str(f, "Test"),
Self::HostMetadata(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"HostMetadata", &__self_0),
}
}
}Debug, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for Offload {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
Offload::Device(ref __binding_0) => { 0usize }
Offload::Host(ref __binding_0) => { 1usize }
Offload::Test => { 2usize }
Offload::HostMetadata(ref __binding_0) => { 3usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
Offload::Device(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
Offload::Host(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
Offload::Test => {}
Offload::HostMetadata(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for Offload {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => {
Offload::Device(::rustc_serialize::Decodable::decode(__decoder))
}
1usize => {
Offload::Host(::rustc_serialize::Decodable::decode(__decoder))
}
2usize => { Offload::Test }
3usize => {
Offload::HostMetadata(::rustc_serialize::Decodable::decode(__decoder))
}
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `Offload`, expected 0..4, actual {0}",
n));
}
}
}
}
};Decodable)]
218pub enum Offload {
219 Device(String),
226 Host(String),
228 Test,
230 HostMetadata(String),
233}
234
235#[derive(#[automatically_derived]
impl ::core::marker::Copy for CodegenRetagOptions { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for CodegenRetagOptions { }
#[automatically_derived]
impl ::core::clone::Clone for CodegenRetagOptions {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<bool>;
*self
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for CodegenRetagOptions {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"CodegenRetagOptions", "no_precise_im", &self.no_precise_im,
"no_precise_pin", &&self.no_precise_pin)
}
}Debug, #[automatically_derived]
impl ::core::default::Default for CodegenRetagOptions {
#[inline]
fn default() -> Self {
CodegenRetagOptions {
no_precise_im: ::core::default::Default::default(),
no_precise_pin: ::core::default::Default::default(),
}
}
}Default, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for CodegenRetagOptions { }
#[automatically_derived]
impl ::core::cmp::PartialEq for CodegenRetagOptions {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.no_precise_im == other.no_precise_im &&
self.no_precise_pin == other.no_precise_pin
}
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for CodegenRetagOptions {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.no_precise_im, state);
::core::hash::Hash::hash(&self.no_precise_pin, state)
}
}Hash, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for CodegenRetagOptions {
fn encode(&self, __encoder: &mut __E) {
let CodegenRetagOptions {
no_precise_im: ref __binding_0,
no_precise_pin: ref __binding_1 } = *self;
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for CodegenRetagOptions {
fn decode(__decoder: &mut __D) -> Self {
CodegenRetagOptions {
no_precise_im: ::rustc_serialize::Decodable::decode(__decoder),
no_precise_pin: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};Decodable)]
237pub struct CodegenRetagOptions {
238 pub no_precise_im: bool,
240 pub no_precise_pin: bool,
242}
243
244#[derive(#[automatically_derived]
impl ::core::clone::Clone for AutoDiff {
#[inline]
fn clone(&self) -> Self {
match self {
Self::Enable => AutoDiff::Enable,
Self::PrintTA => AutoDiff::PrintTA,
Self::PrintTAFn(__self_0) =>
AutoDiff::PrintTAFn(::core::clone::Clone::clone(__self_0)),
Self::PrintAA => AutoDiff::PrintAA,
Self::PrintPerf => AutoDiff::PrintPerf,
Self::PrintSteps => AutoDiff::PrintSteps,
Self::PrintModBefore => AutoDiff::PrintModBefore,
Self::PrintModAfter => AutoDiff::PrintModAfter,
Self::PrintModFinal => AutoDiff::PrintModFinal,
Self::PrintPasses => AutoDiff::PrintPasses,
Self::NoPostopt => AutoDiff::NoPostopt,
Self::LooseTypes => AutoDiff::LooseTypes,
Self::Inline => AutoDiff::Inline,
Self::NoTT => AutoDiff::NoTT,
}
}
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for AutoDiff { }
#[automatically_derived]
impl ::core::cmp::PartialEq for AutoDiff {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::PrintTAFn(__self_0), Self::PrintTAFn(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for AutoDiff {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state);
match self {
Self::PrintTAFn(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for AutoDiff {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Enable => ::core::fmt::Formatter::write_str(f, "Enable"),
Self::PrintTA => ::core::fmt::Formatter::write_str(f, "PrintTA"),
Self::PrintTAFn(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"PrintTAFn", &__self_0),
Self::PrintAA => ::core::fmt::Formatter::write_str(f, "PrintAA"),
Self::PrintPerf =>
::core::fmt::Formatter::write_str(f, "PrintPerf"),
Self::PrintSteps =>
::core::fmt::Formatter::write_str(f, "PrintSteps"),
Self::PrintModBefore =>
::core::fmt::Formatter::write_str(f, "PrintModBefore"),
Self::PrintModAfter =>
::core::fmt::Formatter::write_str(f, "PrintModAfter"),
Self::PrintModFinal =>
::core::fmt::Formatter::write_str(f, "PrintModFinal"),
Self::PrintPasses =>
::core::fmt::Formatter::write_str(f, "PrintPasses"),
Self::NoPostopt =>
::core::fmt::Formatter::write_str(f, "NoPostopt"),
Self::LooseTypes =>
::core::fmt::Formatter::write_str(f, "LooseTypes"),
Self::Inline => ::core::fmt::Formatter::write_str(f, "Inline"),
Self::NoTT => ::core::fmt::Formatter::write_str(f, "NoTT"),
}
}
}Debug, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for AutoDiff {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
AutoDiff::Enable => { 0usize }
AutoDiff::PrintTA => { 1usize }
AutoDiff::PrintTAFn(ref __binding_0) => { 2usize }
AutoDiff::PrintAA => { 3usize }
AutoDiff::PrintPerf => { 4usize }
AutoDiff::PrintSteps => { 5usize }
AutoDiff::PrintModBefore => { 6usize }
AutoDiff::PrintModAfter => { 7usize }
AutoDiff::PrintModFinal => { 8usize }
AutoDiff::PrintPasses => { 9usize }
AutoDiff::NoPostopt => { 10usize }
AutoDiff::LooseTypes => { 11usize }
AutoDiff::Inline => { 12usize }
AutoDiff::NoTT => { 13usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
AutoDiff::Enable => {}
AutoDiff::PrintTA => {}
AutoDiff::PrintTAFn(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
AutoDiff::PrintAA => {}
AutoDiff::PrintPerf => {}
AutoDiff::PrintSteps => {}
AutoDiff::PrintModBefore => {}
AutoDiff::PrintModAfter => {}
AutoDiff::PrintModFinal => {}
AutoDiff::PrintPasses => {}
AutoDiff::NoPostopt => {}
AutoDiff::LooseTypes => {}
AutoDiff::Inline => {}
AutoDiff::NoTT => {}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for AutoDiff {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { AutoDiff::Enable }
1usize => { AutoDiff::PrintTA }
2usize => {
AutoDiff::PrintTAFn(::rustc_serialize::Decodable::decode(__decoder))
}
3usize => { AutoDiff::PrintAA }
4usize => { AutoDiff::PrintPerf }
5usize => { AutoDiff::PrintSteps }
6usize => { AutoDiff::PrintModBefore }
7usize => { AutoDiff::PrintModAfter }
8usize => { AutoDiff::PrintModFinal }
9usize => { AutoDiff::PrintPasses }
10usize => { AutoDiff::NoPostopt }
11usize => { AutoDiff::LooseTypes }
12usize => { AutoDiff::Inline }
13usize => { AutoDiff::NoTT }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `AutoDiff`, expected 0..14, actual {0}",
n));
}
}
}
}
};Decodable)]
246pub enum AutoDiff {
247 Enable,
249
250 PrintTA,
252 PrintTAFn(String),
254 PrintAA,
256 PrintPerf,
258 PrintSteps,
260 PrintModBefore,
262 PrintModAfter,
264 PrintModFinal,
266
267 PrintPasses,
269 NoPostopt,
271 LooseTypes,
274 Inline,
276 NoTT,
278}
279
280#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for AnnotateMoves { }
#[automatically_derived]
impl ::core::clone::Clone for AnnotateMoves {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Option<u64>>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for AnnotateMoves { }Copy, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for AnnotateMoves { }
#[automatically_derived]
impl ::core::cmp::PartialEq for AnnotateMoves {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Enabled(__self_0), Self::Enabled(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for AnnotateMoves {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state);
match self {
Self::Enabled(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for AnnotateMoves {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Disabled =>
::core::fmt::Formatter::write_str(f, "Disabled"),
Self::Enabled(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"Enabled", &__self_0),
}
}
}Debug)]
282pub enum AnnotateMoves {
283 Disabled,
285 Enabled(Option<u64>),
288}
289
290#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for InstrumentMcountOpts { }
#[automatically_derived]
impl ::core::clone::Clone for InstrumentMcountOpts {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<bool>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for InstrumentMcountOpts { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for InstrumentMcountOpts {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"InstrumentMcountOpts", "no_call", &self.no_call, "record",
&&self.record)
}
}Debug, #[automatically_derived]
impl ::core::default::Default for InstrumentMcountOpts {
#[inline]
fn default() -> Self {
InstrumentMcountOpts {
no_call: ::core::default::Default::default(),
record: ::core::default::Default::default(),
}
}
}Default, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for InstrumentMcountOpts { }
#[automatically_derived]
impl ::core::cmp::PartialEq for InstrumentMcountOpts {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.no_call == other.no_call && self.record == other.record
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for InstrumentMcountOpts {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<bool>;
}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for InstrumentMcountOpts {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.no_call, state);
::core::hash::Hash::hash(&self.record, state)
}
}Hash)]
291pub struct InstrumentMcountOpts {
292 pub no_call: bool,
294 pub record: bool,
296}
297
298#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for InstrumentMcount { }
#[automatically_derived]
impl ::core::clone::Clone for InstrumentMcount {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<InstrumentMcountOpts>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for InstrumentMcount { }Copy, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for InstrumentMcount { }
#[automatically_derived]
impl ::core::cmp::PartialEq for InstrumentMcount {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Mcount(__self_0), Self::Mcount(__arg1_0)) =>
__self_0 == __arg1_0,
(Self::Fentry(__self_0), Self::Fentry(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for InstrumentMcount {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<InstrumentMcountOpts>;
}
}Eq, #[automatically_derived]
impl ::core::fmt::Debug for InstrumentMcount {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Disabled =>
::core::fmt::Formatter::write_str(f, "Disabled"),
Self::Mcount(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Mcount",
&__self_0),
Self::Fentry(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Fentry",
&__self_0),
}
}
}Debug, #[automatically_derived]
impl ::core::hash::Hash for InstrumentMcount {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state);
match self {
Self::Mcount(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
Self::Fentry(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}Hash)]
300pub enum InstrumentMcount {
301 Disabled,
303 Mcount(InstrumentMcountOpts),
305 Fentry(InstrumentMcountOpts),
307}
308
309#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for InstrumentXRay { }
#[automatically_derived]
impl ::core::clone::Clone for InstrumentXRay {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<bool>;
let _: ::core::clone::AssertParamIsClone<Option<usize>>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for InstrumentXRay { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for InstrumentXRay {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
&["always", "never", "ignore_loops", "instruction_threshold",
"skip_entry", "skip_exit"];
let values: &[&dyn ::core::fmt::Debug] =
&[&self.always, &self.never, &self.ignore_loops,
&self.instruction_threshold, &self.skip_entry,
&&self.skip_exit];
::core::fmt::Formatter::debug_struct_fields_finish(f,
"InstrumentXRay", names, values)
}
}Debug, #[automatically_derived]
impl ::core::default::Default for InstrumentXRay {
#[inline]
fn default() -> Self {
InstrumentXRay {
always: ::core::default::Default::default(),
never: ::core::default::Default::default(),
ignore_loops: ::core::default::Default::default(),
instruction_threshold: ::core::default::Default::default(),
skip_entry: ::core::default::Default::default(),
skip_exit: ::core::default::Default::default(),
}
}
}Default, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for InstrumentXRay { }
#[automatically_derived]
impl ::core::cmp::PartialEq for InstrumentXRay {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.always == other.always && self.never == other.never &&
self.ignore_loops == other.ignore_loops &&
self.skip_entry == other.skip_entry &&
self.skip_exit == other.skip_exit &&
self.instruction_threshold == other.instruction_threshold
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for InstrumentXRay {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<bool>;
let _: ::core::cmp::AssertParamIsEq<Option<usize>>;
}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for InstrumentXRay {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.always, state);
::core::hash::Hash::hash(&self.never, state);
::core::hash::Hash::hash(&self.ignore_loops, state);
::core::hash::Hash::hash(&self.instruction_threshold, state);
::core::hash::Hash::hash(&self.skip_entry, state);
::core::hash::Hash::hash(&self.skip_exit, state)
}
}Hash)]
311pub struct InstrumentXRay {
312 pub always: bool,
314 pub never: bool,
316 pub ignore_loops: bool,
319 pub instruction_threshold: Option<usize>,
322 pub skip_entry: bool,
324 pub skip_exit: bool,
326}
327
328#[derive(#[automatically_derived]
impl ::core::clone::Clone for LinkerPluginLto {
#[inline]
fn clone(&self) -> Self {
match self {
Self::LinkerPlugin(__self_0) =>
LinkerPluginLto::LinkerPlugin(::core::clone::Clone::clone(__self_0)),
Self::LinkerPluginAuto => LinkerPluginLto::LinkerPluginAuto,
Self::Disabled => LinkerPluginLto::Disabled,
}
}
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for LinkerPluginLto { }
#[automatically_derived]
impl ::core::cmp::PartialEq for LinkerPluginLto {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::LinkerPlugin(__self_0), Self::LinkerPlugin(__arg1_0))
=> __self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for LinkerPluginLto {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state);
match self {
Self::LinkerPlugin(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for LinkerPluginLto {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::LinkerPlugin(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"LinkerPlugin", &__self_0),
Self::LinkerPluginAuto =>
::core::fmt::Formatter::write_str(f, "LinkerPluginAuto"),
Self::Disabled =>
::core::fmt::Formatter::write_str(f, "Disabled"),
}
}
}Debug)]
329pub enum LinkerPluginLto {
330 LinkerPlugin(PathBuf),
331 LinkerPluginAuto,
332 Disabled,
333}
334
335impl LinkerPluginLto {
336 pub fn enabled(&self) -> bool {
337 match *self {
338 LinkerPluginLto::LinkerPlugin(_) | LinkerPluginLto::LinkerPluginAuto => true,
339 LinkerPluginLto::Disabled => false,
340 }
341 }
342}
343
344#[derive(#[automatically_derived]
impl ::core::default::Default for LinkSelfContained {
#[inline]
fn default() -> Self {
LinkSelfContained {
explicitly_set: ::core::default::Default::default(),
enabled_components: ::core::default::Default::default(),
disabled_components: ::core::default::Default::default(),
}
}
}Default, #[automatically_derived]
impl ::core::clone::Clone for LinkSelfContained {
#[inline]
fn clone(&self) -> Self {
LinkSelfContained {
explicitly_set: ::core::clone::Clone::clone(&self.explicitly_set),
enabled_components: ::core::clone::Clone::clone(&self.enabled_components),
disabled_components: ::core::clone::Clone::clone(&self.disabled_components),
}
}
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for LinkSelfContained { }
#[automatically_derived]
impl ::core::cmp::PartialEq for LinkSelfContained {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.explicitly_set == other.explicitly_set &&
self.enabled_components == other.enabled_components &&
self.disabled_components == other.disabled_components
}
}PartialEq, #[automatically_derived]
impl ::core::fmt::Debug for LinkSelfContained {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f,
"LinkSelfContained", "explicitly_set", &self.explicitly_set,
"enabled_components", &self.enabled_components,
"disabled_components", &&self.disabled_components)
}
}Debug)]
360pub struct LinkSelfContained {
361 pub explicitly_set: Option<bool>,
364
365 enabled_components: LinkSelfContainedComponents,
368
369 disabled_components: LinkSelfContainedComponents,
372}
373
374impl LinkSelfContained {
375 pub(crate) fn handle_cli_component(&mut self, component: &str) -> Option<()> {
378 if let Some(component_to_enable) = component.strip_prefix('+') {
383 self.explicitly_set = None;
384 self.enabled_components
385 .insert(LinkSelfContainedComponents::from_str(component_to_enable).ok()?);
386 Some(())
387 } else if let Some(component_to_disable) = component.strip_prefix('-') {
388 self.explicitly_set = None;
389 self.disabled_components
390 .insert(LinkSelfContainedComponents::from_str(component_to_disable).ok()?);
391 Some(())
392 } else {
393 None
394 }
395 }
396
397 pub(crate) fn set_all_explicitly(&mut self, enabled: bool) {
400 self.explicitly_set = Some(enabled);
401
402 if enabled {
403 self.enabled_components = LinkSelfContainedComponents::all();
404 self.disabled_components = LinkSelfContainedComponents::empty();
405 } else {
406 self.enabled_components = LinkSelfContainedComponents::empty();
407 self.disabled_components = LinkSelfContainedComponents::all();
408 }
409 }
410
411 pub fn on() -> Self {
413 let mut on = LinkSelfContained::default();
414 on.set_all_explicitly(true);
415 on
416 }
417
418 fn check_unstable_variants(&self, target_tuple: &TargetTuple) -> Result<(), String> {
422 if self.explicitly_set.is_some() {
423 return Ok(());
424 }
425
426 let has_minus_linker = self.disabled_components.is_linker_enabled();
428 if has_minus_linker && target_tuple.tuple() != "x86_64-unknown-linux-gnu" {
429 return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`-C link-self-contained=-linker` is unstable on the `{0}` target. The `-Z unstable-options` flag must also be passed to use it on this target",
target_tuple))
})format!(
430 "`-C link-self-contained=-linker` is unstable on the `{target_tuple}` \
431 target. The `-Z unstable-options` flag must also be passed to use it on this target",
432 ));
433 }
434
435 let unstable_enabled = self.enabled_components;
437 let unstable_disabled = self.disabled_components - LinkSelfContainedComponents::LINKER;
438 if !unstable_enabled.union(unstable_disabled).is_empty() {
439 return Err(String::from(
440 "only `-C link-self-contained` values `y`/`yes`/`on`/`n`/`no`/`off`/`-linker` \
441 are stable, the `-Z unstable-options` flag must also be passed to use \
442 the unstable values",
443 ));
444 }
445
446 Ok(())
447 }
448
449 pub fn is_linker_enabled(&self) -> bool {
452 self.enabled_components.contains(LinkSelfContainedComponents::LINKER)
453 }
454
455 pub fn is_linker_disabled(&self) -> bool {
458 self.disabled_components.contains(LinkSelfContainedComponents::LINKER)
459 }
460
461 fn check_consistency(&self) -> Option<LinkSelfContainedComponents> {
464 if self.explicitly_set.is_some() {
465 None
466 } else {
467 let common = self.enabled_components.intersection(self.disabled_components);
468 if common.is_empty() { None } else { Some(common) }
469 }
470 }
471}
472
473#[derive(#[automatically_derived]
impl ::core::default::Default for LinkerFeaturesCli {
#[inline]
fn default() -> Self {
LinkerFeaturesCli {
enabled: ::core::default::Default::default(),
disabled: ::core::default::Default::default(),
}
}
}Default, #[automatically_derived]
impl ::core::marker::Copy for LinkerFeaturesCli { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for LinkerFeaturesCli { }
#[automatically_derived]
impl ::core::clone::Clone for LinkerFeaturesCli {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<LinkerFeatures>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for LinkerFeaturesCli { }
#[automatically_derived]
impl ::core::cmp::PartialEq for LinkerFeaturesCli {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.enabled == other.enabled && self.disabled == other.disabled
}
}PartialEq, #[automatically_derived]
impl ::core::fmt::Debug for LinkerFeaturesCli {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"LinkerFeaturesCli", "enabled", &self.enabled, "disabled",
&&self.disabled)
}
}Debug)]
482pub struct LinkerFeaturesCli {
483 pub enabled: LinkerFeatures,
485
486 pub disabled: LinkerFeatures,
488}
489
490impl LinkerFeaturesCli {
491 pub(crate) fn handle_cli_feature(&mut self, feature: &str) -> Option<()> {
494 match feature {
500 "+lld" => {
501 self.enabled.insert(LinkerFeatures::LLD);
502 self.disabled.remove(LinkerFeatures::LLD);
503 Some(())
504 }
505 "-lld" => {
506 self.disabled.insert(LinkerFeatures::LLD);
507 self.enabled.remove(LinkerFeatures::LLD);
508 Some(())
509 }
510 _ => None,
511 }
512 }
513
514 pub(crate) fn check_unstable_variants(&self, target_tuple: &TargetTuple) -> Result<(), String> {
519 let has_minus_lld = self.disabled.is_lld_enabled();
521 if has_minus_lld && target_tuple.tuple() != "x86_64-unknown-linux-gnu" {
522 return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`-C linker-features=-lld` is unstable on the `{0}` target. The `-Z unstable-options` flag must also be passed to use it on this target",
target_tuple))
})format!(
523 "`-C linker-features=-lld` is unstable on the `{target_tuple}` \
524 target. The `-Z unstable-options` flag must also be passed to use it on this target",
525 ));
526 }
527
528 let unstable_enabled = self.enabled;
530 let unstable_disabled = self.disabled - LinkerFeatures::LLD;
531 if !unstable_enabled.union(unstable_disabled).is_empty() {
532 let unstable_features: Vec<_> = unstable_enabled
533 .iter()
534 .map(|f| ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("+{0}", f.as_str().unwrap()))
})format!("+{}", f.as_str().unwrap()))
535 .chain(unstable_disabled.iter().map(|f| ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("-{0}", f.as_str().unwrap()))
})format!("-{}", f.as_str().unwrap())))
536 .collect();
537 return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`-C linker-features={0}` is unstable, and also requires the `-Z unstable-options` flag to be used",
unstable_features.join(",")))
})format!(
538 "`-C linker-features={}` is unstable, and also requires the \
539 `-Z unstable-options` flag to be used",
540 unstable_features.join(","),
541 ));
542 }
543
544 Ok(())
545 }
546}
547
548#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for IncrementalStateAssertion { }
#[automatically_derived]
impl ::core::clone::Clone for IncrementalStateAssertion {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for IncrementalStateAssertion { }Copy, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for IncrementalStateAssertion { }
#[automatically_derived]
impl ::core::cmp::PartialEq for IncrementalStateAssertion {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for IncrementalStateAssertion {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for IncrementalStateAssertion {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
IncrementalStateAssertion::Loaded => "Loaded",
IncrementalStateAssertion::NotLoaded => "NotLoaded",
})
}
}Debug)]
550pub enum IncrementalStateAssertion {
551 Loaded,
556 NotLoaded,
558}
559
560#[derive(#[automatically_derived]
impl ::core::marker::Copy for LocationDetail { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for LocationDetail { }
#[automatically_derived]
impl ::core::clone::Clone for LocationDetail {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<bool>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for LocationDetail { }
#[automatically_derived]
impl ::core::cmp::PartialEq for LocationDetail {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.file == other.file && self.line == other.line &&
self.column == other.column
}
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for LocationDetail {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.file, state);
::core::hash::Hash::hash(&self.line, state);
::core::hash::Hash::hash(&self.column, state)
}
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for LocationDetail {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f,
"LocationDetail", "file", &self.file, "line", &self.line,
"column", &&self.column)
}
}Debug)]
562pub struct LocationDetail {
563 pub file: bool,
564 pub line: bool,
565 pub column: bool,
566}
567
568impl LocationDetail {
569 pub(crate) fn all() -> Self {
570 Self { file: true, line: true, column: true }
571 }
572}
573
574#[derive(#[automatically_derived]
impl ::core::marker::Copy for FmtDebug { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for FmtDebug { }
#[automatically_derived]
impl ::core::clone::Clone for FmtDebug {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for FmtDebug { }
#[automatically_derived]
impl ::core::cmp::PartialEq for FmtDebug {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for FmtDebug {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for FmtDebug {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
FmtDebug::Full => "Full",
FmtDebug::Shallow => "Shallow",
FmtDebug::None => "None",
})
}
}Debug)]
576pub enum FmtDebug {
577 Full,
579 Shallow,
581 None,
583}
584
585impl FmtDebug {
586 pub(crate) fn all() -> [Symbol; 3] {
587 [sym::full, sym::none, sym::shallow]
588 }
589}
590
591#[derive(#[automatically_derived]
impl ::core::clone::Clone for SwitchWithOptPath {
#[inline]
fn clone(&self) -> Self {
match self {
Self::Enabled(__self_0) =>
SwitchWithOptPath::Enabled(::core::clone::Clone::clone(__self_0)),
Self::Disabled => SwitchWithOptPath::Disabled,
}
}
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for SwitchWithOptPath { }
#[automatically_derived]
impl ::core::cmp::PartialEq for SwitchWithOptPath {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Enabled(__self_0), Self::Enabled(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for SwitchWithOptPath {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state);
match self {
Self::Enabled(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for SwitchWithOptPath {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Enabled(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"Enabled", &__self_0),
Self::Disabled =>
::core::fmt::Formatter::write_str(f, "Disabled"),
}
}
}Debug, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for SwitchWithOptPath {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
SwitchWithOptPath::Enabled(ref __binding_0) => { 0usize }
SwitchWithOptPath::Disabled => { 1usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
SwitchWithOptPath::Enabled(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
SwitchWithOptPath::Disabled => {}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for SwitchWithOptPath {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => {
SwitchWithOptPath::Enabled(::rustc_serialize::Decodable::decode(__decoder))
}
1usize => { SwitchWithOptPath::Disabled }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `SwitchWithOptPath`, expected 0..2, actual {0}",
n));
}
}
}
}
};Decodable)]
592pub enum SwitchWithOptPath {
593 Enabled(Option<PathBuf>),
594 Disabled,
595}
596
597impl SwitchWithOptPath {
598 pub fn enabled(&self) -> bool {
599 match *self {
600 SwitchWithOptPath::Enabled(_) => true,
601 SwitchWithOptPath::Disabled => false,
602 }
603 }
604}
605
606#[derive(#[automatically_derived]
impl ::core::marker::Copy for SymbolManglingVersion { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for SymbolManglingVersion { }
#[automatically_derived]
impl ::core::clone::Clone for SymbolManglingVersion {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for SymbolManglingVersion {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
SymbolManglingVersion::Legacy => "Legacy",
SymbolManglingVersion::V0 => "V0",
SymbolManglingVersion::Hashed => "Hashed",
})
}
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for SymbolManglingVersion { }
#[automatically_derived]
impl ::core::cmp::PartialEq for SymbolManglingVersion {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for SymbolManglingVersion { }Eq, #[automatically_derived]
impl ::core::cmp::PartialOrd for SymbolManglingVersion {
#[inline]
fn partial_cmp(&self, other: &Self)
-> ::core::option::Option<::core::cmp::Ordering> {
::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
}
}PartialOrd, #[automatically_derived]
impl ::core::cmp::Ord for SymbolManglingVersion {
#[inline]
fn cmp(&self, other: &Self) -> ::core::cmp::Ordering {
::core::cmp::Ord::cmp(&::core::intrinsics::discriminant_value(self),
&::core::intrinsics::discriminant_value(other))
}
}Ord, #[automatically_derived]
impl ::core::hash::Hash for SymbolManglingVersion {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
SymbolManglingVersion {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
SymbolManglingVersion::Legacy => {}
SymbolManglingVersion::V0 => {}
SymbolManglingVersion::Hashed => {}
}
}
}
};StableHash)]
607#[derive(const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for SymbolManglingVersion {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
SymbolManglingVersion::Legacy => { 0usize }
SymbolManglingVersion::V0 => { 1usize }
SymbolManglingVersion::Hashed => { 2usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::BlobDecoder> ::rustc_serialize::Decodable<__D>
for SymbolManglingVersion {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { SymbolManglingVersion::Legacy }
1usize => { SymbolManglingVersion::V0 }
2usize => { SymbolManglingVersion::Hashed }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `SymbolManglingVersion`, expected 0..3, actual {0}",
n));
}
}
}
}
};BlobDecodable)]
608pub enum SymbolManglingVersion {
609 Legacy,
610 V0,
611 Hashed,
612}
613
614#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for DebugInfo { }
#[automatically_derived]
impl ::core::clone::Clone for DebugInfo {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for DebugInfo { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for DebugInfo {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
DebugInfo::None => "None",
DebugInfo::LineDirectivesOnly => "LineDirectivesOnly",
DebugInfo::LineTablesOnly => "LineTablesOnly",
DebugInfo::Limited => "Limited",
DebugInfo::Full => "Full",
})
}
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for DebugInfo { }
#[automatically_derived]
impl ::core::cmp::PartialEq for DebugInfo {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for DebugInfo {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash)]
615pub enum DebugInfo {
616 None,
617 LineDirectivesOnly,
618 LineTablesOnly,
619 Limited,
620 Full,
621}
622
623#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for DebugInfoCompression { }
#[automatically_derived]
impl ::core::clone::Clone for DebugInfoCompression {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for DebugInfoCompression { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for DebugInfoCompression {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
DebugInfoCompression::None => "None",
DebugInfoCompression::Zlib => "Zlib",
DebugInfoCompression::Zstd => "Zstd",
})
}
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for DebugInfoCompression { }
#[automatically_derived]
impl ::core::cmp::PartialEq for DebugInfoCompression {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for DebugInfoCompression {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash)]
624pub enum DebugInfoCompression {
625 None,
626 Zlib,
627 Zstd,
628}
629
630#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for MirStripDebugInfo { }
#[automatically_derived]
impl ::core::clone::Clone for MirStripDebugInfo {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for MirStripDebugInfo { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for MirStripDebugInfo {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
MirStripDebugInfo::None => "None",
MirStripDebugInfo::LocalsInTinyFunctions =>
"LocalsInTinyFunctions",
MirStripDebugInfo::AllLocals => "AllLocals",
})
}
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for MirStripDebugInfo { }
#[automatically_derived]
impl ::core::cmp::PartialEq for MirStripDebugInfo {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for MirStripDebugInfo {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash)]
631pub enum MirStripDebugInfo {
632 None,
633 LocalsInTinyFunctions,
634 AllLocals,
635}
636
637#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for SplitDwarfKind { }
#[automatically_derived]
impl ::core::clone::Clone for SplitDwarfKind {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for SplitDwarfKind { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for SplitDwarfKind {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
SplitDwarfKind::Single => "Single",
SplitDwarfKind::Split => "Split",
})
}
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for SplitDwarfKind { }
#[automatically_derived]
impl ::core::cmp::PartialEq for SplitDwarfKind {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for SplitDwarfKind {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for SplitDwarfKind {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
SplitDwarfKind::Single => { 0usize }
SplitDwarfKind::Split => { 1usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for SplitDwarfKind {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { SplitDwarfKind::Single }
1usize => { SplitDwarfKind::Split }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `SplitDwarfKind`, expected 0..2, actual {0}",
n));
}
}
}
}
};Decodable)]
647pub enum SplitDwarfKind {
648 Single,
651 Split,
654}
655
656impl FromStr for SplitDwarfKind {
657 type Err = ();
658
659 fn from_str(s: &str) -> Result<Self, ()> {
660 Ok(match s {
661 "single" => SplitDwarfKind::Single,
662 "split" => SplitDwarfKind::Split,
663 _ => return Err(()),
664 })
665 }
666}
667
668macro_rules! define_output_types {
669 (
670 $(
671 $(#[doc = $doc:expr])*
672 $Variant:ident => {
673 shorthand: $shorthand:expr,
674 extension: $extension:expr,
675 description: $description:expr,
676 default_filename: $default_filename:expr,
677 is_text: $is_text:expr,
678 compatible_with_cgus_and_single_output: $compatible:expr
679 }
680 ),* $(,)?
681 ) => {
682 #[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, PartialOrd, Ord, StableHash)]
683 #[derive(Encodable, Decodable)]
684 pub enum OutputType {
685 $(
686 $(#[doc = $doc])*
687 $Variant,
688 )*
689 }
690
691 impl StableOrd for OutputType {
692 const CAN_USE_UNSTABLE_SORT: bool = true;
693
694 const THIS_IMPLEMENTATION_HAS_BEEN_TRIPLE_CHECKED: () = ();
696 }
697
698 impl OutputType {
699 pub fn iter_all() -> impl Iterator<Item = OutputType> {
700 static ALL_VARIANTS: &[OutputType] = &[
701 $(
702 OutputType::$Variant,
703 )*
704 ];
705 ALL_VARIANTS.iter().copied()
706 }
707
708 fn is_compatible_with_codegen_units_and_single_output_file(&self) -> bool {
709 match *self {
710 $(
711 OutputType::$Variant => $compatible,
712 )*
713 }
714 }
715
716 pub fn shorthand(&self) -> &'static str {
717 match *self {
718 $(
719 OutputType::$Variant => $shorthand,
720 )*
721 }
722 }
723
724 fn from_shorthand(shorthand: &str) -> Option<Self> {
725 match shorthand {
726 $(
727 s if s == $shorthand => Some(OutputType::$Variant),
728 )*
729 _ => None,
730 }
731 }
732
733 fn shorthands_display() -> String {
734 let shorthands = vec![
735 $(
736 format!("`{}`", $shorthand),
737 )*
738 ];
739 shorthands.join(", ")
740 }
741
742 pub fn extension(&self) -> &'static str {
743 match *self {
744 $(
745 OutputType::$Variant => $extension,
746 )*
747 }
748 }
749
750 pub fn is_text_output(&self) -> bool {
751 match *self {
752 $(
753 OutputType::$Variant => $is_text,
754 )*
755 }
756 }
757
758 pub fn description(&self) -> &'static str {
759 match *self {
760 $(
761 OutputType::$Variant => $description,
762 )*
763 }
764 }
765
766 pub fn default_filename(&self) -> &'static str {
767 match *self {
768 $(
769 OutputType::$Variant => $default_filename,
770 )*
771 }
772 }
773
774
775 }
776 }
777}
778
779pub enum OutputType {
Assembly,
#[doc =
"This is the optimized bitcode, which could be either pre-LTO or non-LTO bitcode,"]
#[doc = "depending on the specific request type."]
Bitcode,
DepInfo,
Exe,
LlvmAssembly,
Metadata,
Mir,
Object,
#[doc = "This is the summary or index data part of the ThinLTO bitcode."]
ThinLinkBitcode,
}
const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for OutputType {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
OutputType::Assembly => { 0usize }
OutputType::Bitcode => { 1usize }
OutputType::DepInfo => { 2usize }
OutputType::Exe => { 3usize }
OutputType::LlvmAssembly => { 4usize }
OutputType::Metadata => { 5usize }
OutputType::Mir => { 6usize }
OutputType::Object => { 7usize }
OutputType::ThinLinkBitcode => { 8usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
}
}
};
const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for OutputType {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { OutputType::Assembly }
1usize => { OutputType::Bitcode }
2usize => { OutputType::DepInfo }
3usize => { OutputType::Exe }
4usize => { OutputType::LlvmAssembly }
5usize => { OutputType::Metadata }
6usize => { OutputType::Mir }
7usize => { OutputType::Object }
8usize => { OutputType::ThinLinkBitcode }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `OutputType`, expected 0..9, actual {0}",
n));
}
}
}
}
};
#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for OutputType { }
#[automatically_derived]
impl ::core::clone::Clone for OutputType {
#[inline]
fn clone(&self) -> Self { *self }
}
#[automatically_derived]
impl ::core::marker::Copy for OutputType { }
#[automatically_derived]
impl ::core::marker::StructuralPartialEq for OutputType { }
#[automatically_derived]
impl ::core::cmp::PartialEq for OutputType {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}
#[automatically_derived]
impl ::core::cmp::Eq for OutputType { }
#[automatically_derived]
impl ::core::hash::Hash for OutputType {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}
#[automatically_derived]
impl ::core::fmt::Debug for OutputType {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
OutputType::Assembly => "Assembly",
OutputType::Bitcode => "Bitcode",
OutputType::DepInfo => "DepInfo",
OutputType::Exe => "Exe",
OutputType::LlvmAssembly => "LlvmAssembly",
OutputType::Metadata => "Metadata",
OutputType::Mir => "Mir",
OutputType::Object => "Object",
OutputType::ThinLinkBitcode => "ThinLinkBitcode",
})
}
}
#[automatically_derived]
impl ::core::cmp::PartialOrd for OutputType {
#[inline]
fn partial_cmp(&self, other: &Self)
-> ::core::option::Option<::core::cmp::Ordering> {
::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
}
}
#[automatically_derived]
impl ::core::cmp::Ord for OutputType {
#[inline]
fn cmp(&self, other: &Self) -> ::core::cmp::Ordering {
::core::cmp::Ord::cmp(&::core::intrinsics::discriminant_value(self),
&::core::intrinsics::discriminant_value(other))
}
}
const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for OutputType {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
OutputType::Assembly => {}
OutputType::Bitcode => {}
OutputType::DepInfo => {}
OutputType::Exe => {}
OutputType::LlvmAssembly => {}
OutputType::Metadata => {}
OutputType::Mir => {}
OutputType::Object => {}
OutputType::ThinLinkBitcode => {}
}
}
}
};
impl StableOrd for OutputType {
const CAN_USE_UNSTABLE_SORT: bool = true;
const THIS_IMPLEMENTATION_HAS_BEEN_TRIPLE_CHECKED: () = ();
}
impl OutputType {
pub fn iter_all() -> impl Iterator<Item = OutputType> {
static ALL_VARIANTS: &[OutputType] =
&[OutputType::Assembly, OutputType::Bitcode, OutputType::DepInfo,
OutputType::Exe, OutputType::LlvmAssembly,
OutputType::Metadata, OutputType::Mir, OutputType::Object,
OutputType::ThinLinkBitcode];
ALL_VARIANTS.iter().copied()
}
fn is_compatible_with_codegen_units_and_single_output_file(&self)
-> bool {
match *self {
OutputType::Assembly => false,
OutputType::Bitcode => false,
OutputType::DepInfo => true,
OutputType::Exe => true,
OutputType::LlvmAssembly => false,
OutputType::Metadata => true,
OutputType::Mir => false,
OutputType::Object => false,
OutputType::ThinLinkBitcode => false,
}
}
pub fn shorthand(&self) -> &'static str {
match *self {
OutputType::Assembly => "asm",
OutputType::Bitcode => "llvm-bc",
OutputType::DepInfo => "dep-info",
OutputType::Exe => "link",
OutputType::LlvmAssembly => "llvm-ir",
OutputType::Metadata => "metadata",
OutputType::Mir => "mir",
OutputType::Object => "obj",
OutputType::ThinLinkBitcode => "thin-link-bitcode",
}
}
fn from_shorthand(shorthand: &str) -> Option<Self> {
match shorthand {
s if s == "asm" => Some(OutputType::Assembly),
s if s == "llvm-bc" => Some(OutputType::Bitcode),
s if s == "dep-info" => Some(OutputType::DepInfo),
s if s == "link" => Some(OutputType::Exe),
s if s == "llvm-ir" => Some(OutputType::LlvmAssembly),
s if s == "metadata" => Some(OutputType::Metadata),
s if s == "mir" => Some(OutputType::Mir),
s if s == "obj" => Some(OutputType::Object),
s if s == "thin-link-bitcode" =>
Some(OutputType::ThinLinkBitcode),
_ => None,
}
}
fn shorthands_display() -> String {
let shorthands =
::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`{0}`", "asm"))
}),
::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`{0}`", "llvm-bc"))
}),
::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`{0}`", "dep-info"))
}),
::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`{0}`", "link"))
}),
::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`{0}`", "llvm-ir"))
}),
::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`{0}`", "metadata"))
}),
::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`{0}`", "mir"))
}),
::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`{0}`", "obj"))
}),
::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`{0}`",
"thin-link-bitcode"))
})]));
shorthands.join(", ")
}
pub fn extension(&self) -> &'static str {
match *self {
OutputType::Assembly => "s",
OutputType::Bitcode => "bc",
OutputType::DepInfo => "d",
OutputType::Exe => "",
OutputType::LlvmAssembly => "ll",
OutputType::Metadata => "rmeta",
OutputType::Mir => "mir",
OutputType::Object => "o",
OutputType::ThinLinkBitcode => "indexing.o",
}
}
pub fn is_text_output(&self) -> bool {
match *self {
OutputType::Assembly => true,
OutputType::Bitcode => false,
OutputType::DepInfo => true,
OutputType::Exe => false,
OutputType::LlvmAssembly => true,
OutputType::Metadata => false,
OutputType::Mir => true,
OutputType::Object => false,
OutputType::ThinLinkBitcode => false,
}
}
pub fn description(&self) -> &'static str {
match *self {
OutputType::Assembly =>
"Generates a file with the crate's assembly code",
OutputType::Bitcode =>
"Generates a binary file containing the LLVM bitcode",
OutputType::DepInfo =>
"Generates a file with Makefile syntax that indicates all the source files that were loaded to generate the crate",
OutputType::Exe =>
"Generates the crates specified by --crate-type. This is the default if --emit is not specified",
OutputType::LlvmAssembly => "Generates a file containing LLVM IR",
OutputType::Metadata =>
"Generates a file containing metadata about the crate",
OutputType::Mir =>
"Generates a file containing rustc's mid-level intermediate representation",
OutputType::Object => "Generates a native object file",
OutputType::ThinLinkBitcode =>
"Generates the ThinLTO summary as bitcode",
}
}
pub fn default_filename(&self) -> &'static str {
match *self {
OutputType::Assembly => "CRATE_NAME.s",
OutputType::Bitcode => "CRATE_NAME.bc",
OutputType::DepInfo => "CRATE_NAME.d",
OutputType::Exe => "(platform and crate-type dependent)",
OutputType::LlvmAssembly => "CRATE_NAME.ll",
OutputType::Metadata => "libCRATE_NAME.rmeta",
OutputType::Mir => "CRATE_NAME.mir",
OutputType::Object => "CRATE_NAME.o",
OutputType::ThinLinkBitcode => "CRATE_NAME.indexing.o",
}
}
}define_output_types! {
780 Assembly => {
781 shorthand: "asm",
782 extension: "s",
783 description: "Generates a file with the crate's assembly code",
784 default_filename: "CRATE_NAME.s",
785 is_text: true,
786 compatible_with_cgus_and_single_output: false
787 },
788 #[doc = "This is the optimized bitcode, which could be either pre-LTO or non-LTO bitcode,"]
789 #[doc = "depending on the specific request type."]
790 Bitcode => {
791 shorthand: "llvm-bc",
792 extension: "bc",
793 description: "Generates a binary file containing the LLVM bitcode",
794 default_filename: "CRATE_NAME.bc",
795 is_text: false,
796 compatible_with_cgus_and_single_output: false
797 },
798 DepInfo => {
799 shorthand: "dep-info",
800 extension: "d",
801 description: "Generates a file with Makefile syntax that indicates all the source files that were loaded to generate the crate",
802 default_filename: "CRATE_NAME.d",
803 is_text: true,
804 compatible_with_cgus_and_single_output: true
805 },
806 Exe => {
807 shorthand: "link",
808 extension: "",
809 description: "Generates the crates specified by --crate-type. This is the default if --emit is not specified",
810 default_filename: "(platform and crate-type dependent)",
811 is_text: false,
812 compatible_with_cgus_and_single_output: true
813 },
814 LlvmAssembly => {
815 shorthand: "llvm-ir",
816 extension: "ll",
817 description: "Generates a file containing LLVM IR",
818 default_filename: "CRATE_NAME.ll",
819 is_text: true,
820 compatible_with_cgus_and_single_output: false
821 },
822 Metadata => {
823 shorthand: "metadata",
824 extension: "rmeta",
825 description: "Generates a file containing metadata about the crate",
826 default_filename: "libCRATE_NAME.rmeta",
827 is_text: false,
828 compatible_with_cgus_and_single_output: true
829 },
830 Mir => {
831 shorthand: "mir",
832 extension: "mir",
833 description: "Generates a file containing rustc's mid-level intermediate representation",
834 default_filename: "CRATE_NAME.mir",
835 is_text: true,
836 compatible_with_cgus_and_single_output: false
837 },
838 Object => {
839 shorthand: "obj",
840 extension: "o",
841 description: "Generates a native object file",
842 default_filename: "CRATE_NAME.o",
843 is_text: false,
844 compatible_with_cgus_and_single_output: false
845 },
846 #[doc = "This is the summary or index data part of the ThinLTO bitcode."]
847 ThinLinkBitcode => {
848 shorthand: "thin-link-bitcode",
849 extension: "indexing.o",
850 description: "Generates the ThinLTO summary as bitcode",
851 default_filename: "CRATE_NAME.indexing.o",
852 is_text: false,
853 compatible_with_cgus_and_single_output: false
854 },
855}
856
857#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for ErrorOutputType { }
#[automatically_derived]
impl ::core::clone::Clone for ErrorOutputType {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HumanReadableErrorType>;
let _: ::core::clone::AssertParamIsClone<ColorConfig>;
let _: ::core::clone::AssertParamIsClone<bool>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for ErrorOutputType { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for ErrorOutputType {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::HumanReadable { kind: __self_0, color_config: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"HumanReadable", "kind", __self_0, "color_config",
&__self_1),
Self::Json {
pretty: __self_0,
json_rendered: __self_1,
color_config: __self_2 } =>
::core::fmt::Formatter::debug_struct_field3_finish(f, "Json",
"pretty", __self_0, "json_rendered", __self_1,
"color_config", &__self_2),
}
}
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for ErrorOutputType { }
#[automatically_derived]
impl ::core::cmp::PartialEq for ErrorOutputType {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::HumanReadable { kind: __self_0, color_config: __self_1
}, Self::HumanReadable {
kind: __arg1_0, color_config: __arg1_1 }) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1,
(Self::Json {
pretty: __self_0,
json_rendered: __self_1,
color_config: __self_2 }, Self::Json {
pretty: __arg1_0,
json_rendered: __arg1_1,
color_config: __arg1_2 }) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1 &&
__self_2 == __arg1_2,
_ => unsafe { ::core::intrinsics::unreachable() }
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for ErrorOutputType {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<HumanReadableErrorType>;
let _: ::core::cmp::AssertParamIsEq<ColorConfig>;
let _: ::core::cmp::AssertParamIsEq<bool>;
}
}Eq, #[automatically_derived]
impl ::core::default::Default for ErrorOutputType {
#[inline]
fn default() -> Self {
Self::HumanReadable {
kind: const HumanReadableErrorType {
short: false,
unicode: false,
},
color_config: const ColorConfig::Auto,
}
}
}Default)]
859pub enum ErrorOutputType {
860 #[default]
862 HumanReadable {
863 kind: HumanReadableErrorType = HumanReadableErrorType { short: false, unicode: false },
864 color_config: ColorConfig = ColorConfig::Auto,
865 },
866 Json {
868 pretty: bool,
870 json_rendered: HumanReadableErrorType,
873 color_config: ColorConfig,
874 },
875}
876
877#[derive(#[automatically_derived]
impl ::core::clone::Clone for ResolveDocLinks {
#[inline]
fn clone(&self) -> Self {
match self {
Self::None => ResolveDocLinks::None,
Self::ExportedMetadata => ResolveDocLinks::ExportedMetadata,
Self::Exported => ResolveDocLinks::Exported,
Self::All => ResolveDocLinks::All,
}
}
}Clone, #[automatically_derived]
impl ::core::hash::Hash for ResolveDocLinks {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for ResolveDocLinks {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
ResolveDocLinks::None => "None",
ResolveDocLinks::ExportedMetadata => "ExportedMetadata",
ResolveDocLinks::Exported => "Exported",
ResolveDocLinks::All => "All",
})
}
}Debug)]
878pub enum ResolveDocLinks {
879 None,
881 ExportedMetadata,
883 Exported,
885 All,
887}
888
889#[derive(#[automatically_derived]
impl ::core::clone::Clone for OutputTypes {
#[inline]
fn clone(&self) -> Self {
OutputTypes(::core::clone::Clone::clone(&self.0))
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for OutputTypes {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_tuple_field1_finish(f, "OutputTypes",
&&self.0)
}
}Debug, #[automatically_derived]
impl ::core::hash::Hash for OutputTypes {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.0, state)
}
}Hash, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for OutputTypes
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
OutputTypes(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for OutputTypes {
fn encode(&self, __encoder: &mut __E) {
let OutputTypes(ref __binding_0) = *self;
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for OutputTypes {
fn decode(__decoder: &mut __D) -> Self {
OutputTypes(::rustc_serialize::Decodable::decode(__decoder))
}
}
};Decodable)]
894pub struct OutputTypes(BTreeMap<OutputType, Option<OutFileName>>);
895
896impl OutputTypes {
897 pub fn new(entries: &[(OutputType, Option<OutFileName>)]) -> OutputTypes {
898 OutputTypes(BTreeMap::from_iter(entries.iter().map(|&(k, ref v)| (k, v.clone()))))
899 }
900
901 pub(crate) fn get(&self, key: &OutputType) -> Option<&Option<OutFileName>> {
902 self.0.get(key)
903 }
904
905 pub fn contains_key(&self, key: &OutputType) -> bool {
906 self.0.contains_key(key)
907 }
908
909 pub fn contains_explicit_name(&self, key: &OutputType) -> bool {
911 #[allow(non_exhaustive_omitted_patterns)] match self.0.get(key) {
Some(Some(..)) => true,
_ => false,
}matches!(self.0.get(key), Some(Some(..)))
912 }
913
914 pub fn iter(&self) -> BTreeMapIter<'_, OutputType, Option<OutFileName>> {
915 self.0.iter()
916 }
917
918 pub fn keys(&self) -> BTreeMapKeysIter<'_, OutputType, Option<OutFileName>> {
919 self.0.keys()
920 }
921
922 pub fn values(&self) -> BTreeMapValuesIter<'_, OutputType, Option<OutFileName>> {
923 self.0.values()
924 }
925
926 pub fn len(&self) -> usize {
927 self.0.len()
928 }
929
930 pub fn should_codegen(&self) -> bool {
932 self.0.keys().any(|k| match *k {
933 OutputType::Bitcode
934 | OutputType::ThinLinkBitcode
935 | OutputType::Assembly
936 | OutputType::LlvmAssembly
937 | OutputType::Mir
938 | OutputType::Object
939 | OutputType::Exe => true,
940 OutputType::Metadata | OutputType::DepInfo => false,
941 })
942 }
943
944 pub fn should_link(&self) -> bool {
946 self.0.keys().any(|k| match *k {
947 OutputType::Bitcode
948 | OutputType::ThinLinkBitcode
949 | OutputType::Assembly
950 | OutputType::LlvmAssembly
951 | OutputType::Mir
952 | OutputType::Metadata
953 | OutputType::Object
954 | OutputType::DepInfo => false,
955 OutputType::Exe => true,
956 })
957 }
958}
959
960#[derive(#[automatically_derived]
impl ::core::clone::Clone for Externs {
#[inline]
fn clone(&self) -> Self { Externs(::core::clone::Clone::clone(&self.0)) }
}Clone)]
964pub struct Externs(BTreeMap<String, ExternEntry>);
965
966#[derive(#[automatically_derived]
impl ::core::clone::Clone for ExternEntry {
#[inline]
fn clone(&self) -> Self {
ExternEntry {
location: ::core::clone::Clone::clone(&self.location),
is_private_dep: ::core::clone::Clone::clone(&self.is_private_dep),
add_prelude: ::core::clone::Clone::clone(&self.add_prelude),
nounused_dep: ::core::clone::Clone::clone(&self.nounused_dep),
force: ::core::clone::Clone::clone(&self.force),
}
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for ExternEntry {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field5_finish(f, "ExternEntry",
"location", &self.location, "is_private_dep",
&self.is_private_dep, "add_prelude", &self.add_prelude,
"nounused_dep", &self.nounused_dep, "force", &&self.force)
}
}Debug)]
967pub struct ExternEntry {
968 pub location: ExternLocation,
969 pub is_private_dep: bool,
975 pub add_prelude: bool,
980 pub nounused_dep: bool,
985 pub force: bool,
991}
992
993#[derive(#[automatically_derived]
impl ::core::clone::Clone for ExternLocation {
#[inline]
fn clone(&self) -> Self {
match self {
Self::FoundInLibrarySearchDirectories =>
ExternLocation::FoundInLibrarySearchDirectories,
Self::ExactPaths(__self_0) =>
ExternLocation::ExactPaths(::core::clone::Clone::clone(__self_0)),
}
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for ExternLocation {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::FoundInLibrarySearchDirectories =>
::core::fmt::Formatter::write_str(f,
"FoundInLibrarySearchDirectories"),
Self::ExactPaths(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"ExactPaths", &__self_0),
}
}
}Debug)]
994pub enum ExternLocation {
995 FoundInLibrarySearchDirectories,
999 ExactPaths(BTreeSet<CanonicalizedPath>),
1006}
1007
1008impl Externs {
1009 pub fn new(data: BTreeMap<String, ExternEntry>) -> Externs {
1011 Externs(data)
1012 }
1013
1014 pub fn get(&self, key: &str) -> Option<&ExternEntry> {
1015 self.0.get(key)
1016 }
1017
1018 pub fn iter(&self) -> BTreeMapIter<'_, String, ExternEntry> {
1019 self.0.iter()
1020 }
1021}
1022
1023impl ExternEntry {
1024 fn new(location: ExternLocation) -> ExternEntry {
1025 ExternEntry {
1026 location,
1027 is_private_dep: false,
1028 add_prelude: false,
1029 nounused_dep: false,
1030 force: false,
1031 }
1032 }
1033
1034 pub fn files(&self) -> Option<impl Iterator<Item = &CanonicalizedPath>> {
1035 match &self.location {
1036 ExternLocation::ExactPaths(set) => Some(set.iter()),
1037 _ => None,
1038 }
1039 }
1040}
1041
1042#[derive(#[automatically_derived]
impl ::core::fmt::Debug for NextSolverConfig {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
NextSolverConfig::Coherence => "Coherence",
NextSolverConfig::Globally => "Globally",
})
}
}Debug, #[automatically_derived]
impl ::core::marker::Copy for NextSolverConfig { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for NextSolverConfig { }
#[automatically_derived]
impl ::core::clone::Clone for NextSolverConfig {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::hash::Hash for NextSolverConfig {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for NextSolverConfig { }
#[automatically_derived]
impl ::core::cmp::PartialEq for NextSolverConfig {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for NextSolverConfig { }Eq)]
1044pub enum NextSolverConfig {
1045 Coherence,
1046 Globally,
1047}
1048
1049impl Default for NextSolverConfig {
1052 fn default() -> Self {
1053 if ::core::option::Option::Some("1")option_env!("CFG_DEFAULT_NEXT_SOLVER_GLOBALLY").is_some() {
1054 Self::Globally
1055 } else {
1056 Self::Coherence
1057 }
1058 }
1059}
1060
1061#[derive(#[automatically_derived]
impl ::core::clone::Clone for Input {
#[inline]
fn clone(&self) -> Self {
match self {
Self::File(__self_0) =>
Input::File(::core::clone::Clone::clone(__self_0)),
Self::DocTestStr { file: __self_0, line: __self_1, input: __self_2
} =>
Input::DocTestStr {
file: ::core::clone::Clone::clone(__self_0),
line: ::core::clone::Clone::clone(__self_1),
input: ::core::clone::Clone::clone(__self_2),
},
Self::Str { name: __self_0, input: __self_1 } =>
Input::Str {
name: ::core::clone::Clone::clone(__self_0),
input: ::core::clone::Clone::clone(__self_1),
},
}
}
}Clone)]
1062pub enum Input {
1063 File(PathBuf),
1065 DocTestStr {
1067 file: PathBuf,
1069 line: isize,
1071 input: String,
1073 },
1074 Str {
1076 name: FileName,
1078 input: String,
1080 },
1081}
1082
1083impl Input {
1084 pub fn filestem(&self) -> &str {
1085 if let Input::File(ifile) = self {
1086 if let Some(name) = ifile.file_stem().and_then(OsStr::to_str) {
1089 return name;
1090 }
1091 }
1092 "rust_out"
1093 }
1094
1095 pub fn file_name(&self, session: &Session) -> FileName {
1096 match *self {
1097 Input::File(ref ifile) => FileName::Real(
1098 session
1099 .psess
1100 .source_map()
1101 .path_mapping()
1102 .to_real_filename(session.psess.source_map().working_dir(), ifile.as_path()),
1103 ),
1104 Input::DocTestStr { ref file, line, .. } => FileName::DocTest(
1105 session
1106 .psess
1107 .source_map()
1108 .path_mapping()
1109 .to_real_filename(session.psess.source_map().working_dir(), file.as_path()),
1110 line,
1111 ),
1112 Input::Str { ref name, .. } => name.clone(),
1113 }
1114 }
1115
1116 pub fn opt_path(&self) -> Option<&Path> {
1117 match self {
1118 Input::File(file) => Some(file),
1119 Input::DocTestStr { file, .. } => Some(file),
1120 Input::Str { name, .. } => match name {
1121 FileName::Real(real) => real.local_path(),
1122 FileName::CfgSpec(_) => None,
1123 FileName::Anon(_) => None,
1124 FileName::MacroExpansion(_) => None,
1125 FileName::ProcMacroSourceCode(_) => None,
1126 FileName::CliCrateAttr(_) => None,
1127 FileName::Custom(_) => None,
1128 FileName::DocTest(path, _) => path.local_path(),
1129 FileName::InlineAsm(_) => None,
1130 },
1131 }
1132 }
1133}
1134
1135#[derive(#[automatically_derived]
impl ::core::clone::Clone for OutFileName {
#[inline]
fn clone(&self) -> Self {
match self {
Self::Real(__self_0) =>
OutFileName::Real(::core::clone::Clone::clone(__self_0)),
Self::Stdout => OutFileName::Stdout,
}
}
}Clone, #[automatically_derived]
impl ::core::hash::Hash for OutFileName {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state);
match self {
Self::Real(__self_0) => ::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for OutFileName {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Real(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Real",
&__self_0),
Self::Stdout => ::core::fmt::Formatter::write_str(f, "Stdout"),
}
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for OutFileName
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
OutFileName::Real(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
OutFileName::Stdout => {}
}
}
}
};StableHash, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for OutFileName { }
#[automatically_derived]
impl ::core::cmp::PartialEq for OutFileName {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Real(__self_0), Self::Real(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for OutFileName {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<PathBuf>;
}
}Eq, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for OutFileName {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
OutFileName::Real(ref __binding_0) => { 0usize }
OutFileName::Stdout => { 1usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
OutFileName::Real(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
OutFileName::Stdout => {}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for OutFileName {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => {
OutFileName::Real(::rustc_serialize::Decodable::decode(__decoder))
}
1usize => { OutFileName::Stdout }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `OutFileName`, expected 0..2, actual {0}",
n));
}
}
}
}
};Decodable)]
1136pub enum OutFileName {
1137 Real(PathBuf),
1138 Stdout,
1139}
1140
1141impl OutFileName {
1142 pub fn parent(&self) -> Option<&Path> {
1143 match *self {
1144 OutFileName::Real(ref path) => path.parent(),
1145 OutFileName::Stdout => None,
1146 }
1147 }
1148
1149 pub fn filestem(&self) -> Option<&OsStr> {
1150 match *self {
1151 OutFileName::Real(ref path) => path.file_stem(),
1152 OutFileName::Stdout => Some(OsStr::new("stdout")),
1153 }
1154 }
1155
1156 pub fn is_stdout(&self) -> bool {
1157 match *self {
1158 OutFileName::Real(_) => false,
1159 OutFileName::Stdout => true,
1160 }
1161 }
1162
1163 pub fn is_tty(&self) -> bool {
1164 use std::io::IsTerminal;
1165 match *self {
1166 OutFileName::Real(_) => false,
1167 OutFileName::Stdout => std::io::stdout().is_terminal(),
1168 }
1169 }
1170
1171 pub fn as_path(&self) -> &Path {
1172 match *self {
1173 OutFileName::Real(ref path) => path.as_ref(),
1174 OutFileName::Stdout => Path::new("stdout"),
1175 }
1176 }
1177
1178 pub fn file_for_writing(
1184 &self,
1185 outputs: &OutputFilenames,
1186 flavor: OutputType,
1187 codegen_unit_name: &str,
1188 ) -> PathBuf {
1189 match *self {
1190 OutFileName::Real(ref path) => path.clone(),
1191 OutFileName::Stdout => outputs.temp_path_for_cgu(flavor, codegen_unit_name),
1192 }
1193 }
1194
1195 pub fn overwrite(&self, content: &str, sess: &Session) {
1196 match self {
1197 OutFileName::Stdout => { ::std::io::_print(format_args!("{0}", content)); }print!("{content}"),
1198 OutFileName::Real(path) => {
1199 if let Err(e) = fs::write(path, content) {
1200 sess.dcx().emit_fatal(FileWriteFail { path, err: e.to_string() });
1201 }
1202 }
1203 }
1204 }
1205}
1206
1207#[derive(#[automatically_derived]
impl ::core::clone::Clone for OutputFilenames {
#[inline]
fn clone(&self) -> Self {
OutputFilenames {
out_directory: ::core::clone::Clone::clone(&self.out_directory),
crate_stem: ::core::clone::Clone::clone(&self.crate_stem),
filestem: ::core::clone::Clone::clone(&self.filestem),
single_output_file: ::core::clone::Clone::clone(&self.single_output_file),
temps_directory: ::core::clone::Clone::clone(&self.temps_directory),
invocation_temp: ::core::clone::Clone::clone(&self.invocation_temp),
explicit_dwo_out_directory: ::core::clone::Clone::clone(&self.explicit_dwo_out_directory),
outputs: ::core::clone::Clone::clone(&self.outputs),
}
}
}Clone, #[automatically_derived]
impl ::core::hash::Hash for OutputFilenames {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.out_directory, state);
::core::hash::Hash::hash(&self.crate_stem, state);
::core::hash::Hash::hash(&self.filestem, state);
::core::hash::Hash::hash(&self.single_output_file, state);
::core::hash::Hash::hash(&self.temps_directory, state);
::core::hash::Hash::hash(&self.invocation_temp, state);
::core::hash::Hash::hash(&self.explicit_dwo_out_directory, state);
::core::hash::Hash::hash(&self.outputs, state)
}
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for OutputFilenames {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
&["out_directory", "crate_stem", "filestem", "single_output_file",
"temps_directory", "invocation_temp",
"explicit_dwo_out_directory", "outputs"];
let values: &[&dyn ::core::fmt::Debug] =
&[&self.out_directory, &self.crate_stem, &self.filestem,
&self.single_output_file, &self.temps_directory,
&self.invocation_temp, &self.explicit_dwo_out_directory,
&&self.outputs];
::core::fmt::Formatter::debug_struct_fields_finish(f,
"OutputFilenames", names, values)
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
OutputFilenames {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
OutputFilenames {
out_directory: ref __binding_0,
crate_stem: ref __binding_1,
filestem: ref __binding_2,
single_output_file: ref __binding_3,
temps_directory: ref __binding_4,
invocation_temp: ref __binding_5,
explicit_dwo_out_directory: ref __binding_6,
outputs: ref __binding_7 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
{}
{ __binding_6.stable_hash(__hcx, __hasher); }
{ __binding_7.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for OutputFilenames {
fn encode(&self, __encoder: &mut __E) {
let OutputFilenames {
out_directory: ref __binding_0,
crate_stem: ref __binding_1,
filestem: ref __binding_2,
single_output_file: ref __binding_3,
temps_directory: ref __binding_4,
invocation_temp: ref __binding_5,
explicit_dwo_out_directory: ref __binding_6,
outputs: ref __binding_7 } = *self;
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_2,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_3,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_4,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_5,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_6,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_7,
__encoder);
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for OutputFilenames {
fn decode(__decoder: &mut __D) -> Self {
OutputFilenames {
out_directory: ::rustc_serialize::Decodable::decode(__decoder),
crate_stem: ::rustc_serialize::Decodable::decode(__decoder),
filestem: ::rustc_serialize::Decodable::decode(__decoder),
single_output_file: ::rustc_serialize::Decodable::decode(__decoder),
temps_directory: ::rustc_serialize::Decodable::decode(__decoder),
invocation_temp: ::rustc_serialize::Decodable::decode(__decoder),
explicit_dwo_out_directory: ::rustc_serialize::Decodable::decode(__decoder),
outputs: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};Decodable)]
1208pub struct OutputFilenames {
1209 pub(crate) out_directory: PathBuf,
1210 crate_stem: String,
1212 filestem: String,
1214 pub single_output_file: Option<OutFileName>,
1215 temps_directory: Option<PathBuf>,
1216
1217 #[stable_hash(ignore)]
1225 invocation_temp: Option<String>,
1226
1227 explicit_dwo_out_directory: Option<PathBuf>,
1228 pub outputs: OutputTypes,
1229}
1230
1231pub const RLINK_EXT: &str = "rlink";
1232pub const RUST_CGU_EXT: &str = "rcgu";
1233pub const DWARF_OBJECT_EXT: &str = "dwo";
1234pub const MAX_FILENAME_LENGTH: usize = 143; fn maybe_strip_file_name(mut path: PathBuf) -> PathBuf {
1240 if path.file_name().map_or(0, |name| name.len()) > MAX_FILENAME_LENGTH {
1241 let filename = path.file_name().unwrap().to_string_lossy();
1242 let hash_len = 64 / 4; let hyphen_len = 1; let allowed_suffix = MAX_FILENAME_LENGTH.saturating_sub(hash_len + hyphen_len);
1247
1248 let stripped_bytes = filename.len().saturating_sub(allowed_suffix);
1250
1251 let split_at = filename.ceil_char_boundary(stripped_bytes);
1253
1254 let mut hasher = StableHasher::new();
1255 filename[..split_at].hash(&mut hasher);
1256 let hash = hasher.finish::<Hash64>();
1257
1258 path.set_file_name(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0:x}-{1}", hash,
&filename[split_at..]))
})format!("{:x}-{}", hash, &filename[split_at..]));
1259 }
1260 path
1261}
1262impl OutputFilenames {
1263 pub fn new(
1264 out_directory: PathBuf,
1265 out_crate_name: String,
1266 out_filestem: String,
1267 single_output_file: Option<OutFileName>,
1268 temps_directory: Option<PathBuf>,
1269 invocation_temp: Option<String>,
1270 explicit_dwo_out_directory: Option<PathBuf>,
1271 extra: String,
1272 outputs: OutputTypes,
1273 ) -> Self {
1274 OutputFilenames {
1275 out_directory,
1276 single_output_file,
1277 temps_directory,
1278 invocation_temp,
1279 explicit_dwo_out_directory,
1280 outputs,
1281 crate_stem: ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0}{1}", out_crate_name, extra))
})format!("{out_crate_name}{extra}"),
1282 filestem: ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0}{1}", out_filestem, extra))
})format!("{out_filestem}{extra}"),
1283 }
1284 }
1285
1286 pub fn path(&self, flavor: OutputType) -> OutFileName {
1287 self.outputs
1288 .get(&flavor)
1289 .and_then(|p| p.to_owned())
1290 .or_else(|| self.single_output_file.clone())
1291 .unwrap_or_else(|| OutFileName::Real(self.output_path(flavor)))
1292 }
1293
1294 pub fn interface_path(&self) -> PathBuf {
1295 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/4ebd258257737d5b7635c116fa7d281627a7e937/compiler/rustc_session/src/config.rs:1295",
"rustc_session::config", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/4ebd258257737d5b7635c116fa7d281627a7e937/compiler/rustc_session/src/config.rs"),
::tracing_core::__macro_support::Option::Some(1295u32),
::tracing_core::__macro_support::Option::Some("rustc_session::config"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("using crate_name={0} for interface_path",
self.crate_stem) as &dyn ::tracing::field::Value))])
});
} else { ; }
};debug!("using crate_name={} for interface_path", self.crate_stem);
1296 self.out_directory.join(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("lib{0}.rs", self.crate_stem))
})format!("lib{}.rs", self.crate_stem))
1297 }
1298
1299 fn output_path(&self, flavor: OutputType) -> PathBuf {
1302 let extension = flavor.extension();
1303 match flavor {
1304 OutputType::Metadata => {
1305 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/4ebd258257737d5b7635c116fa7d281627a7e937/compiler/rustc_session/src/config.rs:1305",
"rustc_session::config", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/4ebd258257737d5b7635c116fa7d281627a7e937/compiler/rustc_session/src/config.rs"),
::tracing_core::__macro_support::Option::Some(1305u32),
::tracing_core::__macro_support::Option::Some("rustc_session::config"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("using crate_name={0} for {1}",
self.crate_stem, extension) as
&dyn ::tracing::field::Value))])
});
} else { ; }
};debug!("using crate_name={} for {extension}", self.crate_stem);
1306 self.out_directory.join(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("lib{0}.{1}", self.crate_stem,
extension))
})format!("lib{}.{}", self.crate_stem, extension))
1307 }
1308 _ => self.with_directory_and_extension(&self.out_directory, extension),
1309 }
1310 }
1311
1312 pub fn temp_path_for_cgu(&self, flavor: OutputType, codegen_unit_name: &str) -> PathBuf {
1316 let extension = flavor.extension();
1317 self.temp_path_ext_for_cgu(extension, codegen_unit_name)
1318 }
1319
1320 pub fn temp_path_dwo_for_cgu(&self, codegen_unit_name: &str) -> PathBuf {
1322 let p = self.temp_path_ext_for_cgu(DWARF_OBJECT_EXT, codegen_unit_name);
1323 if let Some(dwo_out) = &self.explicit_dwo_out_directory {
1324 let mut o = dwo_out.clone();
1325 o.push(p.file_name().unwrap());
1326 o
1327 } else {
1328 p
1329 }
1330 }
1331
1332 pub fn temp_path_ext_for_cgu(&self, ext: &str, codegen_unit_name: &str) -> PathBuf {
1335 let mut extension = codegen_unit_name.to_string();
1336
1337 if let Some(rng) = &self.invocation_temp {
1339 extension.push('.');
1340 extension.push_str(rng);
1341 }
1342
1343 if !ext.is_empty() {
1346 extension.push('.');
1347 extension.push_str(RUST_CGU_EXT);
1348 extension.push('.');
1349 extension.push_str(ext);
1350 }
1351
1352 let temps_directory = self.temps_directory.as_ref().unwrap_or(&self.out_directory);
1353 maybe_strip_file_name(self.with_directory_and_extension(temps_directory, &extension))
1354 }
1355
1356 pub fn temp_path_for_diagnostic(&self, ext: &str) -> PathBuf {
1357 let temps_directory = self.temps_directory.as_ref().unwrap_or(&self.out_directory);
1358 self.with_directory_and_extension(temps_directory, &ext)
1359 }
1360
1361 pub fn with_extension(&self, extension: &str) -> PathBuf {
1362 self.with_directory_and_extension(&self.out_directory, extension)
1363 }
1364
1365 pub fn with_directory_and_extension(&self, directory: &Path, extension: &str) -> PathBuf {
1366 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/4ebd258257737d5b7635c116fa7d281627a7e937/compiler/rustc_session/src/config.rs:1366",
"rustc_session::config", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/4ebd258257737d5b7635c116fa7d281627a7e937/compiler/rustc_session/src/config.rs"),
::tracing_core::__macro_support::Option::Some(1366u32),
::tracing_core::__macro_support::Option::Some("rustc_session::config"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("using filestem={0} for {1}",
self.filestem, extension) as
&dyn ::tracing::field::Value))])
});
} else { ; }
};debug!("using filestem={} for {extension}", self.filestem);
1367 let mut path = directory.join(&self.filestem);
1368 path.set_extension(extension);
1369 path
1370 }
1371
1372 pub fn split_dwarf_path(
1375 &self,
1376 split_debuginfo_kind: SplitDebuginfo,
1377 split_dwarf_kind: SplitDwarfKind,
1378 cgu_name: &str,
1379 ) -> Option<PathBuf> {
1380 let obj_out = self.temp_path_for_cgu(OutputType::Object, cgu_name);
1381 let dwo_out = self.temp_path_dwo_for_cgu(cgu_name);
1382 match (split_debuginfo_kind, split_dwarf_kind) {
1383 (SplitDebuginfo::Off, SplitDwarfKind::Single | SplitDwarfKind::Split) => None,
1384 (SplitDebuginfo::Packed | SplitDebuginfo::Unpacked, SplitDwarfKind::Single) => {
1388 Some(obj_out)
1389 }
1390 (SplitDebuginfo::Packed | SplitDebuginfo::Unpacked, SplitDwarfKind::Split) => {
1392 Some(dwo_out)
1393 }
1394 }
1395 }
1396}
1397
1398pub fn parse_remap_path_scope(
1400 early_dcx: &EarlyDiagCtxt,
1401 matches: &getopts::Matches,
1402 unstable_opts: &UnstableOptions,
1403) -> RemapPathScopeComponents {
1404 if let Some(v) = matches.opt_str("remap-path-scope") {
1405 let mut slot = RemapPathScopeComponents::empty();
1406 for s in v.split(',') {
1407 slot |= match s {
1408 "macro" => RemapPathScopeComponents::MACRO,
1409 "diagnostics" => RemapPathScopeComponents::DIAGNOSTICS,
1410 "documentation" => {
1411 if !unstable_opts.unstable_options {
1412 early_dcx.early_fatal("remapping `documentation` path scope requested but `-Zunstable-options` not specified");
1413 }
1414
1415 RemapPathScopeComponents::DOCUMENTATION
1416 },
1417 "debuginfo" => RemapPathScopeComponents::DEBUGINFO,
1418 "coverage" => RemapPathScopeComponents::COVERAGE,
1419 "object" => RemapPathScopeComponents::OBJECT,
1420 "all" => RemapPathScopeComponents::all(),
1421 _ => early_dcx.early_fatal("argument for `--remap-path-scope` must be a comma separated list of scopes: `macro`, `diagnostics`, `documentation`, `debuginfo`, `coverage`, `object`, `all`"),
1422 }
1423 }
1424 slot
1425 } else {
1426 RemapPathScopeComponents::all()
1427 }
1428}
1429
1430#[derive(#[automatically_derived]
impl ::core::clone::Clone for Sysroot {
#[inline]
fn clone(&self) -> Self {
Sysroot {
explicit: ::core::clone::Clone::clone(&self.explicit),
default: ::core::clone::Clone::clone(&self.default),
}
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for Sysroot {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f, "Sysroot",
"explicit", &self.explicit, "default", &&self.default)
}
}Debug)]
1431pub struct Sysroot {
1432 pub explicit: Option<PathBuf>,
1433 pub default: PathBuf,
1434}
1435
1436impl Sysroot {
1437 pub fn new(explicit: Option<PathBuf>) -> Sysroot {
1438 Sysroot { explicit, default: filesearch::default_sysroot() }
1439 }
1440
1441 pub fn path(&self) -> &Path {
1443 self.explicit.as_deref().unwrap_or(&self.default)
1444 }
1445
1446 pub fn all_paths(&self) -> impl Iterator<Item = &Path> {
1448 self.explicit.as_deref().into_iter().chain(iter::once(&*self.default))
1449 }
1450}
1451
1452pub fn host_tuple() -> &'static str {
1457 (::core::option::Option::Some("x86_64-unknown-linux-gnu")option_env!("CFG_COMPILER_HOST_TRIPLE")).expect("CFG_COMPILER_HOST_TRIPLE")
1461}
1462
1463fn file_path_mapping(
1464 remap_path_prefix: Vec<(PathBuf, PathBuf)>,
1465 remap_cwd_prefix: Option<&Path>,
1466 remap_path_scope: RemapPathScopeComponents,
1467) -> FilePathMapping {
1468 let cwd_remap = if let Some(to) = remap_cwd_prefix
1471 && let Ok(cwd) = std::env::current_dir()
1472 {
1473 Some((cwd, to.to_path_buf()))
1474 } else {
1475 None
1476 };
1477 FilePathMapping::new(remap_path_prefix.into_iter().chain(cwd_remap).collect(), remap_path_scope)
1480}
1481
1482impl Default for Options {
1483 fn default() -> Options {
1484 let unstable_opts = UnstableOptions::default();
1485
1486 let working_dir = {
1490 let working_dir = std::env::current_dir().unwrap();
1491 let file_mapping =
1492 file_path_mapping(Vec::new(), None, RemapPathScopeComponents::empty());
1493 file_mapping.to_real_filename(&RealFileName::empty(), &working_dir)
1494 };
1495
1496 Options {
1497 crate_types: Vec::new(),
1498 optimize: OptLevel::No,
1499 debuginfo: DebugInfo::None,
1500 lint_opts: Vec::new(),
1501 lint_cap: None,
1502 describe_lints: false,
1503 output_types: OutputTypes(BTreeMap::new()),
1504 search_paths: ::alloc::vec::Vec::new()vec![],
1505 sysroot: Sysroot::new(None),
1506 target_triple: TargetTuple::from_tuple(host_tuple()),
1507 test: false,
1508 incremental: None,
1509 unstable_opts,
1510 prints: Vec::new(),
1511 cg: Default::default(),
1512 error_format: ErrorOutputType::default(),
1513 diagnostic_width: None,
1514 externs: Externs(BTreeMap::new()),
1515 crate_name: None,
1516 libs: Vec::new(),
1517 unstable_features: UnstableFeatures::Disallow,
1518 debug_assertions: true,
1519 actually_rustdoc: false,
1520 resolve_doc_links: ResolveDocLinks::None,
1521 trimmed_def_paths: false,
1522 cli_forced_codegen_units: None,
1523 cli_forced_local_thinlto_off: false,
1524 remap_path_prefix: Vec::new(),
1525 remap_path_scope: RemapPathScopeComponents::all(),
1526 real_rust_source_base_dir: None,
1527 real_rustc_dev_source_base_dir: None,
1528 edition: DEFAULT_EDITION,
1529 json_artifact_notifications: false,
1530 json_timings: false,
1531 json_unused_externs: JsonUnusedExterns::No,
1532 json_future_incompat: false,
1533 pretty: None,
1534 working_dir,
1535 color: ColorConfig::Auto,
1536 verbose: false,
1537 target_modifiers: BTreeMap::default(),
1538 mitigation_coverage_map: Default::default(),
1539 jobs: Jobs { frontend: None, backend: None, linker: LinkerJobs::Default },
1540 recommended_stack_size: DEFAULT_STACK_SIZE,
1541 }
1542 }
1543}
1544
1545impl Options {
1546 pub fn build_dep_graph(&self) -> bool {
1548 self.incremental.is_some()
1549 || self.unstable_opts.dump_dep_graph
1550 || self.unstable_opts.query_dep_graph
1551 }
1552
1553 pub fn file_path_mapping(&self) -> FilePathMapping {
1554 file_path_mapping(
1555 self.remap_path_prefix.clone(),
1556 self.unstable_opts.remap_cwd_prefix.as_deref(),
1557 self.remap_path_scope,
1558 )
1559 }
1560
1561 pub fn will_create_output_file(&self) -> bool {
1563 !self.unstable_opts.parse_crate_root_only && self.unstable_opts.ls.is_empty() }
1566
1567 #[inline]
1568 pub fn share_generics(&self) -> bool {
1569 match self.unstable_opts.share_generics {
1570 Some(setting) => setting,
1571 None => match self.optimize {
1572 OptLevel::No | OptLevel::Less | OptLevel::Size | OptLevel::SizeMin => true,
1573 OptLevel::More | OptLevel::Aggressive => false,
1574 },
1575 }
1576 }
1577
1578 pub fn get_symbol_mangling_version(&self) -> SymbolManglingVersion {
1579 self.cg.symbol_mangling_version.unwrap_or(SymbolManglingVersion::V0)
1580 }
1581
1582 #[inline]
1583 pub fn autodiff_enabled(&self) -> bool {
1584 self.unstable_opts.autodiff.contains(&AutoDiff::Enable)
1585 }
1586}
1587
1588impl UnstableOptions {
1589 pub fn dcx_flags(&self, can_emit_warnings: bool) -> DiagCtxtFlags {
1590 DiagCtxtFlags {
1591 can_emit_warnings,
1592 treat_err_as_bug: self.treat_err_as_bug,
1593 eagerly_emit_delayed_bugs: self.eagerly_emit_delayed_bugs,
1594 macro_backtrace: self.macro_backtrace,
1595 deduplicate_diagnostics: self.deduplicate_diagnostics,
1596 track_diagnostics: self.track_diagnostics,
1597 }
1598 }
1599
1600 pub fn src_hash_algorithm(&self, target: &Target) -> SourceFileHashAlgorithm {
1601 self.src_hash_algorithm.unwrap_or_else(|| {
1602 if target.is_like_msvc {
1603 SourceFileHashAlgorithm::Sha256
1604 } else {
1605 SourceFileHashAlgorithm::Md5
1606 }
1607 })
1608 }
1609
1610 pub fn checksum_hash_algorithm(&self) -> Option<SourceFileHashAlgorithm> {
1611 self.checksum_hash_algorithm
1612 }
1613}
1614
1615#[derive(#[automatically_derived]
impl ::core::marker::Copy for EntryFnType { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for EntryFnType { }
#[automatically_derived]
impl ::core::clone::Clone for EntryFnType {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<u8>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for EntryFnType { }
#[automatically_derived]
impl ::core::cmp::PartialEq for EntryFnType {
#[inline]
fn eq(&self, other: &Self) -> bool {
match (self, other) {
(Self::Main { sigpipe: __self_0 }, Self::Main { sigpipe: __arg1_0
}) => __self_0 == __arg1_0,
}
}
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for EntryFnType {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
match self {
Self::Main { sigpipe: __self_0 } =>
::core::hash::Hash::hash(__self_0, state),
}
}
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for EntryFnType {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Main { sigpipe: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Main",
"sigpipe", &__self_0),
}
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for EntryFnType
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
EntryFnType::Main { sigpipe: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1617pub enum EntryFnType {
1618 Main {
1619 sigpipe: u8,
1626 },
1627}
1628
1629#[derive(#[automatically_derived]
impl ::core::clone::Clone for Passes {
#[inline]
fn clone(&self) -> Self {
match self {
Self::Some(__self_0) =>
Passes::Some(::core::clone::Clone::clone(__self_0)),
Self::All => Passes::All,
}
}
}Clone, #[automatically_derived]
impl ::core::hash::Hash for Passes {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state);
match self {
Self::Some(__self_0) => ::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for Passes {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Some(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Some",
&__self_0),
Self::All => ::core::fmt::Formatter::write_str(f, "All"),
}
}
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for Passes { }
#[automatically_derived]
impl ::core::cmp::PartialEq for Passes {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Some(__self_0), Self::Some(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for Passes {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<Vec<String>>;
}
}Eq, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for Passes {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
Passes::Some(ref __binding_0) => { 0usize }
Passes::All => { 1usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
Passes::Some(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
Passes::All => {}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for Passes {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => {
Passes::Some(::rustc_serialize::Decodable::decode(__decoder))
}
1usize => { Passes::All }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `Passes`, expected 0..2, actual {0}",
n));
}
}
}
}
};Decodable)]
1630pub enum Passes {
1631 Some(Vec<String>),
1632 All,
1633}
1634
1635impl Passes {
1636 fn is_empty(&self) -> bool {
1637 match *self {
1638 Passes::Some(ref v) => v.is_empty(),
1639 Passes::All => false,
1640 }
1641 }
1642
1643 pub(crate) fn extend(&mut self, passes: impl IntoIterator<Item = String>) {
1644 match *self {
1645 Passes::Some(ref mut v) => v.extend(passes),
1646 Passes::All => {}
1647 }
1648 }
1649}
1650
1651#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for PAuthKey { }
#[automatically_derived]
impl ::core::clone::Clone for PAuthKey {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for PAuthKey { }Copy, #[automatically_derived]
impl ::core::hash::Hash for PAuthKey {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for PAuthKey {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self { PAuthKey::A => "A", PAuthKey::B => "B", })
}
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for PAuthKey { }
#[automatically_derived]
impl ::core::cmp::PartialEq for PAuthKey {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq)]
1652pub enum PAuthKey {
1653 A,
1654 B,
1655}
1656
1657#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for PacRet { }
#[automatically_derived]
impl ::core::clone::Clone for PacRet {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<bool>;
let _: ::core::clone::AssertParamIsClone<PAuthKey>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for PacRet { }Copy, #[automatically_derived]
impl ::core::hash::Hash for PacRet {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.leaf, state);
::core::hash::Hash::hash(&self.pc, state);
::core::hash::Hash::hash(&self.key, state)
}
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for PacRet {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f, "PacRet",
"leaf", &self.leaf, "pc", &self.pc, "key", &&self.key)
}
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for PacRet { }
#[automatically_derived]
impl ::core::cmp::PartialEq for PacRet {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.leaf == other.leaf && self.pc == other.pc &&
self.key == other.key
}
}PartialEq)]
1658pub struct PacRet {
1659 pub leaf: bool,
1660 pub pc: bool,
1661 pub key: PAuthKey,
1662}
1663
1664#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for BranchProtection { }
#[automatically_derived]
impl ::core::clone::Clone for BranchProtection {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<bool>;
let _: ::core::clone::AssertParamIsClone<Option<PacRet>>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for BranchProtection { }Copy, #[automatically_derived]
impl ::core::hash::Hash for BranchProtection {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.bti, state);
::core::hash::Hash::hash(&self.pac_ret, state);
::core::hash::Hash::hash(&self.gcs, state)
}
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for BranchProtection {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f,
"BranchProtection", "bti", &self.bti, "pac_ret", &self.pac_ret,
"gcs", &&self.gcs)
}
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for BranchProtection { }
#[automatically_derived]
impl ::core::cmp::PartialEq for BranchProtection {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.bti == other.bti && self.gcs == other.gcs &&
self.pac_ret == other.pac_ret
}
}PartialEq, #[automatically_derived]
impl ::core::default::Default for BranchProtection {
#[inline]
fn default() -> Self {
BranchProtection {
bti: ::core::default::Default::default(),
pac_ret: ::core::default::Default::default(),
gcs: ::core::default::Default::default(),
}
}
}Default)]
1665pub struct BranchProtection {
1666 pub bti: bool,
1667 pub pac_ret: Option<PacRet>,
1668 pub gcs: bool,
1669}
1670
1671#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for PointerAuthOption { }
#[automatically_derived]
impl ::core::clone::Clone for PointerAuthOption {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for PointerAuthOption { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for PointerAuthOption {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
PointerAuthOption::Aarch64JumpTableHardening =>
"Aarch64JumpTableHardening",
PointerAuthOption::AuthTraps => "AuthTraps",
PointerAuthOption::Calls => "Calls",
PointerAuthOption::ElfGot => "ElfGot",
PointerAuthOption::FunctionPointerTypeDiscrimination =>
"FunctionPointerTypeDiscrimination",
PointerAuthOption::IndirectGotos => "IndirectGotos",
PointerAuthOption::InitFini => "InitFini",
PointerAuthOption::InitFiniAddressDiscrimination =>
"InitFiniAddressDiscrimination",
PointerAuthOption::Intrinsics => "Intrinsics",
PointerAuthOption::ReturnAddresses => "ReturnAddresses",
PointerAuthOption::TypeInfoVTPtrDisc => "TypeInfoVTPtrDisc",
PointerAuthOption::VTPtrAddrDisc => "VTPtrAddrDisc",
PointerAuthOption::VTPtrTypeDisc => "VTPtrTypeDisc",
})
}
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for PointerAuthOption { }Eq, #[automatically_derived]
impl ::core::hash::Hash for PointerAuthOption {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash, #[automatically_derived]
impl ::core::cmp::Ord for PointerAuthOption {
#[inline]
fn cmp(&self, other: &Self) -> ::core::cmp::Ordering {
::core::cmp::Ord::cmp(&::core::intrinsics::discriminant_value(self),
&::core::intrinsics::discriminant_value(other))
}
}Ord, #[automatically_derived]
impl ::core::cmp::PartialOrd for PointerAuthOption {
#[inline]
fn partial_cmp(&self, other: &Self)
-> ::core::option::Option<::core::cmp::Ordering> {
::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
}
}PartialOrd, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for PointerAuthOption { }
#[automatically_derived]
impl ::core::cmp::PartialEq for PointerAuthOption {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq)]
1672pub enum PointerAuthOption {
1673 Aarch64JumpTableHardening,
1678 AuthTraps,
1679 Calls,
1680 ElfGot,
1681 FunctionPointerTypeDiscrimination,
1682 IndirectGotos,
1683 InitFini,
1684 InitFiniAddressDiscrimination,
1685 Intrinsics,
1686 ReturnAddresses,
1687 TypeInfoVTPtrDisc,
1688 VTPtrAddrDisc,
1689 VTPtrTypeDisc,
1690 }
1692impl PointerAuthOption {
1693 pub fn parse(s: &str) -> Option<Self> {
1694 match s {
1695 "aarch64-jump-table-hardening" => Some(Self::Aarch64JumpTableHardening),
1696 "auth-traps" => Some(Self::AuthTraps),
1697 "calls" => Some(Self::Calls),
1698 "elf-got" => Some(Self::ElfGot),
1699 "function-pointer-type-discrimination" => Some(Self::FunctionPointerTypeDiscrimination),
1700 "indirect-gotos" => Some(Self::IndirectGotos),
1701 "init-fini" => Some(Self::InitFini),
1702 "init-fini-address-discrimination" => Some(Self::InitFiniAddressDiscrimination),
1703 "intrinsics" => Some(Self::Intrinsics),
1704 "return-addresses" => Some(Self::ReturnAddresses),
1705 "typeinfo-vt-ptr-discrimination" => Some(Self::TypeInfoVTPtrDisc),
1706 "vt-ptr-addr-discrimination" => Some(Self::VTPtrAddrDisc),
1707 "vt-ptr-type-discrimination" => Some(Self::VTPtrTypeDisc),
1708 _ => None,
1709 }
1710 }
1711}
1712
1713#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for LinkerJobs { }
#[automatically_derived]
impl ::core::clone::Clone for LinkerJobs {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<NonZero<usize>>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for LinkerJobs { }Copy)]
1714pub enum LinkerJobs {
1715 Default,
1717 Explicit(NonZero<usize>),
1719}
1720
1721impl LinkerJobs {
1722 pub fn limit(self) -> Option<NonZero<usize>> {
1723 match self {
1724 LinkerJobs::Default => None,
1725 LinkerJobs::Explicit(n) => Some(n),
1726 }
1727 }
1728}
1729
1730#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for Jobs { }
#[automatically_derived]
impl ::core::clone::Clone for Jobs {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Option<NonZero<usize>>>;
let _: ::core::clone::AssertParamIsClone<Option<NonZero<usize>>>;
let _: ::core::clone::AssertParamIsClone<LinkerJobs>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for Jobs { }Copy)]
1733pub struct Jobs {
1734 pub frontend: Option<NonZero<usize>>,
1735 pub backend: Option<NonZero<usize>>,
1736 pub linker: LinkerJobs,
1737}
1738
1739fn parse_jobs_all(
1740 early_dcx: &EarlyDiagCtxt,
1741 matches: &getopts::Matches,
1742 zthreads: Option<&str>,
1743 zno_parallel_backend: bool,
1744 unstable: bool,
1745) -> Jobs {
1746 if zno_parallel_backend {
1747 early_dcx.early_fatal("`-Zno-parallel-backend` is removed, use `--jobs-backend=1` instead");
1748 }
1749 let mut available = None;
1750 let jobs = matches
1751 .opt_str("jobs")
1752 .map(|s| parse_jobs_one(early_dcx, "--jobs", &s, unstable, &mut available));
1753 let check_upper_limit = |value: Option<_>, opt_name| {
1754 if let Some(jobs) = jobs
1755 && value.or(NonZero::new(1)) > jobs.or(NonZero::new(1))
1756 {
1757 early_dcx.early_fatal(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`{0}` cannot be larger than `--jobs`",
opt_name))
})format!("`{opt_name}` cannot be larger than `--jobs`"));
1758 }
1759 };
1760 let frontend = match matches.opt_str("jobs-frontend") {
1761 Some(jobs_frontend) => {
1762 let opt_name = "--jobs-frontend";
1763 let frontend =
1764 parse_jobs_one(early_dcx, opt_name, &jobs_frontend, unstable, &mut available);
1765 check_upper_limit(frontend, opt_name);
1766 if zthreads.is_some() {
1767 early_dcx.early_fatal("cannot use both `--jobs-frontend` and `-Zthreads`");
1768 }
1769 frontend
1770 }
1771 None => match zthreads {
1772 Some(zthreads) => {
1773 let opt_name = "-Zthreads";
1774 let frontend =
1775 parse_jobs_one(early_dcx, opt_name, zthreads, unstable, &mut available);
1776 check_upper_limit(frontend, opt_name);
1777 frontend
1778 }
1779 None => None, },
1781 };
1782 let backend = match matches.opt_str("jobs-backend") {
1783 Some(jobs_backend) => {
1784 let opt_name = "--jobs-backend";
1785 let backend =
1786 parse_jobs_one(early_dcx, opt_name, &jobs_backend, unstable, &mut available);
1787 check_upper_limit(backend, opt_name);
1788 backend
1789 }
1790 None => match jobs {
1791 Some(n) => n,
1792 None => parse_jobs_one(early_dcx, "", "0", unstable, &mut available),
1794 },
1795 };
1796 let linker = match matches.opt_str("jobs-linker") {
1797 Some(jobs_linker) => {
1798 let opt_name = "--jobs-linker";
1799 let linker =
1800 parse_jobs_one(early_dcx, opt_name, &jobs_linker, unstable, &mut available);
1801 check_upper_limit(linker, opt_name);
1802 LinkerJobs::Explicit(linker.or(NonZero::new(1)).unwrap())
1803 }
1804 None => match jobs {
1805 Some(n) => LinkerJobs::Explicit(n.or(NonZero::new(1)).unwrap()),
1806 None => LinkerJobs::Default, },
1808 };
1809
1810 Jobs { frontend, backend, linker }
1811}
1812
1813fn parse_jobs_one(
1815 early_dcx: &EarlyDiagCtxt,
1816 opt_name: &str,
1817 s: &str,
1818 unstable: bool,
1819 available: &mut Option<u8>,
1820) -> Option<NonZero<usize>> {
1821 if s == "sync" {
1822 if !unstable {
1824 early_dcx.early_fatal(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`{0}=sync` requires `-Z unstable-options`",
opt_name))
})format!("`{opt_name}=sync` requires `-Z unstable-options`"));
1825 }
1826 return NonZero::new(1);
1827 }
1828 let n = match u8::from_str(s) {
1832 Ok(0) => *available.get_or_insert_with(|| match thread::available_parallelism() {
1833 Ok(n) => u8::try_from(n.get()).unwrap_or(u8::MAX),
1834 Err(_) => 1,
1835 }),
1836 Ok(n) => n,
1837 Err(_) => early_dcx
1838 .early_fatal(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`{0}`: expected a number from 0 to 255 or `sync`",
opt_name))
})format!("`{opt_name}`: expected a number from 0 to 255 or `sync`")),
1839 };
1840 (n > 1).then_some(NonZero::new(usize::from(n)).unwrap())
1842}
1843
1844pub fn build_configuration(sess: &Session, mut user_cfg: Cfg) -> Cfg {
1845 cfg::disallow_cfgs(sess, &user_cfg);
1847
1848 user_cfg.extend(cfg::default_configuration(sess));
1851 user_cfg
1852}
1853
1854pub fn build_target_config(
1855 early_dcx: &EarlyDiagCtxt,
1856 target: &TargetTuple,
1857 sysroot: &Path,
1858 unstable_options: bool,
1859) -> Target {
1860 match Target::search(target, sysroot, unstable_options) {
1861 Ok((target, warnings)) => {
1862 for warning in warnings.warning_messages() {
1863 early_dcx.early_warn(warning)
1864 }
1865
1866 if !#[allow(non_exhaustive_omitted_patterns)] match target.pointer_width {
16 | 32 | 64 => true,
_ => false,
}matches!(target.pointer_width, 16 | 32 | 64) {
1867 early_dcx.early_fatal(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("target specification was invalid: unrecognized target-pointer-width {0}",
target.pointer_width))
})format!(
1868 "target specification was invalid: unrecognized target-pointer-width {}",
1869 target.pointer_width
1870 ))
1871 }
1872 target
1873 }
1874 Err(e) => {
1875 let mut err =
1876 early_dcx.early_struct_fatal(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("error loading target specification: {0}",
e))
})format!("error loading target specification: {e}"));
1877 err.help("run `rustc --print target-list` for a list of built-in targets");
1878 let typed = target.tuple();
1879 let limit = typed.len() / 3 + 1;
1880 if let Some(suggestion) = rustc_target::spec::TARGETS
1881 .iter()
1882 .filter_map(|&t| {
1883 rustc_span::edit_distance::edit_distance_with_substrings(typed, t, limit)
1884 .map(|d| (d, t))
1885 })
1886 .min_by_key(|(d, _)| *d)
1887 .map(|(_, t)| t)
1888 {
1889 err.help(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("did you mean `{0}`?", suggestion))
})format!("did you mean `{suggestion}`?"));
1890 }
1891 err.emit_fatal()
1892 }
1893 }
1894}
1895
1896#[derive(#[automatically_derived]
impl ::core::marker::Copy for OptionStability { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for OptionStability { }
#[automatically_derived]
impl ::core::clone::Clone for OptionStability {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for OptionStability { }
#[automatically_derived]
impl ::core::cmp::PartialEq for OptionStability {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for OptionStability { }Eq, #[automatically_derived]
impl ::core::fmt::Debug for OptionStability {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
OptionStability::Stable => "Stable",
OptionStability::Unstable => "Unstable",
})
}
}Debug)]
1897pub enum OptionStability {
1898 Stable,
1899 Unstable,
1900}
1901
1902#[derive(#[automatically_derived]
impl ::core::marker::Copy for OptionKind { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for OptionKind { }
#[automatically_derived]
impl ::core::clone::Clone for OptionKind {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for OptionKind { }
#[automatically_derived]
impl ::core::cmp::PartialEq for OptionKind {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for OptionKind { }Eq, #[automatically_derived]
impl ::core::fmt::Debug for OptionKind {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
OptionKind::Opt => "Opt",
OptionKind::Multi => "Multi",
OptionKind::Flag => "Flag",
OptionKind::FlagMulti => "FlagMulti",
})
}
}Debug)]
1903pub enum OptionKind {
1904 Opt,
1908
1909 Multi,
1913
1914 Flag,
1919
1920 FlagMulti,
1925}
1926
1927pub struct RustcOptGroup {
1928 pub name: &'static str,
1936 stability: OptionStability,
1937 kind: OptionKind,
1938
1939 short_name: &'static str,
1940 long_name: &'static str,
1941 desc: &'static str,
1942 value_hint: &'static str,
1943
1944 pub is_verbose_help_only: bool,
1947}
1948
1949impl RustcOptGroup {
1950 pub fn is_stable(&self) -> bool {
1951 self.stability == OptionStability::Stable
1952 }
1953
1954 pub fn apply(&self, options: &mut getopts::Options) {
1955 let &Self { short_name, long_name, desc, value_hint, .. } = self;
1956 match self.kind {
1957 OptionKind::Opt => options.optopt(short_name, long_name, desc, value_hint),
1958 OptionKind::Multi => options.optmulti(short_name, long_name, desc, value_hint),
1959 OptionKind::Flag => options.optflag(short_name, long_name, desc),
1960 OptionKind::FlagMulti => options.optflagmulti(short_name, long_name, desc),
1961 };
1962 }
1963
1964 pub fn long_name(&self) -> &str {
1966 self.long_name
1967 }
1968}
1969
1970pub fn make_opt(
1971 stability: OptionStability,
1972 kind: OptionKind,
1973 short_name: &'static str,
1974 long_name: &'static str,
1975 desc: &'static str,
1976 value_hint: &'static str,
1977) -> RustcOptGroup {
1978 match kind {
1980 OptionKind::Opt | OptionKind::Multi => {}
1981 OptionKind::Flag | OptionKind::FlagMulti => {
match (&value_hint, &"") {
(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!(value_hint, ""),
1982 }
1983 RustcOptGroup {
1984 name: cmp::max_by_key(short_name, long_name, |s| s.len()),
1985 stability,
1986 kind,
1987 short_name,
1988 long_name,
1989 desc,
1990 value_hint,
1991 is_verbose_help_only: false,
1992 }
1993}
1994
1995static EDITION_STRING: LazyLock<String> = LazyLock::new(|| {
1996 ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("Specify which edition of the compiler to use when compiling code. The default is {0} and the latest stable edition is {1}.",
DEFAULT_EDITION, LATEST_STABLE_EDITION))
})format!(
1997 "Specify which edition of the compiler to use when compiling code. \
1998The default is {DEFAULT_EDITION} and the latest stable edition is {LATEST_STABLE_EDITION}."
1999 )
2000});
2001
2002static EMIT_HELP: LazyLock<String> = LazyLock::new(|| {
2003 let mut result =
2004 String::from("Comma separated list of types of output for the compiler to emit.\n");
2005 result.push_str("Each TYPE has the default FILE name:\n");
2006
2007 for output in OutputType::iter_all() {
2008 result.push_str(&::alloc::__export::must_use({
::alloc::fmt::format(format_args!("* {0} - {1}\n",
output.shorthand(), output.default_filename()))
})format!("* {} - {}\n", output.shorthand(), output.default_filename()));
2009 }
2010
2011 result
2012});
2013
2014pub fn rustc_optgroups() -> Vec<RustcOptGroup> {
2024 use OptionKind::{Flag, FlagMulti, Multi, Opt};
2025 use OptionStability::{Stable, Unstable};
2026
2027 use self::make_opt as opt;
2028
2029 let mut options = ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[opt(Stable, Flag, "h", "help", "Display this message", ""),
opt(Stable, Multi, "", "cfg",
"Configure the compilation environment.\n\
SPEC supports the syntax `<NAME>[=\"<VALUE>\"]`.",
"<SPEC>"),
opt(Stable, Multi, "", "check-cfg",
"Provide list of expected cfgs for checking", "<SPEC>"),
opt(Stable, Multi, "L", "",
"Add a directory to the library search path. \
The optional KIND can be one of <dependency|crate|native|framework|all> (default: all).",
"[<KIND>=]<PATH>"),
opt(Stable, Multi, "l", "",
"Link the generated crate(s) to the specified native\n\
library NAME. The optional KIND can be one of\n\
<static|framework|dylib> (default: dylib).\n\
Optional comma separated MODIFIERS\n\
<bundle|verbatim|whole-archive|as-needed>\n\
may be specified each with a prefix of either '+' to\n\
enable or '-' to disable.",
"[<KIND>[:<MODIFIERS>]=]<NAME>[:<RENAME>]"),
make_crate_type_option(),
opt(Stable, Opt, "", "crate-name",
"Specify the name of the crate being built", "<NAME>"),
opt(Stable, Opt, "", "edition", &EDITION_STRING,
EDITION_NAME_LIST),
opt(Stable, Multi, "", "emit", &EMIT_HELP, "<TYPE>[=<FILE>]"),
opt(Stable, Multi, "", "print", &print_request::PRINT_HELP,
"<INFO>[=<FILE>]"),
opt(Stable, FlagMulti, "g", "",
"Equivalent to -C debuginfo=2", ""),
opt(Stable, FlagMulti, "O", "",
"Equivalent to -C opt-level=3", ""),
opt(Stable, Opt, "o", "", "Write output to FILENAME",
"<FILENAME>"),
opt(Stable, Opt, "", "out-dir",
"Write output to compiler-chosen filename in DIR", "<DIR>"),
opt(Stable, Opt, "", "explain",
"Provide a detailed explanation of an error message",
"<OPT>"),
opt(Stable, Flag, "", "test", "Build a test harness", ""),
opt(Stable, Opt, "", "target",
"Target tuple for which the code is compiled", "<TARGET>"),
opt(Stable, Multi, "A", "allow", "Set lint allowed",
"<LINT>"),
opt(Stable, Multi, "W", "warn", "Set lint warnings",
"<LINT>"),
opt(Stable, Multi, "", "force-warn", "Set lint force-warn",
"<LINT>"),
opt(Stable, Multi, "D", "deny", "Set lint denied", "<LINT>"),
opt(Stable, Multi, "F", "forbid", "Set lint forbidden",
"<LINT>"),
opt(Stable, Multi, "", "cap-lints",
"Set the most restrictive lint level. More restrictive lints are capped at this level",
"<LEVEL>"),
opt(Stable, Multi, "C", "codegen", "Set a codegen option",
"<OPT>[=<VALUE>]"),
opt(Stable, Flag, "V", "version",
"Print version info and exit", ""),
opt(Stable, Flag, "v", "verbose", "Use verbose output", "")]))vec![
2030 opt(Stable, Flag, "h", "help", "Display this message", ""),
2031 opt(
2032 Stable,
2033 Multi,
2034 "",
2035 "cfg",
2036 "Configure the compilation environment.\n\
2037 SPEC supports the syntax `<NAME>[=\"<VALUE>\"]`.",
2038 "<SPEC>",
2039 ),
2040 opt(Stable, Multi, "", "check-cfg", "Provide list of expected cfgs for checking", "<SPEC>"),
2041 opt(
2042 Stable,
2043 Multi,
2044 "L",
2045 "",
2046 "Add a directory to the library search path. \
2047 The optional KIND can be one of <dependency|crate|native|framework|all> (default: all).",
2048 "[<KIND>=]<PATH>",
2049 ),
2050 opt(
2051 Stable,
2052 Multi,
2053 "l",
2054 "",
2055 "Link the generated crate(s) to the specified native\n\
2056 library NAME. The optional KIND can be one of\n\
2057 <static|framework|dylib> (default: dylib).\n\
2058 Optional comma separated MODIFIERS\n\
2059 <bundle|verbatim|whole-archive|as-needed>\n\
2060 may be specified each with a prefix of either '+' to\n\
2061 enable or '-' to disable.",
2062 "[<KIND>[:<MODIFIERS>]=]<NAME>[:<RENAME>]",
2063 ),
2064 make_crate_type_option(),
2065 opt(Stable, Opt, "", "crate-name", "Specify the name of the crate being built", "<NAME>"),
2066 opt(Stable, Opt, "", "edition", &EDITION_STRING, EDITION_NAME_LIST),
2067 opt(Stable, Multi, "", "emit", &EMIT_HELP, "<TYPE>[=<FILE>]"),
2068 opt(Stable, Multi, "", "print", &print_request::PRINT_HELP, "<INFO>[=<FILE>]"),
2069 opt(Stable, FlagMulti, "g", "", "Equivalent to -C debuginfo=2", ""),
2070 opt(Stable, FlagMulti, "O", "", "Equivalent to -C opt-level=3", ""),
2071 opt(Stable, Opt, "o", "", "Write output to FILENAME", "<FILENAME>"),
2072 opt(Stable, Opt, "", "out-dir", "Write output to compiler-chosen filename in DIR", "<DIR>"),
2073 opt(
2074 Stable,
2075 Opt,
2076 "",
2077 "explain",
2078 "Provide a detailed explanation of an error message",
2079 "<OPT>",
2080 ),
2081 opt(Stable, Flag, "", "test", "Build a test harness", ""),
2082 opt(Stable, Opt, "", "target", "Target tuple for which the code is compiled", "<TARGET>"),
2083 opt(Stable, Multi, "A", "allow", "Set lint allowed", "<LINT>"),
2084 opt(Stable, Multi, "W", "warn", "Set lint warnings", "<LINT>"),
2085 opt(Stable, Multi, "", "force-warn", "Set lint force-warn", "<LINT>"),
2086 opt(Stable, Multi, "D", "deny", "Set lint denied", "<LINT>"),
2087 opt(Stable, Multi, "F", "forbid", "Set lint forbidden", "<LINT>"),
2088 opt(
2089 Stable,
2090 Multi,
2091 "",
2092 "cap-lints",
2093 "Set the most restrictive lint level. More restrictive lints are capped at this level",
2094 "<LEVEL>",
2095 ),
2096 opt(Stable, Multi, "C", "codegen", "Set a codegen option", "<OPT>[=<VALUE>]"),
2097 opt(Stable, Flag, "V", "version", "Print version info and exit", ""),
2098 opt(Stable, Flag, "v", "verbose", "Use verbose output", ""),
2099 ];
2100
2101 let verbose_only = [
2104 opt(
2105 Stable,
2106 Multi,
2107 "",
2108 "extern",
2109 "Specify where an external rust library is located",
2110 "<NAME>[=<PATH>]",
2111 ),
2112 opt(Stable, Opt, "", "sysroot", "Override the system root", "<PATH>"),
2113 opt(Unstable, Multi, "Z", "", "Set unstable / perma-unstable options", "<FLAG>"),
2114 opt(
2115 Stable,
2116 Opt,
2117 "",
2118 "error-format",
2119 "How errors and other messages are produced",
2120 "<human|json|short>",
2121 ),
2122 opt(Stable, Multi, "", "json", "Configure the JSON output of the compiler", "<CONFIG>"),
2123 opt(
2124 Stable,
2125 Opt,
2126 "",
2127 "color",
2128 "Configure coloring of output:
2129 * auto = colorize, if output goes to a tty (default);
2130 * always = always colorize output;
2131 * never = never colorize output",
2132 "<auto|always|never>",
2133 ),
2134 opt(
2135 Stable,
2136 Opt,
2137 "",
2138 "diagnostic-width",
2139 "Inform rustc of the width of the output so that diagnostics can be truncated to fit",
2140 "<WIDTH>",
2141 ),
2142 opt(
2143 Stable,
2144 Multi,
2145 "",
2146 "remap-path-prefix",
2147 "Remap source names in all output (compiler messages and output files)",
2148 "<FROM>=<TO>",
2149 ),
2150 opt(
2151 Stable,
2152 Opt,
2153 "",
2154 "remap-path-scope",
2155 "Defines which scopes of paths should be remapped by `--remap-path-prefix`",
2156 "<macro,diagnostics,debuginfo,coverage,object,all>",
2157 ),
2158 opt(Unstable, Opt, "j", "jobs", "Limit on the number of used parallel jobs", "<N>"),
2159 opt(
2160 Unstable,
2161 Opt,
2162 "",
2163 "jobs-frontend",
2164 "Limit on the number of parallel jobs used by frontend",
2165 "<N>",
2166 ),
2167 opt(
2168 Unstable,
2169 Opt,
2170 "",
2171 "jobs-backend",
2172 "Limit on the number of parallel jobs used by backend",
2173 "<N>",
2174 ),
2175 opt(
2176 Unstable,
2177 Opt,
2178 "",
2179 "jobs-linker",
2180 "Limit on the number of parallel jobs used by linker",
2181 "<N>",
2182 ),
2183 ];
2184 options.extend(verbose_only.into_iter().map(|mut opt| {
2185 opt.is_verbose_help_only = true;
2186 opt
2187 }));
2188
2189 options
2190}
2191
2192pub fn get_cmd_lint_options(
2193 early_dcx: &EarlyDiagCtxt,
2194 matches: &getopts::Matches,
2195) -> (Vec<(String, lint::Level)>, bool, Option<lint::Level>) {
2196 let mut lint_opts_with_position = ::alloc::vec::Vec::new()vec![];
2197 let mut describe_lints = false;
2198
2199 for level in [lint::Allow, lint::Warn, lint::ForceWarn, lint::Deny, lint::Forbid] {
2200 for (arg_pos, lint_name) in matches.opt_strs_pos(level.as_str()) {
2201 if lint_name == "help" {
2202 describe_lints = true;
2203 } else {
2204 lint_opts_with_position.push((arg_pos, lint_name.replace('-', "_"), level));
2205 }
2206 }
2207 }
2208
2209 lint_opts_with_position.sort_by_key(|x| x.0);
2210 let lint_opts = lint_opts_with_position
2211 .iter()
2212 .cloned()
2213 .map(|(_, lint_name, level)| (lint_name, level))
2214 .collect();
2215
2216 let lint_cap = matches.opt_str("cap-lints").map(|cap| {
2217 lint::Level::from_str(&cap)
2218 .unwrap_or_else(|| early_dcx.early_fatal(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("unknown lint level: `{0}`", cap))
})format!("unknown lint level: `{cap}`")))
2219 });
2220
2221 (lint_opts, describe_lints, lint_cap)
2222}
2223
2224pub fn parse_color(early_dcx: &EarlyDiagCtxt, matches: &getopts::Matches) -> ColorConfig {
2226 match matches.opt_str("color").as_deref() {
2227 Some("auto") => ColorConfig::Auto,
2228 Some("always") => ColorConfig::Always,
2229 Some("never") => ColorConfig::Never,
2230
2231 None => ColorConfig::Auto,
2232
2233 Some(arg) => early_dcx.early_fatal(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("argument for `--color` must be auto, always or never (instead was `{0}`)",
arg))
})format!(
2234 "argument for `--color` must be auto, \
2235 always or never (instead was `{arg}`)"
2236 )),
2237 }
2238}
2239
2240pub struct JsonConfig {
2242 pub json_rendered: HumanReadableErrorType,
2243 pub json_color: ColorConfig,
2244 json_artifact_notifications: bool,
2245 json_timings: bool,
2248 pub json_unused_externs: JsonUnusedExterns,
2249 json_future_incompat: bool,
2250}
2251
2252#[derive(#[automatically_derived]
impl ::core::marker::Copy for JsonUnusedExterns { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for JsonUnusedExterns { }
#[automatically_derived]
impl ::core::clone::Clone for JsonUnusedExterns {
#[inline]
fn clone(&self) -> Self { *self }
}Clone)]
2254pub enum JsonUnusedExterns {
2255 No,
2257 Silent,
2259 Loud,
2261}
2262
2263impl JsonUnusedExterns {
2264 pub fn is_enabled(&self) -> bool {
2265 match self {
2266 JsonUnusedExterns::No => false,
2267 JsonUnusedExterns::Loud | JsonUnusedExterns::Silent => true,
2268 }
2269 }
2270
2271 pub fn is_loud(&self) -> bool {
2272 match self {
2273 JsonUnusedExterns::No | JsonUnusedExterns::Silent => false,
2274 JsonUnusedExterns::Loud => true,
2275 }
2276 }
2277}
2278
2279pub fn parse_json(early_dcx: &EarlyDiagCtxt, matches: &getopts::Matches) -> JsonConfig {
2284 let mut json_rendered = HumanReadableErrorType { short: false, unicode: false };
2285 let mut json_color = ColorConfig::Never;
2286 let mut json_artifact_notifications = false;
2287 let mut json_unused_externs = JsonUnusedExterns::No;
2288 let mut json_future_incompat = false;
2289 let mut json_timings = false;
2290 for option in matches.opt_strs("json") {
2291 if matches.opt_str("color").is_some() {
2295 early_dcx.early_fatal("cannot specify the `--color` option with `--json`");
2296 }
2297
2298 for sub_option in option.split(',') {
2299 match sub_option {
2300 "diagnostic-short" => {
2301 json_rendered = HumanReadableErrorType { short: true, unicode: false };
2302 }
2303 "diagnostic-unicode" => {
2304 json_rendered = HumanReadableErrorType { short: false, unicode: true };
2305 }
2306 "diagnostic-rendered-ansi" => json_color = ColorConfig::Always,
2307 "artifacts" => json_artifact_notifications = true,
2308 "timings" => json_timings = true,
2309 "unused-externs" => json_unused_externs = JsonUnusedExterns::Loud,
2310 "unused-externs-silent" => json_unused_externs = JsonUnusedExterns::Silent,
2311 "future-incompat" => json_future_incompat = true,
2312 s => early_dcx.early_fatal(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("unknown `--json` option `{0}`", s))
})format!("unknown `--json` option `{s}`")),
2313 }
2314 }
2315 }
2316
2317 JsonConfig {
2318 json_rendered,
2319 json_color,
2320 json_artifact_notifications,
2321 json_timings,
2322 json_unused_externs,
2323 json_future_incompat,
2324 }
2325}
2326
2327pub fn parse_error_format(
2329 early_dcx: &mut EarlyDiagCtxt,
2330 matches: &getopts::Matches,
2331 color_config: ColorConfig,
2332 json_color: ColorConfig,
2333 json_rendered: HumanReadableErrorType,
2334) -> ErrorOutputType {
2335 let default_kind = HumanReadableErrorType { short: false, unicode: false };
2336 let error_format = if matches.opts_present(&["error-format".to_owned()]) {
2341 match matches.opt_str("error-format").as_deref() {
2342 None | Some("human") => {
2343 ErrorOutputType::HumanReadable { color_config, kind: default_kind }
2344 }
2345 Some("json") => {
2346 ErrorOutputType::Json { pretty: false, json_rendered, color_config: json_color }
2347 }
2348 Some("pretty-json") => {
2349 ErrorOutputType::Json { pretty: true, json_rendered, color_config: json_color }
2350 }
2351 Some("short") => ErrorOutputType::HumanReadable {
2352 kind: HumanReadableErrorType { short: true, unicode: false },
2353 color_config,
2354 },
2355 Some("human-unicode") => ErrorOutputType::HumanReadable {
2356 kind: HumanReadableErrorType { short: false, unicode: true },
2357 color_config,
2358 },
2359 Some(arg) => {
2360 early_dcx.set_error_format(ErrorOutputType::HumanReadable {
2361 color_config,
2362 kind: default_kind,
2363 });
2364 early_dcx.early_fatal(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("argument for `--error-format` must be `human`, `human-unicode`, `json`, `pretty-json` or `short` (instead was `{0}`)",
arg))
})format!(
2365 "argument for `--error-format` must be `human`, `human-unicode`, \
2366 `json`, `pretty-json` or `short` (instead was `{arg}`)"
2367 ))
2368 }
2369 }
2370 } else {
2371 ErrorOutputType::HumanReadable { color_config, kind: default_kind }
2372 };
2373
2374 match error_format {
2375 ErrorOutputType::Json { .. } => {}
2376
2377 _ if !matches.opt_strs("json").is_empty() => {
2381 early_dcx.early_fatal("using `--json` requires also using `--error-format=json`");
2382 }
2383
2384 _ => {}
2385 }
2386
2387 error_format
2388}
2389
2390pub fn parse_crate_edition(
2391 early_dcx: &EarlyDiagCtxt,
2392 matches: &getopts::Matches,
2393 has_input: bool,
2394) -> Edition {
2395 let is_nightly = nightly_options::match_is_nightly_build(matches);
2396 let edition_list = if is_nightly { EDITION_NAME_LIST } else { EDITION_NAME_LIST_STABLE };
2397 let edition = match matches.opt_str("edition") {
2398 Some(arg) => Edition::from_str(&arg).unwrap_or_else(|_| {
2399 early_dcx.early_fatal(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("argument for `--edition` must be one of: {0} (instead was `{1}`)",
edition_list, arg))
})format!(
2400 "argument for `--edition` must be one of: {edition_list} (instead was `{arg}`)",
2401 ))
2402 }),
2403 None => {
2404 if has_input {
2405 {
::std::io::_eprint(format_args!("`--edition` is unspecified, defaulting to `{0}` while the latest is `{1}`; it must be one of: {2}\n\n",
DEFAULT_EDITION, LATEST_STABLE_EDITION, edition_list));
};eprintln!(
2406 "`--edition` is unspecified, defaulting to `{DEFAULT_EDITION}` while the \
2407 latest is `{LATEST_STABLE_EDITION}`; it must be one of: {edition_list}\n",
2408 );
2409 }
2410 DEFAULT_EDITION
2411 }
2412 };
2413
2414 if !edition.is_stable() && !nightly_options::is_unstable_enabled(matches) {
2415 let msg = if !is_nightly {
2416 ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("the crate requires edition {0}, but the latest edition supported by this Rust version is {1}",
edition, LATEST_STABLE_EDITION))
})format!(
2417 "the crate requires edition {edition}, but the latest edition supported by this \
2418 Rust version is {LATEST_STABLE_EDITION}"
2419 )
2420 } else {
2421 ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("edition {0} is unstable and only available with -Z unstable-options",
edition))
})format!("edition {edition} is unstable and only available with -Z unstable-options")
2422 };
2423 early_dcx.early_fatal(msg)
2424 }
2425
2426 edition
2427}
2428
2429fn check_error_format_stability(
2430 early_dcx: &EarlyDiagCtxt,
2431 unstable_opts: &UnstableOptions,
2432 is_nightly_build: bool,
2433 format: ErrorOutputType,
2434) {
2435 if unstable_opts.unstable_options || is_nightly_build {
2436 return;
2437 }
2438 let format = match format {
2439 ErrorOutputType::Json { pretty: true, .. } => "pretty-json",
2440 ErrorOutputType::HumanReadable { kind, .. } => match kind {
2441 HumanReadableErrorType { unicode: true, .. } => "human-unicode",
2442 _ => return,
2443 },
2444 _ => return,
2445 };
2446 early_dcx.early_fatal(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`--error-format={0}` is unstable",
format))
})format!("`--error-format={format}` is unstable"))
2447}
2448
2449fn parse_output_types(
2450 early_dcx: &EarlyDiagCtxt,
2451 unstable_opts: &UnstableOptions,
2452 matches: &getopts::Matches,
2453) -> OutputTypes {
2454 let mut output_types = BTreeMap::new();
2455 if !unstable_opts.parse_crate_root_only {
2456 for list in matches.opt_strs("emit") {
2457 for output_type in list.split(',') {
2458 let (shorthand, path) = split_out_file_name(output_type);
2459 let output_type = OutputType::from_shorthand(shorthand).unwrap_or_else(|| {
2460 early_dcx.early_fatal(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("unknown emission type: `{1}` - expected one of: {0}",
OutputType::shorthands_display(), shorthand))
})format!(
2461 "unknown emission type: `{shorthand}` - expected one of: {display}",
2462 display = OutputType::shorthands_display(),
2463 ))
2464 });
2465 if output_type == OutputType::ThinLinkBitcode && !unstable_opts.unstable_options {
2466 early_dcx.early_fatal(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0} requested but -Zunstable-options not specified",
OutputType::ThinLinkBitcode.shorthand()))
})format!(
2467 "{} requested but -Zunstable-options not specified",
2468 OutputType::ThinLinkBitcode.shorthand()
2469 ));
2470 }
2471 output_types.insert(output_type, path);
2472 }
2473 }
2474 };
2475 if output_types.is_empty() {
2476 output_types.insert(OutputType::Exe, None);
2477 }
2478 OutputTypes(output_types)
2479}
2480
2481fn split_out_file_name(arg: &str) -> (&str, Option<OutFileName>) {
2482 match arg.split_once('=') {
2483 None => (arg, None),
2484 Some((kind, "-")) => (kind, Some(OutFileName::Stdout)),
2485 Some((kind, path)) => (kind, Some(OutFileName::Real(PathBuf::from(path)))),
2486 }
2487}
2488
2489fn should_override_cgus_and_disable_thinlto(
2490 early_dcx: &EarlyDiagCtxt,
2491 output_types: &OutputTypes,
2492 matches: &getopts::Matches,
2493 mut codegen_units: Option<usize>,
2494) -> (bool, Option<usize>) {
2495 let mut disable_local_thinlto = false;
2496 let incompatible: Vec<_> = output_types
2499 .0
2500 .iter()
2501 .map(|ot_path| ot_path.0)
2502 .filter(|ot| !ot.is_compatible_with_codegen_units_and_single_output_file())
2503 .map(|ot| ot.shorthand())
2504 .collect();
2505 if !incompatible.is_empty() {
2506 match codegen_units {
2507 Some(n) if n > 1 => {
2508 if matches.opt_present("o") {
2509 for ot in &incompatible {
2510 early_dcx.early_warn(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`--emit={0}` with `-o` incompatible with `-C codegen-units=N` for N > 1",
ot))
})format!(
2511 "`--emit={ot}` with `-o` incompatible with \
2512 `-C codegen-units=N` for N > 1",
2513 ));
2514 }
2515 early_dcx.early_warn("resetting to default -C codegen-units=1");
2516 codegen_units = Some(1);
2517 disable_local_thinlto = true;
2518 }
2519 }
2520 _ => {
2521 codegen_units = Some(1);
2522 disable_local_thinlto = true;
2523 }
2524 }
2525 }
2526
2527 if codegen_units == Some(0) {
2528 early_dcx.early_fatal("value for codegen units must be a positive non-zero integer");
2529 }
2530
2531 (disable_local_thinlto, codegen_units)
2532}
2533
2534pub fn parse_target_triple(early_dcx: &EarlyDiagCtxt, matches: &getopts::Matches) -> TargetTuple {
2535 match matches.opt_str("target") {
2536 Some(target) if target.ends_with(".json") => {
2537 let path = Path::new(&target);
2538 TargetTuple::from_path(path).unwrap_or_else(|_| {
2539 early_dcx.early_fatal(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("target file {0:?} does not exist",
path))
})format!("target file {path:?} does not exist"))
2540 })
2541 }
2542 Some(target) => TargetTuple::TargetTuple(target),
2543 _ => TargetTuple::from_tuple(host_tuple()),
2544 }
2545}
2546
2547fn parse_opt_level(
2548 early_dcx: &EarlyDiagCtxt,
2549 matches: &getopts::Matches,
2550 cg: &CodegenOptions,
2551) -> OptLevel {
2552 let max_o = matches.opt_positions("O").into_iter().max();
2559 let max_c = matches
2560 .opt_strs_pos("C")
2561 .into_iter()
2562 .flat_map(|(i, s)| {
2563 if let Some("opt-level") = s.split('=').next() { Some(i) } else { None }
2565 })
2566 .max();
2567 if max_o > max_c {
2568 OptLevel::Aggressive
2569 } else {
2570 match cg.opt_level.as_ref() {
2571 "0" => OptLevel::No,
2572 "1" => OptLevel::Less,
2573 "2" => OptLevel::More,
2574 "3" => OptLevel::Aggressive,
2575 "s" => OptLevel::Size,
2576 "z" => OptLevel::SizeMin,
2577 arg => {
2578 early_dcx.early_fatal(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("optimization level needs to be between 0-3, s or z (instead was `{0}`)",
arg))
})format!(
2579 "optimization level needs to be \
2580 between 0-3, s or z (instead was `{arg}`)"
2581 ));
2582 }
2583 }
2584 }
2585}
2586
2587fn select_debuginfo(matches: &getopts::Matches, cg: &CodegenOptions) -> DebugInfo {
2588 let max_g = matches.opt_positions("g").into_iter().max();
2589 let max_c = matches
2590 .opt_strs_pos("C")
2591 .into_iter()
2592 .flat_map(|(i, s)| {
2593 if let Some("debuginfo") = s.split('=').next() { Some(i) } else { None }
2595 })
2596 .max();
2597 if max_g > max_c { DebugInfo::Full } else { cg.debuginfo }
2598}
2599
2600pub fn parse_externs(
2601 early_dcx: &EarlyDiagCtxt,
2602 matches: &getopts::Matches,
2603 unstable_opts: &UnstableOptions,
2604) -> Externs {
2605 let is_unstable_enabled = unstable_opts.unstable_options;
2606 let mut externs: BTreeMap<String, ExternEntry> = BTreeMap::new();
2607 for arg in matches.opt_strs("extern") {
2608 let ExternOpt { crate_name: name, path, options } =
2609 split_extern_opt(early_dcx, unstable_opts, &arg).unwrap_or_else(|e| e.emit_fatal());
2610
2611 let entry = externs.entry(name.to_owned());
2612
2613 use std::collections::btree_map::Entry;
2614
2615 let entry = if let Some(path) = path {
2616 let path = CanonicalizedPath::new(path);
2618 match entry {
2619 Entry::Vacant(vacant) => {
2620 let files = BTreeSet::from_iter(iter::once(path));
2621 vacant.insert(ExternEntry::new(ExternLocation::ExactPaths(files)))
2622 }
2623 Entry::Occupied(occupied) => {
2624 let ext_ent = occupied.into_mut();
2625 match ext_ent {
2626 ExternEntry { location: ExternLocation::ExactPaths(files), .. } => {
2627 files.insert(path);
2628 }
2629 ExternEntry {
2630 location: location @ ExternLocation::FoundInLibrarySearchDirectories,
2631 ..
2632 } => {
2633 let files = BTreeSet::from_iter(iter::once(path));
2635 *location = ExternLocation::ExactPaths(files);
2636 }
2637 }
2638 ext_ent
2639 }
2640 }
2641 } else {
2642 match entry {
2644 Entry::Vacant(vacant) => {
2645 vacant.insert(ExternEntry::new(ExternLocation::FoundInLibrarySearchDirectories))
2646 }
2647 Entry::Occupied(occupied) => {
2648 occupied.into_mut()
2650 }
2651 }
2652 };
2653
2654 let mut is_private_dep = false;
2655 let mut add_prelude = true;
2656 let mut nounused_dep = false;
2657 let mut force = false;
2658 if let Some(opts) = options {
2659 if !is_unstable_enabled {
2660 early_dcx.early_fatal(
2661 "the `-Z unstable-options` flag must also be passed to \
2662 enable `--extern` options",
2663 );
2664 }
2665 for opt in opts.split(',') {
2666 match opt {
2667 "priv" => is_private_dep = true,
2668 "noprelude" => {
2669 if let ExternLocation::ExactPaths(_) = &entry.location {
2670 add_prelude = false;
2671 } else {
2672 early_dcx.early_fatal(
2673 "the `noprelude` --extern option requires a file path",
2674 );
2675 }
2676 }
2677 "nounused" => nounused_dep = true,
2678 "force" => force = true,
2679 _ => early_dcx.early_fatal(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("unknown --extern option `{0}`",
opt))
})format!("unknown --extern option `{opt}`")),
2680 }
2681 }
2682 }
2683
2684 entry.is_private_dep |= is_private_dep;
2687 entry.nounused_dep |= nounused_dep;
2689 entry.force |= force;
2691 entry.add_prelude |= add_prelude;
2693 }
2694 Externs(externs)
2695}
2696
2697fn parse_remap_path_prefix(
2698 early_dcx: &EarlyDiagCtxt,
2699 matches: &getopts::Matches,
2700) -> Vec<(PathBuf, PathBuf)> {
2701 matches
2702 .opt_strs("remap-path-prefix")
2703 .into_iter()
2704 .map(|remap| match remap.rsplit_once('=') {
2705 None => {
2706 early_dcx.early_fatal("--remap-path-prefix must contain '=' between FROM and TO")
2707 }
2708 Some((from, to)) => (PathBuf::from(from), PathBuf::from(to)),
2709 })
2710 .collect()
2711}
2712
2713#[allow(rustc::bad_opt_access)]
2715pub fn build_session_options(
2716 early_dcx: &mut EarlyDiagCtxt,
2717 matches: &getopts::Matches,
2718 has_input: bool,
2719) -> Options {
2720 let color = parse_color(early_dcx, matches);
2721
2722 let edition = parse_crate_edition(early_dcx, matches, has_input);
2723
2724 let crate_name = matches.opt_str("crate-name");
2725 let unstable_features = UnstableFeatures::from_environment(crate_name.as_deref());
2726 let JsonConfig {
2727 json_rendered,
2728 json_color,
2729 json_artifact_notifications,
2730 json_timings,
2731 json_unused_externs,
2732 json_future_incompat,
2733 } = parse_json(early_dcx, matches);
2734
2735 let error_format = parse_error_format(early_dcx, matches, color, json_color, json_rendered);
2736
2737 early_dcx.set_error_format(error_format);
2738
2739 let diagnostic_width = matches.opt_get("diagnostic-width").unwrap_or_else(|_| {
2740 early_dcx.early_fatal("`--diagnostic-width` must be an positive integer");
2741 });
2742
2743 let unparsed_crate_types = matches.opt_strs("crate-type");
2744 let crate_types = parse_crate_types_from_list(unparsed_crate_types)
2745 .unwrap_or_else(|e| early_dcx.early_fatal(e));
2746
2747 let mut collected_options = Default::default();
2748
2749 let mut unstable_opts = UnstableOptions::build(early_dcx, matches, &mut collected_options);
2750
2751 if unstable_opts.assumptions_on_binders {
2755 let no_next_solver = matches
2758 .opt_strs("Z")
2759 .iter()
2760 .rfind(|arg| arg.starts_with("next-solver"))
2761 .is_some_and(|arg| *arg == "next-solver=no" || *arg == "next-solver=coherence");
2762 if no_next_solver {
2763 early_dcx.early_warn(
2764 "-Zassumptions-on-binders unconditionally enables the next trait solver; \
2765 `-Znext-solver=no` is ignored",
2766 );
2767 }
2768 unstable_opts.next_solver = NextSolverConfig::Globally;
2769 }
2770
2771 if unstable_opts.staticlib_hide_internal_symbols && !crate_types.contains(&CrateType::StaticLib)
2772 {
2773 early_dcx.early_warn(
2774 "-Zstaticlib-hide-internal-symbols has no effect without `--crate-type staticlib`",
2775 );
2776 }
2777
2778 if unstable_opts.staticlib_rename_internal_symbols
2779 && !crate_types.contains(&CrateType::StaticLib)
2780 {
2781 early_dcx.early_warn(
2782 "-Zstaticlib-rename-internal-symbols has no effect without `--crate-type staticlib`",
2783 );
2784 }
2785
2786 let (lint_opts, describe_lints, lint_cap) = get_cmd_lint_options(early_dcx, matches);
2787
2788 if !unstable_opts.unstable_options && json_timings {
2789 early_dcx.early_fatal("--json=timings is unstable and requires using `-Zunstable-options`");
2790 }
2791
2792 check_error_format_stability(
2793 early_dcx,
2794 &unstable_opts,
2795 unstable_features.is_nightly_build(),
2796 error_format,
2797 );
2798
2799 let output_types = parse_output_types(early_dcx, &unstable_opts, matches);
2800
2801 let mut cg = CodegenOptions::build(early_dcx, matches, &mut collected_options);
2802 let (disable_local_thinlto, codegen_units) = should_override_cgus_and_disable_thinlto(
2803 early_dcx,
2804 &output_types,
2805 matches,
2806 cg.codegen_units,
2807 );
2808
2809 let incremental = cg.incremental.as_ref().map(PathBuf::from);
2810
2811 if cg.profile_generate.enabled() && cg.profile_use.is_some() {
2812 early_dcx.early_fatal("options `-C profile-generate` and `-C profile-use` are exclusive");
2813 }
2814
2815 if cg.profile_sample_use.is_some()
2816 && (cg.profile_generate.enabled() || cg.profile_use.is_some())
2817 {
2818 early_dcx.early_fatal(
2819 "option `-C profile-sample-use` cannot be used with `-C profile-generate` or `-C profile-use`",
2820 );
2821 }
2822
2823 match cg.symbol_mangling_version {
2826 None | Some(SymbolManglingVersion::V0) => {}
2828
2829 Some(SymbolManglingVersion::Legacy) => {
2831 if !unstable_opts.unstable_options {
2832 early_dcx.early_fatal(
2833 "`-C symbol-mangling-version=legacy` requires `-Z unstable-options`",
2834 );
2835 }
2836 }
2837 Some(SymbolManglingVersion::Hashed) => {
2838 if !unstable_opts.unstable_options {
2839 early_dcx.early_fatal(
2840 "`-C symbol-mangling-version=hashed` requires `-Z unstable-options`",
2841 );
2842 }
2843 }
2844 }
2845
2846 if cg.instrument_coverage != InstrumentCoverage::No {
2847 if cg.profile_generate.enabled() || cg.profile_use.is_some() {
2848 early_dcx.early_fatal(
2849 "option `-C instrument-coverage` is not compatible with either `-C profile-use` \
2850 or `-C profile-generate`",
2851 );
2852 }
2853
2854 match cg.symbol_mangling_version {
2859 None => cg.symbol_mangling_version = Some(SymbolManglingVersion::V0),
2860 Some(SymbolManglingVersion::Legacy) => {
2861 early_dcx.early_warn(
2862 "-C instrument-coverage requires symbol mangling version `v0`, \
2863 but `-C symbol-mangling-version=legacy` was specified",
2864 );
2865 }
2866 Some(SymbolManglingVersion::V0) => {}
2867 Some(SymbolManglingVersion::Hashed) => {
2868 early_dcx.early_warn(
2869 "-C instrument-coverage requires symbol mangling version `v0`, \
2870 but `-C symbol-mangling-version=hashed` was specified",
2871 );
2872 }
2873 }
2874 }
2875
2876 if let Ok(graphviz_font) = std::env::var("RUSTC_GRAPHVIZ_FONT") {
2877 unstable_opts.graphviz_font = graphviz_font;
2880 }
2881
2882 if !cg.embed_bitcode {
2883 match cg.lto {
2884 LtoCli::No | LtoCli::Unspecified => {}
2885 LtoCli::Yes | LtoCli::NoParam | LtoCli::Thin | LtoCli::Fat => {
2886 early_dcx.early_fatal("options `-C embed-bitcode=no` and `-C lto` are incompatible")
2887 }
2888 }
2889 }
2890
2891 let unstable_options_enabled = nightly_options::is_unstable_enabled(matches);
2892 if !unstable_options_enabled && cg.force_frame_pointers == FramePointer::NonLeaf {
2893 early_dcx.early_fatal(
2894 "`-Cforce-frame-pointers=non-leaf` or `always` also requires `-Zunstable-options` \
2895 and a nightly compiler",
2896 )
2897 }
2898
2899 if !nightly_options::is_unstable_enabled(matches) && !unstable_opts.offload.is_empty() {
2900 early_dcx.early_fatal(
2901 "`-Zoffload=Enable` also requires `-Zunstable-options` and a nightly compiler",
2902 )
2903 }
2904
2905 let target_triple = parse_target_triple(early_dcx, matches);
2906
2907 if !unstable_options_enabled {
2910 if let Err(error) = cg.link_self_contained.check_unstable_variants(&target_triple) {
2911 early_dcx.early_fatal(error);
2912 }
2913
2914 if let Some(flavor) = cg.linker_flavor {
2915 if flavor.is_unstable() {
2916 early_dcx.early_fatal(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("the linker flavor `{0}` is unstable, the `-Z unstable-options` flag must also be passed to use the unstable values",
flavor.desc()))
})format!(
2917 "the linker flavor `{}` is unstable, the `-Z unstable-options` flag must also \
2918 be passed to use the unstable values",
2919 flavor.desc()
2920 ));
2921 }
2922 }
2923 }
2924
2925 if let Some(erroneous_components) = cg.link_self_contained.check_consistency() {
2928 let names: String = erroneous_components
2929 .into_iter()
2930 .map(|c| c.as_str().unwrap())
2931 .intersperse(", ")
2932 .collect();
2933 early_dcx.early_fatal(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("some `-C link-self-contained` components were both enabled and disabled: {0}",
names))
})format!(
2934 "some `-C link-self-contained` components were both enabled and disabled: {names}"
2935 ));
2936 }
2937
2938 let prints = print_request::collect_print_requests(
2939 early_dcx,
2940 &mut cg,
2941 &unstable_opts,
2942 matches,
2943 PrintCategory::ALL_VARIANTS,
2944 );
2945
2946 if unstable_opts.retpoline_external_thunk {
2948 unstable_opts.retpoline = true;
2949 collected_options.target_modifiers.insert(
2950 OptionsTargetModifiers::UnstableOptions(UnstableOptionsTargetModifiers::Retpoline),
2951 "true".to_string(),
2952 );
2953 }
2954
2955 let cg = cg;
2956
2957 let opt_level = parse_opt_level(early_dcx, matches, &cg);
2958 let debug_assertions = cg.debug_assertions.unwrap_or(opt_level == OptLevel::No);
2962 let debuginfo = select_debuginfo(matches, &cg);
2963
2964 if !unstable_options_enabled {
2965 if let Err(error) = cg.linker_features.check_unstable_variants(&target_triple) {
2966 early_dcx.early_fatal(error);
2967 }
2968 }
2969
2970 if !unstable_options_enabled && cg.panic == Some(PanicStrategy::ImmediateAbort) {
2971 early_dcx.early_fatal(
2972 "`-Cpanic=immediate-abort` requires `-Zunstable-options` and a nightly compiler",
2973 )
2974 }
2975
2976 let libs = parse_native_libs(early_dcx, &unstable_opts, unstable_features, matches);
2978
2979 let test = matches.opt_present("test");
2980
2981 if !cg.remark.is_empty() && debuginfo == DebugInfo::None {
2982 early_dcx.early_warn("-C remark requires \"-C debuginfo=n\" to show source locations");
2983 }
2984
2985 if cg.remark.is_empty() && unstable_opts.remark_dir.is_some() {
2986 early_dcx
2987 .early_warn("using -Z remark-dir without enabling remarks using e.g. -C remark=all");
2988 }
2989
2990 let externs = parse_externs(early_dcx, matches, &unstable_opts);
2991
2992 let remap_path_prefix = parse_remap_path_prefix(early_dcx, matches);
2993 let remap_path_scope = parse_remap_path_scope(early_dcx, matches, &unstable_opts);
2994
2995 let pretty = parse_pretty(early_dcx, &unstable_opts);
2996
2997 if unstable_opts.dump_dep_graph && !unstable_opts.query_dep_graph {
2999 early_dcx.early_fatal("can't dump dependency graph without `-Z query-dep-graph`");
3000 }
3001
3002 let sysroot = Sysroot::new(matches.opt_str("sysroot").map(PathBuf::from));
3003
3004 let real_source_base_dir = |suffix: &str, confirm: &str| {
3005 let mut candidate = sysroot.path().join(suffix);
3006 if let Ok(metadata) = candidate.symlink_metadata() {
3007 if metadata.file_type().is_symlink() {
3011 if let Ok(symlink_dest) = std::fs::read_link(&candidate) {
3012 candidate = symlink_dest;
3013 }
3014 }
3015 }
3016
3017 candidate.join(confirm).is_file().then_some(candidate)
3019 };
3020
3021 let real_rust_source_base_dir =
3022 real_source_base_dir("lib/rustlib/src/rust", "library/std/src/lib.rs");
3024
3025 let real_rustc_dev_source_base_dir =
3026 real_source_base_dir("lib/rustlib/rustc-src/rust", "compiler/rustc/src/main.rs");
3028
3029 let search_paths: Vec<SearchPath> = {
3034 let mut seen_search_paths = FxHashSet::default();
3035 let search_path_matches: Vec<String> = matches.opt_strs("L");
3036 search_path_matches
3037 .iter()
3038 .filter(|p| seen_search_paths.insert(*p))
3039 .map(|path| {
3040 SearchPath::from_cli_opt(
3041 sysroot.path(),
3042 &target_triple,
3043 early_dcx,
3044 &path,
3045 unstable_opts.unstable_options,
3046 )
3047 })
3048 .collect()
3049 };
3050
3051 let working_dir = {
3054 let working_dir = std::env::current_dir().unwrap_or_else(|e| {
3055 early_dcx.early_fatal(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("Current directory is invalid: {0}",
e))
})format!("Current directory is invalid: {e}"));
3056 });
3057
3058 let file_mapping = file_path_mapping(
3059 remap_path_prefix.clone(),
3060 unstable_opts.remap_cwd_prefix.as_deref(),
3061 remap_path_scope,
3062 );
3063 file_mapping.to_real_filename(&RealFileName::empty(), &working_dir)
3064 };
3065
3066 let verbose = matches.opt_present("verbose") || unstable_opts.verbose_internals;
3067
3068 let jobs = parse_jobs_all(
3069 early_dcx,
3070 matches,
3071 unstable_opts.threads.as_deref(),
3072 unstable_opts.no_parallel_backend,
3073 unstable_opts.unstable_options,
3074 );
3075
3076 Options {
3077 crate_types,
3078 optimize: opt_level,
3079 debuginfo,
3080 lint_opts,
3081 lint_cap,
3082 describe_lints,
3083 output_types,
3084 search_paths,
3085 sysroot,
3086 target_triple,
3087 test,
3088 incremental,
3089 unstable_opts,
3090 prints,
3091 cg,
3092 error_format,
3093 diagnostic_width,
3094 externs,
3095 unstable_features,
3096 crate_name,
3097 libs,
3098 debug_assertions,
3099 actually_rustdoc: false,
3100 resolve_doc_links: ResolveDocLinks::ExportedMetadata,
3101 trimmed_def_paths: false,
3102 cli_forced_codegen_units: codegen_units,
3103 cli_forced_local_thinlto_off: disable_local_thinlto,
3104 remap_path_prefix,
3105 remap_path_scope,
3106 real_rust_source_base_dir,
3107 real_rustc_dev_source_base_dir,
3108 edition,
3109 json_artifact_notifications,
3110 json_timings,
3111 json_unused_externs,
3112 json_future_incompat,
3113 pretty,
3114 working_dir,
3115 color,
3116 verbose,
3117 target_modifiers: collected_options.target_modifiers,
3118 mitigation_coverage_map: collected_options.mitigations,
3119 jobs,
3120 recommended_stack_size: DEFAULT_STACK_SIZE,
3121 }
3122}
3123
3124fn parse_pretty(early_dcx: &EarlyDiagCtxt, unstable_opts: &UnstableOptions) -> Option<PpMode> {
3125 use PpMode::*;
3126
3127 let first = match unstable_opts.unpretty.as_deref()? {
3128 "normal" => Source(PpSourceMode::Normal),
3129 "expanded" => Source(PpSourceMode::Expanded),
3130 "expanded,identified" => Source(PpSourceMode::ExpandedIdentified),
3131 "expanded,hygiene" => Source(PpSourceMode::ExpandedHygiene),
3132 "ast-tree" => AstTree,
3133 "ast-tree,expanded" => AstTreeExpanded,
3134 "hir" => Hir(PpHirMode::Normal),
3135 "hir,identified" => Hir(PpHirMode::Identified),
3136 "hir,typed" => Hir(PpHirMode::Typed),
3137 "hir-tree" => HirTree,
3138 "thir-tree" => ThirTree,
3139 "thir-flat" => ThirFlat,
3140 "mir" => Mir,
3141 "stable-mir" => StableMir,
3142 "mir-cfg" => MirCFG,
3143 name => early_dcx.early_fatal(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("argument to `unpretty` must be one of `normal`, `expanded`, `expanded,identified`, `expanded,hygiene`, `ast-tree`, `ast-tree,expanded`, `hir`, `hir,identified`, `hir,typed`, `hir-tree`, `thir-tree`, `thir-flat`, `mir`, `stable-mir`, or `mir-cfg`; got {0}",
name))
})format!(
3144 "argument to `unpretty` must be one of `normal`, \
3145 `expanded`, `expanded,identified`, `expanded,hygiene`, \
3146 `ast-tree`, `ast-tree,expanded`, `hir`, `hir,identified`, \
3147 `hir,typed`, `hir-tree`, `thir-tree`, `thir-flat`, `mir`, `stable-mir`, or \
3148 `mir-cfg`; got {name}"
3149 )),
3150 };
3151 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/4ebd258257737d5b7635c116fa7d281627a7e937/compiler/rustc_session/src/config.rs:3151",
"rustc_session::config", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/4ebd258257737d5b7635c116fa7d281627a7e937/compiler/rustc_session/src/config.rs"),
::tracing_core::__macro_support::Option::Some(3151u32),
::tracing_core::__macro_support::Option::Some("rustc_session::config"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("got unpretty option: {0:?}",
first) as &dyn ::tracing::field::Value))])
});
} else { ; }
};debug!("got unpretty option: {first:?}");
3152 Some(first)
3153}
3154
3155pub fn make_crate_type_option() -> RustcOptGroup {
3156 make_opt(
3157 OptionStability::Stable,
3158 OptionKind::Multi,
3159 "",
3160 "crate-type",
3161 "Comma separated list of types of crates
3162 for the compiler to emit",
3163 "<bin|lib|rlib|dylib|cdylib|staticlib|proc-macro>",
3164 )
3165}
3166
3167pub fn parse_crate_types_from_list(list_list: Vec<String>) -> Result<Vec<CrateType>, String> {
3168 let mut crate_types: Vec<CrateType> = Vec::new();
3169 for unparsed_crate_type in &list_list {
3170 for part in unparsed_crate_type.split(',') {
3171 let new_part = match part {
3172 "lib" => CrateType::default(),
3173 "rlib" => CrateType::Rlib,
3174 "staticlib" => CrateType::StaticLib,
3175 "dylib" => CrateType::Dylib,
3176 "cdylib" => CrateType::Cdylib,
3177 "bin" => CrateType::Executable,
3178 "proc-macro" => CrateType::ProcMacro,
3179 "sdylib" => CrateType::Sdylib,
3180 _ => {
3181 return Err(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("unknown crate type: `{0}`, expected one of: `lib`, `rlib`, `staticlib`, `dylib`, `cdylib`, `bin`, `proc-macro`",
part))
})format!(
3182 "unknown crate type: `{part}`, expected one of: \
3183 `lib`, `rlib`, `staticlib`, `dylib`, `cdylib`, `bin`, `proc-macro`",
3184 ));
3185 }
3186 };
3187 if !crate_types.contains(&new_part) {
3188 crate_types.push(new_part)
3189 }
3190 }
3191 }
3192
3193 Ok(crate_types)
3194}
3195
3196pub mod nightly_options {
3197 use rustc_feature::UnstableFeatures;
3198
3199 use super::{OptionStability, RustcOptGroup};
3200 use crate::EarlyDiagCtxt;
3201
3202 pub fn is_unstable_enabled(matches: &getopts::Matches) -> bool {
3203 match_is_nightly_build(matches)
3204 && matches.opt_strs("Z").iter().any(|x| *x == "unstable-options")
3205 }
3206
3207 pub fn match_is_nightly_build(matches: &getopts::Matches) -> bool {
3208 is_nightly_build(matches.opt_str("crate-name").as_deref())
3209 }
3210
3211 fn is_nightly_build(krate: Option<&str>) -> bool {
3212 UnstableFeatures::from_environment(krate).is_nightly_build()
3213 }
3214
3215 pub fn check_nightly_options(
3216 early_dcx: &EarlyDiagCtxt,
3217 matches: &getopts::Matches,
3218 flags: &[RustcOptGroup],
3219 ) {
3220 let has_z_unstable_option = matches.opt_strs("Z").iter().any(|x| *x == "unstable-options");
3221 let really_allows_unstable_options = match_is_nightly_build(matches);
3222 let mut nightly_options_on_stable = 0;
3223
3224 for opt in flags.iter() {
3225 if opt.stability == OptionStability::Stable {
3226 continue;
3227 }
3228 if !matches.opt_present(opt.name) {
3229 continue;
3230 }
3231 if opt.name != "Z" && !has_z_unstable_option {
3232 early_dcx.early_fatal(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("the `-Z unstable-options` flag must also be passed to enable the flag `{0}`",
opt.name))
})format!(
3233 "the `-Z unstable-options` flag must also be passed to enable \
3234 the flag `{}`",
3235 opt.name
3236 ));
3237 }
3238 if really_allows_unstable_options {
3239 continue;
3240 }
3241
3242 nightly_options_on_stable += 1;
3243 let msg = ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("the option `{0}` is only accepted on the nightly compiler",
opt.name))
})format!("the option `{}` is only accepted on the nightly compiler", opt.name);
3244 let _ = early_dcx.early_err(msg);
3246 }
3247
3248 if nightly_options_on_stable > 0 {
3249 let (s, were) = if nightly_options_on_stable > 1 { ("s", "were") } else { ("", "was") };
3250 let mut err = early_dcx.early_struct_fatal(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0} nightly option{1} {2} parsed",
nightly_options_on_stable, s, were))
})format!(
3251 "{nightly_options_on_stable} nightly option{s} {were} parsed",
3252 ));
3253 err.help("consider switching to a nightly toolchain: `rustup default nightly`");
3254 err.note(
3255 "selecting a toolchain with `+toolchain` arguments require a rustup proxy; \
3256 see <https://rust-lang.github.io/rustup/concepts/index.html>",
3257 );
3258 err.note(
3259 "for more information about Rust's stability policy, see \
3260 <https://doc.rust-lang.org/book/appendix-07-nightly-rust.html#unstable-features>",
3261 );
3262 err.emit();
3263 }
3264 }
3265}
3266
3267#[derive(#[automatically_derived]
impl ::core::marker::Copy for PpSourceMode { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for PpSourceMode { }
#[automatically_derived]
impl ::core::clone::Clone for PpSourceMode {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for PpSourceMode { }
#[automatically_derived]
impl ::core::cmp::PartialEq for PpSourceMode {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::fmt::Debug for PpSourceMode {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
PpSourceMode::Normal => "Normal",
PpSourceMode::Expanded => "Expanded",
PpSourceMode::ExpandedIdentified => "ExpandedIdentified",
PpSourceMode::ExpandedHygiene => "ExpandedHygiene",
})
}
}Debug)]
3268pub enum PpSourceMode {
3269 Normal,
3271 Expanded,
3273 ExpandedIdentified,
3275 ExpandedHygiene,
3277}
3278
3279#[derive(#[automatically_derived]
impl ::core::marker::Copy for PpHirMode { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for PpHirMode { }
#[automatically_derived]
impl ::core::clone::Clone for PpHirMode {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for PpHirMode { }
#[automatically_derived]
impl ::core::cmp::PartialEq for PpHirMode {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::fmt::Debug for PpHirMode {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
PpHirMode::Normal => "Normal",
PpHirMode::Identified => "Identified",
PpHirMode::Typed => "Typed",
})
}
}Debug)]
3280pub enum PpHirMode {
3281 Normal,
3283 Identified,
3285 Typed,
3287}
3288
3289#[derive(#[automatically_derived]
impl ::core::marker::Copy for PpMode { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for PpMode { }
#[automatically_derived]
impl ::core::clone::Clone for PpMode {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<PpSourceMode>;
let _: ::core::clone::AssertParamIsClone<PpHirMode>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for PpMode { }
#[automatically_derived]
impl ::core::cmp::PartialEq for PpMode {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Source(__self_0), Self::Source(__arg1_0)) =>
__self_0 == __arg1_0,
(Self::Hir(__self_0), Self::Hir(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::fmt::Debug for PpMode {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Source(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Source",
&__self_0),
Self::AstTree => ::core::fmt::Formatter::write_str(f, "AstTree"),
Self::AstTreeExpanded =>
::core::fmt::Formatter::write_str(f, "AstTreeExpanded"),
Self::Hir(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Hir",
&__self_0),
Self::HirTree => ::core::fmt::Formatter::write_str(f, "HirTree"),
Self::ThirTree =>
::core::fmt::Formatter::write_str(f, "ThirTree"),
Self::ThirFlat =>
::core::fmt::Formatter::write_str(f, "ThirFlat"),
Self::Mir => ::core::fmt::Formatter::write_str(f, "Mir"),
Self::MirCFG => ::core::fmt::Formatter::write_str(f, "MirCFG"),
Self::StableMir =>
::core::fmt::Formatter::write_str(f, "StableMir"),
}
}
}Debug)]
3290pub enum PpMode {
3292 Source(PpSourceMode),
3295 AstTree,
3297 AstTreeExpanded,
3299 Hir(PpHirMode),
3301 HirTree,
3303 ThirTree,
3305 ThirFlat,
3307 Mir,
3309 MirCFG,
3311 StableMir,
3313}
3314
3315impl PpMode {
3316 pub fn needs_ast_map(&self) -> bool {
3317 use PpMode::*;
3318 use PpSourceMode::*;
3319 match *self {
3320 Source(Normal) | AstTree => false,
3321
3322 Source(Expanded | ExpandedIdentified | ExpandedHygiene)
3323 | AstTreeExpanded
3324 | Hir(_)
3325 | HirTree
3326 | ThirTree
3327 | ThirFlat
3328 | Mir
3329 | MirCFG
3330 | StableMir => true,
3331 }
3332 }
3333
3334 pub fn needs_analysis(&self) -> bool {
3335 use PpMode::*;
3336 #[allow(non_exhaustive_omitted_patterns)] match *self {
Hir(PpHirMode::Typed) | Mir | StableMir | MirCFG | ThirTree | ThirFlat =>
true,
_ => false,
}matches!(*self, Hir(PpHirMode::Typed) | Mir | StableMir | MirCFG | ThirTree | ThirFlat)
3337 }
3338}
3339
3340#[derive(#[automatically_derived]
impl ::core::clone::Clone for WasiExecModel {
#[inline]
fn clone(&self) -> Self {
match self {
Self::Command => WasiExecModel::Command,
Self::Reactor => WasiExecModel::Reactor,
}
}
}Clone, #[automatically_derived]
impl ::core::hash::Hash for WasiExecModel {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for WasiExecModel { }
#[automatically_derived]
impl ::core::cmp::PartialEq for WasiExecModel {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for WasiExecModel { }Eq, #[automatically_derived]
impl ::core::fmt::Debug for WasiExecModel {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
WasiExecModel::Command => "Command",
WasiExecModel::Reactor => "Reactor",
})
}
}Debug)]
3341pub enum WasiExecModel {
3342 Command,
3343 Reactor,
3344}
3345
3346pub(crate) mod dep_tracking {
3365 use std::collections::BTreeMap;
3366 use std::hash::Hash;
3367 use std::num::NonZero;
3368 use std::path::PathBuf;
3369
3370 use rustc_abi::Align;
3371 use rustc_ast::attr::version::RustcVersion;
3372 use rustc_data_structures::fx::FxIndexMap;
3373 use rustc_data_structures::stable_hash::StableHasher;
3374 use rustc_errors::LanguageIdentifier;
3375 use rustc_feature::UnstableFeatures;
3376 use rustc_hashes::Hash64;
3377 use rustc_span::edition::Edition;
3378 use rustc_span::{RealFileName, RemapPathScopeComponents};
3379 use rustc_structures::CollapseMacroDebuginfo;
3380 use rustc_target::spec::{
3381 CodeModel, FramePointer, MergeFunctions, OnBrokenPipe, PanicStrategy, RelocModel,
3382 RelroLevel, SanitizerSet, SplitDebuginfo, StackProtector, SymbolVisibility, TargetTuple,
3383 TlsModel,
3384 };
3385
3386 use super::{
3387 AnnotateMoves, AutoDiff, BranchProtection, CFGuard, CFProtection, CodegenRetagOptions,
3388 CoverageOptions, CrateType, DebugInfo, DebugInfoCompression, ErrorOutputType, FmtDebug,
3389 FunctionReturn, InliningThreshold, InstrumentCoverage, InstrumentMcount,
3390 InstrumentMcountOpts, InstrumentXRay, LinkerPluginLto, LocationDetail, LtoCli,
3391 MirStripDebugInfo, NextSolverConfig, Offload, OptLevel, OutFileName, OutputType,
3392 OutputTypes, PatchableFunctionEntry, PointerAuthOption, Polonius, ResolveDocLinks,
3393 SourceFileHashAlgorithm, SplitDwarfKind, SwitchWithOptPath, SymbolManglingVersion,
3394 WasiExecModel,
3395 };
3396 use crate::lint;
3397 use crate::utils::NativeLib;
3398
3399 pub(crate) trait DepTrackingHash {
3400 fn hash(
3401 &self,
3402 hasher: &mut StableHasher,
3403 error_format: ErrorOutputType,
3404 for_crate_hash: bool,
3405 );
3406 }
3407
3408 macro_rules! impl_dep_tracking_hash_via_hash {
3409 ($($t:ty),+ $(,)?) => {$(
3410 impl DepTrackingHash for $t {
3411 fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType, _for_crate_hash: bool) {
3412 Hash::hash(self, hasher);
3413 }
3414 }
3415 )+};
3416 }
3417
3418 impl<T: DepTrackingHash> DepTrackingHash for Option<T> {
3419 fn hash(
3420 &self,
3421 hasher: &mut StableHasher,
3422 error_format: ErrorOutputType,
3423 for_crate_hash: bool,
3424 ) {
3425 match self {
3426 Some(x) => {
3427 Hash::hash(&1, hasher);
3428 DepTrackingHash::hash(x, hasher, error_format, for_crate_hash);
3429 }
3430 None => Hash::hash(&0, hasher),
3431 }
3432 }
3433 }
3434
3435 impl DepTrackingHash for () {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for AnnotateMoves {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for AutoDiff {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for Offload {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for bool {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for usize {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for NonZero<usize> {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for u64 {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for Hash64 {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for String {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for PathBuf {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for lint::Level {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for WasiExecModel {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for u32 {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for FramePointer {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for RelocModel {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for CodeModel {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for TlsModel {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for InstrumentCoverage {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for CoverageOptions {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for InstrumentMcount {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for InstrumentMcountOpts {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for InstrumentXRay {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for CrateType {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for MergeFunctions {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for OnBrokenPipe {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for PanicStrategy {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for RelroLevel {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for OptLevel {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for LtoCli {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for DebugInfo {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for DebugInfoCompression {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for MirStripDebugInfo {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for CollapseMacroDebuginfo {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for UnstableFeatures {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for NativeLib {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for SanitizerSet {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for CFGuard {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for CFProtection {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for TargetTuple {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for Edition {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for LinkerPluginLto {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for ResolveDocLinks {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for SplitDebuginfo {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for SplitDwarfKind {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for StackProtector {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for SwitchWithOptPath {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for SymbolManglingVersion {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for SymbolVisibility {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for RemapPathScopeComponents {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for SourceFileHashAlgorithm {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for OutFileName {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for OutputType {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for RealFileName {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for LocationDetail {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for FmtDebug {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for BranchProtection {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for LanguageIdentifier {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for NextSolverConfig {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for PatchableFunctionEntry {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for Polonius {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for InliningThreshold {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for FunctionReturn {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for Align {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for CodegenRetagOptions {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for RustcVersion {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}
impl DepTrackingHash for PointerAuthOption {
fn hash(&self, hasher: &mut StableHasher, _: ErrorOutputType,
_for_crate_hash: bool) {
Hash::hash(self, hasher);
}
}impl_dep_tracking_hash_via_hash!(
3436 (),
3437 AnnotateMoves,
3438 AutoDiff,
3439 Offload,
3440 bool,
3441 usize,
3442 NonZero<usize>,
3443 u64,
3444 Hash64,
3445 String,
3446 PathBuf,
3447 lint::Level,
3448 WasiExecModel,
3449 u32,
3450 FramePointer,
3451 RelocModel,
3452 CodeModel,
3453 TlsModel,
3454 InstrumentCoverage,
3455 CoverageOptions,
3456 InstrumentMcount,
3457 InstrumentMcountOpts,
3458 InstrumentXRay,
3459 CrateType,
3460 MergeFunctions,
3461 OnBrokenPipe,
3462 PanicStrategy,
3463 RelroLevel,
3464 OptLevel,
3465 LtoCli,
3466 DebugInfo,
3467 DebugInfoCompression,
3468 MirStripDebugInfo,
3469 CollapseMacroDebuginfo,
3470 UnstableFeatures,
3471 NativeLib,
3472 SanitizerSet,
3473 CFGuard,
3474 CFProtection,
3475 TargetTuple,
3476 Edition,
3477 LinkerPluginLto,
3478 ResolveDocLinks,
3479 SplitDebuginfo,
3480 SplitDwarfKind,
3481 StackProtector,
3482 SwitchWithOptPath,
3483 SymbolManglingVersion,
3484 SymbolVisibility,
3485 RemapPathScopeComponents,
3486 SourceFileHashAlgorithm,
3487 OutFileName,
3488 OutputType,
3489 RealFileName,
3490 LocationDetail,
3491 FmtDebug,
3492 BranchProtection,
3493 LanguageIdentifier,
3494 NextSolverConfig,
3495 PatchableFunctionEntry,
3496 Polonius,
3497 InliningThreshold,
3498 FunctionReturn,
3499 Align,
3500 CodegenRetagOptions,
3501 RustcVersion,
3502 PointerAuthOption,
3503 );
3504
3505 impl<T1, T2> DepTrackingHash for (T1, T2)
3506 where
3507 T1: DepTrackingHash,
3508 T2: DepTrackingHash,
3509 {
3510 fn hash(
3511 &self,
3512 hasher: &mut StableHasher,
3513 error_format: ErrorOutputType,
3514 for_crate_hash: bool,
3515 ) {
3516 Hash::hash(&0, hasher);
3517 DepTrackingHash::hash(&self.0, hasher, error_format, for_crate_hash);
3518 Hash::hash(&1, hasher);
3519 DepTrackingHash::hash(&self.1, hasher, error_format, for_crate_hash);
3520 }
3521 }
3522
3523 impl<T1, T2, T3> DepTrackingHash for (T1, T2, T3)
3524 where
3525 T1: DepTrackingHash,
3526 T2: DepTrackingHash,
3527 T3: DepTrackingHash,
3528 {
3529 fn hash(
3530 &self,
3531 hasher: &mut StableHasher,
3532 error_format: ErrorOutputType,
3533 for_crate_hash: bool,
3534 ) {
3535 Hash::hash(&0, hasher);
3536 DepTrackingHash::hash(&self.0, hasher, error_format, for_crate_hash);
3537 Hash::hash(&1, hasher);
3538 DepTrackingHash::hash(&self.1, hasher, error_format, for_crate_hash);
3539 Hash::hash(&2, hasher);
3540 DepTrackingHash::hash(&self.2, hasher, error_format, for_crate_hash);
3541 }
3542 }
3543
3544 impl<T: DepTrackingHash> DepTrackingHash for Vec<T> {
3545 fn hash(
3546 &self,
3547 hasher: &mut StableHasher,
3548 error_format: ErrorOutputType,
3549 for_crate_hash: bool,
3550 ) {
3551 Hash::hash(&self.len(), hasher);
3552 for (index, elem) in self.iter().enumerate() {
3553 Hash::hash(&index, hasher);
3554 DepTrackingHash::hash(elem, hasher, error_format, for_crate_hash);
3555 }
3556 }
3557 }
3558
3559 impl<T: DepTrackingHash, V: DepTrackingHash> DepTrackingHash for FxIndexMap<T, V> {
3560 fn hash(
3561 &self,
3562 hasher: &mut StableHasher,
3563 error_format: ErrorOutputType,
3564 for_crate_hash: bool,
3565 ) {
3566 Hash::hash(&self.len(), hasher);
3567 for (key, value) in self.iter() {
3568 DepTrackingHash::hash(key, hasher, error_format, for_crate_hash);
3569 DepTrackingHash::hash(value, hasher, error_format, for_crate_hash);
3570 }
3571 }
3572 }
3573
3574 impl DepTrackingHash for OutputTypes {
3575 fn hash(
3576 &self,
3577 hasher: &mut StableHasher,
3578 error_format: ErrorOutputType,
3579 for_crate_hash: bool,
3580 ) {
3581 Hash::hash(&self.0.len(), hasher);
3582 for (key, val) in &self.0 {
3583 DepTrackingHash::hash(key, hasher, error_format, for_crate_hash);
3584 if !for_crate_hash {
3585 DepTrackingHash::hash(val, hasher, error_format, for_crate_hash);
3586 }
3587 }
3588 }
3589 }
3590
3591 pub(crate) fn stable_hash(
3593 sub_hashes: BTreeMap<&'static str, &dyn DepTrackingHash>,
3594 hasher: &mut StableHasher,
3595 error_format: ErrorOutputType,
3596 for_crate_hash: bool,
3597 ) {
3598 for (key, sub_hash) in sub_hashes {
3599 Hash::hash(&key.len(), hasher);
3602 Hash::hash(key, hasher);
3603 sub_hash.hash(hasher, error_format, for_crate_hash);
3604 }
3605 }
3606}
3607
3608#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for ProcMacroExecutionStrategy { }
#[automatically_derived]
impl ::core::clone::Clone for ProcMacroExecutionStrategy {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for ProcMacroExecutionStrategy { }Copy, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for ProcMacroExecutionStrategy { }
#[automatically_derived]
impl ::core::cmp::PartialEq for ProcMacroExecutionStrategy {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for ProcMacroExecutionStrategy {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for ProcMacroExecutionStrategy {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
ProcMacroExecutionStrategy::SameThread => "SameThread",
ProcMacroExecutionStrategy::CrossThread => "CrossThread",
})
}
}Debug)]
3610pub enum ProcMacroExecutionStrategy {
3611 SameThread,
3613
3614 CrossThread,
3616}
3617
3618#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for DumpMonoStatsFormat { }
#[automatically_derived]
impl ::core::clone::Clone for DumpMonoStatsFormat {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for DumpMonoStatsFormat { }Copy, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for DumpMonoStatsFormat { }
#[automatically_derived]
impl ::core::cmp::PartialEq for DumpMonoStatsFormat {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for DumpMonoStatsFormat {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for DumpMonoStatsFormat {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
DumpMonoStatsFormat::Markdown => "Markdown",
DumpMonoStatsFormat::Json => "Json",
})
}
}Debug)]
3620pub enum DumpMonoStatsFormat {
3621 Markdown,
3623 Json,
3625}
3626
3627impl DumpMonoStatsFormat {
3628 pub fn extension(self) -> &'static str {
3629 match self {
3630 Self::Markdown => "md",
3631 Self::Json => "json",
3632 }
3633 }
3634}
3635
3636#[derive(#[automatically_derived]
impl ::core::clone::Clone for PatchableFunctionEntry {
#[inline]
fn clone(&self) -> Self {
PatchableFunctionEntry {
prefix: ::core::clone::Clone::clone(&self.prefix),
entry: ::core::clone::Clone::clone(&self.entry),
section: ::core::clone::Clone::clone(&self.section),
}
}
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for PatchableFunctionEntry { }
#[automatically_derived]
impl ::core::cmp::PartialEq for PatchableFunctionEntry {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.prefix == other.prefix && self.entry == other.entry &&
self.section == other.section
}
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for PatchableFunctionEntry {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.prefix, state);
::core::hash::Hash::hash(&self.entry, state);
::core::hash::Hash::hash(&self.section, state)
}
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for PatchableFunctionEntry {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f,
"PatchableFunctionEntry", "prefix", &self.prefix, "entry",
&self.entry, "section", &&self.section)
}
}Debug, #[automatically_derived]
impl ::core::default::Default for PatchableFunctionEntry {
#[inline]
fn default() -> Self {
PatchableFunctionEntry {
prefix: ::core::default::Default::default(),
entry: ::core::default::Default::default(),
section: ::core::default::Default::default(),
}
}
}Default)]
3639pub struct PatchableFunctionEntry {
3640 prefix: u8,
3642 entry: u8,
3644 section: Option<String>,
3646}
3647
3648impl PatchableFunctionEntry {
3649 pub fn from_parts(
3650 total_nops: u8,
3651 prefix_nops: u8,
3652 section: Option<String>,
3653 ) -> Option<PatchableFunctionEntry> {
3654 if total_nops < prefix_nops {
3655 None
3656 } else if section.as_ref().map(|x| x.contains('\0') || x.is_empty()).unwrap_or(false) {
3658 None
3659 } else {
3660 Some(Self { prefix: prefix_nops, entry: total_nops - prefix_nops, section })
3661 }
3662 }
3663 pub fn prefix(&self) -> u8 {
3664 self.prefix
3665 }
3666 pub fn entry(&self) -> u8 {
3667 self.entry
3668 }
3669 pub fn section(&self) -> Option<&str> {
3670 self.section.as_ref().map(|x| x.as_str())
3671 }
3672}
3673
3674#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for Polonius { }
#[automatically_derived]
impl ::core::clone::Clone for Polonius {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for Polonius { }Copy, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for Polonius { }
#[automatically_derived]
impl ::core::cmp::PartialEq for Polonius {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for Polonius {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for Polonius {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
Polonius::Off => "Off",
Polonius::Legacy => "Legacy",
Polonius::Next => "Next",
})
}
}Debug)]
3677pub enum Polonius {
3678 Off,
3680
3681 Legacy,
3683
3684 Next,
3686}
3687
3688impl Default for Polonius {
3689 fn default() -> Self {
3690 Self::DEFAULT
3691 }
3692}
3693
3694impl Polonius {
3695 pub(crate) const DEFAULT: Self =
3696 if ::core::option::Option::Some("1")option_env!("CFG_DEFAULT_POLONIUS_NEXT").is_some() { Self::Next } else { Self::Off };
3697
3698 pub fn is_legacy_enabled(&self) -> bool {
3700 #[allow(non_exhaustive_omitted_patterns)] match self {
Polonius::Legacy => true,
_ => false,
}matches!(self, Polonius::Legacy)
3701 }
3702
3703 pub fn is_next_enabled(&self) -> bool {
3705 #[allow(non_exhaustive_omitted_patterns)] match self {
Polonius::Next => true,
_ => false,
}matches!(self, Polonius::Next)
3706 }
3707}
3708
3709#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for InliningThreshold { }
#[automatically_derived]
impl ::core::clone::Clone for InliningThreshold {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<usize>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for InliningThreshold { }Copy, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for InliningThreshold { }
#[automatically_derived]
impl ::core::cmp::PartialEq for InliningThreshold {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Sometimes(__self_0), Self::Sometimes(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for InliningThreshold {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state);
match self {
Self::Sometimes(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for InliningThreshold {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Always => ::core::fmt::Formatter::write_str(f, "Always"),
Self::Sometimes(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"Sometimes", &__self_0),
Self::Never => ::core::fmt::Formatter::write_str(f, "Never"),
}
}
}Debug)]
3710pub enum InliningThreshold {
3711 Always,
3712 Sometimes(usize),
3713 Never,
3714}
3715
3716impl Default for InliningThreshold {
3717 fn default() -> Self {
3718 Self::Sometimes(100)
3719 }
3720}
3721
3722#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for FunctionReturn { }
#[automatically_derived]
impl ::core::clone::Clone for FunctionReturn {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for FunctionReturn { }Copy, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for FunctionReturn { }
#[automatically_derived]
impl ::core::cmp::PartialEq for FunctionReturn {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for FunctionReturn {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for FunctionReturn {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
FunctionReturn::Keep => "Keep",
FunctionReturn::ThunkExtern => "ThunkExtern",
})
}
}Debug, #[automatically_derived]
impl ::core::default::Default for FunctionReturn {
#[inline]
fn default() -> Self { Self::Keep }
}Default)]
3724pub enum FunctionReturn {
3725 #[default]
3727 Keep,
3728
3729 ThunkExtern,
3731}
3732
3733#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for MirIncludeSpans { }
#[automatically_derived]
impl ::core::clone::Clone for MirIncludeSpans {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for MirIncludeSpans { }Copy, #[automatically_derived]
impl ::core::default::Default for MirIncludeSpans {
#[inline]
fn default() -> Self { Self::Nll }
}Default, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for MirIncludeSpans { }
#[automatically_derived]
impl ::core::cmp::PartialEq for MirIncludeSpans {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::fmt::Debug for MirIncludeSpans {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
MirIncludeSpans::Off => "Off",
MirIncludeSpans::On => "On",
MirIncludeSpans::Nll => "Nll",
})
}
}Debug)]
3736pub enum MirIncludeSpans {
3737 Off,
3738 On,
3739 #[default]
3742 Nll,
3743}
3744
3745impl MirIncludeSpans {
3746 pub fn is_enabled(self) -> bool {
3751 self == MirIncludeSpans::On
3752 }
3753}