Skip MIR pass `UnreachablePropagation` when coverage is enabled by Zalathar · Pu...
source link: https://github.com/rust-lang/rust/pull/116166
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
Conversation
Contributor
When coverage instrumentation and MIR opts are both enabled, coverage relies on two assumptions:
-
MIR opts that would delete
StatementKind::Coverage
statements instead move them into bb0 and change them toCoverageKind::Unreachable
. -
MIR opts won't delete all
CoverageKind::Counter
statements from an instrumented function.
Most MIR opts naturally satisfy the second assumption, because they won't remove coverage statements from bb0, but UnreachablePropagation
can do so if it finds that bb0 is unreachable. If this happens, LLVM thinks the function isn't instrumented, and it vanishes from coverage reports.
A proper solution won't be possible until after per-function coverage info lands in #116046, but for now we can avoid the problem by turning off this particular pass when coverage instrumentation is enabled.
cc @cjgillot since I found this while investigating coverage problems encountered by #113970
@rustbot label +A-code-coverage +A-mir-opt
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK