1
Fork 0

generalize 'forbidden feature' concept so that even (un)stable feature can be invalid to toggle

Also rename some things for extra clarity
This commit is contained in:
Ralf Jung 2024-11-16 10:00:16 +01:00
parent 691aec2ef3
commit a1374f5c36
4 changed files with 18 additions and 14 deletions

View file

@ -9,7 +9,7 @@ codegen_gcc_lto_not_supported =
LTO is not supported. You may get a linker error. LTO is not supported. You may get a linker error.
codegen_gcc_forbidden_ctarget_feature = codegen_gcc_forbidden_ctarget_feature =
target feature `{$feature}` cannot be toggled with `-Ctarget-feature` target feature `{$feature}` cannot be toggled with `-Ctarget-feature`: {$reason}
codegen_gcc_unwinding_inline_asm = codegen_gcc_unwinding_inline_asm =
GCC backend does not support unwinding from inline asm GCC backend does not support unwinding from inline asm

View file

@ -28,6 +28,7 @@ pub(crate) struct UnstableCTargetFeature<'a> {
#[diag(codegen_gcc_forbidden_ctarget_feature)] #[diag(codegen_gcc_forbidden_ctarget_feature)]
pub(crate) struct ForbiddenCTargetFeature<'a> { pub(crate) struct ForbiddenCTargetFeature<'a> {
pub feature: &'a str, pub feature: &'a str,
pub reason: &'a str,
} }
#[derive(Subdiagnostic)] #[derive(Subdiagnostic)]

View file

@ -5,7 +5,7 @@ use rustc_codegen_ssa::errors::TargetFeatureDisableOrEnable;
use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::fx::FxHashMap;
use rustc_middle::bug; use rustc_middle::bug;
use rustc_session::Session; use rustc_session::Session;
use rustc_target::target_features::{RUSTC_SPECIFIC_FEATURES, Stability}; use rustc_target::target_features::RUSTC_SPECIFIC_FEATURES;
use smallvec::{SmallVec, smallvec}; use smallvec::{SmallVec, smallvec};
use crate::errors::{ use crate::errors::{
@ -94,13 +94,15 @@ pub(crate) fn global_gcc_features(sess: &Session, diagnostics: bool) -> Vec<Stri
}; };
sess.dcx().emit_warn(unknown_feature); sess.dcx().emit_warn(unknown_feature);
} }
Some((_, Stability::Stable, _)) => {} Some((_, stability, _)) => {
Some((_, Stability::Unstable(_), _)) => { if let Err(reason) = stability.compute(&sess.target).allow_toggle() {
// An unstable feature. Warn about using it. sess.dcx().emit_warn(ForbiddenCTargetFeature { feature, reason });
sess.dcx().emit_warn(UnstableCTargetFeature { feature }); } else if stability.requires_nightly().is_some() {
} // An unstable feature. Warn about using it. (It makes little sense
Some((_, Stability::Forbidden { .. }, _)) => { // to hard-error here since we just warn about fully unknown
sess.dcx().emit_err(ForbiddenCTargetFeature { feature }); // features above).
sess.dcx().emit_warn(UnstableCTargetFeature { feature });
}
} }
} }

View file

@ -260,8 +260,8 @@ impl CodegenBackend for GccCodegenBackend {
.join(sess) .join(sess)
} }
fn target_features(&self, sess: &Session, allow_unstable: bool) -> Vec<Symbol> { fn target_features_cfg(&self, sess: &Session, allow_unstable: bool) -> Vec<Symbol> {
target_features(sess, allow_unstable, &self.target_info) target_features_cfg(sess, allow_unstable, &self.target_info)
} }
} }
@ -472,7 +472,8 @@ fn to_gcc_opt_level(optlevel: Option<OptLevel>) -> OptimizationLevel {
} }
} }
pub fn target_features( /// Returns the features that should be set in `cfg(target_feature)`.
fn target_features_cfg(
sess: &Session, sess: &Session,
allow_unstable: bool, allow_unstable: bool,
target_info: &LockedTargetInfo, target_info: &LockedTargetInfo,
@ -481,9 +482,9 @@ pub fn target_features(
sess.target sess.target
.rust_target_features() .rust_target_features()
.iter() .iter()
.filter(|(_, gate, _)| gate.is_supported()) .filter(|(_, gate, _)| gate.in_cfg())
.filter_map(|&(feature, gate, _)| { .filter_map(|&(feature, gate, _)| {
if sess.is_nightly_build() || allow_unstable || gate.is_stable() { if sess.is_nightly_build() || allow_unstable || gate.requires_nightly().is_none() {
Some(feature) Some(feature)
} else { } else {
None None