[lit] Fix handling of per test timeout when the installed psutil version
[oota-llvm.git] / utils / schedcover.py
1 #!/usr/bin/python
2
3 # This creates a CSV file from the output of the debug output of subtarget:
4 #   llvm-tblgen --gen-subtarget --debug-only=subtarget-emitter
5 # With thanks to Dave Estes for mentioning the idea at 2014 LLVM Developers' Meeting
6
7 import os;
8 import sys;
9 import re;
10 import operator;
11
12 table = {}
13 models = set()
14 filt = None
15
16 def add(instr, model, resource=None):
17     global table, models
18
19     entry = table.setdefault(instr, dict())
20     entry[model] = resource
21     models.add(model)
22
23 def filter_model(m):
24     global filt
25     if m and filt:
26         return filt.search(m) != None
27     else:
28         return True
29
30
31 def display():
32     global table, models
33
34     ordered_table  = sorted(table.items(), key=operator.itemgetter(0))
35     ordered_models = filter(filter_model, sorted(models))
36
37     # print header
38     sys.stdout.write("instruction")
39     for model in ordered_models:
40         if not model: model = "default"
41         sys.stdout.write(", {}".format(model))
42     sys.stdout.write(os.linesep)
43
44     for (instr, mapping) in ordered_table:
45         sys.stdout.write(instr)
46         for model in ordered_models:
47             if model in mapping:
48                 sys.stdout.write(", {}".format(mapping[model]))
49             else:
50                 sys.stdout.write(", ")
51         sys.stdout.write(os.linesep)
52
53
54 def machineModelCover(path):
55     # The interesting bits
56     re_sched_default  = re.compile("SchedRW machine model for ([^ ]*) (.*)\n");
57     re_sched_no_default = re.compile("No machine model for ([^ ]*)\n");
58     re_sched_spec = re.compile("InstRW on ([^ ]*) for ([^ ]*) (.*)\n");
59     re_sched_no_spec = re.compile("No machine model for ([^ ]*) on processor (.*)\n");
60
61     # scan the file
62     with open(path, 'r') as f:
63         for line in f.readlines():
64             match = re_sched_default.match(line)
65             if match: add(match.group(1), None, match.group(2))
66             match = re_sched_no_default.match(line)
67             if match: add(match.group(1), None)
68             match = re_sched_spec.match(line)
69             if match: add(match.group(2), match.group(1), match.group(3))
70             match = re_sched_no_default.match(line)
71             if match: add(match.group(1), None)
72
73     display()
74
75 if len(sys.argv) > 2:
76     filt = re.compile(sys.argv[2], re.IGNORECASE)
77 machineModelCover(sys.argv[1])