summaryrefslogtreecommitdiffstats
path: root/llvm/tools/opt-viewer
diff options
context:
space:
mode:
authorAdam Nemet <anemet@apple.com>2017-11-29 17:07:41 +0000
committerAdam Nemet <anemet@apple.com>2017-11-29 17:07:41 +0000
commit95e0c5fc6cebc2ced6eaac6dddd7858dc053cf4e (patch)
treef0db50aa4c55e4ddd03b9b0499ec93bfb3aaaa80 /llvm/tools/opt-viewer
parent5360f9404e5bc4b0a55cf1ca7c3449bb64034ff5 (diff)
downloadbcm5719-llvm-95e0c5fc6cebc2ced6eaac6dddd7858dc053cf4e.tar.gz
bcm5719-llvm-95e0c5fc6cebc2ced6eaac6dddd7858dc053cf4e.zip
Add opt-viewer testing
Detects whether we have the Python modules (pygments, yaml) required by opt-viewer and hooks this up to REQUIRES. This fixes https://bugs.llvm.org/show_bug.cgi?id=34129 (the lack of opt-viewer testing). It's also related to https://github.com/apple/swift/pull/12938 and the idea is to expose LLVM_HAVE_OPT_VIEWER_MODULES to the Swift cmake. Differential Revision: https://reviews.llvm.org/D40202 Fixes since the first commit: 1. Disable syntax highlighting as different versions of pygments generate different HTML 2. Use llvm-cxxfilt from the build llvm-svn: 319324
Diffstat (limited to 'llvm/tools/opt-viewer')
-rwxr-xr-xllvm/tools/opt-viewer/opt-viewer.py34
-rw-r--r--llvm/tools/opt-viewer/optrecord.py33
2 files changed, 43 insertions, 24 deletions
diff --git a/llvm/tools/opt-viewer/opt-viewer.py b/llvm/tools/opt-viewer/opt-viewer.py
index 7253d7c13ee..3000fb12f0b 100755
--- a/llvm/tools/opt-viewer/opt-viewer.py
+++ b/llvm/tools/opt-viewer/opt-viewer.py
@@ -60,19 +60,23 @@ class SourceFileRenderer:
def render_source_lines(self, stream, line_remarks):
file_text = stream.read()
- html_highlighted = highlight(
+
+ if args.no_highlight:
+ html_highlighted = file_text
+ else:
+ html_highlighted = highlight(
file_text,
- self.cpp_lexer,
- self.html_formatter)
+ self.cpp_lexer,
+ self.html_formatter)
- # On Python 3, pygments.highlight() returns a bytes object, not a str.
- if sys.version_info >= (3, 0):
- html_highlighted = html_highlighted.decode('utf-8')
+ # On Python 3, pygments.highlight() returns a bytes object, not a str.
+ if sys.version_info >= (3, 0):
+ html_highlighted = html_highlighted.decode('utf-8')
- # Take off the header and footer, these must be
- # reapplied line-wise, within the page structure
- html_highlighted = html_highlighted.replace('<div class="highlight"><pre>', '')
- html_highlighted = html_highlighted.replace('</pre></div>', '')
+ # Take off the header and footer, these must be
+ # reapplied line-wise, within the page structure
+ html_highlighted = html_highlighted.replace('<div class="highlight"><pre>', '')
+ html_highlighted = html_highlighted.replace('</pre></div>', '')
for (linenum, html_line) in enumerate(html_highlighted.split('\n'), start=1):
print('''
@@ -274,9 +278,19 @@ if __name__ == '__main__':
default=1000,
type=int,
help='Maximum number of the hottest remarks to appear on the index page')
+ parser.add_argument(
+ '--no-highlight',
+ action='store_true',
+ default=False,
+ help='Do not use a syntax highlighter when rendering the source code')
+ parser.add_argument(
+ '--demangler',
+ help='Set the demangler to be used (defaults to %s)' % optrecord.Remark.default_demangler)
args = parser.parse_args()
print_progress = not args.no_progress_indicator
+ if args.demangler:
+ optrecord.Remark.set_demangler(args.demangler)
files = optrecord.find_opt_files(*args.yaml_dirs_or_files)
if not files:
diff --git a/llvm/tools/opt-viewer/optrecord.py b/llvm/tools/opt-viewer/optrecord.py
index e68bcb870c6..ce665299e17 100644
--- a/llvm/tools/opt-viewer/optrecord.py
+++ b/llvm/tools/opt-viewer/optrecord.py
@@ -26,11 +26,6 @@ except:
import optpmap
-
-p = subprocess.Popen(['c++filt', '-n'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
-p_lock = Lock()
-
-
try:
dict.iteritems
except AttributeError:
@@ -47,13 +42,6 @@ else:
return d.iteritems()
-def demangle(name):
- with p_lock:
- p.stdin.write((name + '\n').encode('utf-8'))
- p.stdin.flush()
- return p.stdout.readline().rstrip().decode('utf-8')
-
-
def html_file_name(filename):
return filename.replace('/', '_').replace('#', '_') + ".html"
@@ -66,6 +54,21 @@ class Remark(yaml.YAMLObject):
# Work-around for http://pyyaml.org/ticket/154.
yaml_loader = Loader
+ default_demangler = 'c++filt -n'
+ demangler_proc = None
+
+ @classmethod
+ def set_demangler(cls, demangler):
+ cls.demangler_proc = subprocess.Popen(demangler.split(), stdin=subprocess.PIPE, stdout=subprocess.PIPE)
+ cls.demangler_lock = Lock()
+
+ @classmethod
+ def demangle(cls, name):
+ with cls.demangler_lock:
+ cls.demangler_proc.stdin.write((name + '\n').encode('utf-8'))
+ cls.demangler_proc.stdin.flush()
+ return cls.demangler_proc.stdout.readline().rstrip().decode('utf-8')
+
# Intern all strings since we have lot of duplication across filenames,
# remark text.
#
@@ -133,7 +136,7 @@ class Remark(yaml.YAMLObject):
@property
def DemangledFunctionName(self):
- return demangle(self.Function)
+ return self.demangle(self.Function)
@property
def Link(self):
@@ -149,7 +152,7 @@ class Remark(yaml.YAMLObject):
(key, value) = list(mapping.items())[0]
if key == 'Caller' or key == 'Callee':
- value = cgi.escape(demangle(value))
+ value = cgi.escape(self.demangle(value))
if dl and key != 'Caller':
dl_dict = dict(list(dl))
@@ -259,6 +262,8 @@ def get_remarks(input_file):
def gather_results(filenames, num_jobs, should_print_progress):
if should_print_progress:
print('Reading YAML files...')
+ if not Remark.demangler_proc:
+ Remark.set_demangler(Remark.default_demangler)
remarks = optpmap.pmap(
get_remarks, filenames, num_jobs, should_print_progress)
max_hotness = max(entry[0] for entry in remarks)
OpenPOWER on IntegriCloud