]> git.lizzy.rs Git - rust.git/blob - compiler/rustc_mir/src/transform/dump_mir.rs
Rollup merge of #81904 - jhpratt:const_int_fn-stabilization, r=jyn514
[rust.git] / compiler / rustc_mir / src / 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;
9 use crate::util as mir_util;
10 use rustc_middle::mir::Body;
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 mir_util::dump_enabled(tcx, pass_name, body.source.def_id()) {
43         mir_util::dump_mir(
44             tcx,
45             Some(pass_num),
46             pass_name,
47             &Disambiguator { is_after },
48             body,
49             |_, _| Ok(()),
50         );
51     }
52 }
53
54 pub fn emit_mir(tcx: TyCtxt<'_>, outputs: &OutputFilenames) -> io::Result<()> {
55     let path = outputs.path(OutputType::Mir);
56     let mut f = io::BufWriter::new(File::create(&path)?);
57     mir_util::write_mir_pretty(tcx, None, &mut f)?;
58     Ok(())
59 }