pub(crate) struct CoverageInfoBuilder {
nots: FxHashMap<ExprId, NotInfo>,
markers: BlockMarkerGen,
branch_info: Option<BranchInfo>,
mcdc_info: Option<MCDCInfoBuilder>,
}
Expand description
Collects coverage-related information during MIR building, to eventually be
turned into a function’s CoverageInfoHi
when MIR building is complete.
Fields§
§nots: FxHashMap<ExprId, NotInfo>
Maps condition expressions to their enclosing !
, for better instrumentation.
markers: BlockMarkerGen
§branch_info: Option<BranchInfo>
Present if branch coverage is enabled.
mcdc_info: Option<MCDCInfoBuilder>
Present if MC/DC coverage is enabled.
Implementations§
Source§impl CoverageInfoBuilder
impl CoverageInfoBuilder
Sourcepub(crate) fn new_if_enabled(
tcx: TyCtxt<'_>,
def_id: LocalDefId,
) -> Option<Self>
pub(crate) fn new_if_enabled( tcx: TyCtxt<'_>, def_id: LocalDefId, ) -> Option<Self>
Creates a new coverage info builder, but only if coverage instrumentation
is enabled and def_id
represents a function that is eligible for coverage.
Sourcepub(crate) fn visit_unary_not(&mut self, thir: &Thir<'_>, unary_not: ExprId)
pub(crate) fn visit_unary_not(&mut self, thir: &Thir<'_>, unary_not: ExprId)
Unary !
expressions inside an if
condition are lowered by lowering
their argument instead, and then reversing the then/else arms of that if
.
That’s awkward for branch coverage instrumentation, so to work around that
we pre-emptively visit any affected !
expressions, and record extra
information that Builder::visit_coverage_branch_condition
can use to
synthesize branch instrumentation for the enclosing !
.
fn visit_with_not_info( &mut self, thir: &Thir<'_>, expr_id: ExprId, not_info: NotInfo, )
fn register_two_way_branch<'tcx>( &mut self, tcx: TyCtxt<'tcx>, cfg: &mut CFG<'tcx>, source_info: SourceInfo, true_block: BasicBlock, false_block: BasicBlock, )
pub(crate) fn into_done(self) -> Box<CoverageInfoHi>
Auto Trait Implementations§
impl !DynSend for CoverageInfoBuilder
impl !DynSync for CoverageInfoBuilder
impl Freeze for CoverageInfoBuilder
impl RefUnwindSafe for CoverageInfoBuilder
impl Send for CoverageInfoBuilder
impl Sync for CoverageInfoBuilder
impl Unpin for CoverageInfoBuilder
impl UnwindSafe for CoverageInfoBuilder
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