Skip to content

Commit

Permalink
Auto merge of #35542 - scottcarr:visitor_refactor, r=nikomatsakis
Browse files Browse the repository at this point in the history
[MIR] track Location in MirVisitor, combine Location

All the users of MirVisitor::visit_statement implement their own statement index tracking.  This PR move the tracking into MirVisitor itself.

Also, there were 2 separate implementations of Location that were identical.  This PR eliminates one of them.
  • Loading branch information
bors committed Aug 27, 2016
2 parents 1987131 + c043a27 commit b7e2157
Show file tree
Hide file tree
Showing 18 changed files with 278 additions and 254 deletions.
11 changes: 11 additions & 0 deletions src/librustc/mir/repr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1239,3 +1239,14 @@ impl<'a, 'b> GraphSuccessors<'b> for Mir<'a> {
type Item = BasicBlock;
type Iter = IntoIter<BasicBlock>;
}

#[derive(Copy, Clone, PartialEq, Eq, Debug, Hash, Ord, PartialOrd)]
pub struct Location {
/// the location is within this block
pub block: BasicBlock,

/// the location is the start of the this statement; or, if `statement_index`
/// == num-statements, then the start of the terminator.
pub statement_index: usize,
}

211 changes: 122 additions & 89 deletions src/librustc/mir/visit.rs

Large diffs are not rendered by default.

19 changes: 9 additions & 10 deletions src/librustc_borrowck/borrowck/mir/dataflow/impls.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,9 @@
// except according to those terms.

use rustc::ty::TyCtxt;
use rustc::mir::repr::{self, Mir};
use rustc::mir::repr::{self, Mir, Location};
use rustc_data_structures::indexed_vec::Idx;

use super::super::gather_moves::{Location};
use super::super::gather_moves::{MoveOutIndex, MovePathIndex};
use super::super::MoveDataParamEnv;
use super::super::DropFlagState;
Expand Down Expand Up @@ -252,7 +251,7 @@ impl<'a, 'tcx> BitDenotation for MaybeInitializedLvals<'a, 'tcx> {
{
drop_flag_effects_for_location(
self.tcx, self.mir, ctxt,
Location { block: bb, index: idx },
Location { block: bb, statement_index: idx },
|path, s| Self::update_bits(sets, path, s)
)
}
Expand All @@ -265,7 +264,7 @@ impl<'a, 'tcx> BitDenotation for MaybeInitializedLvals<'a, 'tcx> {
{
drop_flag_effects_for_location(
self.tcx, self.mir, ctxt,
Location { block: bb, index: statements_len },
Location { block: bb, statement_index: statements_len },
|path, s| Self::update_bits(sets, path, s)
)
}
Expand Down Expand Up @@ -314,7 +313,7 @@ impl<'a, 'tcx> BitDenotation for MaybeUninitializedLvals<'a, 'tcx> {
{
drop_flag_effects_for_location(
self.tcx, self.mir, ctxt,
Location { block: bb, index: idx },
Location { block: bb, statement_index: idx },
|path, s| Self::update_bits(sets, path, s)
)
}
Expand All @@ -327,7 +326,7 @@ impl<'a, 'tcx> BitDenotation for MaybeUninitializedLvals<'a, 'tcx> {
{
drop_flag_effects_for_location(
self.tcx, self.mir, ctxt,
Location { block: bb, index: statements_len },
Location { block: bb, statement_index: statements_len },
|path, s| Self::update_bits(sets, path, s)
)
}
Expand Down Expand Up @@ -375,7 +374,7 @@ impl<'a, 'tcx> BitDenotation for DefinitelyInitializedLvals<'a, 'tcx> {
{
drop_flag_effects_for_location(
self.tcx, self.mir, ctxt,
Location { block: bb, index: idx },
Location { block: bb, statement_index: idx },
|path, s| Self::update_bits(sets, path, s)
)
}
Expand All @@ -388,7 +387,7 @@ impl<'a, 'tcx> BitDenotation for DefinitelyInitializedLvals<'a, 'tcx> {
{
drop_flag_effects_for_location(
self.tcx, self.mir, ctxt,
Location { block: bb, index: statements_len },
Location { block: bb, statement_index: statements_len },
|path, s| Self::update_bits(sets, path, s)
)
}
Expand Down Expand Up @@ -431,7 +430,7 @@ impl<'a, 'tcx> BitDenotation for MovingOutStatements<'a, 'tcx> {
let path_map = &move_data.path_map;
let rev_lookup = &move_data.rev_lookup;

let loc = Location { block: bb, index: idx };
let loc = Location { block: bb, statement_index: idx };
debug!("stmt {:?} at loc {:?} moves out of move_indexes {:?}",
stmt, loc, &loc_map[loc]);
for move_index in &loc_map[loc] {
Expand Down Expand Up @@ -473,7 +472,7 @@ impl<'a, 'tcx> BitDenotation for MovingOutStatements<'a, 'tcx> {
let (mir, move_data) = (self.mir, &ctxt.move_data);
let term = mir[bb].terminator();
let loc_map = &move_data.loc_map;
let loc = Location { block: bb, index: statements_len };
let loc = Location { block: bb, statement_index: statements_len };
debug!("terminator {:?} at loc {:?} moves out of move_indexes {:?}",
term, loc, &loc_map[loc]);
let bits_per_block = self.bits_per_block(ctxt);
Expand Down
26 changes: 13 additions & 13 deletions src/librustc_borrowck/borrowck/mir/elaborate_drops.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
// except according to those terms.

use indexed_set::IdxSetBuf;
use super::gather_moves::{MoveData, MovePathIndex, MovePathContent, Location};
use super::gather_moves::{MoveData, MovePathIndex, MovePathContent};
use super::dataflow::{MaybeInitializedLvals, MaybeUninitializedLvals};
use super::dataflow::{DataflowResults};
use super::{drop_flag_effects_for_location, on_all_children_bits};
Expand Down Expand Up @@ -146,9 +146,9 @@ impl<'b, 'tcx> ElaborateDropsCtxt<'b, 'tcx> {
dead: self.flow_uninits.sets().on_entry_set_for(loc.block.index())
.to_owned(),
};
for stmt in 0..loc.index {
for stmt in 0..loc.statement_index {
data.apply_location(self.tcx, self.mir, self.env,
Location { block: loc.block, index: stmt });
Location { block: loc.block, statement_index: stmt });
}
data
}
Expand Down Expand Up @@ -226,7 +226,7 @@ impl<'b, 'tcx> ElaborateDropsCtxt<'b, 'tcx> {

let init_data = self.initialization_data_at(Location {
block: bb,
index: data.statements.len()
statement_index: data.statements.len()
});

let path = self.move_data().rev_lookup.find(location);
Expand All @@ -249,7 +249,7 @@ impl<'b, 'tcx> ElaborateDropsCtxt<'b, 'tcx> {
fn elaborate_drops(&mut self)
{
for (bb, data) in self.mir.basic_blocks().iter_enumerated() {
let loc = Location { block: bb, index: data.statements.len() };
let loc = Location { block: bb, statement_index: data.statements.len() };
let terminator = data.terminator();

let resume_block = self.patch.resume_block();
Expand Down Expand Up @@ -359,9 +359,9 @@ impl<'b, 'tcx> ElaborateDropsCtxt<'b, 'tcx> {
unwind: Some(unwind)
}, bb);
on_all_children_bits(self.tcx, self.mir, self.move_data(), path, |child| {
self.set_drop_flag(Location { block: target, index: 0 },
self.set_drop_flag(Location { block: target, statement_index: 0 },
child, DropFlagState::Present);
self.set_drop_flag(Location { block: unwind, index: 0 },
self.set_drop_flag(Location { block: unwind, statement_index: 0 },
child, DropFlagState::Present);
});
}
Expand Down Expand Up @@ -741,7 +741,7 @@ impl<'b, 'tcx> ElaborateDropsCtxt<'b, 'tcx> {
let drop_block = self.drop_block(c);
if update_drop_flag {
self.set_drop_flag(
Location { block: drop_block, index: 0 },
Location { block: drop_block, statement_index: 0 },
c.path,
DropFlagState::Absent
);
Expand Down Expand Up @@ -924,7 +924,7 @@ impl<'b, 'tcx> ElaborateDropsCtxt<'b, 'tcx> {
}

fn drop_flags_on_init(&mut self) {
let loc = Location { block: START_BLOCK, index: 0 };
let loc = Location { block: START_BLOCK, statement_index: 0 };
let span = self.patch.source_info_for_location(self.mir, loc).span;
let false_ = self.constant_bool(span, false);
for flag in self.drop_flags.values() {
Expand All @@ -939,7 +939,7 @@ impl<'b, 'tcx> ElaborateDropsCtxt<'b, 'tcx> {
} = data.terminator().kind {
assert!(!self.patch.is_patched(bb));

let loc = Location { block: tgt, index: 0 };
let loc = Location { block: tgt, statement_index: 0 };
let path = self.move_data().rev_lookup.find(lv);
on_all_children_bits(
self.tcx, self.mir, self.move_data(), path,
Expand All @@ -950,7 +950,7 @@ impl<'b, 'tcx> ElaborateDropsCtxt<'b, 'tcx> {
}

fn drop_flags_for_args(&mut self) {
let loc = Location { block: START_BLOCK, index: 0 };
let loc = Location { block: START_BLOCK, statement_index: 0 };
super::drop_flag_effects_for_function_entry(
self.tcx, self.mir, self.env, |path, ds| {
self.set_drop_flag(loc, path, ds);
Expand Down Expand Up @@ -990,7 +990,7 @@ impl<'b, 'tcx> ElaborateDropsCtxt<'b, 'tcx> {
}
}
}
let loc = Location { block: bb, index: i };
let loc = Location { block: bb, statement_index: i };
super::drop_flag_effects_for_location(
self.tcx, self.mir, self.env, loc, |path, ds| {
if ds == DropFlagState::Absent || allow_initializations {
Expand All @@ -1008,7 +1008,7 @@ impl<'b, 'tcx> ElaborateDropsCtxt<'b, 'tcx> {
} = data.terminator().kind {
assert!(!self.patch.is_patched(bb));

let loc = Location { block: bb, index: data.statements.len() };
let loc = Location { block: bb, statement_index: data.statements.len() };
let path = self.move_data().rev_lookup.find(lv);
on_all_children_bits(
self.tcx, self.mir, self.move_data(), path,
Expand Down
33 changes: 9 additions & 24 deletions src/librustc_borrowck/borrowck/mir/gather_moves.rs
Original file line number Diff line number Diff line change
Expand Up @@ -160,8 +160,8 @@ impl Index<Location> for LocMap {
type Output = [MoveOutIndex];
fn index(&self, index: Location) -> &Self::Output {
assert!(index.block.index() < self.map.len());
assert!(index.index < self.map[index.block.index()].len());
&self.map[index.block.index()][index.index]
assert!(index.statement_index < self.map[index.block.index()].len());
&self.map[index.block.index()][index.statement_index]
}
}

Expand Down Expand Up @@ -200,21 +200,6 @@ impl fmt::Debug for MoveOut {
}
}

#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub struct Location {
/// block where action is located
pub block: BasicBlock,
/// index within above block; statement when < statments.len) or
/// the terminator (when = statements.len).
pub index: usize,
}

impl fmt::Debug for Location {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
write!(fmt, "{:?}[{}]", self.block, self.index)
}
}

#[derive(Debug)]
pub struct MovePathData<'tcx> {
move_paths: Vec<MovePath<'tcx>>,
Expand Down Expand Up @@ -569,7 +554,7 @@ fn gather_moves<'a, 'tcx>(mir: &Mir<'tcx>, tcx: TyCtxt<'a, 'tcx, 'tcx>) -> MoveD
};

for (i, stmt) in bb_data.statements.iter().enumerate() {
let source = Location { block: bb, index: i };
let source = Location { block: bb, statement_index: i };
match stmt.kind {
StatementKind::Assign(ref lval, ref rval) => {
bb_ctxt.builder.create_move_path(lval);
Expand Down Expand Up @@ -631,14 +616,14 @@ fn gather_moves<'a, 'tcx>(mir: &Mir<'tcx>, tcx: TyCtxt<'a, 'tcx, 'tcx>) -> MoveD

TerminatorKind::Return => {
let source = Location { block: bb,
index: bb_data.statements.len() };
statement_index: bb_data.statements.len() };
debug!("gather_moves Return on_move_out_lval return {:?}", source);
bb_ctxt.on_move_out_lval(SK::Return, &Lvalue::ReturnPointer, source);
}

TerminatorKind::If { ref cond, targets: _ } => {
let source = Location { block: bb,
index: bb_data.statements.len() };
statement_index: bb_data.statements.len() };
bb_ctxt.on_operand(SK::If, cond, source);
}

Expand Down Expand Up @@ -669,20 +654,20 @@ fn gather_moves<'a, 'tcx>(mir: &Mir<'tcx>, tcx: TyCtxt<'a, 'tcx, 'tcx>) -> MoveD

TerminatorKind::Drop { ref location, target: _, unwind: _ } => {
let source = Location { block: bb,
index: bb_data.statements.len() };
statement_index: bb_data.statements.len() };
bb_ctxt.on_move_out_lval(SK::Drop, location, source);
}
TerminatorKind::DropAndReplace { ref location, ref value, .. } => {
let assigned_path = bb_ctxt.builder.move_path_for(location);
bb_ctxt.path_map.fill_to(assigned_path.index());

let source = Location { block: bb,
index: bb_data.statements.len() };
statement_index: bb_data.statements.len() };
bb_ctxt.on_operand(SK::Use, value, source);
}
TerminatorKind::Call { ref func, ref args, ref destination, cleanup: _ } => {
let source = Location { block: bb,
index: bb_data.statements.len() };
statement_index: bb_data.statements.len() };
bb_ctxt.on_operand(SK::CallFn, func, source);
for arg in args {
debug!("gather_moves Call on_operand {:?} {:?}", arg, source);
Expand Down Expand Up @@ -757,7 +742,7 @@ impl<'b, 'tcx: 'b> BlockContext<'b, 'tcx> {
stmt_kind: StmtKind,
lval: &Lvalue<'tcx>,
source: Location) {
let i = source.index;
let i = source.statement_index;
let index = MoveOutIndex::new(self.moves.len());

let path = self.builder.move_path_for(lval);
Expand Down
6 changes: 3 additions & 3 deletions src/librustc_borrowck/borrowck/mir/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ use rustc::hir;
use rustc::hir::intravisit::{FnKind};

use rustc::mir::repr;
use rustc::mir::repr::{BasicBlock, BasicBlockData, Mir, Statement, Terminator};
use rustc::mir::repr::{BasicBlock, BasicBlockData, Mir, Statement, Terminator, Location};
use rustc::session::Session;
use rustc::ty::{self, TyCtxt};

Expand All @@ -35,7 +35,7 @@ use self::dataflow::{DataflowOperator};
use self::dataflow::{Dataflow, DataflowAnalysis, DataflowResults};
use self::dataflow::{MaybeInitializedLvals, MaybeUninitializedLvals};
use self::dataflow::{DefinitelyInitializedLvals};
use self::gather_moves::{MoveData, MovePathIndex, Location};
use self::gather_moves::{MoveData, MovePathIndex};
use self::gather_moves::{MovePathContent, MovePathData};

fn has_rustc_mir_with(attrs: &[ast::Attribute], name: &str) -> Option<P<MetaItem>> {
Expand Down Expand Up @@ -367,7 +367,7 @@ fn drop_flag_effects_for_location<'a, 'tcx, F>(
}

let block = &mir[loc.block];
match block.statements.get(loc.index) {
match block.statements.get(loc.statement_index) {
Some(stmt) => match stmt.kind {
repr::StatementKind::SetDiscriminant{ .. } => {
span_bug!(stmt.source_info.span, "SetDiscrimant should not exist during borrowck");
Expand Down
9 changes: 4 additions & 5 deletions src/librustc_borrowck/borrowck/mir/patch.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

use super::gather_moves::Location;
use rustc::ty::Ty;
use rustc::mir::repr::*;
use rustc_data_structures::indexed_vec::{IndexVec, Idx};
Expand Down Expand Up @@ -89,7 +88,7 @@ impl<'tcx> MirPatch<'tcx> {
};
Location {
block: bb,
index: offset
statement_index: offset
}
}

Expand Down Expand Up @@ -149,12 +148,12 @@ impl<'tcx> MirPatch<'tcx> {
}
debug!("MirPatch: adding statement {:?} at loc {:?}+{}",
stmt, loc, delta);
loc.index += delta;
loc.statement_index += delta;
let source_info = Self::source_info_for_index(
&mir[loc.block], loc
);
mir[loc.block].statements.insert(
loc.index, Statement {
loc.statement_index, Statement {
source_info: source_info,
kind: stmt
});
Expand All @@ -163,7 +162,7 @@ impl<'tcx> MirPatch<'tcx> {
}

pub fn source_info_for_index(data: &BasicBlockData, loc: Location) -> SourceInfo {
match data.statements.get(loc.index) {
match data.statements.get(loc.statement_index) {
Some(stmt) => stmt.source_info,
None => data.terminator().source_info
}
Expand Down
3 changes: 2 additions & 1 deletion src/librustc_metadata/decoder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ use rustc_const_math::ConstInt;

use rustc::mir;
use rustc::mir::visit::MutVisitor;
use rustc::mir::repr::Location;

use std::cell::Cell;
use std::io;
Expand Down Expand Up @@ -846,7 +847,7 @@ pub fn maybe_get_item_mir<'a, 'tcx>(cdata: Cmd,
impl<'v, 'cdata, 'codemap> mir::visit::MutVisitor<'v>
for MirDefIdAndSpanTranslator<'cdata, 'codemap>
{
fn visit_def_id(&mut self, def_id: &mut DefId) {
fn visit_def_id(&mut self, def_id: &mut DefId, _: Location) {
*def_id = translate_def_id(self.crate_metadata, *def_id);
}

Expand Down
2 changes: 1 addition & 1 deletion src/librustc_mir/build/cfg.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

//! Routines for manipulating the control-flow graph.

use build::{CFG, Location};
use build::CFG;
use rustc::mir::repr::*;

impl<'tcx> CFG<'tcx> {
Expand Down
Loading

0 comments on commit b7e2157

Please sign in to comment.