18 p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
19 stdout, stderr = p.communicate()
21 p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
22 stdout, stderr = p.communicate(input=data)
24 return stdout.decode(
'utf-8'), stderr.decode(
'utf-8'), p.returncode
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())
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')
43 with open(profilesManifest,
"w")
as manifest:
44 manifest.write(
"\n".join(rawProfiles))
46 cmd = [args[
'llvm_prof'],
'merge',
'-sparse',
'-f', profilesManifest,
'-o', profilesData]
47 stdout, stderr, returncode =
runCmd(cmd)
50 action =
'show' if args[
'format'] !=
'lcov' else 'export'
52 cmd = [args[
'llvm_cov'], action, insightsPath, f
'-instr-profile={profilesData}', f
'--format={args["format"]}',
'-ignore-filename-regex=build/']
54 stdout, stderr, returncode =
runCmd(cmd)
57 open(args[
'output'],
'w').write(stdout)
def runCmd(cmd, data=None)