Subzero: Add a convenience script for Spec2K. Add the --stats argument.

BUG= none
R=jvoung@chromium.org

Review URL: https://codereview.chromium.org/559723003
diff --git a/pydir/szbuild.py b/pydir/szbuild.py
index e922190..32311f1 100755
--- a/pydir/szbuild.py
+++ b/pydir/szbuild.py
@@ -61,6 +61,31 @@
         return True
     return default_match
 
+def AddOptionalArgs(argparser):
+    argparser.add_argument('--force', dest='force', action='store_true',
+                           help='Force all re-translations of the pexe')
+    argparser.add_argument('--include', '-i', default=[], dest='include',
+                           action='append',
+                           help='Subzero symbols to include ' +
+                                '(regex or line range)')
+    argparser.add_argument('--exclude', '-e', default=[], dest='exclude',
+                           action='append',
+                           help='Subzero symbols to exclude ' +
+                                '(regex or line range)')
+    argparser.add_argument('--output', '-o', default='a.out', dest='output',
+                           action='store',
+                           help='Output executable. Default %(default)s.')
+    argparser.add_argument('-O', default='2', dest='optlevel',
+                           choices=['m1', '-1', '0', '1', '2'],
+                           help='Optimization level ' +
+                                '(m1 and -1 are equivalent).' +
+                                ' Default %(default)s.')
+    argparser.add_argument('--verbose', '-v', dest='verbose',
+                           action='store_true',
+                           help='Display some extra debugging output')
+    argparser.add_argument('--stats', dest='stats', action='store_true',
+                           help='Enable Subzero stats output')
+
 def main():
     """Create a hybrid translation from Subzero and llc.
 
@@ -104,38 +129,20 @@
     argparser = argparse.ArgumentParser(
         description='    ' + main.__doc__,
         formatter_class=argparse.RawTextHelpFormatter)
+    AddOptionalArgs(argparser)
     argparser.add_argument('pexe', help='Finalized pexe to translate')
-    argparser.add_argument('--force', dest='force', action='store_true',
-                           help='Force all re-translations of the pexe')
-    argparser.add_argument('--include', '-i', default=[], dest='include',
-                           action='append',
-                           help='Subzero symbols to include ' +
-                                '(regex or line range)')
-    argparser.add_argument('--exclude', '-e', default=[], dest='exclude',
-                           action='append',
-                           help='Subzero symbols to exclude ' +
-                                '(regex or line range)')
-    argparser.add_argument('--output', '-o', default='a.out', dest='output',
-                           action='store',
-                           help='Output executable. Default %(default)s.')
-    argparser.add_argument('-O', default='2', dest='optlevel',
-                           choices=['m1', '-1', '0', '1', '2'],
-                           help='Optimization level ' +
-                                '(m1 and -1 are equivalent).' +
-                                ' Default %(default)s.')
-    argparser.add_argument('--verbose', '-v', dest='verbose',
-                           action='store_true',
-                           help='Display some extra debugging output')
     args = argparser.parse_args()
-
     pexe = args.pexe
+    exe = args.output
+    ProcessPexe(args, pexe, exe)
+
+def ProcessPexe(args, pexe, exe):
     [pexe_base, ext] = os.path.splitext(pexe)
     if ext != '.pexe':
         pexe_base = pexe
     pexe_base_unescaped = pexe_base
     pexe_base = pipes.quote(pexe_base)
     pexe = pipes.quote(pexe)
-    exe = args.output
 
     nacl_root = FindBaseNaCl()
     os.environ['PATH'] = (
@@ -181,7 +188,8 @@
             NewerThanOrNotThere(llvm2ice, obj_sz):
         shellcmd((
             '{l2i} -O{level} -bitcode-format=pnacl -disable-globals ' +
-            '-externalize -ffunction-sections {pexe} -o {asm}'
+            '-externalize -ffunction-sections {pexe} -o {asm}' +
+            (' --stats' if args.stats else '')
             ).format(l2i=llvm2ice, level=opt_level, pexe=pexe, asm=asm_sz),
                  echo=args.verbose)
         shellcmd((
diff --git a/pydir/szbuild_spec2k.py b/pydir/szbuild_spec2k.py
new file mode 100755
index 0000000..fb4321f
--- /dev/null
+++ b/pydir/szbuild_spec2k.py
@@ -0,0 +1,46 @@
+#!/usr/bin/env python2
+
+import argparse
+import os
+import sys
+
+import szbuild
+
+from utils import FindBaseNaCl
+
+def main():
+    """Build native gcc-style executables for one or all Spec2K components.
+
+    Afterwards, the executables can be run from the
+    native_client/tests/spec2k/ directory as:
+    './run_all.sh RunBenchmarks SetupGccX8632Opt {train|ref} ...'
+    """
+    nacl_root = FindBaseNaCl()
+    components = [ '164.gzip', '175.vpr', '176.gcc', '177.mesa', '179.art', 
+                   '181.mcf', '183.equake', '186.crafty', '188.ammp',
+                   '197.parser', '252.eon', '253.perlbmk', '254.gap',
+                   '255.vortex', '256.bzip2', '300.twolf' ]
+    
+    argparser = argparse.ArgumentParser(description=main.__doc__)
+    szbuild.AddOptionalArgs(argparser)
+    argparser.add_argument('comps', nargs='*', default=components)
+    args = argparser.parse_args()
+    bad = set(args.comps) - set(components)
+    if bad:
+        print 'Unknown component{s}: '.format(s='s' if len(bad) > 1 else '') + \
+            ' '.join(x for x in bad)
+        sys.exit(1)
+    for comp in args.comps:
+        name = os.path.splitext(comp)[1] or comp
+        if name[0] == '.':
+            name = name[1:]
+        szbuild.ProcessPexe(args,
+                            ('{root}/tests/spec2k/{comp}/' +
+                             '{name}.opt.stripped.pexe'
+                             ).format(root=nacl_root, comp=comp, name=name),
+                            ('{root}/tests/spec2k/{comp}/' +
+                             '{name}.gcc.opt.x8632'
+                             ).format(root=nacl_root, comp=comp, name=name))
+
+if __name__ == '__main__':
+    main()