]> git.lizzy.rs Git - rust.git/blob - src/librustc_mir/transform/dump_mir.rs
Update const_forget.rs
[rust.git] / src / librustc_mir / transform / 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::transform::{MirPass, MirSource};
9 use crate::util as mir_util;
10 use rustc::mir::{Body, BodyAndCache};
11 use rustc::session::config::{OutputFilenames, OutputType};
12 use rustc::ty::TyCtxt;
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(
22         &self,
23         _tcx: TyCtxt<'tcx>,
24         _source: MirSource<'tcx>,
25         _body: &mut BodyAndCache<'tcx>,
26     ) {
27     }
28 }
29
30 pub struct Disambiguator {
31     is_after: bool,
32 }
33
34 impl fmt::Display for Disambiguator {
35     fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
36         let title = if self.is_after { "after" } else { "before" };
37         write!(formatter, "{}", title)
38     }
39 }
40
41 pub fn on_mir_pass<'tcx>(
42     tcx: TyCtxt<'tcx>,
43     pass_num: &dyn fmt::Display,
44     pass_name: &str,
45     source: MirSource<'tcx>,
46     body: &Body<'tcx>,
47     is_after: bool,
48 ) {
49     if mir_util::dump_enabled(tcx, pass_name, source) {
50         mir_util::dump_mir(
51             tcx,
52             Some(pass_num),
53             pass_name,
54             &Disambiguator { is_after },
55             source,
56             body,
57             |_, _| Ok(()),
58         );
59     }
60 }
61
62 pub fn emit_mir(tcx: TyCtxt<'_>, outputs: &OutputFilenames) -> io::Result<()> {
63     let path = outputs.path(OutputType::Mir);
64     let mut f = io::BufWriter::new(File::create(&path)?);
65     mir_util::write_mir_pretty(tcx, None, &mut f)?;
66     Ok(())
67 }