]> git.lizzy.rs Git - rust.git/blob - compiler/rustc_mir_transform/src/dump_mir.rs
Merge commit 'efa8f5521d3813cc897ba29ea0ef98c7aef66bb6' into rustfmt-subtree
[rust.git] / compiler / rustc_mir_transform / src / dump_mir.rs
1 //! This pass just dumps MIR at a specified point.
2
3 use std::borrow::Cow;
4 use std::fmt;
5 use std::fs::File;
6 use std::io;
7
8 use crate::MirPass;
9 use rustc_middle::mir::Body;
10 use rustc_middle::mir::{dump_enabled, dump_mir, write_mir_pretty};
11 use rustc_middle::ty::TyCtxt;
12 use rustc_session::config::{OutputFilenames, OutputType};
13
14 pub struct Marker(pub &'static str);
15
16 impl<'tcx> MirPass<'tcx> for Marker {
17     fn name(&self) -> Cow<'_, str> {
18         Cow::Borrowed(self.0)
19     }
20
21     fn run_pass(&self, _tcx: TyCtxt<'tcx>, _body: &mut Body<'tcx>) {}
22 }
23
24 pub struct Disambiguator {
25     is_after: bool,
26 }
27
28 impl fmt::Display for Disambiguator {
29     fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
30         let title = if self.is_after { "after" } else { "before" };
31         write!(formatter, "{}", title)
32     }
33 }
34
35 pub fn on_mir_pass<'tcx>(
36     tcx: TyCtxt<'tcx>,
37     pass_num: &dyn fmt::Display,
38     pass_name: &str,
39     body: &Body<'tcx>,
40     is_after: bool,
41 ) {
42     if dump_enabled(tcx, pass_name, body.source.def_id()) {
43         dump_mir(tcx, Some(pass_num), pass_name, &Disambiguator { is_after }, body, |_, _| Ok(()));
44     }
45 }
46
47 pub fn emit_mir(tcx: TyCtxt<'_>, outputs: &OutputFilenames) -> io::Result<()> {
48     let path = outputs.path(OutputType::Mir);
49     let mut f = io::BufWriter::new(File::create(&path)?);
50     write_mir_pretty(tcx, None, &mut f)?;
51     Ok(())
52 }