pub struct FunctionCoverage<'tcx> {
    instance: Instance<'tcx>,
    source_hash: u64,
    is_used: bool,
    counters: IndexVec<CounterValueReference, Option<CodeRegion>>,
    expressions: IndexVec<InjectedExpressionIndex, Option<Expression>>,
    unreachable_regions: Vec<CodeRegion>,
}
Expand description

Collects all of the coverage regions associated with (a) injected counters, (b) counter expressions (additions or subtraction), and (c) unreachable regions (always counted as zero), for a given Function. Counters and counter expressions have non-overlapping ids because they can both be operands in an expression. This struct also stores the function_source_hash, computed during instrumentation, and forwarded with counters.

Note, it may be important to understand LLVM’s definitions of unreachable regions versus “gap regions” (or “gap areas”). A gap region is a code region within a counted region (either counter or expression), but the line or lines in the gap region are not executable (such as lines with only whitespace or comments). According to LLVM Code Coverage Mapping documentation, “A count for a gap area is only used as the line execution count if there are no other regions on a line.”

Fields§

§instance: Instance<'tcx>§source_hash: u64§is_used: bool§counters: IndexVec<CounterValueReference, Option<CodeRegion>>§expressions: IndexVec<InjectedExpressionIndex, Option<Expression>>§unreachable_regions: Vec<CodeRegion>

Implementations§

Creates a new set of coverage data for a used (called) function.

Creates a new set of coverage data for an unused (never called) function.

Returns true for a used (called) function, and false for an unused function.

Sets the function source hash value. If called multiple times for the same function, all calls should have the same hash value.

Adds a code region to be counted by an injected counter intrinsic.

Both counters and “counter expressions” (or simply, “expressions”) can be operands in other expressions. Expression IDs start from u32::MAX and go down, so the range of expression IDs will not overlap with the range of counter IDs. Counters and expressions can be added in any order, and expressions can still be assigned contiguous (though descending) IDs, without knowing what the last counter ID will be.

When storing the expression data in the expressions vector in the FunctionCoverage struct, its vector index is computed, from the given expression ID, by subtracting from u32::MAX.

Since the expression operands (lhs and rhs) can reference either counters or expressions, an operand that references an expression also uses its original ID, descending from u32::MAX. Theses operands are translated only during code generation, after all counters and expressions have been added.

Add a region that will be marked as “unreachable”, with a constant “zero counter”.

Return the source hash, generated from the HIR node structure, and used to indicate whether or not the source code structure changed between different compilations.

Generate an array of CounterExpressions, and an iterator over all Counters and their associated Regions (from which the LLVM-specific CoverageMapGenerator will create CounterMappingRegions.

Trait Implementations§

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Gets the TypeId of self. Read more
Immutably borrows from an owned value. Read more
Mutably borrows from an owned value. Read more

Returns the argument unchanged.

Calls U::from(self).

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

The type returned in the event of a conversion error.
Performs the conversion.
The type returned in the event of a conversion 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: 120 bytes