#!/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 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('--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()
  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())
