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