Update dataflow analyses to use new interface

This commit is contained in:
Dylan MacKenzie
2020-08-28 13:26:25 -07:00
parent 3233fb18a8
commit b19b8ea611
9 changed files with 106 additions and 143 deletions

View File

@@ -165,23 +165,19 @@ where
}
}
impl<Q> dataflow::BottomValue for FlowSensitiveAnalysis<'_, '_, '_, Q> {
const BOTTOM_VALUE: bool = false;
}
impl<Q> dataflow::AnalysisDomain<'tcx> for FlowSensitiveAnalysis<'_, '_, 'tcx, Q>
where
Q: Qualif,
{
type Idx = Local;
type Domain = BitSet<Local>;
const NAME: &'static str = Q::ANALYSIS_NAME;
fn bits_per_block(&self, body: &mir::Body<'tcx>) -> usize {
body.local_decls.len()
fn bottom_value(&self, body: &mir::Body<'tcx>) -> Self::Domain {
BitSet::new_empty(body.local_decls.len())
}
fn initialize_start_block(&self, _body: &mir::Body<'tcx>, state: &mut BitSet<Self::Idx>) {
fn initialize_start_block(&self, _body: &mir::Body<'tcx>, state: &mut Self::Domain) {
self.transfer_function(state).initialize_state();
}
}
@@ -192,7 +188,7 @@ where
{
fn apply_statement_effect(
&self,
state: &mut BitSet<Self::Idx>,
state: &mut Self::Domain,
statement: &mir::Statement<'tcx>,
location: Location,
) {
@@ -201,7 +197,7 @@ where
fn apply_terminator_effect(
&self,
state: &mut BitSet<Self::Idx>,
state: &mut Self::Domain,
terminator: &mir::Terminator<'tcx>,
location: Location,
) {
@@ -210,7 +206,7 @@ where
fn apply_call_return_effect(
&self,
state: &mut BitSet<Self::Idx>,
state: &mut Self::Domain,
block: BasicBlock,
func: &mir::Operand<'tcx>,
args: &[mir::Operand<'tcx>],

View File

@@ -1,4 +1,6 @@
use rustc_ast as ast;
use std::borrow::Borrow;
use rustc_ast::ast;
use rustc_span::symbol::sym;
use rustc_span::Span;
use rustc_target::spec::abi::Abi;
@@ -16,7 +18,7 @@ use crate::dataflow::impls::{
use crate::dataflow::move_paths::{HasMoveData, MoveData};
use crate::dataflow::move_paths::{LookupResult, MovePathIndex};
use crate::dataflow::MoveDataParamEnv;
use crate::dataflow::{Analysis, Results, ResultsCursor};
use crate::dataflow::{Analysis, JoinSemiLattice, Results, ResultsCursor};
pub struct SanityCheck;
@@ -248,25 +250,26 @@ pub trait RustcPeekAt<'tcx>: Analysis<'tcx> {
&self,
tcx: TyCtxt<'tcx>,
place: mir::Place<'tcx>,
flow_state: &BitSet<Self::Idx>,
flow_state: &Self::Domain,
call: PeekCall,
);
}
impl<'tcx, A> RustcPeekAt<'tcx> for A
impl<'tcx, A, D> RustcPeekAt<'tcx> for A
where
A: Analysis<'tcx, Idx = MovePathIndex> + HasMoveData<'tcx>,
A: Analysis<'tcx, Domain = D> + HasMoveData<'tcx>,
D: JoinSemiLattice + Clone + Borrow<BitSet<MovePathIndex>>,
{
fn peek_at(
&self,
tcx: TyCtxt<'tcx>,
place: mir::Place<'tcx>,
flow_state: &BitSet<Self::Idx>,
flow_state: &Self::Domain,
call: PeekCall,
) {
match self.move_data().rev_lookup.find(place.as_ref()) {
LookupResult::Exact(peek_mpi) => {
let bit_state = flow_state.contains(peek_mpi);
let bit_state = flow_state.borrow().contains(peek_mpi);
debug!("rustc_peek({:?} = &{:?}) bit_state: {}", call.arg, place, bit_state);
if !bit_state {
tcx.sess.span_err(call.span, "rustc_peek: bit not set");