pub(super) struct CoverageCounters {
counter_increment_sites: IndexVec<CounterId, CounterIncrementSite>,
node_counters: IndexVec<BasicCoverageBlock, Option<BcbCounter>>,
edge_counters: FxHashMap<(BasicCoverageBlock, BasicCoverageBlock), BcbCounter>,
expressions: IndexVec<ExpressionId, BcbExpression>,
expressions_memo: FxHashMap<BcbExpression, BcbCounter>,
}
Expand description
Generates and stores coverage counter and coverage expression information associated with nodes/edges in the BCB graph.
Fields§
§counter_increment_sites: IndexVec<CounterId, CounterIncrementSite>
List of places where a counter-increment statement should be injected into MIR, each with its corresponding counter ID.
node_counters: IndexVec<BasicCoverageBlock, Option<BcbCounter>>
Coverage counters/expressions that are associated with individual BCBs.
edge_counters: FxHashMap<(BasicCoverageBlock, BasicCoverageBlock), BcbCounter>
Coverage counters/expressions that are associated with the control-flow edge between two BCBs.
We currently don’t iterate over this map, but if we do in the future,
switch it back to FxIndexMap
to avoid query stability hazards.
expressions: IndexVec<ExpressionId, BcbExpression>
Table of expression data, associating each expression ID with its corresponding operator (+ or -) and its LHS/RHS operands.
expressions_memo: FxHashMap<BcbExpression, BcbCounter>
Remember expressions that have already been created (or simplified), so that we don’t create unnecessary duplicates.
Implementations§
Source§impl CoverageCounters
impl CoverageCounters
Sourcepub(super) fn make_bcb_counters(
graph: &CoverageGraph,
bcb_needs_counter: &BitSet<BasicCoverageBlock>,
) -> Self
pub(super) fn make_bcb_counters( graph: &CoverageGraph, bcb_needs_counter: &BitSet<BasicCoverageBlock>, ) -> Self
Ensures that each BCB node needing a counter has one, by creating physical counters or counter expressions for nodes and edges as required.
fn with_num_bcbs(num_bcbs: usize) -> Self
Sourcefn make_counter_inner(&mut self, site: CounterIncrementSite) -> BcbCounter
fn make_counter_inner(&mut self, site: CounterIncrementSite) -> BcbCounter
Shared helper used by Self::make_phys_node_counter
and
Self::make_phys_edge_counter
. Don’t call this directly.
Sourcefn make_phys_node_counter(&mut self, bcb: BasicCoverageBlock) -> BcbCounter
fn make_phys_node_counter(&mut self, bcb: BasicCoverageBlock) -> BcbCounter
Creates a new physical counter for a BCB node.
Sourcefn make_phys_edge_counter(
&mut self,
from_bcb: BasicCoverageBlock,
to_bcb: BasicCoverageBlock,
) -> BcbCounter
fn make_phys_edge_counter( &mut self, from_bcb: BasicCoverageBlock, to_bcb: BasicCoverageBlock, ) -> BcbCounter
Creates a new physical counter for a BCB edge.
fn make_expression( &mut self, lhs: BcbCounter, op: Op, rhs: BcbCounter, ) -> BcbCounter
Sourcefn make_expression_inner(
expressions: &mut IndexVec<ExpressionId, BcbExpression>,
new_expr: BcbExpression,
) -> BcbCounter
fn make_expression_inner( expressions: &mut IndexVec<ExpressionId, BcbExpression>, new_expr: BcbExpression, ) -> BcbCounter
This is an associated function so that we can call it while borrowing
&mut self.expressions_memo
.
Sourcefn make_sum(&mut self, counters: &[BcbCounter]) -> Option<BcbCounter>
fn make_sum(&mut self, counters: &[BcbCounter]) -> Option<BcbCounter>
Creates a counter that is the sum of the given counters.
Returns None
if the given list of counters was empty.
pub(super) fn num_counters(&self) -> usize
fn set_node_counter( &mut self, bcb: BasicCoverageBlock, counter: BcbCounter, ) -> BcbCounter
fn set_edge_counter( &mut self, from_bcb: BasicCoverageBlock, to_bcb: BasicCoverageBlock, counter: BcbCounter, ) -> BcbCounter
pub(super) fn term_for_bcb(&self, bcb: BasicCoverageBlock) -> Option<CovTerm>
Sourcepub(super) fn counter_increment_sites(
&self,
) -> impl Iterator<Item = (CounterId, &CounterIncrementSite)>
pub(super) fn counter_increment_sites( &self, ) -> impl Iterator<Item = (CounterId, &CounterIncrementSite)>
Returns an iterator over all the nodes/edges in the coverage graph that should have a counter-increment statement injected into MIR, along with each site’s corresponding counter ID.
Sourcepub(super) fn bcb_nodes_with_coverage_expressions(
&self,
) -> impl Iterator<Item = (BasicCoverageBlock, ExpressionId)> + Captures<'_>
pub(super) fn bcb_nodes_with_coverage_expressions( &self, ) -> impl Iterator<Item = (BasicCoverageBlock, ExpressionId)> + Captures<'_>
Returns an iterator over the subset of BCB nodes that have been associated with a counter expression, along with the ID of that expression.
pub(super) fn into_expressions(self) -> IndexVec<ExpressionId, Expression>
Auto Trait Implementations§
impl DynSend for CoverageCounters
impl DynSync for CoverageCounters
impl Freeze for CoverageCounters
impl RefUnwindSafe for CoverageCounters
impl Send for CoverageCounters
impl Sync for CoverageCounters
impl Unpin for CoverageCounters
impl UnwindSafe for CoverageCounters
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T, R> CollectAndApply<T, R> for T
impl<T, R> CollectAndApply<T, R> for T
Source§impl<T> Filterable for T
impl<T> Filterable for T
Source§fn filterable(
self,
filter_name: &'static str,
) -> RequestFilterDataProvider<T, fn(_: DataRequest<'_>) -> bool>
fn filterable( self, filter_name: &'static str, ) -> RequestFilterDataProvider<T, fn(_: DataRequest<'_>) -> bool>
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§impl<P> IntoQueryParam<P> for P
impl<P> IntoQueryParam<P> for P
fn into_query_param(self) -> P
Source§impl<T> MaybeResult<T> for T
impl<T> MaybeResult<T> for T
Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<I, T, U> Upcast<I, U> for Twhere
U: UpcastFrom<I, T>,
impl<I, T, U> Upcast<I, U> for Twhere
U: UpcastFrom<I, T>,
Source§impl<I, T> UpcastFrom<I, T> for T
impl<I, T> UpcastFrom<I, T> for T
fn upcast_from(from: T, _tcx: I) -> T
Source§impl<Tcx, T> Value<Tcx> for Twhere
Tcx: DepContext,
impl<Tcx, T> Value<Tcx> for Twhere
Tcx: DepContext,
default fn from_cycle_error( tcx: Tcx, cycle_error: &CycleError, _guar: ErrorGuaranteed, ) -> T
Source§impl<T> WithSubscriber for T
impl<T> WithSubscriber for T
Source§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
Source§fn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
impl<'a, T> Captures<'a> for Twhere
T: ?Sized,
impl<'a, T> Captures<'a> for Twhere
T: ?Sized,
impl<T> ErasedDestructor for Twhere
T: 'static,
impl<T> MaybeSendSync for T
Layout§
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...)
attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.
Size: 136 bytes