[−][src]Struct rustc_mir::transform::coverage::query::CoverageVisitor
The num_counters argument to llvm.instrprof.increment is the max counter_id + 1, or in
other words, the number of counter value references injected into the MIR (plus 1 for the
reserved ZERO counter, which uses counter ID 0 when included in an expression). Injected
counters have a counter ID from 1..num_counters-1.
num_expressions is the number of counter expressions added to the MIR body.
Both num_counters and num_expressions are used to initialize new vectors, during backend
code generate, to lookup counters and expressions by simple u32 indexes.
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.
This visitor runs twice, first with add_missing_operands set to false, to find the maximum
counter ID and maximum expression ID based on their enum variant id fields; then, as a
safeguard, with add_missing_operands set to true, to find any other counter or expression
IDs referenced by expression operands, if not already seen.
Ideally, each operand ID in a MIR CoverageKind::Expression will have a separate MIR Coverage
statement for the Counter or Expression with the referenced ID. but since current or future
MIR optimizations can theoretically optimize out segments of a MIR, it may not be possible to
guarantee this, so the second pass ensures the CoverageInfo counts include all referenced IDs.
Fields
info: CoverageInfoadd_missing_operands: boolImplementations
impl CoverageVisitor[src]
pub(in transform::coverage::query) fn update_num_counters(
&mut self,
counter_id: u32
)[src]
&mut self,
counter_id: u32
)
Updates num_counters to the maximum encountered zero-based counter_id plus 1. Note the
final computed number of counters should be the number of all CoverageKind::Counter
statements in the MIR plus one for the implicit ZERO counter.
pub(in transform::coverage::query) fn update_num_expressions(
&mut self,
expression_id: u32
)[src]
&mut self,
expression_id: u32
)
Computes an expression index for each expression ID, and updates num_expressions to the
maximum encountered index plus 1.
pub(in transform::coverage::query) fn update_from_expression_operand(
&mut self,
operand_id: u32
)[src]
&mut self,
operand_id: u32
)
Trait Implementations
impl<'_> Visitor<'_> for CoverageVisitor[src]
pub fn visit_coverage(&mut self, coverage: &Coverage, _location: Location)[src]
pub fn visit_body(&mut self, body: &Body<'tcx>)[src]
pub fn visit_basic_block_data(
&mut self,
block: BasicBlock,
data: &BasicBlockData<'tcx>
)[src]
&mut self,
block: BasicBlock,
data: &BasicBlockData<'tcx>
)
pub fn visit_source_scope_data(&mut self, scope_data: &SourceScopeData<'tcx>)[src]
pub fn visit_statement(
&mut self,
statement: &Statement<'tcx>,
location: Location
)[src]
&mut self,
statement: &Statement<'tcx>,
location: Location
)
pub fn visit_assign(
&mut self,
place: &Place<'tcx>,
rvalue: &Rvalue<'tcx>,
location: Location
)[src]
&mut self,
place: &Place<'tcx>,
rvalue: &Rvalue<'tcx>,
location: Location
)
pub fn visit_terminator(
&mut self,
terminator: &Terminator<'tcx>,
location: Location
)[src]
&mut self,
terminator: &Terminator<'tcx>,
location: Location
)
pub fn visit_assert_message(
&mut self,
msg: &AssertKind<Operand<'tcx>>,
location: Location
)[src]
&mut self,
msg: &AssertKind<Operand<'tcx>>,
location: Location
)
pub fn visit_rvalue(&mut self, rvalue: &Rvalue<'tcx>, location: Location)[src]
pub fn visit_operand(&mut self, operand: &Operand<'tcx>, location: Location)[src]
pub fn visit_ascribe_user_ty(
&mut self,
place: &Place<'tcx>,
variance: &Variance,
user_ty: &UserTypeProjection,
location: Location
)[src]
&mut self,
place: &Place<'tcx>,
variance: &Variance,
user_ty: &UserTypeProjection,
location: Location
)
pub fn visit_retag(
&mut self,
kind: &RetagKind,
place: &Place<'tcx>,
location: Location
)[src]
&mut self,
kind: &RetagKind,
place: &Place<'tcx>,
location: Location
)
pub fn visit_place(
&mut self,
place: &Place<'tcx>,
context: PlaceContext,
location: Location
)[src]
&mut self,
place: &Place<'tcx>,
context: PlaceContext,
location: Location
)
pub fn visit_projection(
&mut self,
local: Local,
projection: &[ProjectionElem<Local, &'tcx TyS<'tcx>>],
context: PlaceContext,
location: Location
)[src]
&mut self,
local: Local,
projection: &[ProjectionElem<Local, &'tcx TyS<'tcx>>],
context: PlaceContext,
location: Location
)
pub fn visit_projection_elem(
&mut self,
local: Local,
proj_base: &[ProjectionElem<Local, &'tcx TyS<'tcx>>],
elem: ProjectionElem<Local, &'tcx TyS<'tcx>>,
context: PlaceContext,
location: Location
)[src]
&mut self,
local: Local,
proj_base: &[ProjectionElem<Local, &'tcx TyS<'tcx>>],
elem: ProjectionElem<Local, &'tcx TyS<'tcx>>,
context: PlaceContext,
location: Location
)
pub fn super_place(
&mut self,
place: &Place<'tcx>,
context: PlaceContext,
location: Location
)[src]
&mut self,
place: &Place<'tcx>,
context: PlaceContext,
location: Location
)
pub fn super_projection(
&mut self,
local: Local,
projection: &[ProjectionElem<Local, &'tcx TyS<'tcx>>],
context: PlaceContext,
location: Location
)[src]
&mut self,
local: Local,
projection: &[ProjectionElem<Local, &'tcx TyS<'tcx>>],
context: PlaceContext,
location: Location
)
pub fn super_projection_elem(
&mut self,
_local: Local,
_proj_base: &[ProjectionElem<Local, &'tcx TyS<'tcx>>],
elem: ProjectionElem<Local, &'tcx TyS<'tcx>>,
_context: PlaceContext,
location: Location
)[src]
&mut self,
_local: Local,
_proj_base: &[ProjectionElem<Local, &'tcx TyS<'tcx>>],
elem: ProjectionElem<Local, &'tcx TyS<'tcx>>,
_context: PlaceContext,
location: Location
)
pub fn visit_constant(&mut self, constant: &Constant<'tcx>, location: Location)[src]
pub fn visit_span(&mut self, span: &Span)[src]
pub fn visit_source_info(&mut self, source_info: &SourceInfo)[src]
pub fn visit_ty(&mut self, ty: &'tcx TyS<'tcx>, TyContext)[src]
pub fn visit_user_type_projection(&mut self, ty: &UserTypeProjection)[src]
pub fn visit_user_type_annotation(
&mut self,
index: UserTypeAnnotationIndex,
ty: &CanonicalUserTypeAnnotation<'tcx>
)[src]
&mut self,
index: UserTypeAnnotationIndex,
ty: &CanonicalUserTypeAnnotation<'tcx>
)
pub fn visit_region(&mut self, region: &&'tcx RegionKind, Location)[src]
pub fn visit_const(&mut self, constant: &&'tcx Const<'tcx>, Location)[src]
pub fn visit_substs(&mut self, substs: &&'tcx List<GenericArg<'tcx>>, Location)[src]
pub fn visit_local_decl(&mut self, local: Local, local_decl: &LocalDecl<'tcx>)[src]
pub fn visit_var_debug_info(&mut self, var_debug_info: &VarDebugInfo<'tcx>)[src]
pub fn visit_local(
&mut self,
_local: &Local,
_context: PlaceContext,
_location: Location
)[src]
&mut self,
_local: &Local,
_context: PlaceContext,
_location: Location
)
pub fn visit_source_scope(&mut self, scope: &SourceScope)[src]
pub fn super_body(&mut self, body: &Body<'tcx>)[src]
pub fn super_basic_block_data(
&mut self,
block: BasicBlock,
data: &BasicBlockData<'tcx>
)[src]
&mut self,
block: BasicBlock,
data: &BasicBlockData<'tcx>
)
pub fn super_source_scope_data(&mut self, scope_data: &SourceScopeData<'tcx>)[src]
pub fn super_statement(
&mut self,
statement: &Statement<'tcx>,
location: Location
)[src]
&mut self,
statement: &Statement<'tcx>,
location: Location
)
pub fn super_assign(
&mut self,
place: &Place<'tcx>,
rvalue: &Rvalue<'tcx>,
location: Location
)[src]
&mut self,
place: &Place<'tcx>,
rvalue: &Rvalue<'tcx>,
location: Location
)
pub fn super_terminator(
&mut self,
terminator: &Terminator<'tcx>,
location: Location
)[src]
&mut self,
terminator: &Terminator<'tcx>,
location: Location
)
pub fn super_assert_message(
&mut self,
msg: &AssertKind<Operand<'tcx>>,
location: Location
)[src]
&mut self,
msg: &AssertKind<Operand<'tcx>>,
location: Location
)
pub fn super_rvalue(&mut self, rvalue: &Rvalue<'tcx>, location: Location)[src]
pub fn super_operand(&mut self, operand: &Operand<'tcx>, location: Location)[src]
pub fn super_ascribe_user_ty(
&mut self,
place: &Place<'tcx>,
_variance: &Variance,
user_ty: &UserTypeProjection,
location: Location
)[src]
&mut self,
place: &Place<'tcx>,
_variance: &Variance,
user_ty: &UserTypeProjection,
location: Location
)
pub fn super_coverage(&mut self, _coverage: &Coverage, _location: Location)[src]
pub fn super_retag(
&mut self,
_kind: &RetagKind,
place: &Place<'tcx>,
location: Location
)[src]
&mut self,
_kind: &RetagKind,
place: &Place<'tcx>,
location: Location
)
pub fn super_local_decl(&mut self, local: Local, local_decl: &LocalDecl<'tcx>)[src]
pub fn super_var_debug_info(&mut self, var_debug_info: &VarDebugInfo<'tcx>)[src]
pub fn super_source_scope(&mut self, _scope: &SourceScope)[src]
pub fn super_constant(&mut self, constant: &Constant<'tcx>, location: Location)[src]
pub fn super_span(&mut self, _span: &Span)[src]
pub fn super_source_info(&mut self, source_info: &SourceInfo)[src]
pub fn super_user_type_projection(&mut self, _ty: &UserTypeProjection)[src]
pub fn super_user_type_annotation(
&mut self,
_index: UserTypeAnnotationIndex,
ty: &CanonicalUserTypeAnnotation<'tcx>
)[src]
&mut self,
_index: UserTypeAnnotationIndex,
ty: &CanonicalUserTypeAnnotation<'tcx>
)
pub fn super_ty(&mut self, _ty: &'tcx TyS<'tcx>)[src]
pub fn super_region(&mut self, _region: &&'tcx RegionKind)[src]
pub fn super_const(&mut self, _const: &&'tcx Const<'tcx>)[src]
pub fn super_substs(&mut self, _substs: &&'tcx List<GenericArg<'tcx>>)[src]
pub fn visit_location(&mut self, body: &Body<'tcx>, location: Location)[src]
Auto Trait Implementations
impl RefUnwindSafe for CoverageVisitor
impl Send for CoverageVisitor
impl Sync for CoverageVisitor
impl Unpin for CoverageVisitor
impl UnwindSafe for CoverageVisitor
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.