forked from llvm/llvm-project
- Notifications
You must be signed in to change notification settings - Fork 339
/
Copy pathllvm-gisel-cov.py
68 lines (57 loc) · 2.12 KB
/
llvm-gisel-cov.py
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
#!/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.
"""
from __future__ importprint_function
importargparse
importstruct
classFileFormatError(Exception):
pass
defbackend_int_pair(s):
backend, sep, value=s.partition('=')
if (sepisNone):
raiseargparse.ArgumentTypeError("'=' missing, expected name=value")
if (notbackend):
raiseargparse.ArgumentTypeError("Expected name=value")
if (notvalue):
raiseargparse.ArgumentTypeError("Expected name=value")
returnbackend, int(value)
defmain():
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= {}
forinput_filenameinargs.input:
withopen(input_filename, 'rb') asinput_fh:
data=input_fh.read()
pos=0
whiledata:
backend, _, data=data.partition('\0')
pos+=len(backend)
pos+=1
iflen(backend) ==0:
raiseFileFormatError()
backend, =struct.unpack("%ds"%len(backend), backend)
whiledata:
iflen(data) <8:
raiseFileFormatError()
rule_id, =struct.unpack("Q", data[:8])
pos+=8
data=data[8:]
ifrule_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)
forbackend, rules_for_backendincovered_rules.items():
ifbackendinnum_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()