From 63cdd7ab50377323aaa997af78c6ac65611767ec Mon Sep 17 00:00:00 2001 From: Ariel Ben-Yehuda Date: Thu, 16 Jun 2016 16:52:20 +0300 Subject: [PATCH 1/3] use a different filename for original and promoted MIRs --- src/librustc_mir/pretty.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/librustc_mir/pretty.rs b/src/librustc_mir/pretty.rs index 856d6cda5af0f..95769a7a50b02 100644 --- a/src/librustc_mir/pretty.rs +++ b/src/librustc_mir/pretty.rs @@ -61,8 +61,13 @@ pub fn dump_mir<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, return; } - let file_name = format!("rustc.node{}.{}.{}.mir", - node_id, pass_name, disambiguator); + let promotion_id = match src { + MirSource::Promoted(_, id) => format!("-promoted{}", id), + _ => String::new() + }; + + let file_name = format!("rustc.node{}{}.{}.{}.mir", + node_id, promotion_id, pass_name, disambiguator); let _ = fs::File::create(&file_name).and_then(|mut file| { try!(writeln!(file, "// MIR for `{}`", node_path)); try!(writeln!(file, "// node_id = {}", node_id)); From 5da8bf8402a422720a659673e465c7d70d494995 Mon Sep 17 00:00:00 2001 From: Ariel Ben-Yehuda Date: Thu, 16 Jun 2016 16:52:37 +0300 Subject: [PATCH 2/3] stop having `'static` in dump-mir names --- src/librustc_mir/transform/simplify_branches.rs | 3 +++ src/librustc_mir/transform/simplify_cfg.rs | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/librustc_mir/transform/simplify_branches.rs b/src/librustc_mir/transform/simplify_branches.rs index f93de6ca382bb..b4960c677a16e 100644 --- a/src/librustc_mir/transform/simplify_branches.rs +++ b/src/librustc_mir/transform/simplify_branches.rs @@ -60,4 +60,7 @@ impl<'l> Pass for SimplifyBranches<'l> { fn disambiguator<'a>(&'a self) -> Option> { Some(Box::new(self.label)) } + + // avoid calling `type_name` - it contains `<'static>` + fn name(&self) -> &str { "SimplifyBranches" } } diff --git a/src/librustc_mir/transform/simplify_cfg.rs b/src/librustc_mir/transform/simplify_cfg.rs index 8bbcc3fe2d70f..c0e7e54050adf 100644 --- a/src/librustc_mir/transform/simplify_cfg.rs +++ b/src/librustc_mir/transform/simplify_cfg.rs @@ -62,6 +62,9 @@ impl<'l> Pass for SimplifyCfg<'l> { fn disambiguator<'a>(&'a self) -> Option> { Some(Box::new(self.label)) } + + // avoid calling `type_name` - it contains `<'static>` + fn name(&self) -> &str { "SimplifyCfg" } } pub struct CfgSimplifier<'a, 'tcx: 'a> { From a6d694ea0095be73aff9c29ccc2d5da260b3bfae Mon Sep 17 00:00:00 2001 From: Ariel Ben-Yehuda Date: Thu, 16 Jun 2016 17:30:09 +0300 Subject: [PATCH 3/3] fix MirSource::Promoted handling --- src/librustc/mir/transform.rs | 21 ++++++++++--------- src/librustc_mir/pretty.rs | 6 +++--- src/librustc_mir/transform/add_call_guards.rs | 5 +---- 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/src/librustc/mir/transform.rs b/src/librustc/mir/transform.rs index f17984d380459..4ca3907d4e602 100644 --- a/src/librustc/mir/transform.rs +++ b/src/librustc/mir/transform.rs @@ -13,7 +13,7 @@ use hir; use hir::map::DefPathData; use hir::def_id::DefId; use mir::mir_map::MirMap; -use mir::repr::Mir; +use mir::repr::{Mir, Promoted}; use ty::TyCtxt; use syntax::ast::NodeId; @@ -32,7 +32,7 @@ pub enum MirSource { Static(NodeId, hir::Mutability), /// Promoted rvalues within a function. - Promoted(NodeId, usize) + Promoted(NodeId, Promoted) } impl<'a, 'tcx> MirSource { @@ -77,7 +77,12 @@ pub trait Pass { DepNode::MirPass(def_id) } fn name(&self) -> &str { - unsafe { ::std::intrinsics::type_name::() } + let name = unsafe { ::std::intrinsics::type_name::() }; + if let Some(tail) = name.rfind(":") { + &name[tail+1..] + } else { + name + } } fn disambiguator<'a>(&'a self) -> Option> { None } } @@ -104,11 +109,6 @@ pub trait MirPassHook<'tcx>: Pass { /// A pass which inspects Mir of functions in isolation. pub trait MirPass<'tcx>: Pass { - fn run_pass_on_promoted<'a>(&mut self, tcx: TyCtxt<'a, 'tcx, 'tcx>, - item_id: NodeId, index: usize, - mir: &mut Mir<'tcx>) { - self.run_pass(tcx, MirSource::Promoted(item_id, index), mir); - } fn run_pass<'a>(&mut self, tcx: TyCtxt<'a, 'tcx, 'tcx>, src: MirSource, mir: &mut Mir<'tcx>); } @@ -133,11 +133,12 @@ impl<'tcx, T: MirPass<'tcx>> MirMapPass<'tcx> for T { hook.on_mir_pass(tcx, src, mir, self, true); } - for (i, mir) in mir.promoted.iter_mut().enumerate() { + for (i, mir) in mir.promoted.iter_enumerated_mut() { + let src = MirSource::Promoted(id, i); for hook in &mut *hooks { hook.on_mir_pass(tcx, src, mir, self, false); } - self.run_pass_on_promoted(tcx, id, i, mir); + MirPass::run_pass(self, tcx, src, mir); for hook in &mut *hooks { hook.on_mir_pass(tcx, src, mir, self, true); } diff --git a/src/librustc_mir/pretty.rs b/src/librustc_mir/pretty.rs index 95769a7a50b02..515620d425389 100644 --- a/src/librustc_mir/pretty.rs +++ b/src/librustc_mir/pretty.rs @@ -62,7 +62,7 @@ pub fn dump_mir<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, } let promotion_id = match src { - MirSource::Promoted(_, id) => format!("-promoted{}", id), + MirSource::Promoted(_, id) => format!("-{:?}", id), _ => String::new() }; @@ -98,7 +98,7 @@ pub fn write_mir_pretty<'a, 'b, 'tcx, I>(tcx: TyCtxt<'b, 'tcx, 'tcx>, let src = MirSource::from_node(tcx, id); write_mir_fn(tcx, src, mir, w, None)?; - for (i, mir) in mir.promoted.iter().enumerate() { + for (i, mir) in mir.promoted.iter_enumerated() { writeln!(w, "")?; write_mir_fn(tcx, MirSource::Promoted(id, i), mir, w, None)?; } @@ -292,7 +292,7 @@ fn write_mir_sig(tcx: TyCtxt, src: MirSource, mir: &Mir, w: &mut Write) MirSource::Const(_) => write!(w, "const")?, MirSource::Static(_, hir::MutImmutable) => write!(w, "static")?, MirSource::Static(_, hir::MutMutable) => write!(w, "static mut")?, - MirSource::Promoted(_, i) => write!(w, "promoted{} in", i)? + MirSource::Promoted(_, i) => write!(w, "{:?} in", i)? } write!(w, " {}", tcx.node_path_str(src.item_id()))?; diff --git a/src/librustc_mir/transform/add_call_guards.rs b/src/librustc_mir/transform/add_call_guards.rs index 63e975128c792..c028504d6f96d 100644 --- a/src/librustc_mir/transform/add_call_guards.rs +++ b/src/librustc_mir/transform/add_call_guards.rs @@ -13,8 +13,6 @@ use rustc::mir::repr::*; use rustc::mir::transform::{MirPass, MirSource, Pass}; use rustc_data_structures::indexed_vec::{Idx, IndexVec}; -use pretty; - pub struct AddCallGuards; /** @@ -38,7 +36,7 @@ pub struct AddCallGuards; */ impl<'tcx> MirPass<'tcx> for AddCallGuards { - fn run_pass<'a>(&mut self, tcx: TyCtxt<'a, 'tcx, 'tcx>, src: MirSource, mir: &mut Mir<'tcx>) { + fn run_pass<'a>(&mut self, _tcx: TyCtxt<'a, 'tcx, 'tcx>, _src: MirSource, mir: &mut Mir<'tcx>) { let pred_count: IndexVec<_, _> = mir.predecessors().iter().map(|ps| ps.len()).collect(); @@ -75,7 +73,6 @@ impl<'tcx> MirPass<'tcx> for AddCallGuards { } } - pretty::dump_mir(tcx, "break_cleanup_edges", &0, src, mir, None); debug!("Broke {} N edges", new_blocks.len()); mir.basic_blocks_mut().extend(new_blocks);