#!/usr/bin/env python # Copyright (c) 2015 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Run the given command through LLVM's coverage tools.""" import argparse import os import subprocess BUILDTYPE = 'Coverage' PROFILE_DATA = 'default.profraw' PROFILE_DATA_MERGED = 'prof_merged' SKIA_OUT = 'SKIA_OUT' def _get_out_dir(): """Determine the location for compiled binaries.""" return os.path.join(os.environ.get(SKIA_OUT, os.path.realpath('out')), BUILDTYPE) def run_coverage(cmd): """Run the given command and return per-file coverage data. Assumes that the binary has been built using llvm_coverage_build and that LLVM 3.6 or newer is installed. """ binary_path = os.path.join(_get_out_dir(), cmd[0]) subprocess.call([binary_path] + cmd[1:]) try: subprocess.check_call( ['llvm-profdata', 'merge', PROFILE_DATA, '-output=%s' % PROFILE_DATA_MERGED]) finally: os.remove(PROFILE_DATA) try: return subprocess.check_output(['llvm-cov', 'show', '-no-colors', '-instr-profile', PROFILE_DATA_MERGED, binary_path]) finally: os.remove(PROFILE_DATA_MERGED) def main(): """Run coverage and generate a report.""" # Parse args. parser = argparse.ArgumentParser() parser.add_argument('--outResultsFile') args, cmd = parser.parse_known_args() # Run coverage. report = run_coverage(cmd) with open(args.outResultsFile, 'w') as f: f.write(report) if __name__ == '__main__': main()