Skip to content

Please test and defend use of insert-gcov-profiling for coverage measurementΒ #4868

Closed as not planned
@ctz

Description

@ctz

This is a feature request (tangentially related to #4865) for cargo to include an integration test that ensures that this method of building code with coverage measurement enabled continues to work in future versions.

Here's documentation of how I currently do this for the sct and rustls projects:

Prerequisites: a compatible llvm installation, lcov, nightly rustc

  1. Clean up: cargo clean and delete all .gcda and .gcno intermediate files
  2. Build: run cargo rustc --all-features --profile test --lib, with RUSTC_WRAPPER set to a shell script that adds COVERAGE_OPTIONS to the rustc invocation for a specific crate build (see below).
  3. Execute the library unit tests program that now exists, eg ./target/debug/sct-43d2a05ec780a9bc
  4. Use lcov to extract coverage data from resulting gcno files: run lcov --gcov-tool ./admin/llvm-gcov --rc lcov_branch_coverage=1 --rc lcov_excl_line=assert --capture --directory . --base-directory . -o sct.info
  5. Merge all .info files into one coverage.info: run lcov --gcov-tool ./admin/llvm-gcov --rc lcov_branch_coverage=1 --rc lcov_excl_line=assert --add sct.info -o coverage.info
  6. Trim coverage.info to remove uninteresting sources: run lcov --gcov-tool ./admin/llvm-gcov --rc lcov_branch_coverage=1 --rc lcov_excl_line=assert --extract coverage.info /home/full/path/to/sct/src/\* -o final.info

My RUSTC_WRAPPER program is:

#!/bin/bash -e

get_crate_name()
{
  while [[ $# -gt 1 ]] ; do
    v=$1
    case $v in
      --crate-name)
        echo $2
        return
        ;;
    esac
    shift
  done
}

case $(get_crate_name "$@") in
  sct)
    EXTRA=$COVERAGE_OPTIONS
    ;;
  *)
    ;;
esac

exec "$@" $EXTRA

admin/llvm-gcov is:

#!/bin/sh -e
llvm-cov gcov $*

This method works in cargo 0.23.0 (61fa02415 2017-11-22) but is broken in cargo 0.25.0-nightly (e08f31018 2017-12-24) (and not just due to #4865).

Metadata

Metadata

Assignees

No one assigned

    Labels

    C-feature-requestCategory: proposal for a feature. Before PR, ping rust-lang/cargo if this is not `Feature accepted`

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions