mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-25 01:36:06 +00:00

This is the first commit in a series that will reformat all the python files in the LLVM repository. Reformatting is done with `black`. See more information here: https://discourse.llvm.org/t/rfc-document-and-standardize-python-code-style Reviewed By: jhenderson, JDevlieghere, MatzeB Differential Revision: https://reviews.llvm.org/D150545
83 lines
2.5 KiB
Python
Executable File
83 lines
2.5 KiB
Python
Executable File
#!/usr/bin/env python
|
|
"""
|
|
Summarize the information in the given coverage files.
|
|
|
|
Emits the number of rules covered or the percentage of rules covered depending
|
|
on whether --num-rules has been used to specify the total number of rules.
|
|
"""
|
|
from __future__ import print_function
|
|
|
|
import argparse
|
|
import struct
|
|
|
|
|
|
class FileFormatError(Exception):
|
|
pass
|
|
|
|
|
|
def backend_int_pair(s):
|
|
backend, sep, value = s.partition("=")
|
|
if sep is None:
|
|
raise argparse.ArgumentTypeError("'=' missing, expected name=value")
|
|
if not backend:
|
|
raise argparse.ArgumentTypeError("Expected name=value")
|
|
if not value:
|
|
raise argparse.ArgumentTypeError("Expected name=value")
|
|
return backend, int(value)
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(description=__doc__)
|
|
parser.add_argument("input", nargs="+")
|
|
parser.add_argument(
|
|
"--num-rules",
|
|
type=backend_int_pair,
|
|
action="append",
|
|
metavar="BACKEND=NUM",
|
|
help="Specify the number of rules for a backend",
|
|
)
|
|
args = parser.parse_args()
|
|
|
|
covered_rules = {}
|
|
|
|
for input_filename in args.input:
|
|
with open(input_filename, "rb") as input_fh:
|
|
data = input_fh.read()
|
|
pos = 0
|
|
while data:
|
|
backend, _, data = data.partition("\0")
|
|
pos += len(backend)
|
|
pos += 1
|
|
|
|
if len(backend) == 0:
|
|
raise FileFormatError()
|
|
(backend,) = struct.unpack("%ds" % len(backend), backend)
|
|
|
|
while data:
|
|
if len(data) < 8:
|
|
raise FileFormatError()
|
|
(rule_id,) = struct.unpack("Q", data[:8])
|
|
pos += 8
|
|
data = data[8:]
|
|
if rule_id == (2**64) - 1:
|
|
break
|
|
covered_rules[backend] = covered_rules.get(backend, {})
|
|
covered_rules[backend][rule_id] = (
|
|
covered_rules[backend].get(rule_id, 0) + 1
|
|
)
|
|
|
|
num_rules = dict(args.num_rules)
|
|
for backend, rules_for_backend in covered_rules.items():
|
|
if backend in num_rules:
|
|
print(
|
|
"%s: %3.2f%% of rules covered"
|
|
% (backend, float(len(rules_for_backend)) / num_rules[backend])
|
|
* 100
|
|
)
|
|
else:
|
|
print("%s: %d rules covered" % (backend, len(rules_for_backend)))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|