pub trait PassHook {
fn on_mir_pass<'a, 'tcx>(&self,
tcx: TyCtxt<'a, 'tcx, 'tcx>,
- pass: &Pass,
+ pass_name: &str,
pass_num: usize,
is_after: bool);
}
#[derive(Clone)]
struct PassSet {
- passes: Vec<Rc<Pass>>,
+ passes: Vec<Rc<DefIdPass>>,
}
/// The number of "pass sets" that we have:
// NB: passes are numbered from 1, since "construction" is zero.
for (pass, pass_num) in set.passes.iter().zip(start_num + 1..) {
for hook in &self.pass_hooks {
- hook.on_mir_pass(tcx, &**pass, pass_num, false);
+ hook.on_mir_pass(tcx, &pass.name(), pass_num, false);
}
- time(tcx.sess.time_passes(), &*pass.name(), || pass.run_pass(tcx));
+ time(tcx.sess.time_passes(), &*pass.name(), || {
+ for &def_id in tcx.mir_keys(LOCAL_CRATE).iter() {
+ pass.run_pass(tcx, def_id);
+ }
+ });
for hook in &self.pass_hooks {
- hook.on_mir_pass(tcx, &**pass, pass_num, true);
+ hook.on_mir_pass(tcx, &pass.name(), pass_num, true);
}
}
}
/// Pushes a built-in pass.
- pub fn push_pass<T: Pass + 'static>(&mut self, set: usize, pass: T) {
+ pub fn push_pass<T: DefIdPass + 'static>(&mut self, set: usize, pass: T) {
self.sets[set].passes.push(Rc::new(pass));
}
passes.push_pass(MIR_OPTIMIZED, mir::transform::simplify::SimplifyCfg::new("elaborate-drops"));
// No lifetime analysis based on borrowing can be done from here on out.
- passes.push_pass(MIR_OPTIMIZED, mir::transform::inline::Inline);
+ // passes.push_pass(MIR_OPTIMIZED, mir::transform::inline::Inline); // TODO re-enable
passes.push_pass(MIR_OPTIMIZED, mir::transform::instcombine::InstCombine);
passes.push_pass(MIR_OPTIMIZED, mir::transform::deaggregator::Deaggregator);
passes.push_pass(MIR_OPTIMIZED, mir::transform::copy_prop::CopyPropagation);