diff --git a/utils/opt-viewer/opt-viewer.py b/utils/opt-viewer/opt-viewer.py
index 56332a06288..ee5c7b52e11 100755
--- a/utils/opt-viewer/opt-viewer.py
+++ b/utils/opt-viewer/opt-viewer.py
@@ -32,10 +32,23 @@ def demangle(name):
class Remark(yaml.YAMLObject):
- max_hotness = 1
+ max_hotness = 0
+
+ @classmethod
+ def should_display_hotness(cls):
+ # If max_hotness is 0 at the end, we assume hotness information is
+ # missing and no relative hotness information is displayed
+ return cls.max_hotness != 0
+
# Map function names to their source location for function where inlining happened
caller_loc = dict()
+ def __getattr__(self, name):
+ # If hotness is missing, assume 0
+ if name == 'Hotness':
+ return 0
+ raise AttributeError
+
@property
def File(self):
return self.DebugLoc['File']
@@ -90,7 +103,10 @@ class Remark(yaml.YAMLObject):
@property
def RelativeHotness(self):
- return int(round(self.Hotness * 100 / Remark.max_hotness))
+ if Remark.should_display_hotness():
+ return "{}%".format(int(round(self.Hotness * 100 / Remark.max_hotness)))
+ else:
+ return ''
@property
def key(self):
@@ -177,7 +193,7 @@ class SourceFileRenderer:
print('''
|
-{r.RelativeHotness}% |
+{r.RelativeHotness} |
{r.Pass} |
{indent} {r.message} |
{inlining_context} |
@@ -224,7 +240,7 @@ class IndexRenderer:
print('''
{r.DebugLocString} |
-{r.RelativeHotness}% |
+{r.RelativeHotness} |
{r.DemangledFunctionName} |
{r.Pass} |
'''.format(**locals()), file=self.stream)
@@ -259,15 +275,14 @@ for input_file in args.yaml_files:
f = open(input_file)
docs = yaml.load_all(f)
for remark in docs:
- if hasattr(remark, 'Hotness'):
- # Avoid duplicated remarks
- if remark.key in all_remarks:
- continue
- all_remarks[remark.key] = remark
+ # Avoid duplicated remarks
+ if remark.key in all_remarks:
+ continue
+ all_remarks[remark.key] = remark
- file_remarks.setdefault(remark.File, dict()).setdefault(remark.Line, []).append(remark)
+ file_remarks.setdefault(remark.File, dict()).setdefault(remark.Line, []).append(remark)
- Remark.max_hotness = max(Remark.max_hotness, remark.Hotness)
+ Remark.max_hotness = max(Remark.max_hotness, remark.Hotness)
# Set up a map between function names and their source location for function where inlining happened
for remark in all_remarks.itervalues():
@@ -277,7 +292,10 @@ for remark in all_remarks.itervalues():
if caller:
Remark.caller_loc[caller] = arg['DebugLoc']
-sorted_remarks = sorted(all_remarks.itervalues(), key=lambda r: r.Hotness, reverse=True)
+if Remark.should_display_hotness():
+ sorted_remarks = sorted(all_remarks.itervalues(), key=lambda r: r.Hotness, reverse=True)
+else:
+ sorted_remarks = sorted(all_remarks.itervalues(), key=lambda r: (r.File, r.Line, r.Column))
if not os.path.exists(args.output_dir):
os.mkdir(args.output_dir)