Index: pydir/run-llvm2ice.py |
diff --git a/pydir/run-llvm2ice.py b/pydir/run-llvm2ice.py |
new file mode 100755 |
index 0000000000000000000000000000000000000000..583d7f8eb72d26c32041d3f52942a36462f6bc5a |
--- /dev/null |
+++ b/pydir/run-llvm2ice.py |
@@ -0,0 +1,89 @@ |
+#!/usr/bin/env python2 |
+ |
+import argparse |
+import itertools |
+import os |
+import re |
+import subprocess |
+import sys |
+ |
+from utils import shellcmd |
+ |
+def main(): |
+ """Run the llvm2ice compiler on an llvm file. |
+ |
+ Takes an llvm input file, freezes it into a pexe file, converts |
+ it to a Subzero program, and finally compiles it. |
+ """ |
+ argparser = argparse.ArgumentParser( |
+ description=' ' + main.__doc__, |
+ formatter_class=argparse.ArgumentDefaultsHelpFormatter) |
+ argparser.add_argument('--input', '-i', required=True, |
+ help='LLVM source file to compile') |
+ argparser.add_argument('--insts', required=False, |
+ action='store_true', |
+ help='Stop after translating to ' + |
+ 'Subzero instructions') |
+ argparser.add_argument('--no-local-syms', required=False, |
+ action='store_true', |
+ help="Don't keep local symbols in the pexe file") |
+ argparser.add_argument('--llvm', required=False, |
+ action='store_true', |
+ help='Parse pexe into llvm IR first, then ' + |
+ 'convert to Subzero') |
+ argparser.add_argument('--llvm-source', required=False, |
+ action='store_true', |
+ help='Parse source directly into llvm IR ' + |
+ '(without generating a pexe), then ' + |
+ 'convert to Subzero') |
+ argparser.add_argument( |
+ '--llvm2ice', required=False, default='./llvm2ice', metavar='LLVM2ICE', |
+ help="Subzero translator 'llvm2ice'") |
+ argparser.add_argument('--llvm-bin-path', required=False, |
+ default=None, metavar='LLVM_BIN_PATH', |
+ help='Path to LLVM executables ' + |
+ '(for building PEXE files)') |
+ argparser.add_argument('--echo-cmd', required=False, |
+ action='store_true', |
+ help='Trace command that generates ICE instructions') |
+ argparser.add_argument('--args', '-a', nargs=argparse.REMAINDER, |
+ help='Remaining arguments are passed to llvm2ice') |
+ |
+ args = argparser.parse_args() |
+ llvm_bin_path = args.llvm_bin_path |
+ llfile = args.input |
+ |
+ if args.llvm and args.llvm_source: |
+ raise RuntimeError("Can't specify both '--llvm' and '--llvm-source'") |
+ |
+ if args.llvm_source and args.no_local_syms: |
+ raise RuntimeError("Can't specify both '--llvm-source' and " + |
+ "'--no-local-syms'") |
+ |
+ cmd = [] |
+ if not args.llvm_source: |
+ cmd = [os.path.join(llvm_bin_path, 'llvm-as'), llfile, '-o', '-', '|', |
+ os.path.join(llvm_bin_path, 'pnacl-freeze')] |
+ if not args.no_local_syms: |
+ cmd += ['--allow-local-symbol-tables'] |
+ cmd += ['|'] |
+ cmd += [args.llvm2ice] |
+ if args.insts: |
+ cmd += ['-verbose', 'inst', '-notranslate'] |
+ if not args.llvm_source: |
+ cmd += ['--bitcode-format=pnacl'] |
+ if not args.no_local_syms: |
+ cmd += ['--allow-local-symbol-tables'] |
+ if not (args.llvm or args.llvm_source): |
+ cmd += ['--build-on-read'] |
+ if args.args: |
+ cmd += args.args |
+ if args.llvm_source: |
+ cmd += [llfile] |
+ |
+ stdout_result = shellcmd(cmd, echo=args.echo_cmd) |
+ if not args.echo_cmd: |
+ sys.stdout.write(stdout_result) |
+ |
+if __name__ == '__main__': |
+ main() |