skia2/tools/llvm_coverage_run.py
borenet a6ae14e223 Split llvm_coverage_run into two scripts
... One for running to generate the coverage data, another to parse the data into various formats.

NOTRY=true
BUG=skia:2430

Review URL: https://codereview.chromium.org/1239963002
2015-07-20 09:43:36 -07:00

64 lines
1.6 KiB
Python
Executable File

#!/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()