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:
@@ -4,8 +4,8 @@ use rustc_macros::{Diagnostic, LintDiagnostic, Subdiagnostic};
|
||||
use rustc_middle::mir::AssertKind;
|
||||
use rustc_middle::ty::TyCtxt;
|
||||
use rustc_session::lint::{self, Lint};
|
||||
use rustc_span::Span;
|
||||
use rustc_span::def_id::DefId;
|
||||
use rustc_span::{Span, Symbol};
|
||||
|
||||
use crate::fluent_generated as fluent;
|
||||
|
||||
@@ -142,3 +142,29 @@ pub(crate) struct MustNotSuspendReason {
|
||||
#[note(mir_transform_note2)]
|
||||
#[help]
|
||||
pub(crate) struct UndefinedTransmute;
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(mir_transform_force_inline)]
|
||||
#[note]
|
||||
pub(crate) struct ForceInlineFailure {
|
||||
#[label(mir_transform_caller)]
|
||||
pub caller_span: Span,
|
||||
#[label(mir_transform_callee)]
|
||||
pub callee_span: Span,
|
||||
#[label(mir_transform_attr)]
|
||||
pub attr_span: Span,
|
||||
#[primary_span]
|
||||
#[label(mir_transform_call)]
|
||||
pub call_span: Span,
|
||||
pub callee: String,
|
||||
pub caller: String,
|
||||
pub reason: &'static str,
|
||||
#[subdiagnostic]
|
||||
pub justification: Option<ForceInlineJustification>,
|
||||
}
|
||||
|
||||
#[derive(Subdiagnostic)]
|
||||
#[note(mir_transform_force_inline_justification)]
|
||||
pub(crate) struct ForceInlineJustification {
|
||||
pub sym: Symbol,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user