| #!/usr/bin/env python3 |
| # Copyright (c) 2019, 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. |
| |
| # Run R8 or PG on 'third_party/r8/r8.jar'. |
| # Report Golem-compatible CodeSize and RunTimeRaw values: |
| # |
| # <NAME>-Total(CodeSize): <size> |
| # <NAME>-Total(RunTimeRaw>: <time> ms |
| # |
| # and also detailed segment sizes for each classfile segment: |
| # |
| # <NAME>-Code(CodeSize): <size> |
| # <NAME>-AnnotationSets(CodeSize): <size> |
| # ... |
| # |
| # Uses the R8CfSegments Java tool which is downloaded as an x20 dependency. |
| # To make changes to the R8CfSegments tool one can use the gradle target - |
| # remember to update the x20 dependency afterwards if you want the numbers |
| # tracked. |
| |
| from __future__ import print_function |
| import argparse |
| import golem |
| import minify_tool |
| import os |
| import sys |
| import utils |
| |
| def parse_arguments(): |
| parser = argparse.ArgumentParser( |
| description = 'Run R8 or PG on' |
| ' third_party/r8/r8.jar.' |
| ' Report Golem-compatible CodeSize and RunTimeRaw values.') |
| parser.add_argument('--tool', |
| choices = ['pg', 'r8'], |
| required = True, |
| help = 'Compiler tool to use.') |
| parser.add_argument('--golem', |
| help = 'Running on golem, link in third_party resources.', |
| default = False, |
| action = 'store_true') |
| parser.add_argument('--name', |
| required = True, |
| help = 'Results will be printed using the specified benchmark name (e.g.' |
| ' <NAME>-<segment>(CodeSize): <bytes>), the full size is reported' |
| ' with <NAME>-Total(CodeSize)') |
| parser.add_argument('--print-memoryuse', |
| help = 'Prints the line \'<NAME>-Total(MemoryUse):' |
| ' <mem>\' at the end where <mem> is the peak' |
| ' peak resident set size (VmHWM) in bytes.', |
| default = False, |
| action = 'store_true') |
| parser.add_argument('--output', |
| help = 'Output directory to keep the generated files') |
| return parser.parse_args() |
| |
| |
| def Main(): |
| args = parse_arguments() |
| if args.golem: |
| golem.link_third_party() |
| utils.check_java_version() |
| output_dir = args.output |
| with utils.TempDir() as temp_dir: |
| if not output_dir: |
| output_dir = temp_dir |
| track_memory_file = None |
| if args.print_memoryuse: |
| track_memory_file = os.path.join(output_dir, utils.MEMORY_USE_TMP_FILE) |
| if args.tool == 'pg': |
| utils.print_cfsegments(args.name, [utils.PINNED_PGR8_JAR]) |
| else: |
| out_file = os.path.join(output_dir, 'out.jar') |
| return_code = minify_tool.minify_tool( |
| input_jar=utils.PINNED_R8_JAR, |
| output_jar=out_file, |
| debug=False, |
| build=False, |
| track_memory_file=track_memory_file, |
| benchmark_name=args.name + "-Total") |
| if return_code != 0: |
| sys.exit(return_code) |
| |
| utils.print_cfsegments(args.name, [out_file]) |
| |
| |
| if __name__ == '__main__': |
| sys.exit(Main()) |