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 
9 import os
10 import sys
11 import argparse
12 import glob
13 import subprocess
14 #------------------------------------------------------------------------------
15 
16 def 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 
27 def 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 
61 sys.exit(main())
62 #------------------------------------------------------------------------------
63 
64 
def runCmd(cmd, data=None)