stabilize -Clinker-features=-lld on x64 linux
This stabilizes a subset of the `-Clinker-features` components on x64 linux: the lld opt-out. The opt-in is not stabilized, as interactions with other stable flags require more internal work, but are not needed for stabilizing using rust-lld by default. Similarly, since we only switch to rust-lld on x64 linux, the opt-out is only stabilized there. Other targets still require `-Zunstable-options` to use it.
This commit is contained in:
@@ -402,7 +402,7 @@ impl LinkSelfContained {
|
||||
}
|
||||
}
|
||||
|
||||
/// The different values that `-Z linker-features` can take on the CLI: a list of individually
|
||||
/// The different values that `-C linker-features` can take on the CLI: a list of individually
|
||||
/// enabled or disabled features used during linking.
|
||||
///
|
||||
/// There is no need to enable or disable them in bulk. Each feature is fine-grained, and can be
|
||||
@@ -442,6 +442,39 @@ impl LinkerFeaturesCli {
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
/// When *not* using `-Z unstable-options` on the CLI, ensure only stable linker features are
|
||||
/// used, for the given `TargetTuple`. Returns `Ok` if no unstable variants are used.
|
||||
/// The caller should ensure that e.g. `nightly_options::is_unstable_enabled()`
|
||||
/// returns false.
|
||||
pub(crate) fn check_unstable_variants(&self, target_tuple: &TargetTuple) -> Result<(), String> {
|
||||
// `-C linker-features=-lld` is only stable on x64 linux.
|
||||
let has_minus_lld = self.disabled.is_lld_enabled();
|
||||
if has_minus_lld && target_tuple.tuple() != "x86_64-unknown-linux-gnu" {
|
||||
return Err(format!(
|
||||
"`-C linker-features=-lld` is unstable on the `{target_tuple}` \
|
||||
target. The `-Z unstable-options` flag must also be passed to use it on this target",
|
||||
));
|
||||
}
|
||||
|
||||
// Any `+lld` or non-lld feature used is unstable, and that's an error.
|
||||
let unstable_enabled = self.enabled;
|
||||
let unstable_disabled = self.disabled - LinkerFeatures::LLD;
|
||||
if !unstable_enabled.union(unstable_disabled).is_empty() {
|
||||
let unstable_features: Vec<_> = unstable_enabled
|
||||
.iter()
|
||||
.map(|f| format!("+{}", f.as_str().unwrap()))
|
||||
.chain(unstable_disabled.iter().map(|f| format!("-{}", f.as_str().unwrap())))
|
||||
.collect();
|
||||
return Err(format!(
|
||||
"`-C linker-features={}` is unstable, and also requires the \
|
||||
`-Z unstable-options` flag to be used",
|
||||
unstable_features.join(","),
|
||||
));
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
/// Used with `-Z assert-incr-state`.
|
||||
@@ -2638,9 +2671,8 @@ pub fn build_session_options(early_dcx: &mut EarlyDiagCtxt, matches: &getopts::M
|
||||
}
|
||||
}
|
||||
|
||||
if !nightly_options::is_unstable_enabled(matches)
|
||||
&& cg.force_frame_pointers == FramePointer::NonLeaf
|
||||
{
|
||||
let unstable_options_enabled = nightly_options::is_unstable_enabled(matches);
|
||||
if !unstable_options_enabled && cg.force_frame_pointers == FramePointer::NonLeaf {
|
||||
early_dcx.early_fatal(
|
||||
"`-Cforce-frame-pointers=non-leaf` or `always` also requires `-Zunstable-options` \
|
||||
and a nightly compiler",
|
||||
@@ -2650,7 +2682,7 @@ pub fn build_session_options(early_dcx: &mut EarlyDiagCtxt, matches: &getopts::M
|
||||
// For testing purposes, until we have more feedback about these options: ensure `-Z
|
||||
// unstable-options` is required when using the unstable `-C link-self-contained` and `-C
|
||||
// linker-flavor` options.
|
||||
if !nightly_options::is_unstable_enabled(matches) {
|
||||
if !unstable_options_enabled {
|
||||
let uses_unstable_self_contained_option =
|
||||
cg.link_self_contained.are_unstable_variants_set();
|
||||
if uses_unstable_self_contained_option {
|
||||
@@ -2706,6 +2738,12 @@ pub fn build_session_options(early_dcx: &mut EarlyDiagCtxt, matches: &getopts::M
|
||||
let debuginfo = select_debuginfo(matches, &cg);
|
||||
let debuginfo_compression = unstable_opts.debuginfo_compression;
|
||||
|
||||
if !unstable_options_enabled {
|
||||
if let Err(error) = cg.linker_features.check_unstable_variants(&target_triple) {
|
||||
early_dcx.early_fatal(error);
|
||||
}
|
||||
}
|
||||
|
||||
let crate_name = matches.opt_str("crate-name");
|
||||
let unstable_features = UnstableFeatures::from_environment(crate_name.as_deref());
|
||||
// Parse any `-l` flags, which link to native libraries.
|
||||
|
||||
@@ -2015,6 +2015,8 @@ options! {
|
||||
on a C toolchain or linker installed in the system"),
|
||||
linker: Option<PathBuf> = (None, parse_opt_pathbuf, [UNTRACKED],
|
||||
"system linker to link outputs with"),
|
||||
linker_features: LinkerFeaturesCli = (LinkerFeaturesCli::default(), parse_linker_features, [UNTRACKED],
|
||||
"a comma-separated list of linker features to enable (+) or disable (-): `lld`"),
|
||||
linker_flavor: Option<LinkerFlavorCli> = (None, parse_linker_flavor, [UNTRACKED],
|
||||
"linker flavor"),
|
||||
linker_plugin_lto: LinkerPluginLto = (LinkerPluginLto::Disabled,
|
||||
@@ -2307,8 +2309,6 @@ options! {
|
||||
"link native libraries in the linker invocation (default: yes)"),
|
||||
link_only: bool = (false, parse_bool, [TRACKED],
|
||||
"link the `.rlink` file generated by `-Z no-link` (default: no)"),
|
||||
linker_features: LinkerFeaturesCli = (LinkerFeaturesCli::default(), parse_linker_features, [UNTRACKED],
|
||||
"a comma-separated list of linker features to enable (+) or disable (-): `lld`"),
|
||||
lint_llvm_ir: bool = (false, parse_bool, [TRACKED],
|
||||
"lint LLVM IR (default: no)"),
|
||||
lint_mir: bool = (false, parse_bool, [UNTRACKED],
|
||||
|
||||
Reference in New Issue
Block a user