llvm-coverage.py
Go to the documentation of this file.
1#! /usr/bin/env python3
2#
3#
4# C++ Insights, copyright (C) by Andreas Fertig
5# Distributed under an MIT license. See LICENSE for details
6#
7#------------------------------------------------------------------------------
8
9import os
10import sys
11import argparse
12import glob
13import subprocess
14#------------------------------------------------------------------------------
15
16def runCmd(cmd, data=None):
17 if input is None:
18 p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
19 stdout, stderr = p.communicate()
20 else:
21 p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
22 stdout, stderr = p.communicate(input=data)
23
24 return stdout.decode('utf-8'), stderr.decode('utf-8'), p.returncode
25#------------------------------------------------------------------------------
26
27def main():
28 parser = argparse.ArgumentParser(description='llvm-coverage')
29 parser.add_argument('--insights', help='C++ Insights binary', required=True)
30 parser.add_argument('--llvm-prof-dir', help='LLVM profiles data dir', default='')
31 parser.add_argument('--llvm-prof', help='llvm-profdata binary', default='llvm-profdata')
32 parser.add_argument('--llvm-cov', help='llvm-cov binary', default='llvm-cov')
33 parser.add_argument('--format', help='Output format: html/text', default='text')
34 parser.add_argument('--output', help='Output filename', required=True)
35 parser.add_argument('args', nargs=argparse.REMAINDER)
36 args = vars(parser.parse_args())
37
38 insightsPath = args['insights']
39 rawProfiles = glob.glob(os.path.join(args['llvm_prof_dir'], "*.profraw"))
40 profilesManifest = os.path.join(args['llvm_prof_dir'], 'profiles.manifest')
41 profilesData = os.path.join(args['llvm_prof_dir'], 'insights.profdata')
42
43 with open(profilesManifest, "w") as manifest:
44 manifest.write("\n".join(rawProfiles))
45
46 cmd = [args['llvm_prof'], 'merge', '-sparse', '-f', profilesManifest, '-o', profilesData]
47 stdout, stderr, returncode = runCmd(cmd)
48 print(stderr)
49
50 action = 'show' if args['format'] != 'lcov' else 'export'
51
52 cmd = [args['llvm_cov'], action, insightsPath, f'-instr-profile={profilesData}', f'--format={args["format"]}', '-ignore-filename-regex=build/']
53
54 stdout, stderr, returncode = runCmd(cmd)
55 print(stderr)
56
57 open(args['output'], 'w').write(stdout)
58#------------------------------------------------------------------------------
59
60
61sys.exit(main())
62#------------------------------------------------------------------------------
63
64
runCmd(cmd, data=None)