mir_transform: implement forced inlining
Adds `#[rustc_force_inline]` which is similar to always inlining but reports an error if the inlining was not possible, and which always attempts to inline annotated items, regardless of optimisation levels. It can only be applied to free functions to guarantee that the MIR inliner will be able to resolve calls.
This commit is contained in:
@@ -46,7 +46,7 @@ fn cross_crate_inlinable(tcx: TyCtxt<'_>, def_id: LocalDefId) -> bool {
|
||||
// #[inline(never)] to force code generation.
|
||||
match codegen_fn_attrs.inline {
|
||||
InlineAttr::Never => return false,
|
||||
InlineAttr::Hint | InlineAttr::Always => return true,
|
||||
InlineAttr::Hint | InlineAttr::Always | InlineAttr::Force { .. } => return true,
|
||||
_ => {}
|
||||
}
|
||||
|
||||
@@ -69,8 +69,9 @@ fn cross_crate_inlinable(tcx: TyCtxt<'_>, def_id: LocalDefId) -> bool {
|
||||
// Don't do any inference if codegen optimizations are disabled and also MIR inlining is not
|
||||
// enabled. This ensures that we do inference even if someone only passes -Zinline-mir,
|
||||
// which is less confusing than having to also enable -Copt-level=1.
|
||||
if matches!(tcx.sess.opts.optimize, OptLevel::No) && !pm::should_run_pass(tcx, &inline::Inline)
|
||||
{
|
||||
let inliner_will_run = pm::should_run_pass(tcx, &inline::Inline)
|
||||
|| inline::ForceInline::should_run_pass_for_callee(tcx, def_id.to_def_id());
|
||||
if matches!(tcx.sess.opts.optimize, OptLevel::No) && !inliner_will_run {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user