Struct rustc_mir_transform::coverage::Instrumentor
source · struct Instrumentor<'a, 'tcx> {
pass_name: &'a str,
tcx: TyCtxt<'tcx>,
mir_body: &'a mut Body<'tcx>,
source_file: Lrc<SourceFile>,
fn_sig_span: Span,
body_span: Span,
basic_coverage_blocks: CoverageGraph,
coverage_counters: CoverageCounters,
}
Fields§
§pass_name: &'a str
§tcx: TyCtxt<'tcx>
§mir_body: &'a mut Body<'tcx>
§source_file: Lrc<SourceFile>
§fn_sig_span: Span
§body_span: Span
§basic_coverage_blocks: CoverageGraph
§coverage_counters: CoverageCounters
Implementations§
source§impl<'a, 'tcx> Instrumentor<'a, 'tcx>
impl<'a, 'tcx> Instrumentor<'a, 'tcx>
fn new(
pass_name: &'a str,
tcx: TyCtxt<'tcx>,
mir_body: &'a mut Body<'tcx>
) -> Self
fn inject_counters(&'a mut self)
sourcefn inject_coverage_span_counters(
&mut self,
coverage_spans: Vec<CoverageSpan>,
graphviz_data: &mut GraphvizData,
debug_used_expressions: &mut UsedExpressions
)
fn inject_coverage_span_counters(
&mut self,
coverage_spans: Vec<CoverageSpan>,
graphviz_data: &mut GraphvizData,
debug_used_expressions: &mut UsedExpressions
)
Inject a counter for each CoverageSpan
. There can be multiple CoverageSpan
s for a given
BCB, but only one actual counter needs to be incremented per BCB. bb_counters
maps each
bcb
to its Counter
, when injected. Subsequent CoverageSpan
s for a BCB that already has
a Counter
will inject an Expression
instead, and compute its value by adding ZERO
to
the BCB Counter
value.
If debugging, add every BCB Expression
associated with a CoverageSpan
s to the
used_expression_operands
map.
sourcefn inject_indirect_counters(
&mut self,
graphviz_data: &mut GraphvizData,
debug_used_expressions: &mut UsedExpressions
)
fn inject_indirect_counters(
&mut self,
graphviz_data: &mut GraphvizData,
debug_used_expressions: &mut UsedExpressions
)
inject_coverage_span_counters()
looped through the CoverageSpan
s and injected the
counter from the CoverageSpan
s BasicCoverageBlock
, removing it from the BCB in the
process (via take_counter()
).
Any other counter associated with a BasicCoverageBlock
, or its incoming edge, but not
associated with a CoverageSpan
, should only exist if the counter is an Expression
dependency (one of the expression operands). Collect them, and inject the additional
counters into the MIR, without a reportable coverage span.
fn bcb_leader_bb(&self, bcb: BasicCoverageBlock) -> BasicBlock
fn bcb_last_bb(&self, bcb: BasicCoverageBlock) -> BasicBlock
fn bcb_data(&self, bcb: BasicCoverageBlock) -> &BasicCoverageBlockData
fn bcb_data_mut(
&mut self,
bcb: BasicCoverageBlock
) -> &mut BasicCoverageBlockData
fn format_counter(&self, counter_kind: &CoverageKind) -> String
Auto Trait Implementations§
impl<'a, 'tcx> !RefUnwindSafe for Instrumentor<'a, 'tcx>
impl<'a, 'tcx> !Send for Instrumentor<'a, 'tcx>
impl<'a, 'tcx> !Sync for Instrumentor<'a, 'tcx>
impl<'a, 'tcx> Unpin for Instrumentor<'a, 'tcx>where
'tcx: 'a,
impl<'a, 'tcx> !UnwindSafe for Instrumentor<'a, 'tcx>
Blanket Implementations§
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: 248 bytes