On 11/11/25 08:52, Jørgen Kvalsvik wrote:
Hi,
The current state of flags for controlling the code coverage features is
a bit messy. GCC uses these options to enable different kinds of coverage:
-ftest-coverage
-fcondition-coverage
-fpath-coverage
--coverage
There's also -fprofile-arcs which is implied by --coverage, but -
fprofile-arcs is useful outside of coverage for profile-guided
optimizations, maybe other uses. Unlike -fprofile-arcs, the -fcondition-
coverage and -fpath-coverage does not make sense without also enabling -
ftest-coverage, I have a patch fixing that [1]. --coverage has
historically been the flag intended to be used by users, as it also
tells to linker to link libgcov. It never really makes sense to use -
fcondition-coverage or -fpath-coverage without -ftest-coverage.
To make matters a bit more confusing, -fcondition-coverage measures
masking MC/DC [2], and -fpath-coverage measures prime path coverage [3]
[4], and neither is immediately obvious from the flags. For comparison,
clang uses -fmcdc for its (unique-cause) MC/DC support. Both these flags
were added by me, and the intention at the time was for them to maybe
include options later for specifying what form of condition- and path
coverage to measure, with the current behaviour remaining the default.
We can still do this, of course, but either way it's still a bit of a mess.
I propose to either extend the --coverage flag with an option, or add a
new flag, similar to the -fsanitize=... family, maybe with some
defaults. Example usage:
gcc a.c -o a --coverage # line and branch coverage
gcc a.c -o a --coverage=prime-path,mcdc # implies masking MC/DC
gcc a.c -o a --coverage=prime-path,masking-mcdc # explicitly masking MC/DC
gcc a.c -o a --coverage=prime-path --coverage=masking-mcdc # repeated
use is ok too
An alternative to overloading the --coverage flag is adding a new -
fcoverage=... flag, similar to -fsanitize.
Thoughts, alternatives?
Thanks,
Jørgen
[1] https://gcc.gnu.org/pipermail/gcc-patches/2025-November/699758.html
[2] https://en.wikipedia.org/wiki/Modified_condition/decision_coverage
[3] https://cs.gmu.edu/~johnsonb/fall20/Lecture_19-AOCh7(2).pdf
[4] https://patch.no/static/papers/prime-path-coverage-in-
gcc-2025-03-27.pdf
Any thoughts on this? I'm happy to implement it either way we're going for.
Thanks,
Jørgen