Declare all MIR passes in a list
This commit is contained in:
parent
71042b4b20
commit
2a9cc8f4d6
2 changed files with 154 additions and 62 deletions
|
@ -40,77 +40,159 @@ use tracing::{debug, trace};
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
mod pass_manager;
|
mod pass_manager;
|
||||||
|
|
||||||
|
use std::sync::LazyLock;
|
||||||
|
|
||||||
use pass_manager::{self as pm, Lint, MirLint, MirPass, WithMinOptLevel};
|
use pass_manager::{self as pm, Lint, MirLint, MirPass, WithMinOptLevel};
|
||||||
|
|
||||||
mod abort_unwinding_calls;
|
|
||||||
mod add_call_guards;
|
|
||||||
mod add_moves_for_packed_drops;
|
|
||||||
mod add_retag;
|
|
||||||
mod add_subtyping_projections;
|
|
||||||
mod check_alignment;
|
|
||||||
mod check_const_item_mutation;
|
|
||||||
mod check_packed_ref;
|
|
||||||
mod check_undefined_transmutes;
|
|
||||||
// This pass is public to allow external drivers to perform MIR cleanup
|
|
||||||
pub mod cleanup_post_borrowck;
|
|
||||||
mod copy_prop;
|
|
||||||
mod coroutine;
|
|
||||||
mod cost_checker;
|
mod cost_checker;
|
||||||
mod coverage;
|
|
||||||
mod cross_crate_inline;
|
mod cross_crate_inline;
|
||||||
mod ctfe_limit;
|
|
||||||
mod dataflow_const_prop;
|
|
||||||
mod dead_store_elimination;
|
|
||||||
mod deduce_param_attrs;
|
mod deduce_param_attrs;
|
||||||
mod deduplicate_blocks;
|
|
||||||
mod deref_separator;
|
|
||||||
mod dest_prop;
|
|
||||||
pub mod dump_mir;
|
|
||||||
mod early_otherwise_branch;
|
|
||||||
mod elaborate_box_derefs;
|
|
||||||
mod elaborate_drops;
|
|
||||||
mod errors;
|
mod errors;
|
||||||
mod ffi_unwind_calls;
|
mod ffi_unwind_calls;
|
||||||
mod function_item_references;
|
|
||||||
mod gvn;
|
|
||||||
// Made public so that `mir_drops_elaborated_and_const_checked` can be overridden
|
|
||||||
// by custom rustc drivers, running all the steps by themselves. See #114628.
|
|
||||||
pub mod inline;
|
|
||||||
mod instsimplify;
|
|
||||||
mod jump_threading;
|
|
||||||
mod known_panics_lint;
|
|
||||||
mod large_enums;
|
|
||||||
mod lint;
|
mod lint;
|
||||||
mod lower_intrinsics;
|
|
||||||
mod lower_slice_len;
|
|
||||||
mod match_branches;
|
|
||||||
mod mentioned_items;
|
|
||||||
mod multiple_return_terminators;
|
|
||||||
mod nrvo;
|
|
||||||
mod post_drop_elaboration;
|
|
||||||
mod prettify;
|
|
||||||
mod promote_consts;
|
|
||||||
mod ref_prop;
|
|
||||||
mod remove_noop_landing_pads;
|
|
||||||
mod remove_place_mention;
|
|
||||||
mod remove_storage_markers;
|
|
||||||
mod remove_uninit_drops;
|
|
||||||
mod remove_unneeded_drops;
|
|
||||||
mod remove_zsts;
|
|
||||||
mod required_consts;
|
|
||||||
mod reveal_all;
|
|
||||||
mod sanity_check;
|
|
||||||
mod shim;
|
mod shim;
|
||||||
mod ssa;
|
mod ssa;
|
||||||
|
|
||||||
|
/// We import passes via this macro so that we can have a static list of pass names
|
||||||
|
/// (used to verify CLI arguments). It takes a list of modules, followed by the passes
|
||||||
|
/// declared within them.
|
||||||
|
/// ```ignore,macro-test
|
||||||
|
/// declare_passes! {
|
||||||
|
/// // Declare a single pass from the module `abort_unwinding_calls`
|
||||||
|
/// mod abort_unwinding_calls : AbortUnwindingCalls;
|
||||||
|
/// // When passes are grouped together as an enum, declare the two constituent passes
|
||||||
|
/// mod add_call_guards : AddCallGuards {
|
||||||
|
/// AllCallEdges,
|
||||||
|
/// CriticalCallEdges
|
||||||
|
/// };
|
||||||
|
/// // Declares multiple pass groups, each containing their own constituent passes
|
||||||
|
/// mod simplify : SimplifyCfg {
|
||||||
|
/// Initial,
|
||||||
|
/// /* omitted */
|
||||||
|
/// }, SimplifyLocals {
|
||||||
|
/// BeforeConstProp,
|
||||||
|
/// /* omitted */
|
||||||
|
/// };
|
||||||
|
/// }
|
||||||
|
/// ```
|
||||||
|
macro_rules! declare_passes {
|
||||||
|
(
|
||||||
|
$(
|
||||||
|
$vis:vis mod $mod_name:ident : $($pass_name:ident $( { $($ident:ident),* } )?),+ $(,)?;
|
||||||
|
)*
|
||||||
|
) => {
|
||||||
|
$(
|
||||||
|
$vis mod $mod_name;
|
||||||
|
$(
|
||||||
|
// Make sure the type name is correct
|
||||||
|
#[allow(unused_imports)]
|
||||||
|
use $mod_name::$pass_name as _;
|
||||||
|
)+
|
||||||
|
)*
|
||||||
|
|
||||||
|
#[cfg(debug_assertions)]
|
||||||
|
static PASS_NAMES: LazyLock<Vec<String>> = LazyLock::new(|| vec![
|
||||||
|
// Fake marker pass
|
||||||
|
"PreCodegen".to_string(),
|
||||||
|
$(
|
||||||
|
$(
|
||||||
|
stringify!($pass_name).to_string(),
|
||||||
|
$(
|
||||||
|
$(
|
||||||
|
$mod_name::$pass_name::$ident.name().to_string(),
|
||||||
|
)*
|
||||||
|
)?
|
||||||
|
)+
|
||||||
|
)*
|
||||||
|
]);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
declare_passes! {
|
||||||
|
mod abort_unwinding_calls : AbortUnwindingCalls;
|
||||||
|
mod add_call_guards : AddCallGuards { AllCallEdges, CriticalCallEdges };
|
||||||
|
mod add_moves_for_packed_drops : AddMovesForPackedDrops;
|
||||||
|
mod add_retag : AddRetag;
|
||||||
|
mod add_subtyping_projections : Subtyper;
|
||||||
|
mod check_alignment : CheckAlignment;
|
||||||
|
mod check_const_item_mutation : CheckConstItemMutation;
|
||||||
|
mod check_packed_ref : CheckPackedRef;
|
||||||
|
mod check_undefined_transmutes : CheckUndefinedTransmutes;
|
||||||
// This pass is public to allow external drivers to perform MIR cleanup
|
// This pass is public to allow external drivers to perform MIR cleanup
|
||||||
pub mod simplify;
|
pub mod cleanup_post_borrowck : CleanupPostBorrowck;
|
||||||
mod simplify_branches;
|
|
||||||
mod simplify_comparison_integral;
|
mod copy_prop : CopyProp;
|
||||||
mod single_use_consts;
|
mod coroutine : StateTransform;
|
||||||
mod sroa;
|
mod coverage : InstrumentCoverage;
|
||||||
mod unreachable_enum_branching;
|
mod ctfe_limit : CtfeLimit;
|
||||||
mod unreachable_prop;
|
mod dataflow_const_prop : DataflowConstProp;
|
||||||
mod validate;
|
mod dead_store_elimination : DeadStoreElimination {
|
||||||
|
Initial,
|
||||||
|
Final
|
||||||
|
};
|
||||||
|
mod deduplicate_blocks : DeduplicateBlocks;
|
||||||
|
mod deref_separator : Derefer;
|
||||||
|
mod dest_prop : DestinationPropagation;
|
||||||
|
pub mod dump_mir : Marker;
|
||||||
|
mod early_otherwise_branch : EarlyOtherwiseBranch;
|
||||||
|
mod elaborate_box_derefs : ElaborateBoxDerefs;
|
||||||
|
mod elaborate_drops : ElaborateDrops;
|
||||||
|
mod function_item_references : FunctionItemReferences;
|
||||||
|
mod gvn : GVN;
|
||||||
|
// Made public so that `mir_drops_elaborated_and_const_checked` can be overridden
|
||||||
|
// by custom rustc drivers, running all the steps by themselves. See #114628.
|
||||||
|
pub mod inline : Inline;
|
||||||
|
mod instsimplify : InstSimplify { BeforeInline, AfterSimplifyCfg };
|
||||||
|
mod jump_threading : JumpThreading;
|
||||||
|
mod known_panics_lint : KnownPanicsLint;
|
||||||
|
mod large_enums : EnumSizeOpt;
|
||||||
|
mod lower_intrinsics : LowerIntrinsics;
|
||||||
|
mod lower_slice_len : LowerSliceLenCalls;
|
||||||
|
mod match_branches : MatchBranchSimplification;
|
||||||
|
mod mentioned_items : MentionedItems;
|
||||||
|
mod multiple_return_terminators : MultipleReturnTerminators;
|
||||||
|
mod nrvo : RenameReturnPlace;
|
||||||
|
mod post_drop_elaboration : CheckLiveDrops;
|
||||||
|
mod prettify : ReorderBasicBlocks, ReorderLocals;
|
||||||
|
mod promote_consts : PromoteTemps;
|
||||||
|
mod ref_prop : ReferencePropagation;
|
||||||
|
mod remove_noop_landing_pads : RemoveNoopLandingPads;
|
||||||
|
mod remove_place_mention : RemovePlaceMention;
|
||||||
|
mod remove_storage_markers : RemoveStorageMarkers;
|
||||||
|
mod remove_uninit_drops : RemoveUninitDrops;
|
||||||
|
mod remove_unneeded_drops : RemoveUnneededDrops;
|
||||||
|
mod remove_zsts : RemoveZsts;
|
||||||
|
mod required_consts : RequiredConstsVisitor;
|
||||||
|
mod reveal_all : RevealAll;
|
||||||
|
mod sanity_check : SanityCheck;
|
||||||
|
// This pass is public to allow external drivers to perform MIR cleanup
|
||||||
|
pub mod simplify :
|
||||||
|
SimplifyCfg {
|
||||||
|
Initial,
|
||||||
|
PromoteConsts,
|
||||||
|
RemoveFalseEdges,
|
||||||
|
PostAnalysis,
|
||||||
|
PreOptimizations,
|
||||||
|
Final,
|
||||||
|
MakeShim,
|
||||||
|
AfterUnreachableEnumBranching
|
||||||
|
},
|
||||||
|
SimplifyLocals {
|
||||||
|
BeforeConstProp,
|
||||||
|
AfterGVN,
|
||||||
|
Final
|
||||||
|
};
|
||||||
|
mod simplify_branches : SimplifyConstCondition {
|
||||||
|
AfterConstProp,
|
||||||
|
Final
|
||||||
|
};
|
||||||
|
mod simplify_comparison_integral : SimplifyComparisonIntegral;
|
||||||
|
mod single_use_consts : SingleUseConsts;
|
||||||
|
mod sroa : ScalarReplacementOfAggregates;
|
||||||
|
mod unreachable_enum_branching : UnreachableEnumBranching;
|
||||||
|
mod unreachable_prop : UnreachablePropagation;
|
||||||
|
mod validate : Validator;
|
||||||
|
}
|
||||||
|
|
||||||
rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
|
rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
use std::cell::RefCell;
|
use std::cell::RefCell;
|
||||||
use std::collections::hash_map::Entry;
|
use std::collections::hash_map::Entry;
|
||||||
|
|
||||||
use rustc_data_structures::fx::FxHashMap;
|
use rustc_data_structures::fx::{FxHashMap, FxIndexSet};
|
||||||
use rustc_middle::mir::{self, Body, MirPhase, RuntimePhase};
|
use rustc_middle::mir::{self, Body, MirPhase, RuntimePhase};
|
||||||
use rustc_middle::ty::TyCtxt;
|
use rustc_middle::ty::TyCtxt;
|
||||||
use rustc_session::Session;
|
use rustc_session::Session;
|
||||||
|
@ -198,6 +198,16 @@ fn run_passes_inner<'tcx>(
|
||||||
let overridden_passes = &tcx.sess.opts.unstable_opts.mir_enable_passes;
|
let overridden_passes = &tcx.sess.opts.unstable_opts.mir_enable_passes;
|
||||||
trace!(?overridden_passes);
|
trace!(?overridden_passes);
|
||||||
|
|
||||||
|
#[cfg(debug_assertions)]
|
||||||
|
{
|
||||||
|
let used_passes: FxIndexSet<_> = passes.iter().map(|p| p.name()).collect();
|
||||||
|
let known_passes: FxIndexSet<_> = crate::PASS_NAMES.iter().map(|p| p.as_str()).collect();
|
||||||
|
|
||||||
|
for &name in used_passes.difference(&known_passes) {
|
||||||
|
tcx.dcx().bug(format!("pass `{name}` is not declared in `PASS_NAMES`"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let prof_arg = tcx.sess.prof.enabled().then(|| format!("{:?}", body.source.def_id()));
|
let prof_arg = tcx.sess.prof.enabled().then(|| format!("{:?}", body.source.def_id()));
|
||||||
|
|
||||||
if !body.should_skip() {
|
if !body.should_skip() {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue