summaryrefslogtreecommitdiff
path: root/utils/llvm-gisel-cov.py
diff options
context:
space:
mode:
Diffstat (limited to 'utils/llvm-gisel-cov.py')
-rw-r--r--utils/llvm-gisel-cov.py67
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()