diff options
Diffstat (limited to 'utils/llvm-gisel-cov.py')
| -rw-r--r-- | utils/llvm-gisel-cov.py | 67 | 
1 files changed, 67 insertions, 0 deletions
| diff --git a/utils/llvm-gisel-cov.py b/utils/llvm-gisel-cov.py new file mode 100644 index 000000000000..a74ed10f8642 --- /dev/null +++ b/utils/llvm-gisel-cov.py @@ -0,0 +1,67 @@ +#!/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. +""" + +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.keys())) / num_rules[backend]) * 100) +    else: +      print "%s: %d rules covered" % (backend, len(rules_for_backend.keys())) + +if __name__ == '__main__': +  main() | 
