diff options
| author | bors <bors@rust-lang.org> | 2024-12-02 05:18:09 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2024-12-02 05:18:09 +0000 |
| commit | caa81728c37f5ccfa9a0979574b9272a67f8a286 (patch) | |
| tree | 99203dee6dd56d84f2b267f56f3e50d1103f46a9 /compiler/rustc_mir_transform/src | |
| parent | a522d78598415cdd614ccc6d961160f192f64b5c (diff) | |
| parent | 76183a53ed49264769c1e27296eee6115a1e43c1 (diff) | |
| download | rust-caa81728c37f5ccfa9a0979574b9272a67f8a286.tar.gz rust-caa81728c37f5ccfa9a0979574b9272a67f8a286.zip | |
Auto merge of #133723 - jhpratt:rollup-pyfespf, r=jhpratt
Rollup of 5 pull requests Successful merges: - #131416 (Mark `slice::copy_from_slice` unstably const) - #131784 (Stabilize unsigned and float variants of `num_midpoint` feature) - #133446 (coverage: Use a query to identify which counter/expression IDs are used) - #133711 (add isatty doc alias for `is_terminal`) - #133712 (rust_analyzer_settings: force use of 'nightly' toolchain) r? `@ghost` `@rustbot` modify labels: rollup
Diffstat (limited to 'compiler/rustc_mir_transform/src')
| -rw-r--r-- | compiler/rustc_mir_transform/src/coverage/query.rs | 47 |
1 files changed, 38 insertions, 9 deletions
diff --git a/compiler/rustc_mir_transform/src/coverage/query.rs b/compiler/rustc_mir_transform/src/coverage/query.rs index df151f8cca3..0090f6f3040 100644 --- a/compiler/rustc_mir_transform/src/coverage/query.rs +++ b/compiler/rustc_mir_transform/src/coverage/query.rs @@ -1,6 +1,7 @@ use rustc_data_structures::captures::Captures; +use rustc_index::bit_set::BitSet; use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags; -use rustc_middle::mir::coverage::{CounterId, CoverageKind}; +use rustc_middle::mir::coverage::{CovTerm, CoverageKind, MappingKind}; use rustc_middle::mir::{Body, CoverageIdsInfo, Statement, StatementKind}; use rustc_middle::query::TyCtxtAt; use rustc_middle::ty::{self, TyCtxt}; @@ -86,15 +87,43 @@ fn coverage_ids_info<'tcx>( ) -> CoverageIdsInfo { let mir_body = tcx.instance_mir(instance_def); - let max_counter_id = all_coverage_in_mir_body(mir_body) - .filter_map(|kind| match *kind { - CoverageKind::CounterIncrement { id } => Some(id), - _ => None, - }) - .max() - .unwrap_or(CounterId::ZERO); + let Some(fn_cov_info) = mir_body.function_coverage_info.as_ref() else { + return CoverageIdsInfo { + counters_seen: BitSet::new_empty(0), + expressions_seen: BitSet::new_empty(0), + }; + }; + + let mut counters_seen = BitSet::new_empty(fn_cov_info.num_counters); + let mut expressions_seen = BitSet::new_filled(fn_cov_info.expressions.len()); + + // For each expression ID that is directly used by one or more mappings, + // mark it as not-yet-seen. This indicates that we expect to see a + // corresponding `ExpressionUsed` statement during MIR traversal. + for mapping in fn_cov_info.mappings.iter() { + // Currently we only worry about ordinary code mappings. + // For branch and MC/DC mappings, expressions might not correspond + // to any particular point in the control-flow graph. + // (Keep this in sync with the injection of `ExpressionUsed` + // statements in the `InstrumentCoverage` MIR pass.) + if let MappingKind::Code(CovTerm::Expression(id)) = mapping.kind { + expressions_seen.remove(id); + } + } + + for kind in all_coverage_in_mir_body(mir_body) { + match *kind { + CoverageKind::CounterIncrement { id } => { + counters_seen.insert(id); + } + CoverageKind::ExpressionUsed { id } => { + expressions_seen.insert(id); + } + _ => {} + } + } - CoverageIdsInfo { max_counter_id } + CoverageIdsInfo { counters_seen, expressions_seen } } fn all_coverage_in_mir_body<'a, 'tcx>( |
