[cfe-dev] SBCC and emitEmptyMapping
Vedant Kumar via cfe-dev
cfe-dev at lists.llvm.org
Thu May 10 21:57:01 PDT 2018
I should have mentioned that there is a bug report about the scaling issue:
https://bugs.llvm.org/show_bug.cgi?id=34533 <https://bugs.llvm.org/show_bug.cgi?id=34533>
One promising solution is to give the empty coverage mappings names, mark them as linkonce_odr, and store them into a different section. The premise of this approach is that clang will emit identical empty mappings for a function many times, say, if it's an inline function in a header. By marking each of these mappings as linkonce_odr, the linker can unique them in the final binary and save a fair amount of space (O(#functions), instead of O(#functions * #translation-units)).
As I've switched to a different team at work, I don't have the time to work on code coverage bugs at the moment. That said I'd be happy to chat about this further or review patches.
vedant
> On May 10, 2018, at 9:39 PM, Vedant Kumar <vsk at apple.com> wrote:
>
> + Max
>
>> On May 10, 2018, at 1:25 PM, Harp, Thom via cfe-dev <cfe-dev at lists.llvm.org <mailto:cfe-dev at lists.llvm.org>> wrote:
>>
>> Compared to LLVM’s gcov-compatible coverage method, SBCC’s resource requirements are much bigger. The total size of all .profraw files from my system is almost 1GB while the same system,
>
> Have you tried enabling run-time raw profile merging with "%Nm" (https://clang.llvm.org/docs/SourceBasedCodeCoverage.html#running-the-instrumented-program <https://clang.llvm.org/docs/SourceBasedCodeCoverage.html#running-the-instrumented-program>)?
>
>
>> built for gcov, totals only 150MB of .gcda files. I removed emitEmptyMapping from CoverageMapping.cpp to see what happens,
>
> Some engineers working on Chromium tried something similar using an experimental cl::opt (-limited-coverage-experimental) which may have a comparable same effect. I've CC'd Max who may be able to say more about this.
Er, s/comparable same/comparable/
>
>
>> and the SBCC coverage dumps dropped from 1GB to about 26MB. There are also significant gains in runtime memory use and on-disk image size.
>>
>> I don’t mind losing the zero counts for code that is unused
>
> In this case, I'd suggest trying the cl::opt I mentioned above, with the caveat that it can skew coverage reporting quite a bit.
>
> IMO having some mapping information for unused code is arguably one of the more important use cases for coverage reporting.
>
>
>> but I want to understand how clang determines what’s used and what isn’t.
>
> See AddDeferredUnusedCoverageMapping, ClearUnusedCoverageMapping, and EmitDeferredUnusedCoverageMappings. I'm not the original author so I might not have this totally right, but I think the idea here is that:
>
> - In CodeGenModule::EmitTopLevelDecl, we might not be sure a Decl actually needs to be emitted, so we mark it as deferred for coverage reporting purposes. If we never generate code for it, we'd emit a simple empty coverage mapping.
>
> - If it turns out that a Decl marked as deferred is actually emitted, we clear the deferred bit, because we no longer want an empty mapping.
>
> best,
> vedant
>
>
>> I traced the decision up to CodeGenPGO::assignRegionCounters in CodeGenPGO.cpp, where implicit functions and some constructor/destructor variants are eliminated but I can’t explain the bulk of it.
>>
>> Can someone help me understand how clang determines what code is used and what isn’t in this context?
>>
>> Thanks.
>> -thom
>>
>> _______________________________________________
>> cfe-dev mailing list
>> cfe-dev at lists.llvm.org <mailto:cfe-dev at lists.llvm.org>
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20180510/d8d04b52/attachment.html>
More information about the cfe-dev
mailing list