Mercurial > hg > CbC > CbC_llvm
annotate utils/llvm-gisel-cov.py @ 171:66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 25 May 2020 11:07:02 +0900 |
parents | |
children |
rev | line source |
---|---|
171
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1 #!/usr/bin/env python |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
2 """ |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
3 Summarize the information in the given coverage files. |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
4 |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
5 Emits the number of rules covered or the percentage of rules covered depending |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
6 on whether --num-rules has been used to specify the total number of rules. |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
7 """ |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
8 from __future__ import print_function |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
9 |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
10 import argparse |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
11 import struct |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
12 |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
13 class FileFormatError(Exception): |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
14 pass |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
15 |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
16 def backend_int_pair(s): |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
17 backend, sep, value = s.partition('=') |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
18 if (sep is None): |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
19 raise argparse.ArgumentTypeError("'=' missing, expected name=value") |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
20 if (not backend): |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
21 raise argparse.ArgumentTypeError("Expected name=value") |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
22 if (not value): |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
23 raise argparse.ArgumentTypeError("Expected name=value") |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
24 return backend, int(value) |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
25 |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
26 def main(): |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
27 parser = argparse.ArgumentParser(description=__doc__) |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
28 parser.add_argument('input', nargs='+') |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
29 parser.add_argument('--num-rules', type=backend_int_pair, action='append', |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
30 metavar='BACKEND=NUM', |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
31 help='Specify the number of rules for a backend') |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
32 args = parser.parse_args() |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
33 |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
34 covered_rules = {} |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
35 |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
36 for input_filename in args.input: |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
37 with open(input_filename, 'rb') as input_fh: |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
38 data = input_fh.read() |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
39 pos = 0 |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
40 while data: |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
41 backend, _, data = data.partition('\0') |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
42 pos += len(backend) |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
43 pos += 1 |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
44 |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
45 if len(backend) == 0: |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
46 raise FileFormatError() |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
47 backend, = struct.unpack("%ds" % len(backend), backend) |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
48 |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
49 while data: |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
50 if len(data) < 8: |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
51 raise FileFormatError() |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
52 rule_id, = struct.unpack("Q", data[:8]) |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
53 pos += 8 |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
54 data = data[8:] |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
55 if rule_id == (2 ** 64) - 1: |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
56 break |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
57 covered_rules[backend] = covered_rules.get(backend, {}) |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
58 covered_rules[backend][rule_id] = covered_rules[backend].get(rule_id, 0) + 1 |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
59 |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
60 num_rules = dict(args.num_rules) |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
61 for backend, rules_for_backend in covered_rules.items(): |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
62 if backend in num_rules: |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
63 print("%s: %3.2f%% of rules covered" % (backend, float(len(rules_for_backend)) / num_rules[backend]) * 100)) |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
64 else: |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
65 print("%s: %d rules covered" % (backend, len(rules_for_backend))) |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
66 |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
67 if __name__ == '__main__': |
66f3bfe93da9
git version 2c4ca6832fa6b306ee6a7010bfb80a3f2596f824
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
68 main() |