blob: 448a0beca38a9aa89b5d8551a963555dc1dd8ef1 [file] [log] [blame]
#!/usr/bin/env python3
# Copyright (c) 2018, 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.
'''
Compare the R8 API used by the API usage sample to the API kept by @Keep.
'''
import argparse
import jdk
import os
import subprocess
import utils
parser = argparse.ArgumentParser(description=__doc__.strip(),
formatter_class=argparse.RawTextHelpFormatter)
parser.add_argument('-o', '--output-dir')
API_SAMPLE_JAR = 'tests/d8_api_usage_sample.jar'
def main(output_dir=None):
if output_dir is None:
output_dir = ''
javaExecutable = jdk.GetJavaExecutable()
printseeds_path = os.path.join(output_dir, 'keep-seeds.txt')
printseeds_args = [
javaExecutable,
'-jar',
utils.R8_JAR,
'printseeds',
utils.RT_JAR,
utils.R8_JAR,
utils.R8LIB_KEEP_RULES,
]
write_sorted_lines(printseeds_args, printseeds_path)
printuses_path = os.path.join(output_dir, 'sample-uses.txt')
printuses_args = [
javaExecutable,
'-jar',
utils.R8_JAR,
'printuses',
utils.RT_JAR,
utils.R8_JAR,
API_SAMPLE_JAR,
]
write_sorted_lines(printuses_args, printuses_path)
print_diff(printseeds_path, printuses_path)
def write_sorted_lines(cmd_args, output_path):
utils.PrintCmd(cmd_args)
output_lines = subprocess.check_output(cmd_args).splitlines(True)
print("Write output to %s" % output_path)
output_lines.sort()
with open(output_path, 'w') as fp:
for line in output_lines:
fp.write(line)
def print_diff(printseeds_path, printuses_path):
with open(printseeds_path) as fp:
seeds = set(fp.read().splitlines())
with open(printuses_path) as fp:
uses = set(fp.read().splitlines())
only_in_seeds = seeds - uses
only_in_uses = uses - seeds
if only_in_seeds:
print("%s lines with '-' are marked @Keep " % len(only_in_seeds) +
"but not used by sample.")
if only_in_uses:
print("%s lines with '+' are used by sample " % len(only_in_uses) +
"but are missing @Keep annotations.")
for line in sorted(only_in_seeds):
print('-' + line)
for line in sorted(only_in_uses):
print('+' + line)
if not only_in_seeds and not only_in_uses:
print('Sample uses the entire set of members marked @Keep. Well done!')
if __name__ == '__main__':
main(**vars(parser.parse_args()))