1
Fork 0

miri: fail when calling a function that requires an unavailable target feature

miri will report an UB when calling a function that has a `#[target_feature(enable = ...)]` attribute is called and the required feature is not available.

"Available features" are the same that `is_x86_feature_detected!` (or equivalent) reports to be available during miri execution (which can be enabled or disabled with the `-C target-feature` flag).
This commit is contained in:
Eduardo Sánchez Muñoz 2023-07-16 00:23:17 +02:00
parent ad963232d9
commit b5fde0dae0
5 changed files with 60 additions and 0 deletions

View file

@ -399,6 +399,9 @@ const_eval_unallowed_mutable_refs_raw =
const_eval_unallowed_op_in_const_context =
{$msg}
const_eval_unavailable_target_features_for_fn =
calling a function that requires unavailable target features: {$unavailable_feats}
const_eval_undefined_behavior =
it is undefined behavior to use this value

View file

@ -503,6 +503,25 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
}
}
let attrs = self.tcx.codegen_fn_attrs(instance.def_id());
let missing_features: Vec<_> = attrs
.target_features
.iter()
.copied()
.filter(|feature| !self.tcx.sess.target_features.contains(feature))
.collect();
if !missing_features.is_empty() {
let mut missing_features_str = String::from(missing_features[0].as_str());
for missing_feature in missing_features[1..].iter() {
missing_features_str.push(',');
missing_features_str.push_str(missing_feature.as_str());
}
throw_ub_custom!(
fluent::const_eval_unavailable_target_features_for_fn,
unavailable_feats = missing_features_str,
);
}
if !callee_fn_abi.can_unwind {
// The callee cannot unwind, so force the `Unreachable` unwind handling.
unwind = mir::UnwindAction::Unreachable;