llvm-gisel-cov.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. #!/usr/bin/env python
  2. """
  3. Summarize the information in the given coverage files.
  4. Emits the number of rules covered or the percentage of rules covered depending
  5. on whether --num-rules has been used to specify the total number of rules.
  6. """
  7. from __future__ import print_function
  8. import argparse
  9. import struct
  10. class FileFormatError(Exception):
  11. pass
  12. def backend_int_pair(s):
  13. backend, sep, value = s.partition('=')
  14. if (sep is None):
  15. raise argparse.ArgumentTypeError("'=' missing, expected name=value")
  16. if (not backend):
  17. raise argparse.ArgumentTypeError("Expected name=value")
  18. if (not value):
  19. raise argparse.ArgumentTypeError("Expected name=value")
  20. return backend, int(value)
  21. def main():
  22. parser = argparse.ArgumentParser(description=__doc__)
  23. parser.add_argument('input', nargs='+')
  24. parser.add_argument('--num-rules', type=backend_int_pair, action='append',
  25. metavar='BACKEND=NUM',
  26. help='Specify the number of rules for a backend')
  27. args = parser.parse_args()
  28. covered_rules = {}
  29. for input_filename in args.input:
  30. with open(input_filename, 'rb') as input_fh:
  31. data = input_fh.read()
  32. pos = 0
  33. while data:
  34. backend, _, data = data.partition('\0')
  35. pos += len(backend)
  36. pos += 1
  37. if len(backend) == 0:
  38. raise FileFormatError()
  39. backend, = struct.unpack("%ds" % len(backend), backend)
  40. while data:
  41. if len(data) < 8:
  42. raise FileFormatError()
  43. rule_id, = struct.unpack("Q", data[:8])
  44. pos += 8
  45. data = data[8:]
  46. if rule_id == (2 ** 64) - 1:
  47. break
  48. covered_rules[backend] = covered_rules.get(backend, {})
  49. covered_rules[backend][rule_id] = covered_rules[backend].get(rule_id, 0) + 1
  50. num_rules = dict(args.num_rules)
  51. for backend, rules_for_backend in covered_rules.items():
  52. if backend in num_rules:
  53. print("%s: %3.2f%% of rules covered" % (backend, float(len(rules_for_backend)) / num_rules[backend]) * 100))
  54. else:
  55. print("%s: %d rules covered" % (backend, len(rules_for_backend)))
  56. if __name__ == '__main__':
  57. main()