pub trait GenKillAnalysis<'tcx>: Analysis<'tcx> {
type Idx: Idx;
// Required methods
fn domain_size(&self, body: &Body<'tcx>) -> usize;
fn statement_effect(
&mut self,
trans: &mut impl GenKill<Self::Idx>,
statement: &Statement<'tcx>,
location: Location,
);
fn terminator_effect<'mir>(
&mut self,
trans: &mut Self::Domain,
terminator: &'mir Terminator<'tcx>,
location: Location,
) -> TerminatorEdges<'mir, 'tcx>;
fn call_return_effect(
&mut self,
trans: &mut Self::Domain,
block: BasicBlock,
return_places: CallReturnPlaces<'_, 'tcx>,
);
// Provided methods
fn before_statement_effect(
&mut self,
_trans: &mut impl GenKill<Self::Idx>,
_statement: &Statement<'tcx>,
_location: Location,
) { ... }
fn before_terminator_effect(
&mut self,
_trans: &mut Self::Domain,
_terminator: &Terminator<'tcx>,
_location: Location,
) { ... }
fn switch_int_edge_effects<G: GenKill<Self::Idx>>(
&mut self,
_block: BasicBlock,
_discr: &Operand<'tcx>,
_edge_effects: &mut impl SwitchIntEdgeEffects<G>,
) { ... }
}
Expand description
A gen/kill dataflow problem.
Each method in this trait has a corresponding one in Analysis
. However, the first two methods
here only allow modification of the dataflow state via “gen” and “kill” operations. By defining
transfer functions for each statement in this way, the transfer function for an entire basic
block can be computed efficiently. The remaining methods match up with Analysis
exactly.
Analysis
is automatically implemented for all implementers of GenKillAnalysis
via a blanket
impl below.
Required Associated Types§
Required Methods§
fn domain_size(&self, body: &Body<'tcx>) -> usize
sourcefn statement_effect(
&mut self,
trans: &mut impl GenKill<Self::Idx>,
statement: &Statement<'tcx>,
location: Location,
)
fn statement_effect( &mut self, trans: &mut impl GenKill<Self::Idx>, statement: &Statement<'tcx>, location: Location, )
See Analysis::apply_statement_effect
. Note how the second arg differs.
sourcefn terminator_effect<'mir>(
&mut self,
trans: &mut Self::Domain,
terminator: &'mir Terminator<'tcx>,
location: Location,
) -> TerminatorEdges<'mir, 'tcx>
fn terminator_effect<'mir>( &mut self, trans: &mut Self::Domain, terminator: &'mir Terminator<'tcx>, location: Location, ) -> TerminatorEdges<'mir, 'tcx>
See Analysis::apply_terminator_effect
.
sourcefn call_return_effect(
&mut self,
trans: &mut Self::Domain,
block: BasicBlock,
return_places: CallReturnPlaces<'_, 'tcx>,
)
fn call_return_effect( &mut self, trans: &mut Self::Domain, block: BasicBlock, return_places: CallReturnPlaces<'_, 'tcx>, )
See Analysis::apply_call_return_effect
.
Provided Methods§
sourcefn before_statement_effect(
&mut self,
_trans: &mut impl GenKill<Self::Idx>,
_statement: &Statement<'tcx>,
_location: Location,
)
fn before_statement_effect( &mut self, _trans: &mut impl GenKill<Self::Idx>, _statement: &Statement<'tcx>, _location: Location, )
See Analysis::apply_before_statement_effect
. Note how the second arg
differs.
sourcefn before_terminator_effect(
&mut self,
_trans: &mut Self::Domain,
_terminator: &Terminator<'tcx>,
_location: Location,
)
fn before_terminator_effect( &mut self, _trans: &mut Self::Domain, _terminator: &Terminator<'tcx>, _location: Location, )
See Analysis::apply_before_terminator_effect
.
sourcefn switch_int_edge_effects<G: GenKill<Self::Idx>>(
&mut self,
_block: BasicBlock,
_discr: &Operand<'tcx>,
_edge_effects: &mut impl SwitchIntEdgeEffects<G>,
)
fn switch_int_edge_effects<G: GenKill<Self::Idx>>( &mut self, _block: BasicBlock, _discr: &Operand<'tcx>, _edge_effects: &mut impl SwitchIntEdgeEffects<G>, )
See Analysis::apply_switch_int_edge_effects
.