mirror of
https://github.com/rust-lang/rust.git
synced 2026-01-21 01:10:40 +00:00
coverage: Skip instrumenting a function if no spans were extracted from MIR The immediate symptoms of #118643 were fixed by #118666, but some users reported that their builds now encounter another coverage-related ICE: ``` error: internal compiler error: compiler/rustc_codegen_llvm/src/coverageinfo/mapgen.rs:98:17: A used function should have had coverage mapping data but did not: (...) ``` I was able to reproduce at least one cause of this error: if no relevant spans could be extracted from a function, but the function contains `CoverageKind::SpanMarker` statements, then codegen still thinks the function is instrumented and complains about the fact that it has no coverage spans. This PR prevents that from happening in two ways: - If we didn't extract any relevant spans from MIR, skip instrumenting the entire function and don't create a `FunctionCoverateInfo` for it. - If coverage codegen sees a `CoverageKind::SpanMarker` statement, skip it early and avoid creating `func_coverage`. --- Fixes #118850.
The tests in this directory are shared by two different test modes, and can be run in multiple different ways:
./x.py test coverage-map(compiles to LLVM IR and checks coverage mappings)./x.py test coverage-run(runs a test binary and checks its coverage report)./x.py test coverage(runs bothcoverage-mapandcoverage-run)
Maintenance note
These tests can be sensitive to small changes in MIR spans or MIR control flow, especially in HIR-to-MIR lowering or MIR optimizations.
If you haven't touched the coverage code directly, and the tests still pass in
coverage-run mode, then it should usually be OK to just re-bless the mappings
as necessary with ./x.py test coverage-map --bless, without worrying too much
about the exact changes.