blob: b0a1ec8fa40745c91a9a95d2e64c62b77d9a26cb [file] [log] [blame]
Morten Krogh-Jespersen017a7002019-01-10 14:14:17 +01001#!/usr/bin/env python
2# Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
3# for details. All rights reserved. Use of this source code is governed by a
4# BSD-style license that can be found in the LICENSE file.
5
Morten Krogh-Jespersena6f0f2f2019-01-17 13:57:39 +01006import archive
7import argparse
Ian Zerny3f54e222019-02-12 10:51:17 +01008import jdk
Morten Krogh-Jespersen017a7002019-01-10 14:14:17 +01009import subprocess
10import sys
Morten Krogh-Jespersena6f0f2f2019-01-17 13:57:39 +010011import tempfile
Morten Krogh-Jespersen017a7002019-01-10 14:14:17 +010012import utils
13
Morten Krogh-Jespersena6f0f2f2019-01-17 13:57:39 +010014def parse_arguments():
15 parser = argparse.ArgumentParser(
16 description = 'R8lib wrapper for retrace tool.')
17 parser.add_argument(
18 '-c',
19 '--commit_hash',
20 help='Commit hash to download r8lib map file for.',
21 default=None)
22 parser.add_argument(
23 '--version',
24 help='Version to download r8lib map file for.',
25 default=None)
26 parser.add_argument(
Morten Krogh-Jespersen08701bf2019-12-02 21:31:04 +010027 '--tag',
28 help='Tag to download r8lib map file for.',
29 default=None)
30 parser.add_argument(
Morten Krogh-Jespersena6f0f2f2019-01-17 13:57:39 +010031 '--map',
32 help='Path to r8lib map.',
33 default=utils.R8LIB_JAR + '.map')
34 parser.add_argument(
Morten Krogh-Jespersen3aa4bff82020-09-30 16:43:26 +020035 '--no-r8lib',
36 default=False,
37 action='store_true',
38 help='Use r8.jar and not r8lib.jar.')
39 parser.add_argument(
Morten Krogh-Jespersena6f0f2f2019-01-17 13:57:39 +010040 '--stacktrace',
41 help='Path to stacktrace file.',
42 default=None)
Christoffer Quist Adamsen7bf60342020-11-09 14:00:27 +010043 parser.add_argument(
44 '--quiet',
45 default=None,
46 action='store_true',
47 help='Disables diagnostics printing to stdout.')
Morten Krogh-Jespersenc9fd21d2020-12-14 09:25:11 +010048 parser.add_argument(
49 '--debug-agent',
50 default=None,
51 action='store_true',
52 help='Attach a debug-agent to the retracer java process.')
Morten Krogh-Jespersena6f0f2f2019-01-17 13:57:39 +010053 return parser.parse_args()
54
55
Morten Krogh-Jespersen08701bf2019-12-02 21:31:04 +010056def find_version_or_hash_from_tag(tag_or_hash):
57 info = subprocess.check_output([
58 'git',
59 'show',
60 tag_or_hash,
61 '-s',
62 '--format=oneline']).splitlines()[-1].split()
63 # The info should be on the following form [hash,"Version",version]
64 if len(info) == 3 and len(info[0]) == 40 and info[1] == "Version":
65 return info[2]
66 return None
67
68
Morten Krogh-Jespersen017a7002019-01-10 14:14:17 +010069def main():
Morten Krogh-Jespersena6f0f2f2019-01-17 13:57:39 +010070 args = parse_arguments()
Morten Krogh-Jespersen08701bf2019-12-02 21:31:04 +010071 if args.tag:
72 hash_or_version = find_version_or_hash_from_tag(args.tag)
73 else:
74 hash_or_version = args.commit_hash or args.version
Morten Krogh-Jespersen3aa4bff82020-09-30 16:43:26 +020075 return run(
76 args.map,
77 hash_or_version,
78 args.stacktrace,
79 args.commit_hash is not None,
Christoffer Quist Adamsen7bf60342020-11-09 14:00:27 +010080 args.no_r8lib,
Morten Krogh-Jespersenc9fd21d2020-12-14 09:25:11 +010081 quiet=args.quiet,
82 debug=args.debug_agent)
Ian Zerny5ffa58f2020-02-26 08:37:14 +010083
Morten Krogh-Jespersenc9fd21d2020-12-14 09:25:11 +010084def run(map_path, hash_or_version, stacktrace, is_hash, no_r8lib, quiet=False,
85 debug=False):
Morten Krogh-Jespersen08701bf2019-12-02 21:31:04 +010086 if hash_or_version:
Morten Krogh-Jespersena6f0f2f2019-01-17 13:57:39 +010087 download_path = archive.GetUploadDestination(
Morten Krogh-Jespersen08701bf2019-12-02 21:31:04 +010088 hash_or_version,
Morten Krogh-Jespersena6f0f2f2019-01-17 13:57:39 +010089 'r8lib.jar.map',
Ian Zerny5ffa58f2020-02-26 08:37:14 +010090 is_hash)
Morten Krogh-Jespersena6f0f2f2019-01-17 13:57:39 +010091 if utils.file_exists_on_cloud_storage(download_path):
Morten Krogh-Jespersen3aa4bff82020-09-30 16:43:26 +020092 map_path = tempfile.NamedTemporaryFile().name
93 utils.download_file_from_cloud_storage(download_path, map_path)
Morten Krogh-Jespersena6f0f2f2019-01-17 13:57:39 +010094 else:
Morten Krogh-Jespersen08701bf2019-12-02 21:31:04 +010095 print('Could not find map file from argument: %s.' % hash_or_version)
Morten Krogh-Jespersena6f0f2f2019-01-17 13:57:39 +010096 return 1
97
Morten Krogh-Jespersenc9fd21d2020-12-14 09:25:11 +010098 retrace_args = [jdk.GetJavaExecutable()]
99
100 if debug:
101 retrace_args.append('-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005')
102
103 retrace_args += [
Morten Krogh-Jespersen89a5b062020-01-07 14:50:40 +0100104 '-cp',
Morten Krogh-Jespersen3aa4bff82020-09-30 16:43:26 +0200105 utils.R8_JAR if no_r8lib else utils.R8LIB_JAR,
Morten Krogh-Jespersen89a5b062020-01-07 14:50:40 +0100106 'com.android.tools.r8.retrace.Retrace',
Morten Krogh-Jespersen3aa4bff82020-09-30 16:43:26 +0200107 map_path
Ian Zerny3f54e222019-02-12 10:51:17 +0100108 ]
Morten Krogh-Jespersen89a5b062020-01-07 14:50:40 +0100109
Morten Krogh-Jespersen691793a2021-01-08 11:36:20 +0100110 if quiet:
111 retrace_args.append('--quiet')
112
Ian Zerny5ffa58f2020-02-26 08:37:14 +0100113 if stacktrace:
114 retrace_args.append(stacktrace)
Morten Krogh-Jespersena6f0f2f2019-01-17 13:57:39 +0100115
Christoffer Quist Adamsen7bf60342020-11-09 14:00:27 +0100116 utils.PrintCmd(retrace_args, quiet=quiet)
Morten Krogh-Jespersena6f0f2f2019-01-17 13:57:39 +0100117 return subprocess.call(retrace_args)
118
Morten Krogh-Jespersen017a7002019-01-10 14:14:17 +0100119
120if __name__ == '__main__':
121 sys.exit(main())