diff options
| author | Adam Nemet <anemet@apple.com> | 2017-11-29 17:07:41 +0000 |
|---|---|---|
| committer | Adam Nemet <anemet@apple.com> | 2017-11-29 17:07:41 +0000 |
| commit | 95e0c5fc6cebc2ced6eaac6dddd7858dc053cf4e (patch) | |
| tree | f0db50aa4c55e4ddd03b9b0499ec93bfb3aaaa80 /llvm/tools/opt-viewer | |
| parent | 5360f9404e5bc4b0a55cf1ca7c3449bb64034ff5 (diff) | |
| download | bcm5719-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-x | llvm/tools/opt-viewer/opt-viewer.py | 34 | ||||
| -rw-r--r-- | llvm/tools/opt-viewer/optrecord.py | 33 |
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) |

