Rollup merge of #126587 - Zalathar:no-mir-spans, r=oli-obk
coverage: Add debugging flag `-Zcoverage-options=no-mir-spans` When set, this flag skips the code that normally extracts coverage spans from MIR statements and terminators. That sometimes makes it easier to debug branch coverage and MC/DC coverage instrumentation, because the coverage output is less noisy. For internal debugging only. If future code changes would make it hard to keep supporting this flag, it should be removed at that time. `@rustbot` label +A-code-coverage
This commit is contained in:
commit
bbec736f2d
10 changed files with 235 additions and 21 deletions
|
@ -5,6 +5,7 @@ use rustc_index::bit_set::BitSet;
|
|||
use rustc_index::IndexVec;
|
||||
use rustc_middle::mir::coverage::{BlockMarkerId, BranchSpan, ConditionInfo, CoverageKind};
|
||||
use rustc_middle::mir::{self, BasicBlock, StatementKind};
|
||||
use rustc_middle::ty::TyCtxt;
|
||||
use rustc_span::Span;
|
||||
|
||||
use crate::coverage::graph::{BasicCoverageBlock, CoverageGraph, START_BCB};
|
||||
|
@ -63,30 +64,34 @@ pub(super) struct ExtractedMappings {
|
|||
|
||||
/// Extracts coverage-relevant spans from MIR, and associates them with
|
||||
/// their corresponding BCBs.
|
||||
pub(super) fn extract_all_mapping_info_from_mir(
|
||||
mir_body: &mir::Body<'_>,
|
||||
pub(super) fn extract_all_mapping_info_from_mir<'tcx>(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
mir_body: &mir::Body<'tcx>,
|
||||
hir_info: &ExtractedHirInfo,
|
||||
basic_coverage_blocks: &CoverageGraph,
|
||||
) -> ExtractedMappings {
|
||||
if hir_info.is_async_fn {
|
||||
// An async function desugars into a function that returns a future,
|
||||
// with the user code wrapped in a closure. Any spans in the desugared
|
||||
// outer function will be unhelpful, so just keep the signature span
|
||||
// and ignore all of the spans in the MIR body.
|
||||
let mut mappings = ExtractedMappings::default();
|
||||
if let Some(span) = hir_info.fn_sig_span_extended {
|
||||
mappings.code_mappings.push(CodeMapping { span, bcb: START_BCB });
|
||||
}
|
||||
return mappings;
|
||||
}
|
||||
|
||||
let mut code_mappings = vec![];
|
||||
let mut branch_pairs = vec![];
|
||||
let mut mcdc_bitmap_bytes = 0;
|
||||
let mut mcdc_branches = vec![];
|
||||
let mut mcdc_decisions = vec![];
|
||||
|
||||
extract_refined_covspans(mir_body, hir_info, basic_coverage_blocks, &mut code_mappings);
|
||||
if hir_info.is_async_fn || tcx.sess.coverage_no_mir_spans() {
|
||||
// An async function desugars into a function that returns a future,
|
||||
// with the user code wrapped in a closure. Any spans in the desugared
|
||||
// outer function will be unhelpful, so just keep the signature span
|
||||
// and ignore all of the spans in the MIR body.
|
||||
//
|
||||
// When debugging flag `-Zcoverage-options=no-mir-spans` is set, we need
|
||||
// to give the same treatment to _all_ functions, because `llvm-cov`
|
||||
// seems to ignore functions that don't have any ordinary code spans.
|
||||
if let Some(span) = hir_info.fn_sig_span_extended {
|
||||
code_mappings.push(CodeMapping { span, bcb: START_BCB });
|
||||
}
|
||||
} else {
|
||||
// Extract coverage spans from MIR statements/terminators as normal.
|
||||
extract_refined_covspans(mir_body, hir_info, basic_coverage_blocks, &mut code_mappings);
|
||||
}
|
||||
|
||||
branch_pairs.extend(extract_branch_pairs(mir_body, hir_info, basic_coverage_blocks));
|
||||
|
||||
|
|
|
@ -71,8 +71,12 @@ fn instrument_function_for_coverage<'tcx>(tcx: TyCtxt<'tcx>, mir_body: &mut mir:
|
|||
|
||||
////////////////////////////////////////////////////
|
||||
// Extract coverage spans and other mapping info from MIR.
|
||||
let extracted_mappings =
|
||||
mappings::extract_all_mapping_info_from_mir(mir_body, &hir_info, &basic_coverage_blocks);
|
||||
let extracted_mappings = mappings::extract_all_mapping_info_from_mir(
|
||||
tcx,
|
||||
mir_body,
|
||||
&hir_info,
|
||||
&basic_coverage_blocks,
|
||||
);
|
||||
|
||||
////////////////////////////////////////////////////
|
||||
// Create an optimized mix of `Counter`s and `Expression`s for the `CoverageGraph`. Ensure
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue