Skip to content

Matched gcov to the compiler that produced the coverage data - #658

Merged
fdesbiens merged 1 commit into
eclipse-threadx:devfrom
fdesbiens:fix/coverage-gcov-matches-cc
Aug 24, 2026
Merged

Matched gcov to the compiler that produced the coverage data#658
fdesbiens merged 1 commit into
eclipse-threadx:devfrom
fdesbiens:fix/coverage-gcov-matches-cc

Conversation

@fdesbiens

Copy link
Copy Markdown
Contributor

Companion to #656 and #657. Neither is wrong; together they open a hole that this closes.

gcov reads a data format tied to the compiler that produced it. coverage.sh took whatever gcov was first on PATH, which was fine while the compiler was also whatever was first on PATH. #656 made cmake/linux.cmake honour CC, and #657 made a compiler switch actually reconfigure the build — so that assumption no longer holds, and the first person to use the new capability would have hit this.

Measured on dev with both merged:

$ CC=gcc-14 ./run.sh build default_build_coverage     # succeeds
$ ./coverage.sh default_build_coverage
RuntimeError: GCOV returncode was 3.
EXIT=64

gcov says why, if asked directly:

tx_block_allocate.c.gcno:version 'B42*', prefer 'B33*'

The part that would have cost someone an afternoon is where it surfaces: the tests all pass, then the coverage step dies with a Python traceback, which reads like a gcovr bug rather than a toolchain mismatch.

The change

gcov is derived from CC instead of found on PATH, so the caller sets one variable rather than remembering two. GCOV still overrides, for a toolchain that does not follow the gcc/gcov naming, and a derived gcov that does not exist is reported as such rather than surfacing as a traceback.

Applied to both test/tx/cmake/coverage.sh and test/smp/cmake/coverage.sh.

Verified, both suites

Invocation Before After
CC=gcc-14 exit 64, traceback exit 0 — 177 files, 1527/3827 lines
CC unset (what CI does) exit 0 exit 0 — 177 files, 1527/3827 lines, unchanged
CC=gcc-99 n/a exit 1, naming gcov-99 and CC, not a traceback
GCOV=gcov-14 with CC=gcc-99 n/a exit 0 — the override still wins

CI is unaffected: nothing in the workflows sets CC, so the default path is byte-for-byte the behaviour it had before.

One deliberate non-fix

Reading a gcc-14 tree with the default gcc-13 gcov still fails with exit 64. That pairing is wrong, and producing a number from mismatched coverage data would be worse than refusing. Only the case where CC is stated is made to work.

gcov reads a data format tied to the compiler that produced it. coverage.sh
took whatever gcov was first on PATH, which was fine while the compiler was
also whatever was first on PATH. eclipse-threadx#656 made cmake/linux.cmake honour CC and
eclipse-threadx#657 made a compiler switch actually reconfigure the build, so that
assumption no longer holds, and the first person to use the new capability
would have hit this.

Measured on dev with both of those merged:

    CC=gcc-14 ./run.sh build default_build_coverage    # succeeds
    ./coverage.sh default_build_coverage               # exit 64

gcov says why, if asked directly:

    tx_block_allocate.c.gcno:version 'B42*', prefer 'B33*'

gcovr turns that into "GCOV returncode was 3" and exits 64 through a Python
traceback, after the tests have already passed. It reads like a coverage bug
rather than a toolchain mismatch, which is the part that would have cost
someone an afternoon.

gcov is now derived from CC rather than found on PATH, so the caller sets
one variable instead of remembering two. GCOV still overrides, for a
toolchain that does not follow the gcc/gcov naming, and a derived gcov that
does not exist is reported as such instead of surfacing as a traceback.

Verified, tx and smp, before and after:

    CC=gcc-14    was exit 64, now exit 0, 177 files and 1527/3827 lines
    CC unset     exit 0, 177 files and 1527/3827 lines, unchanged
    CC=gcc-99    exit 1 naming gcov-99 and CC, rather than a traceback
    GCOV=gcov-14 with CC=gcc-99, exit 0, so the override still wins

A mismatched pairing still fails, deliberately: reading a gcc-14 tree with
the default gcc-13 gcov is exit 64 as before. Producing a number from
mismatched data would be worse than refusing.

Assisted-by: Claude Opus 5 <noreply@anthropic.com>
@fdesbiens
fdesbiens merged commit eabdb86 into eclipse-threadx:dev Aug 24, 2026
8 checks passed
@fdesbiens
fdesbiens deleted the fix/coverage-gcov-matches-cc branch August 24, 2026 19:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant