-
Notifications
You must be signed in to change notification settings - Fork 13
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Consider support for llvm profile compiler runtime library #43
Comments
Thanks for this, I wasn’t aware of lcov, it’s super interesting. Here’s a bit of a braindump of the various things I’m thinking about. I’d love to support better methods of gathering coverage, but at the same time I worry changing coverage tool might break some people’s builds - especially since, given it removes landing pads, I suspect it breaks panics? Maybe with a flag, we could chose a coverage tool. The default would remain kcov for backward compat. Are any of the flags used in that blog nightly-only? The post doesn’t mention it, but I thought playing with optimisation passes was unstable. Maybe I’m remembering wrong. For this method, the main “complicated” part is generating the rustc_wrapper script. We need to get the name of the crates we want to integrate coverage into (making sure to avoid building coverage into build scripts and whatnot). Hopefully, I’ll be able to automate this by looking at the build targets by parsing Could this work on windows? Does llvm profile library and lcov work there? If so, we’ll want to think about ways to generate a rustc wrapper that avoids bash. Probably, write it in rust, and pass it the crate names via an env variable. I’d also like to minimize non rust dependencies. Depending on ruby and a gem to upload the lcov data to coveralls is meh. I’d want to rewrite that in rust to keep installation of cargo-travis easy and self-contained. |
I'm very happy to hear about your interest.
About nightly-only or not and whether this would work on Windows I have no idea. |
So I did a quick check, and the LLVM binary builds for windows include clang_rt.profile-x86_64.lib (full path is lib/clang/7.0.0/lib/windows/clang_rt.profile-x86_64.lib). So I guess it works on windows, which is super good news \o/. Further supporting this is a blog post about using clang code coverage on windows: https://marco-c.github.io/2018/01/09/code-coverage-with-clang-on-windows.html. Looking at the binary release of LLVM, llvm-cov seems to be missing though! 😱. Thankfully, according to the above blog post, we can use grcov, a rust-based alternative used by firefox and maintained by mozilla. It has builds for Windows, Mac and Linux. Additionally, it can upload straight to coveralls, so we can avoid the ruby gem. As an aside, while investigating this, I discovered https://github.com/kennytm/cov, which might be able to suit your needs in the meantime? |
The approach described here uses llvm profile compiler runtime library, which has several benefits.
Most interestingly, it seems to me like the coverage results are more accurate and can even include branch coverage.
See for yourself:
However, the scripts are not that trivial and letting them duplicate through rust crates would not be very good for the ecosystem.
Is there any intention to integrate this method into cargo-travis?
The text was updated successfully, but these errors were encountered: