Coerce safe-to-call target_feature functions to fn pointers. · rust-lang/rust@8fee6a7 (original) (raw)
`@@ -60,7 +60,7 @@ use crate::dep_graph::{DepGraph, DepKindStruct};
`
60
60
`use crate::infer::canonical::{CanonicalParamEnvCache, CanonicalVarInfo, CanonicalVarInfos};
`
61
61
`use crate::lint::lint_level;
`
62
62
`use crate::metadata::ModChild;
`
63
``
`-
use crate::middle::codegen_fn_attrs::CodegenFnAttrs;
`
``
63
`+
use crate::middle::codegen_fn_attrs::{CodegenFnAttrs, TargetFeature};
`
64
64
`use crate::middle::{resolve_bound_vars, stability};
`
65
65
`use crate::mir::interpret::{self, Allocation, ConstAllocation};
`
66
66
`use crate::mir::{Body, Local, Place, PlaceElem, ProjectionKind, Promoted};
`
`@@ -1776,6 +1776,37 @@ impl<'tcx> TyCtxt<'tcx> {
`
1776
1776
`pub fn dcx(self) -> DiagCtxtHandle<'tcx> {
`
1777
1777
`self.sess.dcx()
`
1778
1778
`}
`
``
1779
+
``
1780
`+
pub fn is_target_feature_call_safe(
`
``
1781
`+
self,
`
``
1782
`+
callee_features: &[TargetFeature],
`
``
1783
`+
body_features: &[TargetFeature],
`
``
1784
`+
) -> bool {
`
``
1785
`+
// If the called function has target features the calling function hasn't,
`
``
1786
`` +
// the call requires unsafe
. Don't check this on wasm
``
``
1787
`+
// targets, though. For more information on wasm see the
`
``
1788
`+
// is_like_wasm check in hir_analysis/src/collect.rs
`
``
1789
`+
self.sess.target.options.is_like_wasm
`
``
1790
`+
|| callee_features
`
``
1791
`+
.iter()
`
``
1792
`+
.all(|feature| body_features.iter().any(|f| f.name == feature.name))
`
``
1793
`+
}
`
``
1794
+
``
1795
`+
/// Returns the safe version of the signature of the given function, if calling it
`
``
1796
`+
/// would be safe in the context of the given caller.
`
``
1797
`+
pub fn adjust_target_feature_sig(
`
``
1798
`+
self,
`
``
1799
`+
fun_def: DefId,
`
``
1800
`+
fun_sig: ty::Binder<'tcx, ty::FnSig<'tcx>>,
`
``
1801
`+
caller: DefId,
`
``
1802
`+
) -> Option<ty::Binder<'tcx, ty::FnSig<'tcx>>> {
`
``
1803
`+
let fun_features = &self.codegen_fn_attrs(fun_def).target_features;
`
``
1804
`+
let callee_features = &self.codegen_fn_attrs(caller).target_features;
`
``
1805
`+
if self.is_target_feature_call_safe(&fun_features, &callee_features) {
`
``
1806
`+
return Some(fun_sig.map_bound(|sig| ty::FnSig { safety: hir::Safety::Safe, ..sig }));
`
``
1807
`+
}
`
``
1808
`+
None
`
``
1809
`+
}
`
1779
1810
`}
`
1780
1811
``
1781
1812
`impl<'tcx> TyCtxtAt<'tcx> {
`