]> git.proxmox.com Git - rustc.git/blob - src/librustc_mir/transform/dump_mir.rs
New upstream version 1.41.1+dfsg1
[rustc.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::{Body, BodyAndCache};
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<'tcx> MirPass<'tcx> for Marker {
17 fn name(&self) -> Cow<'_, str> {
18 Cow::Borrowed(self.0)
19 }
20
21 fn run_pass(
22 &self, _tcx: TyCtxt<'tcx>, _source: MirSource<'tcx>, _body: &mut BodyAndCache<'tcx>
23 ) {}
24 }
25
26 pub struct Disambiguator {
27 is_after: bool
28 }
29
30 impl fmt::Display for Disambiguator {
31 fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
32 let title = if self.is_after { "after" } else { "before" };
33 write!(formatter, "{}", title)
34 }
35 }
36
37 pub fn on_mir_pass<'tcx>(
38 tcx: TyCtxt<'tcx>,
39 pass_num: &dyn fmt::Display,
40 pass_name: &str,
41 source: MirSource<'tcx>,
42 body: &Body<'tcx>,
43 is_after: bool,
44 ) {
45 if mir_util::dump_enabled(tcx, pass_name, source) {
46 mir_util::dump_mir(tcx,
47 Some(pass_num),
48 pass_name,
49 &Disambiguator { is_after },
50 source,
51 body,
52 |_, _| Ok(()) );
53 }
54 }
55
56 pub fn emit_mir(tcx: TyCtxt<'_>, outputs: &OutputFilenames) -> io::Result<()> {
57 let path = outputs.path(OutputType::Mir);
58 let mut f = File::create(&path)?;
59 mir_util::write_mir_pretty(tcx, None, &mut f)?;
60 Ok(())
61 }