Re: [PROPOSAL] Replace gcov and kcov with llvm-cov

From: Peter Oberparleiter

Date: Thu Oct 08 2026 - 12:03:46 EST


On 07.10.2026 06:17, Chuck Wolber wrote:
> On Wed, Oct 7, 2026, at 2:30 AM, Masami Hiramatsu wrote:
>> On Tue, 06 Oct 2026 16:27:11 +0000, Chuck Wolber <chuck@xxxxxxxxxx> wrote:
>>> On Tue, Oct 6, 2026, at 4:10 PM, Marco Elver wrote:
>>>> On Tue, 6 Oct 2026 at 17:14, Chuck Wolber <chuck@xxxxxxxxxx> wrote:
>>
>>>>> If there is a desire to take this in pieces or implement other
>>>>> intermediate steps, let me know. Otherwise I can generate a
>>>>> monolithic set all at once.
>>>>>
>>>>> [1] https://lore.kernel.org/lkml/20240905043245.1389509-1-wentaoz5@xxxxxxxxxxxx/
>>>>>
>>>>>>> llvm-cov is generally useful to have; llvm-cov is closest to
>>>>>>> gcov, so that might make sense to replace.
>>>
>>> Swapping llvm-cov for gcov to start with is pretty straightforward,
>>> so I can aim my initial patch set there.
>>
>> Hmm, is it necessary to remove gcov? Would it be difficult to simply
>> add support for llvm-cov and enable (make kconfig selectable) one or
>> the other depending on the compiler?
>
> Not strictly necessary, no. And what you are describing is what our
> original patches do.
>
> The concern was why we would want to have three separate code coverage
> tools in the kernel. Each has their own way of doing things, and they
> can all live together in the kernel harmoniously.
>
> But the concern was raised so I am trying to find a way forward.
>
> The llvm-cov approach gives results that are reliably tied to actual
> lines of source, so that is the one I reflexively reach for any time I
> need code coverage. I am at a loss (but definitely willing to be
> educated) as to what value gcov style coverage provides in comparison.

I agree that llvm-cov native kernel support has some advantages over
current gcov-kernel support:

* MC/DC coverage (though a series introducing MC/DC for gcov-kernel
exists, pending review..)
* Sub-line precision data
* Optimization doesn't affect precision of coverage data

The lack of support for non-x86 architectures would be an initial
obstacle for some users, but one that can be addressed.

The main problem I see with the idea of replacing gcov-kernel with
llvm-cov is that it would immediately disrupt a lot of gcov-kernel based
workflows that people have developed over time, e.g. automated coverage
measurements as part of CI tests, maybe coupled with specialized tooling
features like lcov's differential coverage analysis. I'm not sure that
the extra value provided by llvm-cov today justifies the effort needed
to move away from gcov-kernel for everyone.

Also not everyone may be able to switch from GCC to LLVM for compiling
instrumented kernels, e.g. because their test kernels need to match the
associated kernel-based product (think Linux distributions). Those users
would then be left with no workable coverage measurement option at all.

> I also found some interesting possibilities using intrinsics to enable
> boot time tracing with llvm-cov. That is, of course, experimental and
> not something I am considering for the intial patch-set. But it got me
> thinking about broader configurability that supports more granular forms
> of coverage that _may_ address kcov needs in the long term.
>
> I have been working on this off-and on for a few years and still really
> want to see this idea succeed. Any guidance on a workable path forward
> would be greatly appreciated.

My recommendation would be to keep working towards getting llvm-cov
integrated as an alternative to gcov-kernel for LLVM users. This would
enable kernel developers that are not bound to using GCC to benefit from
the current (and potential future) unique benefits of llvm-cov data.

As for whether the kernel needs two coverage mechanisms (not counting
KCOV - see Marco Elver's previous email): coverage and instrumentation
are inherently toolchain-specific today. Since the kernel supports both
GCC and LLVM, supporting the corresponding toolchain-specific coverage
mechanisms seems reasonable to me.

> Another option, proposed by Sasha Levin[1], was to use a single
> /sys/kernel/debug/coverage interface, quoting him here:
>
> "To clarify, are you suggesting that we'll have something like a single
> /sys/kernel/debug/coverage interface that is producing the same structured
> output whether we use gcov or llvm?"
>
> I am not sure it is feasible to use the same structured ouput, but it
> would isolate things down to a single interface with KConfig knobs being
> used to select which coverage data one can expect to find there.

The data format produced by instrumented kernel code is defined by the
associated toolchain. I don't see a feasible way to merge/map these. One
could argue though that the code for both mechanisms could be better
co-located, both in kernel source tree and configuration menus. Also
there might be some value in merging the per-directory/per-file
no-profile indicators (GCOV_PROFILE/LLVM_COV_PROFILE).


--
Peter Oberparleiter
Linux on IBM Z Development - IBM Germany R&D