GCov space optimization

Andrew Stubbs ams@baylibre.com
Tue Jul 22 14:52:04 GMT 2025


Hi all,

Question: Would it be acceptable to introduce a new "counter" variety, 
together with options and UI support, that simply records a "visited" state?

Have there been any previous efforts in this space that I've missed?


I'm currently looking at the feasibility of reducing the memory 
footprint of coverage testing.  I don't have any figures or testcases 
yet, but the customer states that coverage testing works, except that 
the memory usage can be a problem on their devices, so I'm exploring 
what options we have to address this.

Looking at the implementation, we currently use one 32- or 64-bit 
counter (depending on the size of "long", I think) for each arc in the 
program. Obviously this memory overhead is a small proportion of the 
text size, but even so, it might be overkill for simple coverage testing 
(as opposed to profiling). However, the code inserted to atomically 
update the counter might end up being quite a large proportion of the 
text, so that's worth looking at too.

If we add a new "counter" that uses one byte per arc, then that's not 
really enough bits for a useful counter, but is more than enough for a 
"visited" flag. Required storage would reduce by a factor of 4 or 8, and 
since nothing ever transitions from "visited" to "unvisited" there will 
be no need for atomic updates, which should reduce the code overhead.

Alternatively, if we use one bit per arc then storage will reduce even 
further, but now we need to do read-modify-write again, so maybe the 
saving is entirely negated.


As for the file format, we can either support the new counter all the 
way through libgcc and gcov, or we can expand it to look like a regular 
counter on stream-out.  This second approach would be a lot less effort, 
and means we retain backwards compatibility with pre-installed gcov 
tools (and even PGO will still be able to locate the most unlikely 
branches?), but the output will be presented as "1" iteration and might 
possibly end up being misleading (at least to the unwary user).

Which approach is likely to be more acceptable to the maintainers?


Thanks in advance

Andrew


More information about the Gcc mailing list