ABI-required target features: warn when they are missing in base CPU (rather than silently enabling them)
This commit is contained in:
parent
f753850659
commit
93ee180cfa
15 changed files with 80 additions and 127 deletions
|
@ -1,3 +1,8 @@
|
|||
interface_abi_required_feature =
|
||||
target feature `{$feature}` must be {$enabled} to ensure that the ABI of the current target can be implemented correctly
|
||||
.note = this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
|
||||
interface_abi_required_feature_issue = for more information, see issue #116344 <https://github.com/rust-lang/rust/issues/116344>
|
||||
|
||||
interface_cant_emit_mir =
|
||||
could not emit MIR: {$error}
|
||||
|
||||
|
|
|
@ -103,3 +103,12 @@ pub struct IgnoringOutDir;
|
|||
#[derive(Diagnostic)]
|
||||
#[diag(interface_multiple_output_types_to_stdout)]
|
||||
pub struct MultipleOutputTypesToStdout;
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(interface_abi_required_feature)]
|
||||
#[note]
|
||||
#[note(interface_abi_required_feature_issue)]
|
||||
pub(crate) struct AbiRequiredTargetFeature<'a> {
|
||||
pub feature: &'a str,
|
||||
pub enabled: &'a str,
|
||||
}
|
||||
|
|
|
@ -492,6 +492,8 @@ pub fn run_compiler<R: Send>(config: Config, f: impl FnOnce(&Compiler) -> R + Se
|
|||
}
|
||||
sess.lint_store = Some(Lrc::new(lint_store));
|
||||
|
||||
util::check_abi_required_features(&sess);
|
||||
|
||||
let compiler = Compiler {
|
||||
sess,
|
||||
codegen_backend,
|
||||
|
|
|
@ -18,21 +18,25 @@ use rustc_session::{EarlyDiagCtxt, Session, filesearch};
|
|||
use rustc_span::edit_distance::find_best_match_for_name;
|
||||
use rustc_span::edition::Edition;
|
||||
use rustc_span::source_map::SourceMapInputs;
|
||||
use rustc_span::sym;
|
||||
use rustc_span::{Symbol, sym};
|
||||
use rustc_target::spec::Target;
|
||||
use tracing::info;
|
||||
|
||||
use crate::errors;
|
||||
|
||||
/// Function pointer type that constructs a new CodegenBackend.
|
||||
pub type MakeBackendFn = fn() -> Box<dyn CodegenBackend>;
|
||||
type MakeBackendFn = fn() -> Box<dyn CodegenBackend>;
|
||||
|
||||
/// Adds `target_feature = "..."` cfgs for a variety of platform
|
||||
/// specific features (SSE, NEON etc.).
|
||||
///
|
||||
/// This is performed by checking whether a set of permitted features
|
||||
/// is available on the target machine, by querying the codegen backend.
|
||||
pub fn add_configuration(cfg: &mut Cfg, sess: &mut Session, codegen_backend: &dyn CodegenBackend) {
|
||||
pub(crate) fn add_configuration(
|
||||
cfg: &mut Cfg,
|
||||
sess: &mut Session,
|
||||
codegen_backend: &dyn CodegenBackend,
|
||||
) {
|
||||
let tf = sym::target_feature;
|
||||
|
||||
let unstable_target_features = codegen_backend.target_features_cfg(sess, true);
|
||||
|
@ -48,6 +52,34 @@ pub fn add_configuration(cfg: &mut Cfg, sess: &mut Session, codegen_backend: &dy
|
|||
}
|
||||
}
|
||||
|
||||
/// Ensures that all target features required by the ABI are present.
|
||||
/// Must be called after `unstable_target_features` has been populated!
|
||||
pub(crate) fn check_abi_required_features(sess: &Session) {
|
||||
let abi_feature_constraints = sess.target.abi_required_features();
|
||||
// We check this against `unstable_target_features` as that is conveniently already
|
||||
// back-translated to rustc feature names, taking into account `-Ctarget-cpu` and `-Ctarget-feature`.
|
||||
// Just double-check that the features we care about are actually on our list.
|
||||
for feature in
|
||||
abi_feature_constraints.required.iter().chain(abi_feature_constraints.incompatible.iter())
|
||||
{
|
||||
assert!(
|
||||
sess.target.rust_target_features().iter().any(|(name, ..)| feature == name),
|
||||
"target feature {feature} is required/incompatible for the current ABI but not a recognized feature for this target"
|
||||
);
|
||||
}
|
||||
|
||||
for feature in abi_feature_constraints.required {
|
||||
if !sess.unstable_target_features.contains(&Symbol::intern(feature)) {
|
||||
sess.dcx().emit_warn(errors::AbiRequiredTargetFeature { feature, enabled: "enabled" });
|
||||
}
|
||||
}
|
||||
for feature in abi_feature_constraints.incompatible {
|
||||
if sess.unstable_target_features.contains(&Symbol::intern(feature)) {
|
||||
sess.dcx().emit_warn(errors::AbiRequiredTargetFeature { feature, enabled: "disabled" });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub static STACK_SIZE: OnceLock<usize> = OnceLock::new();
|
||||
pub const DEFAULT_STACK_SIZE: usize = 8 * 1024 * 1024;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue