2

Skip MIR pass `UnreachablePropagation` when coverage is enabled by Zalathar · Pu...

 11 months ago
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.
neoserver,ios ssh client

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 to CoverageKind::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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK