blob: 56ce1f97671d8fbc1e20823ea2e4b7ac6af3b74c [file] [log] [blame] [view]
# `turbo-cov`
## About
`turbo-cov` can be used by the `./tools/run cts run-cts` tool, when passing the `--coverage` flag.
`turbo-cov` is substantially faster at processing coverage data than using the standard LLVM tools.
## Requirements
To build `turbo-cov`, you will need to set the CMake define the CMake flag `LLVM_SOURCE_DIR` to the `/llvm` subdirectory of a LLVM checkout. `turbo-cov` requires LLVM 9+.
## Details
[Clang provides two tools](https://clang.llvm.org/docs/SourceBasedCodeCoverage.html#creating-coverage-reports) for processing coverage data:
* `llvm-profdata` indexes the raw `.profraw` coverage profile file and emits a `.profdata` file.
* `llvm-cov` further processes the `.profdata` file into something human readable or machine parsable.
`llvm-cov` provides many options, including emitting an pretty HTML file, but is remarkably slow at producing easily machine-parsable data.
Fortunately the core of `llvm-cov` is [a few hundreds of lines of code](https://github.com/llvm/llvm-project/tree/master/llvm/tools/llvm-cov), as it relies on LLVM libraries to do the heavy lifting.
`turbo-cov` is a a simple `llvm-cov` replacement, which efficiently converts a `.profdata` into a simple binary stream which can be consumed by the `tools/src/cov` package.
## File structure
`turbo-cov` is a trivial binary stream, which takes the tightly-packed form:
```c++
struct Root {
uint32_t num_files;
File file[num_files];
};
struct File {
uint32_t name_length
uint8_t name_data[name_length];
uint32_t num_segments;
Segment segments[num_segments];
};
struct Segment {
// The line where this segment begins.
uint32_t line;
// The column where this segment begins.
uint32_t column;
// The execution count, or zero if no count was recorded.
uint32_t count;
// When 0, the segment was uninstrumented or skipped.
uint8_t hasCount;
}
```