1
Fork 0

Make Visitor::visit_body take a simple Body

This commit is contained in:
Dylan MacKenzie 2020-03-26 16:02:10 -07:00
parent 285519d412
commit b641e9e358
19 changed files with 29 additions and 30 deletions

View file

@ -65,12 +65,12 @@ use rustc_span::Span;
// variant argument) that does not require visiting, as in // variant argument) that does not require visiting, as in
// `is_cleanup` above. // `is_cleanup` above.
macro_rules! body_cache_type { macro_rules! body_type {
(mut $a:lifetime, $tcx:lifetime) => { (mut $tcx:lifetime) => {
&mut BodyAndCache<$tcx> &mut BodyAndCache<$tcx>
}; };
($a:lifetime, $tcx:lifetime) => { ($tcx:lifetime) => {
ReadOnlyBodyAndCache<$a, $tcx> &Body<$tcx>
}; };
} }
@ -82,7 +82,7 @@ macro_rules! make_mir_visitor {
fn visit_body( fn visit_body(
&mut self, &mut self,
body: body_cache_type!($($mutability)? '_, 'tcx) body: body_type!($($mutability)? 'tcx)
) { ) {
self.super_body(body); self.super_body(body);
} }
@ -254,7 +254,7 @@ macro_rules! make_mir_visitor {
fn super_body( fn super_body(
&mut self, &mut self,
$($mutability)? body: body_cache_type!($($mutability)? '_, 'tcx) $($mutability)? body: body_type!($($mutability)? 'tcx)
) { ) {
let span = body.span; let span = body.span;
if let Some(yield_ty) = &$($mutability)? body.yield_ty { if let Some(yield_ty) = &$($mutability)? body.yield_ty {
@ -819,7 +819,7 @@ macro_rules! make_mir_visitor {
fn visit_location( fn visit_location(
&mut self, &mut self,
body: body_cache_type!($($mutability)? '_, 'tcx), body: body_type!($($mutability)? 'tcx),
location: Location location: Location
) { ) {
let basic_block = & $($mutability)? body[location.block]; let basic_block = & $($mutability)? body[location.block];

View file

@ -20,7 +20,7 @@ pub fn non_ssa_locals<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
let mir = fx.mir; let mir = fx.mir;
let mut analyzer = LocalAnalyzer::new(fx); let mut analyzer = LocalAnalyzer::new(fx);
analyzer.visit_body(mir); analyzer.visit_body(*mir);
for (local, decl) in mir.local_decls.iter_enumerated() { for (local, decl) in mir.local_decls.iter_enumerated() {
let ty = fx.monomorphize(&decl.ty); let ty = fx.monomorphize(&decl.ty);

View file

@ -107,7 +107,7 @@ impl LocalsStateAtExit {
LocalsStateAtExit::AllAreInvalidated LocalsStateAtExit::AllAreInvalidated
} else { } else {
let mut has_storage_dead = HasStorageDead(BitSet::new_empty(body.local_decls.len())); let mut has_storage_dead = HasStorageDead(BitSet::new_empty(body.local_decls.len()));
has_storage_dead.visit_body(body); has_storage_dead.visit_body(*body);
let mut has_storage_dead_or_moved = has_storage_dead.0; let mut has_storage_dead_or_moved = has_storage_dead.0;
for move_out in &move_data.moves { for move_out in &move_data.moves {
if let Some(index) = move_data.base_local(move_out.path) { if let Some(index) = move_data.base_local(move_out.path) {

View file

@ -1561,7 +1561,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
} }
} }
let mut visitor = FakeReadCauseFinder { place, cause: None }; let mut visitor = FakeReadCauseFinder { place, cause: None };
visitor.visit_body(self.body); visitor.visit_body(*self.body);
match visitor.cause { match visitor.cause {
Some(FakeReadCause::ForMatchGuard) => Some("match guard"), Some(FakeReadCause::ForMatchGuard) => Some("match guard"),
Some(FakeReadCause::ForIndex) => Some("indexing expression"), Some(FakeReadCause::ForIndex) => Some("indexing expression"),

View file

@ -37,7 +37,7 @@ pub(super) fn generate_invalidates<'tcx>(
body: &body, body: &body,
dominators, dominators,
}; };
ig.visit_body(body); ig.visit_body(*body);
} }
} }

View file

@ -81,7 +81,7 @@ impl LocalUseMap {
live_locals.iter().for_each(|&local| locals_with_use_data[local] = true); live_locals.iter().for_each(|&local| locals_with_use_data[local] = true);
LocalUseMapBuild { local_use_map: &mut local_use_map, elements, locals_with_use_data } LocalUseMapBuild { local_use_map: &mut local_use_map, elements, locals_with_use_data }
.visit_body(body); .visit_body(*body);
local_use_map local_use_map
} }

View file

@ -101,7 +101,7 @@ pub(super) fn populate_access_facts(
location_table, location_table,
move_data, move_data,
}; };
extractor.visit_body(body); extractor.visit_body(*body);
facts.var_dropped_at.extend( facts.var_dropped_at.extend(
dropped_at.iter().map(|&(local, location)| (local, location_table.mid_index(location))), dropped_at.iter().map(|&(local, location)| (local, location_table.mid_index(location))),

View file

@ -210,7 +210,7 @@ fn type_check_internal<'a, 'tcx, R>(
); );
let errors_reported = { let errors_reported = {
let mut verifier = TypeVerifier::new(&mut checker, *body, promoted); let mut verifier = TypeVerifier::new(&mut checker, *body, promoted);
verifier.visit_body(body); verifier.visit_body(*body);
verifier.errors_reported verifier.errors_reported
}; };
@ -435,7 +435,7 @@ impl<'a, 'b, 'tcx> Visitor<'tcx> for TypeVerifier<'a, 'b, 'tcx> {
} }
} }
fn visit_body(&mut self, body: ReadOnlyBodyAndCache<'_, 'tcx>) { fn visit_body(&mut self, body: &Body<'tcx>) {
self.sanitize_type(&"return type", body.return_ty()); self.sanitize_type(&"return type", body.return_ty());
for local_decl in &body.local_decls { for local_decl in &body.local_decls {
self.sanitize_type(local_decl, local_decl.ty); self.sanitize_type(local_decl, local_decl.ty);
@ -563,7 +563,7 @@ impl<'a, 'b, 'tcx> TypeVerifier<'a, 'b, 'tcx> {
swap_constraints(self); swap_constraints(self);
self.visit_body(promoted_body); self.visit_body(*promoted_body);
if !self.errors_reported { if !self.errors_reported {
// if verifier failed, don't do further checks to avoid ICEs // if verifier failed, don't do further checks to avoid ICEs

View file

@ -32,7 +32,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
never_initialized_mut_locals: &mut never_initialized_mut_locals, never_initialized_mut_locals: &mut never_initialized_mut_locals,
mbcx: self, mbcx: self,
}; };
visitor.visit_body(visitor.mbcx.body); visitor.visit_body(*visitor.mbcx.body);
} }
// Take the union of the existed `used_mut` set with those variables we've found were // Take the union of the existed `used_mut` set with those variables we've found were

View file

@ -250,7 +250,7 @@ impl<'mir, 'tcx> MaybeRequiresStorage<'mir, 'tcx> {
/// Kill locals that are fully moved and have not been borrowed. /// Kill locals that are fully moved and have not been borrowed.
fn check_for_move(&self, trans: &mut impl GenKill<Local>, loc: Location) { fn check_for_move(&self, trans: &mut impl GenKill<Local>, loc: Location) {
let mut visitor = MoveVisitor { trans, borrowed_locals: &self.borrowed_locals }; let mut visitor = MoveVisitor { trans, borrowed_locals: &self.borrowed_locals };
visitor.visit_location(self.body, loc); visitor.visit_location(*self.body, loc);
} }
} }

View file

@ -1162,7 +1162,7 @@ fn collect_neighbours<'tcx>(
debug!("collect_neighbours: {:?}", instance.def_id()); debug!("collect_neighbours: {:?}", instance.def_id());
let body = tcx.instance_mir(instance.def); let body = tcx.instance_mir(instance.def);
MirNeighborCollector { tcx, body: &body, output, instance }.visit_body(body); MirNeighborCollector { tcx, body: &body, output, instance }.visit_body(*body);
} }
fn def_id_to_string(tcx: TyCtxt<'_>, def_id: DefId) -> String { fn def_id_to_string(tcx: TyCtxt<'_>, def_id: DefId) -> String {

View file

@ -183,7 +183,7 @@ impl Validator<'a, 'mir, 'tcx> {
self.check_op_spanned(ops::Loop, body.span); self.check_op_spanned(ops::Loop, body.span);
} }
self.visit_body(body); self.visit_body(*body);
// Ensure that the end result is `Sync` in a non-thread local `static`. // Ensure that the end result is `Sync` in a non-thread local `static`.
let should_check_for_sync = let should_check_for_sync =

View file

@ -507,7 +507,7 @@ fn unsafety_check_result(tcx: TyCtxt<'_>, def_id: DefId) -> UnsafetyCheckResult
// mir_built ensures that body has a computed cache, so we don't (and can't) attempt to // mir_built ensures that body has a computed cache, so we don't (and can't) attempt to
// recompute it here. // recompute it here.
let body = body.unwrap_read_only(); let body = body.unwrap_read_only();
checker.visit_body(body); checker.visit_body(*body);
check_unused_unsafe(tcx, def_id, &checker.used_unsafe, &mut checker.inherited_blocks); check_unused_unsafe(tcx, def_id, &checker.used_unsafe, &mut checker.inherited_blocks);
UnsafetyCheckResult { UnsafetyCheckResult {

View file

@ -778,7 +778,7 @@ impl CanConstProp {
trace!("local {:?} can't be const propagated because it's not a temporary", local); trace!("local {:?} can't be const propagated because it's not a temporary", local);
} }
} }
cpv.visit_body(body); cpv.visit_body(*body);
cpv.can_const_prop cpv.can_const_prop
} }
} }

View file

@ -469,7 +469,7 @@ fn locals_live_across_suspend_points(
// Find the MIR locals which do not use StorageLive/StorageDead statements. // Find the MIR locals which do not use StorageLive/StorageDead statements.
// The storage of these locals are always live. // The storage of these locals are always live.
let mut ignored = StorageIgnored(BitSet::new_filled(body.local_decls.len())); let mut ignored = StorageIgnored(BitSet::new_filled(body.local_decls.len()));
ignored.visit_body(body); ignored.visit_body(*body);
// Calculate the MIR locals which have been previously // Calculate the MIR locals which have been previously
// borrowed (even if they are still active). // borrowed (even if they are still active).

View file

@ -26,7 +26,7 @@ impl<'tcx> MirPass<'tcx> for InstCombine {
let optimizations = { let optimizations = {
let read_only_cache = read_only!(body); let read_only_cache = read_only!(body);
let mut optimization_finder = OptimizationFinder::new(body, tcx); let mut optimization_finder = OptimizationFinder::new(body, tcx);
optimization_finder.visit_body(read_only_cache); optimization_finder.visit_body(*read_only_cache);
optimization_finder.optimizations optimization_finder.optimizations
}; };

View file

@ -309,7 +309,7 @@ impl<'tcx> MirPass<'tcx> for SimplifyLocals {
let locals = { let locals = {
let read_only_cache = read_only!(body); let read_only_cache = read_only!(body);
let mut marker = DeclMarker { locals: BitSet::new_empty(body.local_decls.len()), body }; let mut marker = DeclMarker { locals: BitSet::new_empty(body.local_decls.len()), body };
marker.visit_body(read_only_cache); marker.visit_body(*read_only_cache);
// Return pointer and arguments are always live // Return pointer and arguments are always live
marker.locals.insert(RETURN_PLACE); marker.locals.insert(RETURN_PLACE);
for arg in body.args_iter() { for arg in body.args_iter() {

View file

@ -1,7 +1,6 @@
use rustc::mir::visit::PlaceContext; use rustc::mir::visit::PlaceContext;
use rustc::mir::visit::Visitor; use rustc::mir::visit::Visitor;
use rustc::mir::ReadOnlyBodyAndCache; use rustc::mir::{Body, Local, Location};
use rustc::mir::{Local, Location};
crate trait FindAssignments { crate trait FindAssignments {
// Finds all statements that assign directly to local (i.e., X = ...) // Finds all statements that assign directly to local (i.e., X = ...)
@ -9,10 +8,10 @@ crate trait FindAssignments {
fn find_assignments(&self, local: Local) -> Vec<Location>; fn find_assignments(&self, local: Local) -> Vec<Location>;
} }
impl<'a, 'tcx> FindAssignments for ReadOnlyBodyAndCache<'a, 'tcx> { impl<'tcx> FindAssignments for Body<'tcx> {
fn find_assignments(&self, local: Local) -> Vec<Location> { fn find_assignments(&self, local: Local) -> Vec<Location> {
let mut visitor = FindLocalAssignmentVisitor { needle: local, locations: vec![] }; let mut visitor = FindLocalAssignmentVisitor { needle: local, locations: vec![] };
visitor.visit_body(*self); visitor.visit_body(self);
visitor.locations visitor.locations
} }
} }

View file

@ -38,7 +38,7 @@ impl DefUseAnalysis {
var_debug_info_index: 0, var_debug_info_index: 0,
in_var_debug_info: false, in_var_debug_info: false,
}; };
finder.visit_body(body); finder.visit_body(*body);
self.info = finder.info self.info = finder.info
} }