struct CoverageVisitor {
    max_counter_id: CounterId,
    max_expression_id: ExpressionId,
}
Expand description

Coverage codegen needs to know the total number of counter IDs and expression IDs that have been used by a function’s coverage mappings. These totals are used to create vectors to hold the relevant counter and expression data, and the maximum counter ID (+ 1) is also needed by the llvm.instrprof.increment intrinsic.

MIR optimization may split and duplicate some BasicBlock sequences, or optimize out some code including injected counters. (It is OK if some counters are optimized out, but those counters are still included in the total num_counters or num_expressions.) Simply counting the calls may not work; but computing the number of counters or expressions by adding 1 to the highest ID (for a given instrumented function) is valid.

It’s possible for a coverage expression to remain in MIR while one or both of its operands have been optimized away. To avoid problems in codegen, we include those operands’ IDs when determining the maximum counter/expression ID, even if the underlying counter/expression is no longer present.

Fields§

§max_counter_id: CounterId§max_expression_id: ExpressionId

Implementations§

source§

impl CoverageVisitor

source

fn update_max_counter_id(&mut self, counter_id: CounterId)

Updates max_counter_id to the maximum encountered counter ID.

source

fn update_max_expression_id(&mut self, expression_id: ExpressionId)

Updates max_expression_id to the maximum encountered expression ID.

source

fn update_from_expression_operand(&mut self, operand: Operand)

source

fn visit_body(&mut self, body: &Body<'_>)

source

fn visit_coverage(&mut self, coverage: &Coverage)

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for Twhere U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T, U> TryFrom<U> for Twhere U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.

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: 8 bytes