annotate utils/llvm-gisel-cov.py @ 138:53f12981605a

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