diff --git a/Cargo.lock b/Cargo.lock index 9b2bcfd1e8b8c..ddb66892181d3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3831,7 +3831,6 @@ dependencies = [ "rustc_metadata", "rustc_middle", "rustc_mir_build", - "rustc_mir_transform", "rustc_parse", "rustc_public", "rustc_resolve", diff --git a/compiler/rustc_driver_impl/Cargo.toml b/compiler/rustc_driver_impl/Cargo.toml index 10e1b1987194a..aeb2063e76960 100644 --- a/compiler/rustc_driver_impl/Cargo.toml +++ b/compiler/rustc_driver_impl/Cargo.toml @@ -27,7 +27,6 @@ rustc_macros = { path = "../rustc_macros" } rustc_metadata = { path = "../rustc_metadata" } rustc_middle = { path = "../rustc_middle" } rustc_mir_build = { path = "../rustc_mir_build" } -rustc_mir_transform = { path = "../rustc_mir_transform" } rustc_parse = { path = "../rustc_parse" } rustc_public = { path = "../rustc_public", features = ["rustc_internal"] } rustc_resolve = { path = "../rustc_resolve" } diff --git a/compiler/rustc_driver_impl/src/lib.rs b/compiler/rustc_driver_impl/src/lib.rs index aaac65721dfab..73de6cf94d5a8 100644 --- a/compiler/rustc_driver_impl/src/lib.rs +++ b/compiler/rustc_driver_impl/src/lib.rs @@ -6,6 +6,7 @@ // tidy-alphabetical-start #![feature(decl_macro)] +#![feature(file_buffered)] #![feature(panic_backtrace_config)] #![feature(panic_update_hook)] #![feature(trim_prefix_suffix)] @@ -333,7 +334,7 @@ pub fn run_compiler(at_args: &[String], callbacks: &mut (dyn Callbacks + Send)) } if tcx.sess.opts.output_types.contains_key(&OutputType::Mir) { - if let Err(error) = rustc_mir_transform::dump_mir::emit_mir(tcx) { + if let Err(error) = pretty::emit_mir(tcx) { tcx.dcx().emit_fatal(CantEmitMIR { error }); } } diff --git a/compiler/rustc_driver_impl/src/pretty.rs b/compiler/rustc_driver_impl/src/pretty.rs index 3d3906637b8b1..426ead704ab83 100644 --- a/compiler/rustc_driver_impl/src/pretty.rs +++ b/compiler/rustc_driver_impl/src/pretty.rs @@ -2,6 +2,8 @@ use std::cell::Cell; use std::fmt::Write; +use std::fs::File; +use std::io; use rustc_ast as ast; use rustc_ast_pretty::pprust as pprust_ast; @@ -12,7 +14,7 @@ use rustc_middle::ty::{self, TyCtxt}; use rustc_mir_build::thir::print::{thir_flat, thir_tree}; use rustc_public::rustc_internal::pretty::write_smir_pretty; use rustc_session::Session; -use rustc_session::config::{OutFileName, PpHirMode, PpMode, PpSourceMode}; +use rustc_session::config::{OutFileName, OutputType, PpHirMode, PpMode, PpSourceMode}; use rustc_span::{FileName, Ident}; use tracing::debug; @@ -340,3 +342,21 @@ pub fn print<'tcx>(sess: &Session, ppm: PpMode, ex: PrintExtra<'tcx>) { write_or_print(&out, sess); } + +/// Implementation of `--emit=mir`. +pub fn emit_mir(tcx: TyCtxt<'_>) -> io::Result<()> { + match tcx.output_filenames(()).path(OutputType::Mir) { + OutFileName::Stdout => { + let mut f = io::stdout(); + write_mir_pretty(tcx, &mut f)?; + } + OutFileName::Real(path) => { + let mut f = File::create_buffered(&path)?; + write_mir_pretty(tcx, &mut f)?; + if tcx.sess.opts.json_artifact_notifications { + tcx.dcx().emit_artifact_notification(&path, "mir"); + } + } + } + Ok(()) +} diff --git a/compiler/rustc_mir_transform/src/dump_mir.rs b/compiler/rustc_mir_transform/src/dump_mir.rs deleted file mode 100644 index 50d4e9894e74a..0000000000000 --- a/compiler/rustc_mir_transform/src/dump_mir.rs +++ /dev/null @@ -1,39 +0,0 @@ -//! This pass just dumps MIR at a specified point. - -use std::fs::File; -use std::io; - -use rustc_middle::mir::{Body, write_mir_pretty}; -use rustc_middle::ty::TyCtxt; -use rustc_session::config::{OutFileName, OutputType}; - -pub(super) struct Marker(pub &'static str); - -impl<'tcx> crate::MirPass<'tcx> for Marker { - fn name(&self) -> &'static str { - self.0 - } - - fn run_pass(&self, _tcx: TyCtxt<'tcx>, _body: &mut Body<'tcx>) {} - - fn is_required(&self) -> bool { - false - } -} - -pub fn emit_mir(tcx: TyCtxt<'_>) -> io::Result<()> { - match tcx.output_filenames(()).path(OutputType::Mir) { - OutFileName::Stdout => { - let mut f = io::stdout(); - write_mir_pretty(tcx, &mut f)?; - } - OutFileName::Real(path) => { - let mut f = File::create_buffered(&path)?; - write_mir_pretty(tcx, &mut f)?; - if tcx.sess.opts.json_artifact_notifications { - tcx.dcx().emit_artifact_notification(&path, "mir"); - } - } - } - Ok(()) -} diff --git a/compiler/rustc_mir_transform/src/lib.rs b/compiler/rustc_mir_transform/src/lib.rs index 91dfffcf1a6a5..6b086c29ba8ae 100644 --- a/compiler/rustc_mir_transform/src/lib.rs +++ b/compiler/rustc_mir_transform/src/lib.rs @@ -2,7 +2,6 @@ #![feature(box_patterns)] #![feature(const_type_name)] #![feature(cow_is_borrowed)] -#![feature(file_buffered)] #![feature(impl_trait_in_assoc_type)] #![feature(iterator_try_collect)] #![feature(try_blocks)] @@ -91,8 +90,6 @@ macro_rules! declare_passes { static PASS_NAMES: LazyLock> = LazyLock::new(|| { let mut set = FxIndexSet::default(); - // Fake marker pass - set.insert("PreCodegen"); $( $( set.extend(pass_names!($mod_name : $pass_name $( { $($ident),* } )? )); @@ -145,7 +142,6 @@ declare_passes! { }; mod deref_separator : Derefer; mod dest_prop : DestinationPropagation; - pub mod dump_mir : Marker; mod early_otherwise_branch : EarlyOtherwiseBranch; mod erase_deref_temps : EraseDerefTemps; mod elaborate_box_derefs : ElaborateBoxDerefs; @@ -162,6 +158,7 @@ declare_passes! { mod large_enums : EnumSizeOpt; mod lower_intrinsics : LowerIntrinsics; mod lower_slice_len : LowerSliceLenCalls; + mod marker : PreCodegen; mod match_branches : MatchBranchSimplification; mod mentioned_items : MentionedItems; mod multiple_return_terminators : MultipleReturnTerminators; @@ -771,8 +768,9 @@ pub(crate) fn run_optimization_passes<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<' // Cleanup for human readability, off by default. &prettify::ReorderBasicBlocks, &prettify::ReorderLocals, - // Dump the end result for testing and debugging purposes. - &dump_mir::Marker("PreCodegen"), + // Dummy pass to allow dumping the final pre-codegen MIR for testing/debugging. + // This must be the final pass! + &marker::PreCodegen, ], Some(MirPhase::Runtime(RuntimePhase::Optimized)), optimizations, diff --git a/compiler/rustc_mir_transform/src/marker.rs b/compiler/rustc_mir_transform/src/marker.rs new file mode 100644 index 0000000000000..ed324097b728a --- /dev/null +++ b/compiler/rustc_mir_transform/src/marker.rs @@ -0,0 +1,20 @@ +use rustc_middle::mir::Body; +use rustc_middle::ty::TyCtxt; + +/// Dummy pass that does nothing, to be used as the final pass. +/// +/// Its existence allows `-Zdump-mir` and mir-opt tests to easily dump +/// the final MIR just before codegen, by dumping the input or output +/// of the `PreCodegen` pass. +pub(super) struct PreCodegen; + +impl<'tcx> crate::MirPass<'tcx> for PreCodegen { + fn run_pass(&self, _tcx: TyCtxt<'tcx>, _body: &mut Body<'tcx>) { + // This is a dummy pass, so the pass itself doesn't do anything. + // Dumping is performed by the normal `-Zdump-mir` machinery. + } + + fn is_required(&self) -> bool { + false + } +}