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:
parent
691aec2ef3
commit
a1374f5c36
4 changed files with 18 additions and 14 deletions
|
@ -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
|
||||||
|
|
|
@ -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)]
|
||||||
|
|
|
@ -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 });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
11
src/lib.rs
11
src/lib.rs
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue