| //! 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, None, &mut f)?; | |
| } | |
| OutFileName::Real(path) => { | |
| let mut f = File::create_buffered(&path)?; | |
| write_mir_pretty(tcx, None, &mut f)?; | |
| if tcx.sess.opts.json_artifact_notifications { | |
| tcx.dcx().emit_artifact_notification(&path, "mir"); | |
| } | |
| } | |
| } | |
| Ok(()) | |
| } |