[−][src]Struct rustc_mir::transform::coverage::counters::BcbCounters
Traverse the CoverageGraph and add either a Counter or Expression to every BCB, to be
injected with CoverageSpans. Expressions have no runtime overhead, so if a viable expression
(adding or subtracting two other counters or expressions) can compute the same result as an
embedded counter, an Expression should be used.
Fields
coverage_counters: &'a mut CoverageCountersbasic_coverage_blocks: &'a mut CoverageGraphImplementations
impl<'a> BcbCounters<'a>[src]
pub(in transform::coverage::counters) fn new(
coverage_counters: &'a mut CoverageCounters,
basic_coverage_blocks: &'a mut CoverageGraph
) -> Self[src]
coverage_counters: &'a mut CoverageCounters,
basic_coverage_blocks: &'a mut CoverageGraph
) -> Self
pub(in transform::coverage::counters) fn make_bcb_counters(
&mut self,
coverage_spans: &Vec<CoverageSpan>
) -> Result<Vec<CoverageKind>, Error>[src]
&mut self,
coverage_spans: &Vec<CoverageSpan>
) -> Result<Vec<CoverageKind>, Error>
If two BasicCoverageBlocks branch from another BasicCoverageBlock, one of the branches
can be counted by Expression by subtracting the other branch from the branching
block. Otherwise, the BasicCoverageBlock executed the least should have the Counter.
One way to predict which branch executes the least is by considering loops. A loop is exited
at a branch, so the branch that jumps to a BasicCoverageBlock outside the loop is almost
always executed less than the branch that does not exit the loop.
Returns any non-code-span expressions created to represent intermediate values (such as to add two counters so the result can be subtracted from another counter), or an Error with message for subsequent debugging.
pub(in transform::coverage::counters) fn make_branch_counters(
&mut self,
traversal: &mut TraverseCoverageGraphWithLoops,
branching_bcb: BasicCoverageBlock,
branching_counter_operand: ExpressionOperandId,
collect_intermediate_expressions: &mut Vec<CoverageKind>
) -> Result<(), Error>[src]
&mut self,
traversal: &mut TraverseCoverageGraphWithLoops,
branching_bcb: BasicCoverageBlock,
branching_counter_operand: ExpressionOperandId,
collect_intermediate_expressions: &mut Vec<CoverageKind>
) -> Result<(), Error>
pub(in transform::coverage::counters) fn get_or_make_counter_operand(
&mut self,
bcb: BasicCoverageBlock,
collect_intermediate_expressions: &mut Vec<CoverageKind>
) -> Result<ExpressionOperandId, Error>[src]
&mut self,
bcb: BasicCoverageBlock,
collect_intermediate_expressions: &mut Vec<CoverageKind>
) -> Result<ExpressionOperandId, Error>
pub(in transform::coverage::counters) fn recursive_get_or_make_counter_operand(
&mut self,
bcb: BasicCoverageBlock,
collect_intermediate_expressions: &mut Vec<CoverageKind>,
debug_indent_level: usize
) -> Result<ExpressionOperandId, Error>[src]
&mut self,
bcb: BasicCoverageBlock,
collect_intermediate_expressions: &mut Vec<CoverageKind>,
debug_indent_level: usize
) -> Result<ExpressionOperandId, Error>
pub(in transform::coverage::counters) fn get_or_make_edge_counter_operand(
&mut self,
from_bcb: BasicCoverageBlock,
to_bcb: BasicCoverageBlock,
collect_intermediate_expressions: &mut Vec<CoverageKind>
) -> Result<ExpressionOperandId, Error>[src]
&mut self,
from_bcb: BasicCoverageBlock,
to_bcb: BasicCoverageBlock,
collect_intermediate_expressions: &mut Vec<CoverageKind>
) -> Result<ExpressionOperandId, Error>
pub(in transform::coverage::counters) fn recursive_get_or_make_edge_counter_operand(
&mut self,
from_bcb: BasicCoverageBlock,
to_bcb: BasicCoverageBlock,
collect_intermediate_expressions: &mut Vec<CoverageKind>,
debug_indent_level: usize
) -> Result<ExpressionOperandId, Error>[src]
&mut self,
from_bcb: BasicCoverageBlock,
to_bcb: BasicCoverageBlock,
collect_intermediate_expressions: &mut Vec<CoverageKind>,
debug_indent_level: usize
) -> Result<ExpressionOperandId, Error>
pub(in transform::coverage::counters) fn choose_preferred_expression_branch(
&self,
traversal: &TraverseCoverageGraphWithLoops,
branches: &Vec<BcbBranch>
) -> BcbBranch[src]
&self,
traversal: &TraverseCoverageGraphWithLoops,
branches: &Vec<BcbBranch>
) -> BcbBranch
Select a branch for the expression, either the recommended reloop_branch, or if none was
found, select any branch.
pub(in transform::coverage::counters) fn find_some_reloop_branch(
&self,
traversal: &TraverseCoverageGraphWithLoops,
branches: &Vec<BcbBranch>
) -> Option<BcbBranch>[src]
&self,
traversal: &TraverseCoverageGraphWithLoops,
branches: &Vec<BcbBranch>
) -> Option<BcbBranch>
At most, one of the branches (or its edge, from the branching_bcb, if the branch has multiple incoming edges) can have a counter computed by expression.
If at least one of the branches leads outside of a loop (found_loop_exit is
true), and at least one other branch does not exit the loop (the first of which
is captured in some_reloop_branch), it's likely any reloop branch will be
executed far more often than loop exit branch, making the reloop branch a better
candidate for an expression.
pub(in transform::coverage::counters) fn bcb_predecessors(
&self,
bcb: BasicCoverageBlock
) -> &Vec<BasicCoverageBlock>[src]
&self,
bcb: BasicCoverageBlock
) -> &Vec<BasicCoverageBlock>
pub(in transform::coverage::counters) fn bcb_successors(
&self,
bcb: BasicCoverageBlock
) -> &Vec<BasicCoverageBlock>[src]
&self,
bcb: BasicCoverageBlock
) -> &Vec<BasicCoverageBlock>
pub(in transform::coverage::counters) fn bcb_branches(
&self,
from_bcb: BasicCoverageBlock
) -> Vec<BcbBranch>[src]
&self,
from_bcb: BasicCoverageBlock
) -> Vec<BcbBranch>
pub(in transform::coverage::counters) fn bcb_needs_branch_counters(
&self,
bcb: BasicCoverageBlock
) -> bool[src]
&self,
bcb: BasicCoverageBlock
) -> bool
pub(in transform::coverage::counters) fn bcb_has_one_path_to_target(
&self,
bcb: BasicCoverageBlock
) -> bool[src]
&self,
bcb: BasicCoverageBlock
) -> bool
Returns true if the BasicCoverageBlock has zero or one incoming edge. (If zero, it should be the entry point for the function.)
pub(in transform::coverage::counters) fn bcb_is_dominated_by(
&self,
node: BasicCoverageBlock,
dom: BasicCoverageBlock
) -> bool[src]
&self,
node: BasicCoverageBlock,
dom: BasicCoverageBlock
) -> bool
pub(in transform::coverage::counters) fn format_counter(
&self,
counter_kind: &CoverageKind
) -> String[src]
&self,
counter_kind: &CoverageKind
) -> String
Auto Trait Implementations
impl<'a> RefUnwindSafe for BcbCounters<'a>
impl<'a> Send for BcbCounters<'a>
impl<'a> Sync for BcbCounters<'a>
impl<'a> Unpin for BcbCounters<'a>
impl<'a> !UnwindSafe for BcbCounters<'a>
Blanket Implementations
impl<T> Any for T where
T: 'static + ?Sized, [src]
T: 'static + ?Sized,
impl<T> Borrow<T> for T where
T: ?Sized, [src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized, [src]
T: ?Sized,
pub fn borrow_mut(&mut self) -> &mut T[src]
impl<T> From<T> for T[src]
impl<T, U> Into<U> for T where
U: From<T>, [src]
U: From<T>,
impl<T, U> TryFrom<U> for T where
U: Into<T>, [src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
pub fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>, [src]
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error
The type returned in the event of a conversion error.