annotate llvm/tools/opt-viewer/optrecord.py @ 252:1f2b6ac9f198 llvm-original

LLVM16-1
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 18 Aug 2023 09:04:13 +0900
parents 0572611fdcc8
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 #!/usr/bin/env python
anatofuz
parents:
diff changeset
2
anatofuz
parents:
diff changeset
3 from __future__ import print_function
anatofuz
parents:
diff changeset
4
anatofuz
parents:
diff changeset
5 import io
anatofuz
parents:
diff changeset
6 import yaml
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
7
150
anatofuz
parents:
diff changeset
8 # Try to use the C parser.
anatofuz
parents:
diff changeset
9 try:
anatofuz
parents:
diff changeset
10 from yaml import CLoader as Loader
anatofuz
parents:
diff changeset
11 except ImportError:
anatofuz
parents:
diff changeset
12 print("For faster parsing, you may want to install libYAML for PyYAML")
anatofuz
parents:
diff changeset
13 from yaml import Loader
anatofuz
parents:
diff changeset
14
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
15 import html
150
anatofuz
parents:
diff changeset
16 from collections import defaultdict
anatofuz
parents:
diff changeset
17 import fnmatch
anatofuz
parents:
diff changeset
18 import functools
anatofuz
parents:
diff changeset
19 from multiprocessing import Lock
anatofuz
parents:
diff changeset
20 import os, os.path
anatofuz
parents:
diff changeset
21 import subprocess
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
22
150
anatofuz
parents:
diff changeset
23 try:
anatofuz
parents:
diff changeset
24 # The previously builtin function `intern()` was moved
anatofuz
parents:
diff changeset
25 # to the `sys` module in Python 3.
anatofuz
parents:
diff changeset
26 from sys import intern
anatofuz
parents:
diff changeset
27 except:
anatofuz
parents:
diff changeset
28 pass
anatofuz
parents:
diff changeset
29
anatofuz
parents:
diff changeset
30 import re
anatofuz
parents:
diff changeset
31
anatofuz
parents:
diff changeset
32 import optpmap
anatofuz
parents:
diff changeset
33
anatofuz
parents:
diff changeset
34 try:
anatofuz
parents:
diff changeset
35 dict.iteritems
anatofuz
parents:
diff changeset
36 except AttributeError:
anatofuz
parents:
diff changeset
37 # Python 3
anatofuz
parents:
diff changeset
38 def itervalues(d):
anatofuz
parents:
diff changeset
39 return iter(d.values())
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
40
150
anatofuz
parents:
diff changeset
41 def iteritems(d):
anatofuz
parents:
diff changeset
42 return iter(d.items())
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
43
150
anatofuz
parents:
diff changeset
44 else:
anatofuz
parents:
diff changeset
45 # Python 2
anatofuz
parents:
diff changeset
46 def itervalues(d):
anatofuz
parents:
diff changeset
47 return d.itervalues()
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
48
150
anatofuz
parents:
diff changeset
49 def iteritems(d):
anatofuz
parents:
diff changeset
50 return d.iteritems()
anatofuz
parents:
diff changeset
51
anatofuz
parents:
diff changeset
52
anatofuz
parents:
diff changeset
53 def html_file_name(filename):
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
54 return filename.replace("/", "_").replace("#", "_") + ".html"
150
anatofuz
parents:
diff changeset
55
anatofuz
parents:
diff changeset
56
anatofuz
parents:
diff changeset
57 def make_link(File, Line):
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
58 return '"{}#L{}"'.format(html_file_name(File), Line)
150
anatofuz
parents:
diff changeset
59
anatofuz
parents:
diff changeset
60
anatofuz
parents:
diff changeset
61 class Remark(yaml.YAMLObject):
anatofuz
parents:
diff changeset
62 # Work-around for http://pyyaml.org/ticket/154.
anatofuz
parents:
diff changeset
63 yaml_loader = Loader
anatofuz
parents:
diff changeset
64
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
65 default_demangler = "c++filt -n"
150
anatofuz
parents:
diff changeset
66 demangler_proc = None
anatofuz
parents:
diff changeset
67
anatofuz
parents:
diff changeset
68 @classmethod
anatofuz
parents:
diff changeset
69 def set_demangler(cls, demangler):
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
70 cls.demangler_proc = subprocess.Popen(
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
71 demangler.split(), stdin=subprocess.PIPE, stdout=subprocess.PIPE
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
72 )
150
anatofuz
parents:
diff changeset
73 cls.demangler_lock = Lock()
anatofuz
parents:
diff changeset
74
anatofuz
parents:
diff changeset
75 @classmethod
anatofuz
parents:
diff changeset
76 def demangle(cls, name):
anatofuz
parents:
diff changeset
77 with cls.demangler_lock:
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
78 cls.demangler_proc.stdin.write((name + "\n").encode("utf-8"))
150
anatofuz
parents:
diff changeset
79 cls.demangler_proc.stdin.flush()
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
80 return cls.demangler_proc.stdout.readline().rstrip().decode("utf-8")
150
anatofuz
parents:
diff changeset
81
anatofuz
parents:
diff changeset
82 # Intern all strings since we have lot of duplication across filenames,
anatofuz
parents:
diff changeset
83 # remark text.
anatofuz
parents:
diff changeset
84 #
anatofuz
parents:
diff changeset
85 # Change Args from a list of dicts to a tuple of tuples. This saves
anatofuz
parents:
diff changeset
86 # memory in two ways. One, a small tuple is significantly smaller than a
anatofuz
parents:
diff changeset
87 # small dict. Two, using tuple instead of list allows Args to be directly
anatofuz
parents:
diff changeset
88 # used as part of the key (in Python only immutable types are hashable).
anatofuz
parents:
diff changeset
89 def _reduce_memory(self):
anatofuz
parents:
diff changeset
90 self.Pass = intern(self.Pass)
anatofuz
parents:
diff changeset
91 self.Name = intern(self.Name)
anatofuz
parents:
diff changeset
92 try:
anatofuz
parents:
diff changeset
93 # Can't intern unicode strings.
anatofuz
parents:
diff changeset
94 self.Function = intern(self.Function)
anatofuz
parents:
diff changeset
95 except:
anatofuz
parents:
diff changeset
96 pass
anatofuz
parents:
diff changeset
97
anatofuz
parents:
diff changeset
98 def _reduce_memory_dict(old_dict):
anatofuz
parents:
diff changeset
99 new_dict = dict()
anatofuz
parents:
diff changeset
100 for (k, v) in iteritems(old_dict):
anatofuz
parents:
diff changeset
101 if type(k) is str:
anatofuz
parents:
diff changeset
102 k = intern(k)
anatofuz
parents:
diff changeset
103
anatofuz
parents:
diff changeset
104 if type(v) is str:
anatofuz
parents:
diff changeset
105 v = intern(v)
anatofuz
parents:
diff changeset
106 elif type(v) is dict:
anatofuz
parents:
diff changeset
107 # This handles [{'Caller': ..., 'DebugLoc': { 'File': ... }}]
anatofuz
parents:
diff changeset
108 v = _reduce_memory_dict(v)
anatofuz
parents:
diff changeset
109 new_dict[k] = v
anatofuz
parents:
diff changeset
110 return tuple(new_dict.items())
anatofuz
parents:
diff changeset
111
anatofuz
parents:
diff changeset
112 self.Args = tuple([_reduce_memory_dict(arg_dict) for arg_dict in self.Args])
anatofuz
parents:
diff changeset
113
anatofuz
parents:
diff changeset
114 # The inverse operation of the dictonary-related memory optimization in
anatofuz
parents:
diff changeset
115 # _reduce_memory_dict. E.g.
anatofuz
parents:
diff changeset
116 # (('DebugLoc', (('File', ...) ... ))) -> [{'DebugLoc': {'File': ...} ....}]
anatofuz
parents:
diff changeset
117 def recover_yaml_structure(self):
anatofuz
parents:
diff changeset
118 def tuple_to_dict(t):
anatofuz
parents:
diff changeset
119 d = dict()
anatofuz
parents:
diff changeset
120 for (k, v) in t:
anatofuz
parents:
diff changeset
121 if type(v) is tuple:
anatofuz
parents:
diff changeset
122 v = tuple_to_dict(v)
anatofuz
parents:
diff changeset
123 d[k] = v
anatofuz
parents:
diff changeset
124 return d
anatofuz
parents:
diff changeset
125
anatofuz
parents:
diff changeset
126 self.Args = [tuple_to_dict(arg_tuple) for arg_tuple in self.Args]
anatofuz
parents:
diff changeset
127
anatofuz
parents:
diff changeset
128 def canonicalize(self):
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
129 if not hasattr(self, "Hotness"):
150
anatofuz
parents:
diff changeset
130 self.Hotness = 0
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
131 if not hasattr(self, "Args"):
150
anatofuz
parents:
diff changeset
132 self.Args = []
anatofuz
parents:
diff changeset
133 self._reduce_memory()
anatofuz
parents:
diff changeset
134
anatofuz
parents:
diff changeset
135 @property
anatofuz
parents:
diff changeset
136 def File(self):
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
137 return self.DebugLoc["File"]
150
anatofuz
parents:
diff changeset
138
anatofuz
parents:
diff changeset
139 @property
anatofuz
parents:
diff changeset
140 def Line(self):
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
141 return int(self.DebugLoc["Line"])
150
anatofuz
parents:
diff changeset
142
anatofuz
parents:
diff changeset
143 @property
anatofuz
parents:
diff changeset
144 def Column(self):
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
145 return self.DebugLoc["Column"]
150
anatofuz
parents:
diff changeset
146
anatofuz
parents:
diff changeset
147 @property
anatofuz
parents:
diff changeset
148 def DebugLocString(self):
anatofuz
parents:
diff changeset
149 return "{}:{}:{}".format(self.File, self.Line, self.Column)
anatofuz
parents:
diff changeset
150
anatofuz
parents:
diff changeset
151 @property
anatofuz
parents:
diff changeset
152 def DemangledFunctionName(self):
anatofuz
parents:
diff changeset
153 return self.demangle(self.Function)
anatofuz
parents:
diff changeset
154
anatofuz
parents:
diff changeset
155 @property
anatofuz
parents:
diff changeset
156 def Link(self):
anatofuz
parents:
diff changeset
157 return make_link(self.File, self.Line)
anatofuz
parents:
diff changeset
158
anatofuz
parents:
diff changeset
159 def getArgString(self, mapping):
anatofuz
parents:
diff changeset
160 mapping = dict(list(mapping))
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
161 dl = mapping.get("DebugLoc")
150
anatofuz
parents:
diff changeset
162 if dl:
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
163 del mapping["DebugLoc"]
150
anatofuz
parents:
diff changeset
164
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
165 assert len(mapping) == 1
150
anatofuz
parents:
diff changeset
166 (key, value) = list(mapping.items())[0]
anatofuz
parents:
diff changeset
167
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
168 if key == "Caller" or key == "Callee" or key == "DirectCallee":
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
169 value = html.escape(self.demangle(value))
150
anatofuz
parents:
diff changeset
170
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
171 if dl and key != "Caller":
150
anatofuz
parents:
diff changeset
172 dl_dict = dict(list(dl))
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
173 return "<a href={}>{}</a>".format(
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
174 make_link(dl_dict["File"], dl_dict["Line"]), value
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
175 )
150
anatofuz
parents:
diff changeset
176 else:
anatofuz
parents:
diff changeset
177 return value
anatofuz
parents:
diff changeset
178
anatofuz
parents:
diff changeset
179 # Return a cached dictionary for the arguments. The key for each entry is
anatofuz
parents:
diff changeset
180 # the argument key (e.g. 'Callee' for inlining remarks. The value is a
anatofuz
parents:
diff changeset
181 # list containing the value (e.g. for 'Callee' the function) and
anatofuz
parents:
diff changeset
182 # optionally a DebugLoc.
anatofuz
parents:
diff changeset
183 def getArgDict(self):
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
184 if hasattr(self, "ArgDict"):
150
anatofuz
parents:
diff changeset
185 return self.ArgDict
anatofuz
parents:
diff changeset
186 self.ArgDict = {}
anatofuz
parents:
diff changeset
187 for arg in self.Args:
anatofuz
parents:
diff changeset
188 if len(arg) == 2:
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
189 if arg[0][0] == "DebugLoc":
150
anatofuz
parents:
diff changeset
190 dbgidx = 0
anatofuz
parents:
diff changeset
191 else:
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
192 assert arg[1][0] == "DebugLoc"
150
anatofuz
parents:
diff changeset
193 dbgidx = 1
anatofuz
parents:
diff changeset
194
anatofuz
parents:
diff changeset
195 key = arg[1 - dbgidx][0]
anatofuz
parents:
diff changeset
196 entry = (arg[1 - dbgidx][1], arg[dbgidx][1])
anatofuz
parents:
diff changeset
197 else:
anatofuz
parents:
diff changeset
198 arg = arg[0]
anatofuz
parents:
diff changeset
199 key = arg[0]
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
200 entry = (arg[1],)
150
anatofuz
parents:
diff changeset
201
anatofuz
parents:
diff changeset
202 self.ArgDict[key] = entry
anatofuz
parents:
diff changeset
203 return self.ArgDict
anatofuz
parents:
diff changeset
204
anatofuz
parents:
diff changeset
205 def getDiffPrefix(self):
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
206 if hasattr(self, "Added"):
150
anatofuz
parents:
diff changeset
207 if self.Added:
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
208 return "+"
150
anatofuz
parents:
diff changeset
209 else:
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
210 return "-"
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
211 return ""
150
anatofuz
parents:
diff changeset
212
anatofuz
parents:
diff changeset
213 @property
anatofuz
parents:
diff changeset
214 def PassWithDiffPrefix(self):
anatofuz
parents:
diff changeset
215 return self.getDiffPrefix() + self.Pass
anatofuz
parents:
diff changeset
216
anatofuz
parents:
diff changeset
217 @property
anatofuz
parents:
diff changeset
218 def message(self):
anatofuz
parents:
diff changeset
219 # Args is a list of mappings (dictionaries)
anatofuz
parents:
diff changeset
220 values = [self.getArgString(mapping) for mapping in self.Args]
anatofuz
parents:
diff changeset
221 return "".join(values)
anatofuz
parents:
diff changeset
222
anatofuz
parents:
diff changeset
223 @property
anatofuz
parents:
diff changeset
224 def RelativeHotness(self):
anatofuz
parents:
diff changeset
225 if self.max_hotness:
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
226 return "{0:.2f}%".format(self.Hotness * 100.0 / self.max_hotness)
150
anatofuz
parents:
diff changeset
227 else:
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
228 return ""
150
anatofuz
parents:
diff changeset
229
anatofuz
parents:
diff changeset
230 @property
anatofuz
parents:
diff changeset
231 def key(self):
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
232 return (
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
233 self.__class__,
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
234 self.PassWithDiffPrefix,
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
235 self.Name,
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
236 self.File,
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
237 self.Line,
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
238 self.Column,
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
239 self.Function,
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
240 self.Args,
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
241 )
150
anatofuz
parents:
diff changeset
242
anatofuz
parents:
diff changeset
243 def __hash__(self):
anatofuz
parents:
diff changeset
244 return hash(self.key)
anatofuz
parents:
diff changeset
245
anatofuz
parents:
diff changeset
246 def __eq__(self, other):
anatofuz
parents:
diff changeset
247 return self.key == other.key
anatofuz
parents:
diff changeset
248
anatofuz
parents:
diff changeset
249 def __repr__(self):
anatofuz
parents:
diff changeset
250 return str(self.key)
anatofuz
parents:
diff changeset
251
anatofuz
parents:
diff changeset
252
anatofuz
parents:
diff changeset
253 class Analysis(Remark):
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
254 yaml_tag = "!Analysis"
150
anatofuz
parents:
diff changeset
255
anatofuz
parents:
diff changeset
256 @property
anatofuz
parents:
diff changeset
257 def color(self):
anatofuz
parents:
diff changeset
258 return "white"
anatofuz
parents:
diff changeset
259
anatofuz
parents:
diff changeset
260
anatofuz
parents:
diff changeset
261 class AnalysisFPCommute(Analysis):
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
262 yaml_tag = "!AnalysisFPCommute"
150
anatofuz
parents:
diff changeset
263
anatofuz
parents:
diff changeset
264
anatofuz
parents:
diff changeset
265 class AnalysisAliasing(Analysis):
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
266 yaml_tag = "!AnalysisAliasing"
150
anatofuz
parents:
diff changeset
267
anatofuz
parents:
diff changeset
268
anatofuz
parents:
diff changeset
269 class Passed(Remark):
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
270 yaml_tag = "!Passed"
150
anatofuz
parents:
diff changeset
271
anatofuz
parents:
diff changeset
272 @property
anatofuz
parents:
diff changeset
273 def color(self):
anatofuz
parents:
diff changeset
274 return "green"
anatofuz
parents:
diff changeset
275
anatofuz
parents:
diff changeset
276
anatofuz
parents:
diff changeset
277 class Missed(Remark):
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
278 yaml_tag = "!Missed"
150
anatofuz
parents:
diff changeset
279
anatofuz
parents:
diff changeset
280 @property
anatofuz
parents:
diff changeset
281 def color(self):
anatofuz
parents:
diff changeset
282 return "red"
anatofuz
parents:
diff changeset
283
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
284
150
anatofuz
parents:
diff changeset
285 class Failure(Missed):
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
286 yaml_tag = "!Failure"
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
287
150
anatofuz
parents:
diff changeset
288
anatofuz
parents:
diff changeset
289 def get_remarks(input_file, filter_=None):
anatofuz
parents:
diff changeset
290 max_hotness = 0
anatofuz
parents:
diff changeset
291 all_remarks = dict()
anatofuz
parents:
diff changeset
292 file_remarks = defaultdict(functools.partial(defaultdict, list))
anatofuz
parents:
diff changeset
293
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
294 with io.open(input_file, encoding="utf-8") as f:
150
anatofuz
parents:
diff changeset
295 docs = yaml.load_all(f, Loader=Loader)
anatofuz
parents:
diff changeset
296
anatofuz
parents:
diff changeset
297 filter_e = None
anatofuz
parents:
diff changeset
298 if filter_:
anatofuz
parents:
diff changeset
299 filter_e = re.compile(filter_)
anatofuz
parents:
diff changeset
300 for remark in docs:
anatofuz
parents:
diff changeset
301 remark.canonicalize()
anatofuz
parents:
diff changeset
302 # Avoid remarks withoug debug location or if they are duplicated
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
303 if not hasattr(remark, "DebugLoc") or remark.key in all_remarks:
150
anatofuz
parents:
diff changeset
304 continue
anatofuz
parents:
diff changeset
305
anatofuz
parents:
diff changeset
306 if filter_e and not filter_e.search(remark.Pass):
anatofuz
parents:
diff changeset
307 continue
anatofuz
parents:
diff changeset
308
anatofuz
parents:
diff changeset
309 all_remarks[remark.key] = remark
anatofuz
parents:
diff changeset
310
anatofuz
parents:
diff changeset
311 file_remarks[remark.File][remark.Line].append(remark)
anatofuz
parents:
diff changeset
312
anatofuz
parents:
diff changeset
313 # If we're reading a back a diff yaml file, max_hotness is already
anatofuz
parents:
diff changeset
314 # captured which may actually be less than the max hotness found
anatofuz
parents:
diff changeset
315 # in the file.
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
316 if hasattr(remark, "max_hotness"):
150
anatofuz
parents:
diff changeset
317 max_hotness = remark.max_hotness
anatofuz
parents:
diff changeset
318 max_hotness = max(max_hotness, remark.Hotness)
anatofuz
parents:
diff changeset
319
anatofuz
parents:
diff changeset
320 return max_hotness, all_remarks, file_remarks
anatofuz
parents:
diff changeset
321
anatofuz
parents:
diff changeset
322
anatofuz
parents:
diff changeset
323 def gather_results(filenames, num_jobs, should_print_progress, filter_=None):
anatofuz
parents:
diff changeset
324 if should_print_progress:
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
325 print("Reading YAML files...")
150
anatofuz
parents:
diff changeset
326 if not Remark.demangler_proc:
anatofuz
parents:
diff changeset
327 Remark.set_demangler(Remark.default_demangler)
anatofuz
parents:
diff changeset
328 remarks = optpmap.pmap(
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
329 get_remarks, filenames, num_jobs, should_print_progress, filter_
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
330 )
150
anatofuz
parents:
diff changeset
331 max_hotness = max(entry[0] for entry in remarks)
anatofuz
parents:
diff changeset
332
anatofuz
parents:
diff changeset
333 def merge_file_remarks(file_remarks_job, all_remarks, merged):
anatofuz
parents:
diff changeset
334 for filename, d in iteritems(file_remarks_job):
anatofuz
parents:
diff changeset
335 for line, remarks in iteritems(d):
anatofuz
parents:
diff changeset
336 for remark in remarks:
anatofuz
parents:
diff changeset
337 # Bring max_hotness into the remarks so that
anatofuz
parents:
diff changeset
338 # RelativeHotness does not depend on an external global.
anatofuz
parents:
diff changeset
339 remark.max_hotness = max_hotness
anatofuz
parents:
diff changeset
340 if remark.key not in all_remarks:
anatofuz
parents:
diff changeset
341 merged[filename][line].append(remark)
anatofuz
parents:
diff changeset
342
anatofuz
parents:
diff changeset
343 all_remarks = dict()
anatofuz
parents:
diff changeset
344 file_remarks = defaultdict(functools.partial(defaultdict, list))
anatofuz
parents:
diff changeset
345 for _, all_remarks_job, file_remarks_job in remarks:
anatofuz
parents:
diff changeset
346 merge_file_remarks(file_remarks_job, all_remarks, file_remarks)
anatofuz
parents:
diff changeset
347 all_remarks.update(all_remarks_job)
anatofuz
parents:
diff changeset
348
anatofuz
parents:
diff changeset
349 return all_remarks, file_remarks, max_hotness != 0
anatofuz
parents:
diff changeset
350
anatofuz
parents:
diff changeset
351
anatofuz
parents:
diff changeset
352 def find_opt_files(*dirs_or_files):
anatofuz
parents:
diff changeset
353 all = []
anatofuz
parents:
diff changeset
354 for dir_or_file in dirs_or_files:
anatofuz
parents:
diff changeset
355 if os.path.isfile(dir_or_file):
anatofuz
parents:
diff changeset
356 all.append(dir_or_file)
anatofuz
parents:
diff changeset
357 else:
anatofuz
parents:
diff changeset
358 for dir, subdirs, files in os.walk(dir_or_file):
anatofuz
parents:
diff changeset
359 # Exclude mounted directories and symlinks (os.walk default).
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
360 subdirs[:] = [
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
361 d for d in subdirs if not os.path.ismount(os.path.join(dir, d))
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
362 ]
150
anatofuz
parents:
diff changeset
363 for file in files:
anatofuz
parents:
diff changeset
364 if fnmatch.fnmatch(file, "*.opt.yaml*"):
anatofuz
parents:
diff changeset
365 all.append(os.path.join(dir, file))
anatofuz
parents:
diff changeset
366 return all