[Retrace] Add retrace benchmark

Bug: 149974481
Change-Id: I0718f92693f3d17021a43f8106ed9efe4ce97825
diff --git a/tools/golem.py b/tools/golem.py
index 466c3ab..586ac5e 100755
--- a/tools/golem.py
+++ b/tools/golem.py
@@ -21,6 +21,8 @@
     'proguard',
     'proguardsettings',
     'r8',
+    'remapper',
+    'retrace_benchmarks',
     'sample_libraries',
     'youtube',
 ]
diff --git a/tools/retrace_benchmark.py b/tools/retrace_benchmark.py
new file mode 100755
index 0000000..5e2bd3b
--- /dev/null
+++ b/tools/retrace_benchmark.py
@@ -0,0 +1,83 @@
+#!/usr/bin/env python
+# Copyright (c) 2020, the R8 project authors. Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+import argparse
+import jdk
+import golem
+import os
+import subprocess
+import sys
+import time
+import toolhelper
+import utils
+
+RETRACERS = ['r8', 'proguard', 'remapper']
+
+def parse_arguments(argv):
+  parser = argparse.ArgumentParser(
+                    description = 'Run r8 retrace bootstrap benchmarks.')
+  parser.add_argument('--golem',
+                    help = 'Link in third party dependencies.',
+                    default = False,
+                    action = 'store_true')
+  parser.add_argument('--ignore-java-version',
+                    help='Do not check java version',
+                    default=False,
+                    action='store_true')
+  parser.add_argument('--print-runtimeraw',
+                    metavar='BENCHMARKNAME',
+                    help='Print the line \'<BENCHMARKNAME>(RunTimeRaw):' +
+                        ' <elapsed> ms\' at the end where <elapsed> is' +
+                        ' the elapsed time in milliseconds.')
+  parser.add_argument('--retracer',
+                    help='The retracer to use',
+                    choices=RETRACERS,
+                    required=True)
+  options = parser.parse_args(argv)
+  return options
+
+
+def run_retrace(options, temp):
+  if options.retracer == 'r8':
+    retracer_args = [
+        '-cp', utils.R8LIB_JAR, 'com.android.tools.r8.retrace.Retrace']
+  elif options.retracer == 'proguard':
+    retracer_args = ['-jar',
+                     os.path.join(
+                        utils.THIRD_PARTY,
+                        'proguard',
+                        'proguard6.0.1',
+                        'lib',
+                        'retrace.jar')]
+  elif options.retracer == 'remapper':
+    retracer_args = ['-jar',
+                     os.path.join(
+                        utils.THIRD_PARTY,
+                        'remapper',
+                        'remapper_deploy.jar')]
+  else:
+    assert False, "Unexpected retracer " + options.retracer
+  retrace_args = [jdk.GetJavaExecutable()] + retracer_args + [
+    os.path.join(utils.THIRD_PARTY, 'retrace_benchmark', 'r8lib.jar.map'),
+    os.path.join(utils.THIRD_PARTY, 'retrace_benchmark', 'stacktrace.txt')]
+  utils.PrintCmd(retrace_args)
+  t0 = time.time()
+  subprocess.check_call(
+      retrace_args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+  t1 = time.time()
+  if options.print_runtimeraw:
+    print('{}(RunTimeRaw): {} ms'
+        .format(options.print_runtimeraw, 1000.0 * (t1 - t0)))
+
+
+if __name__ == '__main__':
+  options = parse_arguments(sys.argv[1:])
+  if options.golem:
+    golem.link_third_party()
+  if not options.ignore_java_version:
+    utils.check_java_version()
+  with utils.TempDir() as temp:
+    run_retrace(options, temp)
+