require -Zunstable-options to use new link-self-contained values and

linker flavors

- only the stable values for `-Clink-self-contained` can be used on stable until we
have more feedback on the interface
- `-Zunstable-options` is required to use unstable linker flavors
This commit is contained in:
Rémy Rakic 2023-06-21 21:49:41 +00:00
parent 051e94d50e
commit 38dca73456
2 changed files with 53 additions and 10 deletions

View File

@ -11,7 +11,7 @@
use rustc_data_structures::fx::{FxHashMap, FxHashSet}; use rustc_data_structures::fx::{FxHashMap, FxHashSet};
use rustc_data_structures::stable_hasher::{StableOrd, ToStableHashKey}; use rustc_data_structures::stable_hasher::{StableOrd, ToStableHashKey};
use rustc_target::abi::Align; use rustc_target::abi::Align;
use rustc_target::spec::{LinkerFlavorCli, PanicStrategy, SanitizerSet, SplitDebuginfo}; use rustc_target::spec::{PanicStrategy, SanitizerSet, SplitDebuginfo};
use rustc_target::spec::{Target, TargetTriple, TargetWarnings, TARGETS}; use rustc_target::spec::{Target, TargetTriple, TargetWarnings, TARGETS};
use crate::parse::{CrateCheckConfig, CrateConfig}; use crate::parse::{CrateCheckConfig, CrateConfig};
@ -308,6 +308,14 @@ pub fn on() -> Self {
on on
} }
/// To help checking CLI usage while some of the values are unstable: returns whether one of the
/// components was set individually. This would also require the `-Zunstable-options` flag, to
/// be allowed.
fn are_unstable_variants_set(&self) -> bool {
let any_component_set = !self.components.is_empty();
self.explicitly_set.is_none() && any_component_set
}
/// Returns whether the self-contained linker component is enabled. /// Returns whether the self-contained linker component is enabled.
pub fn linker(&self) -> bool { pub fn linker(&self) -> bool {
self.components.contains(LinkSelfContainedComponents::LINKER) self.components.contains(LinkSelfContainedComponents::LINKER)
@ -2648,16 +2656,28 @@ pub fn build_session_options(
} }
} }
if let Some(flavor) = cg.linker_flavor { // For testing purposes, until we have more feedback about these options: ensure `-Z
if matches!(flavor, LinkerFlavorCli::BpfLinker | LinkerFlavorCli::PtxLinker) // unstable-options` is required when using the unstable `-C link-self-contained` options, like
&& !nightly_options::is_unstable_enabled(matches) // `-C link-self-contained=+linker`, and when using the unstable `-C linker-flavor` options, like
{ // `-C linker-flavor=gnu-lld-cc`.
let msg = format!( if !nightly_options::is_unstable_enabled(matches) {
"linker flavor `{}` is unstable, `-Z unstable-options` \ let uses_unstable_self_contained_option =
flag must also be passed to explicitly use it", cg.link_self_contained.are_unstable_variants_set();
flavor.desc() if uses_unstable_self_contained_option {
handler.early_error(
"only `-C link-self-contained` values `y`/`yes`/`on`/`n`/`no`/`off` are stable, \
the `-Z unstable-options` flag must also be passed to use the unstable values",
); );
handler.early_error(msg); }
if let Some(flavor) = cg.linker_flavor {
if flavor.is_unstable() {
handler.early_error(format!(
"the linker flavor `{}` is unstable, the `-Z unstable-options` \
flag must also be passed to use the unstable values",
flavor.desc()
));
}
} }
} }

View File

@ -181,6 +181,29 @@ pub enum LinkerFlavorCli {
PtxLinker, PtxLinker,
} }
impl LinkerFlavorCli {
/// Returns whether this `-C linker-flavor` option is one of the unstable values.
pub fn is_unstable(&self) -> bool {
match self {
LinkerFlavorCli::Gnu(..)
| LinkerFlavorCli::Darwin(..)
| LinkerFlavorCli::WasmLld(..)
| LinkerFlavorCli::Unix(..)
| LinkerFlavorCli::Msvc(Lld::Yes)
| LinkerFlavorCli::EmCc
| LinkerFlavorCli::Bpf
| LinkerFlavorCli::Ptx
| LinkerFlavorCli::BpfLinker
| LinkerFlavorCli::PtxLinker => true,
LinkerFlavorCli::Gcc
| LinkerFlavorCli::Ld
| LinkerFlavorCli::Lld(..)
| LinkerFlavorCli::Msvc(Lld::No)
| LinkerFlavorCli::Em => false,
}
}
}
#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)] #[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
pub enum LldFlavor { pub enum LldFlavor {
Wasm, Wasm,