Rollup merge of #133446 - Zalathar:querify, r=cjgillot
coverage: Use a query to identify which counter/expression IDs are used Given that we already have a query to identify the highest-numbered counter ID in a MIR body, we can extend that query to also build bitsets of used counter/expression IDs. That lets us avoid some messy coverage bookkeeping during the main MIR traversal for codegen. This does mean that we fail to treat some IDs as used in certain MIR-inlining scenarios, but I think that's fine, because it means that the results will be consistent across all instantiations of a function. --- There's some more cleanup I want to do in the function coverage collector, since it isn't really collecting anything any more, but I'll leave that for future work.
This commit is contained in:
commit
fa2edee758
9 changed files with 114 additions and 113 deletions
|
@ -28,7 +28,6 @@ rustc_index::newtype_index! {
|
|||
#[derive(HashStable)]
|
||||
#[encodable]
|
||||
#[orderable]
|
||||
#[max = 0xFFFF_FFFF]
|
||||
#[debug_format = "CounterId({})"]
|
||||
pub struct CounterId {}
|
||||
}
|
||||
|
@ -46,7 +45,6 @@ rustc_index::newtype_index! {
|
|||
#[derive(HashStable)]
|
||||
#[encodable]
|
||||
#[orderable]
|
||||
#[max = 0xFFFF_FFFF]
|
||||
#[debug_format = "ExpressionId({})"]
|
||||
pub struct ExpressionId {}
|
||||
}
|
||||
|
|
|
@ -8,7 +8,7 @@ use rustc_abi::{FieldIdx, VariantIdx};
|
|||
use rustc_data_structures::fx::FxIndexMap;
|
||||
use rustc_errors::ErrorGuaranteed;
|
||||
use rustc_hir::def_id::LocalDefId;
|
||||
use rustc_index::bit_set::BitMatrix;
|
||||
use rustc_index::bit_set::{BitMatrix, BitSet};
|
||||
use rustc_index::{Idx, IndexVec};
|
||||
use rustc_macros::{HashStable, TyDecodable, TyEncodable, TypeFoldable, TypeVisitable};
|
||||
use rustc_span::Span;
|
||||
|
@ -359,12 +359,22 @@ pub struct DestructuredConstant<'tcx> {
|
|||
/// Used by the `coverage_ids_info` query.
|
||||
#[derive(Clone, TyEncodable, TyDecodable, Debug, HashStable)]
|
||||
pub struct CoverageIdsInfo {
|
||||
/// Coverage codegen needs to know the highest counter ID that is ever
|
||||
pub counters_seen: BitSet<mir::coverage::CounterId>,
|
||||
pub expressions_seen: BitSet<mir::coverage::ExpressionId>,
|
||||
}
|
||||
|
||||
impl CoverageIdsInfo {
|
||||
/// Coverage codegen needs to know how many coverage counters are ever
|
||||
/// incremented within a function, so that it can set the `num-counters`
|
||||
/// argument of the `llvm.instrprof.increment` intrinsic.
|
||||
///
|
||||
/// This may be less than the highest counter ID emitted by the
|
||||
/// InstrumentCoverage MIR pass, if the highest-numbered counter increments
|
||||
/// were removed by MIR optimizations.
|
||||
pub max_counter_id: mir::coverage::CounterId,
|
||||
pub fn num_counters_after_mir_opts(&self) -> u32 {
|
||||
// FIXME(Zalathar): Currently this treats an unused counter as "used"
|
||||
// if its ID is less than that of the highest counter that really is
|
||||
// used. Fixing this would require adding a renumbering step somewhere.
|
||||
self.counters_seen.last_set_in(..).map_or(0, |max| max.as_u32() + 1)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue