coverage: Remove -Zcoverage-options=no-mir-spans

This flag turned out to be less useful than anticipated, and interferes with
work towards expansion support.
This commit is contained in:
Zalathar
2025-08-02 18:20:56 +10:00
parent 16843ce427
commit 51e62a09a3
9 changed files with 5 additions and 226 deletions

View File

@@ -778,8 +778,8 @@ fn test_unstable_options_tracking_hash() {
coverage_options,
CoverageOptions {
level: CoverageLevel::Mcdc,
no_mir_spans: true,
discard_all_spans_in_codegen: true
// (don't collapse test-only options onto the same line)
discard_all_spans_in_codegen: true,
}
);
tracked!(crate_attr, vec!["abc".to_string()]);

View File

@@ -82,15 +82,11 @@ pub(super) fn extract_all_mapping_info_from_mir<'tcx>(
let mut mcdc_degraded_branches = vec![];
let mut mcdc_mappings = vec![];
if hir_info.is_async_fn || tcx.sess.coverage_no_mir_spans() {
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.
//
// 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 {
code_mappings.push(CodeMapping { span, bcb: START_BCB });
}

View File

@@ -182,14 +182,6 @@ pub enum InstrumentCoverage {
pub struct CoverageOptions {
pub level: CoverageLevel,
/// `-Zcoverage-options=no-mir-spans`: Don't extract block coverage spans
/// from MIR statements/terminators, making it easier to inspect/debug
/// branch and MC/DC coverage mappings.
///
/// For internal debugging only. If other code changes would make it hard
/// to keep supporting this flag, remove it.
pub no_mir_spans: bool,
/// `-Zcoverage-options=discard-all-spans-in-codegen`: During codegen,
/// discard all coverage spans as though they were invalid. Needed by
/// regression tests for #133606, because we don't have an easy way to

View File

@@ -755,8 +755,7 @@ mod desc {
pub(crate) const parse_linker_flavor: &str = ::rustc_target::spec::LinkerFlavorCli::one_of();
pub(crate) const parse_dump_mono_stats: &str = "`markdown` (default) or `json`";
pub(crate) const parse_instrument_coverage: &str = parse_bool;
pub(crate) const parse_coverage_options: &str =
"`block` | `branch` | `condition` | `mcdc` | `no-mir-spans`";
pub(crate) const parse_coverage_options: &str = "`block` | `branch` | `condition` | `mcdc`";
pub(crate) const parse_instrument_xray: &str = "either a boolean (`yes`, `no`, `on`, `off`, etc), or a comma separated list of settings: `always` or `never` (mutually exclusive), `ignore-loops`, `instruction-threshold=N`, `skip-entry`, `skip-exit`";
pub(crate) const parse_unpretty: &str = "`string` or `string=string`";
pub(crate) const parse_treat_err_as_bug: &str = "either no value or a non-negative number";
@@ -1460,7 +1459,6 @@ pub mod parse {
"branch" => slot.level = CoverageLevel::Branch,
"condition" => slot.level = CoverageLevel::Condition,
"mcdc" => slot.level = CoverageLevel::Mcdc,
"no-mir-spans" => slot.no_mir_spans = true,
"discard-all-spans-in-codegen" => slot.discard_all_spans_in_codegen = true,
_ => return false,
}

View File

@@ -359,11 +359,6 @@ impl Session {
&& self.opts.unstable_opts.coverage_options.level >= CoverageLevel::Mcdc
}
/// True if `-Zcoverage-options=no-mir-spans` was passed.
pub fn coverage_no_mir_spans(&self) -> bool {
self.opts.unstable_opts.coverage_options.no_mir_spans
}
/// True if `-Zcoverage-options=discard-all-spans-in-codegen` was passed.
pub fn coverage_discard_all_spans_in_codegen(&self) -> bool {
self.opts.unstable_opts.coverage_options.discard_all_spans_in_codegen

View File

@@ -1,63 +0,0 @@
Function name: no_mir_spans::while_cond
Raw bytes (18): 0x[01, 01, 01, 05, 01, 02, 01, 10, 01, 00, 10, 20, 02, 01, 04, 0b, 00, 10]
Number of files: 1
- file 0 => $DIR/no-mir-spans.rs
Number of expressions: 1
- expression 0 operands: lhs = Counter(1), rhs = Counter(0)
Number of file 0 mappings: 2
- Code(Counter(0)) at (prev + 16, 1) to (start + 0, 16)
- Branch { true: Expression(0, Sub), false: Counter(0) } at (prev + 4, 11) to (start + 0, 16)
true = (c1 - c0)
false = c0
Highest counter ID seen: c0
Function name: no_mir_spans::while_cond_not
Raw bytes (18): 0x[01, 01, 01, 05, 01, 02, 01, 19, 01, 00, 14, 20, 02, 01, 04, 0b, 00, 14]
Number of files: 1
- file 0 => $DIR/no-mir-spans.rs
Number of expressions: 1
- expression 0 operands: lhs = Counter(1), rhs = Counter(0)
Number of file 0 mappings: 2
- Code(Counter(0)) at (prev + 25, 1) to (start + 0, 20)
- Branch { true: Expression(0, Sub), false: Counter(0) } at (prev + 4, 11) to (start + 0, 20)
true = (c1 - c0)
false = c0
Highest counter ID seen: c0
Function name: no_mir_spans::while_op_and
Raw bytes (31): 0x[01, 01, 04, 09, 05, 09, 01, 0f, 09, 01, 05, 03, 01, 22, 01, 00, 12, 20, 05, 02, 05, 0b, 00, 10, 20, 06, 0a, 00, 14, 00, 19]
Number of files: 1
- file 0 => $DIR/no-mir-spans.rs
Number of expressions: 4
- expression 0 operands: lhs = Counter(2), rhs = Counter(1)
- expression 1 operands: lhs = Counter(2), rhs = Counter(0)
- expression 2 operands: lhs = Expression(3, Add), rhs = Counter(2)
- expression 3 operands: lhs = Counter(0), rhs = Counter(1)
Number of file 0 mappings: 3
- Code(Counter(0)) at (prev + 34, 1) to (start + 0, 18)
- Branch { true: Counter(1), false: Expression(0, Sub) } at (prev + 5, 11) to (start + 0, 16)
true = c1
false = (c2 - c1)
- Branch { true: Expression(1, Sub), false: Expression(2, Sub) } at (prev + 0, 20) to (start + 0, 25)
true = (c2 - c0)
false = ((c0 + c1) - c2)
Highest counter ID seen: c1
Function name: no_mir_spans::while_op_or
Raw bytes (29): 0x[01, 01, 03, 09, 05, 09, 0b, 01, 05, 03, 01, 2d, 01, 00, 11, 20, 05, 02, 05, 0b, 00, 10, 20, 06, 01, 00, 14, 00, 19]
Number of files: 1
- file 0 => $DIR/no-mir-spans.rs
Number of expressions: 3
- expression 0 operands: lhs = Counter(2), rhs = Counter(1)
- expression 1 operands: lhs = Counter(2), rhs = Expression(2, Add)
- expression 2 operands: lhs = Counter(0), rhs = Counter(1)
Number of file 0 mappings: 3
- Code(Counter(0)) at (prev + 45, 1) to (start + 0, 17)
- Branch { true: Counter(1), false: Expression(0, Sub) } at (prev + 5, 11) to (start + 0, 16)
true = c1
false = (c2 - c1)
- Branch { true: Expression(1, Sub), false: Counter(0) } at (prev + 0, 20) to (start + 0, 25)
true = (c2 - (c0 + c1))
false = c0
Highest counter ID seen: c1

View File

@@ -1,77 +0,0 @@
LL| |#![feature(coverage_attribute)]
LL| |//@ edition: 2021
LL| |//@ compile-flags: -Zcoverage-options=branch,no-mir-spans
LL| |//@ llvm-cov-flags: --show-branches=count
LL| |
LL| |// Tests the behaviour of the `-Zcoverage-options=no-mir-spans` debugging flag.
LL| |// The actual code below is just some non-trivial code copied from another test
LL| |// (`while.rs`), and has no particular significance.
LL| |
LL| |macro_rules! no_merge {
LL| | () => {
LL| | for _ in 0..1 {}
LL| | };
LL| |}
LL| |
LL| 1|fn while_cond() {
LL| | no_merge!();
LL| |
LL| | let mut a = 8;
LL| | while a > 0 {
------------------
| Branch (LL:11): [True: 8, False: 1]
------------------
LL| | a -= 1;
LL| | }
LL| |}
LL| |
LL| 1|fn while_cond_not() {
LL| | no_merge!();
LL| |
LL| | let mut a = 8;
LL| | while !(a == 0) {
------------------
| Branch (LL:11): [True: 8, False: 1]
------------------
LL| | a -= 1;
LL| | }
LL| |}
LL| |
LL| 1|fn while_op_and() {
LL| | no_merge!();
LL| |
LL| | let mut a = 8;
LL| | let mut b = 4;
LL| | while a > 0 && b > 0 {
------------------
| Branch (LL:11): [True: 5, False: 0]
| Branch (LL:20): [True: 4, False: 1]
------------------
LL| | a -= 1;
LL| | b -= 1;
LL| | }
LL| |}
LL| |
LL| 1|fn while_op_or() {
LL| | no_merge!();
LL| |
LL| | let mut a = 4;
LL| | let mut b = 8;
LL| | while a > 0 || b > 0 {
------------------
| Branch (LL:11): [True: 4, False: 5]
| Branch (LL:20): [True: 4, False: 1]
------------------
LL| | a -= 1;
LL| | b -= 1;
LL| | }
LL| |}
LL| |
LL| |#[coverage(off)]
LL| |fn main() {
LL| | while_cond();
LL| | while_cond_not();
LL| | while_op_and();
LL| | while_op_or();
LL| |}

View File

@@ -1,62 +0,0 @@
#![feature(coverage_attribute)]
//@ edition: 2021
//@ compile-flags: -Zcoverage-options=branch,no-mir-spans
//@ llvm-cov-flags: --show-branches=count
// Tests the behaviour of the `-Zcoverage-options=no-mir-spans` debugging flag.
// The actual code below is just some non-trivial code copied from another test
// (`while.rs`), and has no particular significance.
macro_rules! no_merge {
() => {
for _ in 0..1 {}
};
}
fn while_cond() {
no_merge!();
let mut a = 8;
while a > 0 {
a -= 1;
}
}
fn while_cond_not() {
no_merge!();
let mut a = 8;
while !(a == 0) {
a -= 1;
}
}
fn while_op_and() {
no_merge!();
let mut a = 8;
let mut b = 4;
while a > 0 && b > 0 {
a -= 1;
b -= 1;
}
}
fn while_op_or() {
no_merge!();
let mut a = 4;
let mut b = 8;
while a > 0 || b > 0 {
a -= 1;
b -= 1;
}
}
#[coverage(off)]
fn main() {
while_cond();
while_cond_not();
while_op_and();
while_op_or();
}

View File

@@ -1,2 +1,2 @@
error: incorrect value `bad` for unstable option `coverage-options` - `block` | `branch` | `condition` | `mcdc` | `no-mir-spans` was expected
error: incorrect value `bad` for unstable option `coverage-options` - `block` | `branch` | `condition` | `mcdc` was expected