Teach rustc --emit=mir

This commit is contained in:
Jake Goulding 2017-02-16 16:59:09 -05:00
parent 58c701f5c7
commit 9218f9772a
4 changed files with 29 additions and 0 deletions

View File

@ -82,6 +82,7 @@ pub enum OutputType {
Bitcode, Bitcode,
Assembly, Assembly,
LlvmAssembly, LlvmAssembly,
Mir,
Metadata, Metadata,
Object, Object,
Exe, Exe,
@ -96,6 +97,7 @@ impl OutputType {
OutputType::Bitcode | OutputType::Bitcode |
OutputType::Assembly | OutputType::Assembly |
OutputType::LlvmAssembly | OutputType::LlvmAssembly |
OutputType::Mir |
OutputType::Object | OutputType::Object |
OutputType::Metadata => false, OutputType::Metadata => false,
} }
@ -106,6 +108,7 @@ impl OutputType {
OutputType::Bitcode => "llvm-bc", OutputType::Bitcode => "llvm-bc",
OutputType::Assembly => "asm", OutputType::Assembly => "asm",
OutputType::LlvmAssembly => "llvm-ir", OutputType::LlvmAssembly => "llvm-ir",
OutputType::Mir => "mir",
OutputType::Object => "obj", OutputType::Object => "obj",
OutputType::Metadata => "metadata", OutputType::Metadata => "metadata",
OutputType::Exe => "link", OutputType::Exe => "link",
@ -118,6 +121,7 @@ impl OutputType {
OutputType::Bitcode => "bc", OutputType::Bitcode => "bc",
OutputType::Assembly => "s", OutputType::Assembly => "s",
OutputType::LlvmAssembly => "ll", OutputType::LlvmAssembly => "ll",
OutputType::Mir => "mir",
OutputType::Object => "o", OutputType::Object => "o",
OutputType::Metadata => "rmeta", OutputType::Metadata => "rmeta",
OutputType::DepInfo => "d", OutputType::DepInfo => "d",
@ -172,6 +176,7 @@ impl OutputTypes {
OutputType::Bitcode | OutputType::Bitcode |
OutputType::Assembly | OutputType::Assembly |
OutputType::LlvmAssembly | OutputType::LlvmAssembly |
OutputType::Mir |
OutputType::Object | OutputType::Object |
OutputType::Exe => true, OutputType::Exe => true,
OutputType::Metadata | OutputType::Metadata |
@ -1370,6 +1375,7 @@ pub fn build_session_options_and_crate_config(matches: &getopts::Matches)
let output_type = match parts.next().unwrap() { let output_type = match parts.next().unwrap() {
"asm" => OutputType::Assembly, "asm" => OutputType::Assembly,
"llvm-ir" => OutputType::LlvmAssembly, "llvm-ir" => OutputType::LlvmAssembly,
"mir" => OutputType::Mir,
"llvm-bc" => OutputType::Bitcode, "llvm-bc" => OutputType::Bitcode,
"obj" => OutputType::Object, "obj" => OutputType::Object,
"metadata" => OutputType::Metadata, "metadata" => OutputType::Metadata,

View File

@ -209,6 +209,13 @@ pub fn compile_input(sess: &Session,
tcx.print_debug_stats(); tcx.print_debug_stats();
} }
if tcx.sess.opts.output_types.contains_key(&OutputType::Mir) {
if let Err(e) = mir::transform::dump_mir::emit_mir(tcx, &outputs) {
sess.err(&format!("could not emit MIR: {}", e));
sess.abort_if_errors();
}
}
Ok((outputs, trans)) Ok((outputs, trans))
})?? })??
}; };

View File

@ -11,7 +11,10 @@
//! This pass just dumps MIR at a specified point. //! This pass just dumps MIR at a specified point.
use std::fmt; use std::fmt;
use std::fs::File;
use std::io;
use rustc::session::config::{OutputFilenames, OutputType};
use rustc::ty::TyCtxt; use rustc::ty::TyCtxt;
use rustc::mir::*; use rustc::mir::*;
use rustc::mir::transform::{Pass, MirPass, MirPassHook, MirSource}; use rustc::mir::transform::{Pass, MirPass, MirPassHook, MirSource};
@ -70,3 +73,14 @@ impl<'tcx> MirPassHook<'tcx> for DumpMir {
} }
impl<'b> Pass for DumpMir {} impl<'b> Pass for DumpMir {}
pub fn emit_mir<'a, 'tcx>(
tcx: TyCtxt<'a, 'tcx, 'tcx>,
outputs: &OutputFilenames)
-> io::Result<()>
{
let path = outputs.path(OutputType::Mir);
let mut f = File::create(&path)?;
mir_util::write_mir_pretty(tcx, tcx.maps.mir.borrow().keys().into_iter(), &mut f)?;
Ok(())
}

View File

@ -741,6 +741,7 @@ pub fn run_passes(sess: &Session,
modules_config.emit_obj = true; modules_config.emit_obj = true;
metadata_config.emit_obj = true; metadata_config.emit_obj = true;
}, },
OutputType::Mir => {}
OutputType::DepInfo => {} OutputType::DepInfo => {}
} }
} }
@ -880,6 +881,7 @@ pub fn run_passes(sess: &Session,
user_wants_objects = true; user_wants_objects = true;
copy_if_one_unit(OutputType::Object, true); copy_if_one_unit(OutputType::Object, true);
} }
OutputType::Mir |
OutputType::Metadata | OutputType::Metadata |
OutputType::Exe | OutputType::Exe |
OutputType::DepInfo => {} OutputType::DepInfo => {}