File: llvm-gisel-cov.py

package info (click to toggle)
llvm-toolchain-20 1%3A20.1.6-1~exp1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 2,111,304 kB
  • sloc: cpp: 7,438,677; ansic: 1,393,822; asm: 1,012,926; python: 241,650; f90: 86,635; objc: 75,479; lisp: 42,144; pascal: 17,286; sh: 10,027; ml: 5,082; perl: 4,730; awk: 3,523; makefile: 3,349; javascript: 2,251; xml: 892; fortran: 672
file content (82 lines) | stat: -rwxr-xr-x 2,520 bytes parent folder | download | duplicates (9)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#!/usr/bin/env python3
"""
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.
"""
from __future__ import print_function

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)) / num_rules[backend])
                * 100
            )
        else:
            print("%s: %d rules covered" % (backend, len(rules_for_backend)))


if __name__ == "__main__":
    main()