xref: /aosp_15_r20/art/test/default_run.py (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker#
2*795d594fSAndroid Build Coastguard Worker# Copyright (C) 2022 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker#
4*795d594fSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker# You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker#
8*795d594fSAndroid Build Coastguard Worker#      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker#
10*795d594fSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker# limitations under the License.
15*795d594fSAndroid Build Coastguard Worker
16*795d594fSAndroid Build Coastguard Workerimport sys, os, shutil, shlex, re, subprocess, glob
17*795d594fSAndroid Build Coastguard Workerfrom argparse import ArgumentParser, BooleanOptionalAction, Namespace
18*795d594fSAndroid Build Coastguard Workerfrom globals import BOOTCLASSPATH
19*795d594fSAndroid Build Coastguard Workerfrom os import path
20*795d594fSAndroid Build Coastguard Workerfrom os.path import isfile, isdir, basename
21*795d594fSAndroid Build Coastguard Workerfrom subprocess import check_output, DEVNULL, PIPE, STDOUT
22*795d594fSAndroid Build Coastguard Workerfrom tempfile import NamedTemporaryFile
23*795d594fSAndroid Build Coastguard Workerfrom testrunner import env
24*795d594fSAndroid Build Coastguard Workerfrom typing import List
25*795d594fSAndroid Build Coastguard Worker
26*795d594fSAndroid Build Coastguard WorkerCOLOR = (os.environ.get("LUCI_CONTEXT") == None)  # Disable colors on LUCI.
27*795d594fSAndroid Build Coastguard WorkerCOLOR_BLUE = '\033[94m' if COLOR else ''
28*795d594fSAndroid Build Coastguard WorkerCOLOR_GREEN = '\033[92m' if COLOR else ''
29*795d594fSAndroid Build Coastguard WorkerCOLOR_NORMAL = '\033[0m' if COLOR else ''
30*795d594fSAndroid Build Coastguard WorkerCOLOR_RED = '\033[91m' if COLOR else ''
31*795d594fSAndroid Build Coastguard Worker
32*795d594fSAndroid Build Coastguard Workerdef parse_args(argv):
33*795d594fSAndroid Build Coastguard Worker  argp, opt_bool = ArgumentParser(), BooleanOptionalAction
34*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--64", dest="is64", action="store_true")
35*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--O", action="store_true")
36*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--Xcompiler-option", default=[], action="append")
37*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--add-libdir-argument", action="store_true")
38*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--android-art-root", default="/apex/com.android.art")
39*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--android-i18n-root", default="/apex/com.android.i18n")
40*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--android-log-tags", default="*:i")
41*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--android-root", default="/system")
42*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--android-runtime-option", default=[], action="append")
43*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--android-tzdata-root", default="/apex/com.android.tzdata")
44*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--app-image", default=True, action=opt_bool)
45*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--baseline", action="store_true")
46*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--bionic", action="store_true")
47*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--boot", default="")
48*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--chroot", default="")
49*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--compiler-only-option", default=[], action="append")
50*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--create-runner", action="store_true")
51*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--diff-min-log-tag", default="E")
52*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--debug", action="store_true")
53*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--debug-agent")
54*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--debug-wrap-agent", action="store_true")
55*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--dex2oat-dm", action="store_true")
56*795d594fSAndroid Build Coastguard Worker  argp.add_argument(
57*795d594fSAndroid Build Coastguard Worker      "--dex2oat-rt-timeout", type=int,
58*795d594fSAndroid Build Coastguard Worker      default=360)  # The *hard* timeout.  6 min.
59*795d594fSAndroid Build Coastguard Worker  argp.add_argument(
60*795d594fSAndroid Build Coastguard Worker      "--dex2oat-timeout", type=int, default=300)  # The "soft" timeout.  5 min.
61*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--dry-run", action="store_true")
62*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--experimental", default=[], action="append")
63*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--external-log-tags", action="store_true")
64*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--gc-stress", action="store_true")
65*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--gdb", action="store_true")
66*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--gdb-arg", default=[], action="append")
67*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--gdb-dex2oat", action="store_true")
68*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--gdb-dex2oat-args")
69*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--gdbserver", action="store_true")
70*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--gdbserver-bin")
71*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--gdbserver-port", default=":5039")
72*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--host", action="store_true")
73*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--image", default=True, action=opt_bool)
74*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--instruction-set-features", default="")
75*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--interpreter", action="store_true")
76*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--switch-interpreter", action="store_true")
77*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--invoke-with", default=[], action="append")
78*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--jit", action="store_true")
79*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--jvm", action="store_true")
80*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--jvmti", action="store_true")
81*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--jvmti-field-stress", action="store_true")
82*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--jvmti-redefine-stress", action="store_true")
83*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--jvmti-step-stress", action="store_true")
84*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--jvmti-trace-stress", action="store_true")
85*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--lib", default="")
86*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--optimize", default=True, action=opt_bool)
87*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--prebuild", default=True, action=opt_bool)
88*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--profile", action="store_true")
89*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--random-profile", action="store_true")
90*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--relocate", default=False, action=opt_bool)
91*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--runtime-dm", action="store_true")
92*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--runtime-option", default=[], action="append")
93*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--secondary", action="store_true")
94*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--secondary-app-image", default=True, action=opt_bool)
95*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--secondary-class-loader-context", default="")
96*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--secondary-compilation", default=True, action=opt_bool)
97*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--simpleperf", action="store_true")
98*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--sync", action="store_true")
99*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--testlib", default=[], action="append")
100*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--timeout", default=0, type=int)
101*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--vdex", action="store_true")
102*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--vdex-arg", default=[], action="append")
103*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--vdex-filter", default="")
104*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--verify", default=True, action=opt_bool)
105*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--verify-soft-fail", action="store_true")
106*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--with-agent", default=[], action="append")
107*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--zygote", action="store_true")
108*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--test_args", default=[], action="append")
109*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--stdout_file", default="")
110*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--stderr_file", default="")
111*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--main", default="Main")
112*795d594fSAndroid Build Coastguard Worker  argp.add_argument("--expected_exit_code", default=0)
113*795d594fSAndroid Build Coastguard Worker
114*795d594fSAndroid Build Coastguard Worker  # Python parser requires the format --key=--value, since without the equals symbol
115*795d594fSAndroid Build Coastguard Worker  # it looks like the required value has been omitted and there is just another flag.
116*795d594fSAndroid Build Coastguard Worker  # For example, '--args --foo --host --64' will become '--arg=--foo --host --64'
117*795d594fSAndroid Build Coastguard Worker  # because otherwise the --args is missing its value and --foo is unknown argument.
118*795d594fSAndroid Build Coastguard Worker  for i, arg in reversed(list(enumerate(argv))):
119*795d594fSAndroid Build Coastguard Worker    if arg in [
120*795d594fSAndroid Build Coastguard Worker        "--args", "--runtime-option", "--android-runtime-option",
121*795d594fSAndroid Build Coastguard Worker        "-Xcompiler-option", "--compiler-only-option"
122*795d594fSAndroid Build Coastguard Worker    ]:
123*795d594fSAndroid Build Coastguard Worker      argv[i] += "=" + argv.pop(i + 1)
124*795d594fSAndroid Build Coastguard Worker
125*795d594fSAndroid Build Coastguard Worker  # Accept single-dash arguments as if they were double-dash arguments.
126*795d594fSAndroid Build Coastguard Worker  # For exmpample, '-Xcompiler-option' becomes '--Xcompiler-option'
127*795d594fSAndroid Build Coastguard Worker  # became single-dash can be used only with single-letter arguments.
128*795d594fSAndroid Build Coastguard Worker  for i, arg in list(enumerate(argv)):
129*795d594fSAndroid Build Coastguard Worker    if arg.startswith("-") and not arg.startswith("--"):
130*795d594fSAndroid Build Coastguard Worker      argv[i] = "-" + arg
131*795d594fSAndroid Build Coastguard Worker    if arg == "--":
132*795d594fSAndroid Build Coastguard Worker      break
133*795d594fSAndroid Build Coastguard Worker
134*795d594fSAndroid Build Coastguard Worker  return argp.parse_args(argv)
135*795d594fSAndroid Build Coastguard Worker
136*795d594fSAndroid Build Coastguard Workerdef get_target_arch(is64: bool) -> str:
137*795d594fSAndroid Build Coastguard Worker  # We may build for two arches. Get the one with the expected bitness.
138*795d594fSAndroid Build Coastguard Worker  arches = [a for a in [env.TARGET_ARCH, env.TARGET_2ND_ARCH] if a]
139*795d594fSAndroid Build Coastguard Worker  assert len(arches) > 0, "TARGET_ARCH/TARGET_2ND_ARCH not set"
140*795d594fSAndroid Build Coastguard Worker  if is64:
141*795d594fSAndroid Build Coastguard Worker    arches = [a for a in arches if a.endswith("64")]
142*795d594fSAndroid Build Coastguard Worker    assert len(arches) == 1, f"Can not find (unique) 64-bit arch in {arches}"
143*795d594fSAndroid Build Coastguard Worker  else:
144*795d594fSAndroid Build Coastguard Worker    arches = [a for a in arches if not a.endswith("64")]
145*795d594fSAndroid Build Coastguard Worker    assert len(arches) == 1, f"Can not find (unique) 32-bit arch in {arches}"
146*795d594fSAndroid Build Coastguard Worker  return arches[0]
147*795d594fSAndroid Build Coastguard Worker
148*795d594fSAndroid Build Coastguard Worker
149*795d594fSAndroid Build Coastguard Worker# Helper function to construct paths for apex modules (for both -Xbootclasspath and
150*795d594fSAndroid Build Coastguard Worker# -Xbootclasspath-location).
151*795d594fSAndroid Build Coastguard Workerdef get_apex_bootclasspath_impl(bpath_prefix: str):
152*795d594fSAndroid Build Coastguard Worker  return ":".join(bpath_prefix + bpath for bpath in BOOTCLASSPATH)
153*795d594fSAndroid Build Coastguard Worker
154*795d594fSAndroid Build Coastguard Worker
155*795d594fSAndroid Build Coastguard Worker# Gets a -Xbootclasspath paths with the apex modules.
156*795d594fSAndroid Build Coastguard Workerdef get_apex_bootclasspath(host: bool):
157*795d594fSAndroid Build Coastguard Worker  bpath_prefix = ""
158*795d594fSAndroid Build Coastguard Worker
159*795d594fSAndroid Build Coastguard Worker  if host:
160*795d594fSAndroid Build Coastguard Worker    bpath_prefix = os.environ["ANDROID_HOST_OUT"]
161*795d594fSAndroid Build Coastguard Worker
162*795d594fSAndroid Build Coastguard Worker  return get_apex_bootclasspath_impl(bpath_prefix)
163*795d594fSAndroid Build Coastguard Worker
164*795d594fSAndroid Build Coastguard Worker
165*795d594fSAndroid Build Coastguard Worker# Gets a -Xbootclasspath-location paths with the apex modules.
166*795d594fSAndroid Build Coastguard Workerdef get_apex_bootclasspath_locations(host: bool):
167*795d594fSAndroid Build Coastguard Worker  bpath_location_prefix = ""
168*795d594fSAndroid Build Coastguard Worker
169*795d594fSAndroid Build Coastguard Worker  if host:
170*795d594fSAndroid Build Coastguard Worker    ANDROID_BUILD_TOP=os.environ["ANDROID_BUILD_TOP"]
171*795d594fSAndroid Build Coastguard Worker    ANDROID_HOST_OUT=os.environ["ANDROID_HOST_OUT"]
172*795d594fSAndroid Build Coastguard Worker    if ANDROID_HOST_OUT[0:len(ANDROID_BUILD_TOP)+1] == f"{ANDROID_BUILD_TOP}/":
173*795d594fSAndroid Build Coastguard Worker      bpath_location_prefix=ANDROID_HOST_OUT[len(ANDROID_BUILD_TOP)+1:]
174*795d594fSAndroid Build Coastguard Worker    else:
175*795d594fSAndroid Build Coastguard Worker      print(f"ANDROID_BUILD_TOP/ is not a prefix of ANDROID_HOST_OUT"\
176*795d594fSAndroid Build Coastguard Worker            "\nANDROID_BUILD_TOP={ANDROID_BUILD_TOP}"\
177*795d594fSAndroid Build Coastguard Worker            "\nANDROID_HOST_OUT={ANDROID_HOST_OUT}")
178*795d594fSAndroid Build Coastguard Worker      sys.exit(1)
179*795d594fSAndroid Build Coastguard Worker
180*795d594fSAndroid Build Coastguard Worker  return get_apex_bootclasspath_impl(bpath_location_prefix)
181*795d594fSAndroid Build Coastguard Worker
182*795d594fSAndroid Build Coastguard Worker
183*795d594fSAndroid Build Coastguard Workerdef default_run(ctx, args, **kwargs):
184*795d594fSAndroid Build Coastguard Worker  # Clone the args so we can modify them without affecting args in the caller.
185*795d594fSAndroid Build Coastguard Worker  args = Namespace(**vars(args))
186*795d594fSAndroid Build Coastguard Worker
187*795d594fSAndroid Build Coastguard Worker  # Overwrite args based on the named parameters.
188*795d594fSAndroid Build Coastguard Worker  # E.g. the caller can do `default_run(args, jvmti=True)` to modify args.jvmti.
189*795d594fSAndroid Build Coastguard Worker  for name, new_value in kwargs.items():
190*795d594fSAndroid Build Coastguard Worker    old_value = getattr(args, name)
191*795d594fSAndroid Build Coastguard Worker    assert isinstance(new_value, old_value.__class__), name + " should have type " + str(old_value.__class__)
192*795d594fSAndroid Build Coastguard Worker    if isinstance(old_value, list):
193*795d594fSAndroid Build Coastguard Worker      setattr(args, name, old_value + new_value)  # Lists get merged.
194*795d594fSAndroid Build Coastguard Worker    else:
195*795d594fSAndroid Build Coastguard Worker      setattr(args, name, new_value)
196*795d594fSAndroid Build Coastguard Worker
197*795d594fSAndroid Build Coastguard Worker  ON_VM = os.environ.get("ART_TEST_ON_VM")
198*795d594fSAndroid Build Coastguard Worker
199*795d594fSAndroid Build Coastguard Worker  # Store copy of stdout&stderr of command in files so that we can diff them later.
200*795d594fSAndroid Build Coastguard Worker  # This may run under 'adb shell' so we are limited only to 'sh' shell feature set.
201*795d594fSAndroid Build Coastguard Worker  def tee(cmd: str):
202*795d594fSAndroid Build Coastguard Worker    # 'tee' works on stdout only, so we need to temporarily swap stdout and stderr.
203*795d594fSAndroid Build Coastguard Worker    cmd = f"({cmd} | tee -a {DEX_LOCATION}/{basename(args.stdout_file)}) 3>&1 1>&2 2>&3"
204*795d594fSAndroid Build Coastguard Worker    cmd = f"({cmd} | tee -a {DEX_LOCATION}/{basename(args.stderr_file)}) 3>&1 1>&2 2>&3"
205*795d594fSAndroid Build Coastguard Worker    return f"set -o pipefail; {cmd}"  # Use exit code of first failure in piped command.
206*795d594fSAndroid Build Coastguard Worker
207*795d594fSAndroid Build Coastguard Worker  local_path = os.path.dirname(__file__)
208*795d594fSAndroid Build Coastguard Worker
209*795d594fSAndroid Build Coastguard Worker  ANDROID_BUILD_TOP = os.environ.get("ANDROID_BUILD_TOP")
210*795d594fSAndroid Build Coastguard Worker  ANDROID_DATA = os.environ.get("ANDROID_DATA")
211*795d594fSAndroid Build Coastguard Worker  ANDROID_HOST_OUT = os.environ["ANDROID_HOST_OUT"]
212*795d594fSAndroid Build Coastguard Worker  ANDROID_LOG_TAGS = os.environ.get("ANDROID_LOG_TAGS", "")
213*795d594fSAndroid Build Coastguard Worker  ART_TIME_OUT_MULTIPLIER = int(os.environ.get("ART_TIME_OUT_MULTIPLIER", 1))
214*795d594fSAndroid Build Coastguard Worker  DEX2OAT = os.environ.get("DEX2OAT", "")
215*795d594fSAndroid Build Coastguard Worker  DEX_LOCATION = os.environ["DEX_LOCATION"]
216*795d594fSAndroid Build Coastguard Worker  JAVA = os.environ.get("JAVA")
217*795d594fSAndroid Build Coastguard Worker  OUT_DIR = os.environ.get("OUT_DIR")
218*795d594fSAndroid Build Coastguard Worker  PATH = os.environ.get("PATH", "")
219*795d594fSAndroid Build Coastguard Worker  SANITIZE_HOST = os.environ.get("SANITIZE_HOST", "")
220*795d594fSAndroid Build Coastguard Worker  TEST_NAME = os.environ["TEST_NAME"]
221*795d594fSAndroid Build Coastguard Worker
222*795d594fSAndroid Build Coastguard Worker  assert ANDROID_BUILD_TOP, "Did you forget to run `lunch`?"
223*795d594fSAndroid Build Coastguard Worker
224*795d594fSAndroid Build Coastguard Worker  ANDROID_ROOT = args.android_root
225*795d594fSAndroid Build Coastguard Worker  ANDROID_ART_ROOT = args.android_art_root
226*795d594fSAndroid Build Coastguard Worker  ANDROID_I18N_ROOT = args.android_i18n_root
227*795d594fSAndroid Build Coastguard Worker  ANDROID_TZDATA_ROOT = args.android_tzdata_root
228*795d594fSAndroid Build Coastguard Worker  ARCHITECTURES_32 = "(arm|x86|none)"
229*795d594fSAndroid Build Coastguard Worker  ARCHITECTURES_64 = "(arm64|x86_64|riscv64|none)"
230*795d594fSAndroid Build Coastguard Worker  ARCHITECTURES_PATTERN = ARCHITECTURES_32
231*795d594fSAndroid Build Coastguard Worker  GET_DEVICE_ISA_BITNESS_FLAG = "--32"
232*795d594fSAndroid Build Coastguard Worker  BOOT_IMAGE = args.boot
233*795d594fSAndroid Build Coastguard Worker  CHROOT = args.chroot
234*795d594fSAndroid Build Coastguard Worker  COMPILE_FLAGS = ""
235*795d594fSAndroid Build Coastguard Worker  DALVIKVM = "dalvikvm32"
236*795d594fSAndroid Build Coastguard Worker  DEBUGGER = "n"
237*795d594fSAndroid Build Coastguard Worker  WITH_AGENT = args.with_agent
238*795d594fSAndroid Build Coastguard Worker  DEBUGGER_AGENT = args.debug_agent
239*795d594fSAndroid Build Coastguard Worker  WRAP_DEBUGGER_AGENT = args.debug_wrap_agent
240*795d594fSAndroid Build Coastguard Worker  DEX2OAT_NDEBUG_BINARY = "dex2oat32"
241*795d594fSAndroid Build Coastguard Worker  DEX2OAT_DEBUG_BINARY = "dex2oatd32"
242*795d594fSAndroid Build Coastguard Worker  EXPERIMENTAL = args.experimental
243*795d594fSAndroid Build Coastguard Worker  FALSE_BIN = "false"
244*795d594fSAndroid Build Coastguard Worker  FLAGS = ""
245*795d594fSAndroid Build Coastguard Worker  ANDROID_FLAGS = ""
246*795d594fSAndroid Build Coastguard Worker  GDB = ""
247*795d594fSAndroid Build Coastguard Worker  GDB_ARGS = ""
248*795d594fSAndroid Build Coastguard Worker  GDB_DEX2OAT_EXTRA_ARGS = ""
249*795d594fSAndroid Build Coastguard Worker  GDBSERVER_DEVICE = "gdbserver"
250*795d594fSAndroid Build Coastguard Worker  GDBSERVER_HOST = "gdbserver"
251*795d594fSAndroid Build Coastguard Worker  HAVE_IMAGE = args.image
252*795d594fSAndroid Build Coastguard Worker  HOST = args.host
253*795d594fSAndroid Build Coastguard Worker  BIONIC = args.bionic
254*795d594fSAndroid Build Coastguard Worker  CREATE_ANDROID_ROOT = False
255*795d594fSAndroid Build Coastguard Worker  INTERPRETER = args.interpreter
256*795d594fSAndroid Build Coastguard Worker  SWITCH_INTERPRETER = args.switch_interpreter
257*795d594fSAndroid Build Coastguard Worker  JIT = args.jit
258*795d594fSAndroid Build Coastguard Worker  INVOKE_WITH = " ".join(args.invoke_with)
259*795d594fSAndroid Build Coastguard Worker  USE_JVMTI = args.jvmti
260*795d594fSAndroid Build Coastguard Worker  IS_JVMTI_TEST = False
261*795d594fSAndroid Build Coastguard Worker  ADD_LIBDIR_ARGUMENTS = args.add_libdir_argument
262*795d594fSAndroid Build Coastguard Worker  SUFFIX64 = ""
263*795d594fSAndroid Build Coastguard Worker  ISA = "x86"
264*795d594fSAndroid Build Coastguard Worker  LIBRARY_DIRECTORY = "lib"
265*795d594fSAndroid Build Coastguard Worker  TEST_DIRECTORY = "nativetest"
266*795d594fSAndroid Build Coastguard Worker  MAIN = args.main
267*795d594fSAndroid Build Coastguard Worker  OPTIMIZE = args.optimize
268*795d594fSAndroid Build Coastguard Worker  PREBUILD = args.prebuild
269*795d594fSAndroid Build Coastguard Worker  RELOCATE = args.relocate
270*795d594fSAndroid Build Coastguard Worker  SECONDARY_DEX = ""
271*795d594fSAndroid Build Coastguard Worker  TIME_OUT = "timeout"  # "n" (disabled), "timeout" (use timeout), "gdb" (use gdb)
272*795d594fSAndroid Build Coastguard Worker  TIMEOUT_DUMPER = "signal_dumper"
273*795d594fSAndroid Build Coastguard Worker  # Values in seconds.
274*795d594fSAndroid Build Coastguard Worker  TIME_OUT_EXTRA = 0
275*795d594fSAndroid Build Coastguard Worker  TIME_OUT_VALUE = args.timeout
276*795d594fSAndroid Build Coastguard Worker  USE_GDB = args.gdb
277*795d594fSAndroid Build Coastguard Worker  USE_GDBSERVER = args.gdbserver
278*795d594fSAndroid Build Coastguard Worker  GDBSERVER_PORT = args.gdbserver_port
279*795d594fSAndroid Build Coastguard Worker  USE_GDB_DEX2OAT = args.gdb_dex2oat
280*795d594fSAndroid Build Coastguard Worker  USE_JVM = args.jvm
281*795d594fSAndroid Build Coastguard Worker  VERIFY = "y" if args.verify else "n"  # y=yes,n=no,s=softfail
282*795d594fSAndroid Build Coastguard Worker  ZYGOTE = ""
283*795d594fSAndroid Build Coastguard Worker  DEX_VERIFY = ""
284*795d594fSAndroid Build Coastguard Worker  INSTRUCTION_SET_FEATURES = args.instruction_set_features
285*795d594fSAndroid Build Coastguard Worker  ARGS = ""
286*795d594fSAndroid Build Coastguard Worker  VDEX_ARGS = ""
287*795d594fSAndroid Build Coastguard Worker  DRY_RUN = args.dry_run
288*795d594fSAndroid Build Coastguard Worker  TEST_VDEX = args.vdex
289*795d594fSAndroid Build Coastguard Worker  TEST_DEX2OAT_DM = args.dex2oat_dm
290*795d594fSAndroid Build Coastguard Worker  TEST_RUNTIME_DM = args.runtime_dm
291*795d594fSAndroid Build Coastguard Worker  TEST_IS_NDEBUG = args.O
292*795d594fSAndroid Build Coastguard Worker  APP_IMAGE = args.app_image
293*795d594fSAndroid Build Coastguard Worker  SECONDARY_APP_IMAGE = args.secondary_app_image
294*795d594fSAndroid Build Coastguard Worker  SECONDARY_CLASS_LOADER_CONTEXT = args.secondary_class_loader_context
295*795d594fSAndroid Build Coastguard Worker  SECONDARY_COMPILATION = args.secondary_compilation
296*795d594fSAndroid Build Coastguard Worker  JVMTI_STRESS = False
297*795d594fSAndroid Build Coastguard Worker  JVMTI_REDEFINE_STRESS = args.jvmti_redefine_stress
298*795d594fSAndroid Build Coastguard Worker  JVMTI_STEP_STRESS = args.jvmti_step_stress
299*795d594fSAndroid Build Coastguard Worker  JVMTI_FIELD_STRESS = args.jvmti_field_stress
300*795d594fSAndroid Build Coastguard Worker  JVMTI_TRACE_STRESS = args.jvmti_trace_stress
301*795d594fSAndroid Build Coastguard Worker  PROFILE = args.profile
302*795d594fSAndroid Build Coastguard Worker  RANDOM_PROFILE = args.random_profile
303*795d594fSAndroid Build Coastguard Worker  DEX2OAT_TIMEOUT = args.dex2oat_timeout
304*795d594fSAndroid Build Coastguard Worker  DEX2OAT_RT_TIMEOUT = args.dex2oat_rt_timeout
305*795d594fSAndroid Build Coastguard Worker  CREATE_RUNNER = args.create_runner
306*795d594fSAndroid Build Coastguard Worker  INT_OPTS = ""
307*795d594fSAndroid Build Coastguard Worker  SIMPLEPERF = args.simpleperf
308*795d594fSAndroid Build Coastguard Worker  DEBUGGER_OPTS = ""
309*795d594fSAndroid Build Coastguard Worker  JVM_VERIFY_ARG = ""
310*795d594fSAndroid Build Coastguard Worker  LIB = args.lib
311*795d594fSAndroid Build Coastguard Worker
312*795d594fSAndroid Build Coastguard Worker  # if True, run 'sync' before dalvikvm to make sure all files from
313*795d594fSAndroid Build Coastguard Worker  # build step (e.g. dex2oat) were finished writing.
314*795d594fSAndroid Build Coastguard Worker  SYNC_BEFORE_RUN = args.sync
315*795d594fSAndroid Build Coastguard Worker
316*795d594fSAndroid Build Coastguard Worker  # When running a debug build, we want to run with all checks.
317*795d594fSAndroid Build Coastguard Worker  ANDROID_FLAGS += " -XX:SlowDebug=true"
318*795d594fSAndroid Build Coastguard Worker  # The same for dex2oatd, both prebuild and runtime-driven.
319*795d594fSAndroid Build Coastguard Worker  ANDROID_FLAGS += (" -Xcompiler-option --runtime-arg -Xcompiler-option "
320*795d594fSAndroid Build Coastguard Worker                    "-XX:SlowDebug=true")
321*795d594fSAndroid Build Coastguard Worker  COMPILER_FLAGS = "  --runtime-arg -XX:SlowDebug=true"
322*795d594fSAndroid Build Coastguard Worker
323*795d594fSAndroid Build Coastguard Worker  # Let the compiler and runtime know that we are running tests.
324*795d594fSAndroid Build Coastguard Worker  COMPILE_FLAGS += " --compile-art-test"
325*795d594fSAndroid Build Coastguard Worker  ANDROID_FLAGS += " -Xcompiler-option --compile-art-test"
326*795d594fSAndroid Build Coastguard Worker
327*795d594fSAndroid Build Coastguard Worker  if USE_JVMTI:
328*795d594fSAndroid Build Coastguard Worker    IS_JVMTI_TEST = True
329*795d594fSAndroid Build Coastguard Worker    # Secondary images block some tested behavior.
330*795d594fSAndroid Build Coastguard Worker    SECONDARY_APP_IMAGE = False
331*795d594fSAndroid Build Coastguard Worker  if args.gc_stress:
332*795d594fSAndroid Build Coastguard Worker    # Give an extra 20 mins if we are gc-stress.
333*795d594fSAndroid Build Coastguard Worker    TIME_OUT_EXTRA += 1200
334*795d594fSAndroid Build Coastguard Worker  for arg in args.testlib:
335*795d594fSAndroid Build Coastguard Worker    ARGS += f" {arg}"
336*795d594fSAndroid Build Coastguard Worker  for arg in args.test_args:
337*795d594fSAndroid Build Coastguard Worker    ARGS += f" {arg}"
338*795d594fSAndroid Build Coastguard Worker  for arg in args.compiler_only_option:
339*795d594fSAndroid Build Coastguard Worker    COMPILE_FLAGS += f" {arg}"
340*795d594fSAndroid Build Coastguard Worker  for arg in args.Xcompiler_option:
341*795d594fSAndroid Build Coastguard Worker    FLAGS += f" -Xcompiler-option {arg}"
342*795d594fSAndroid Build Coastguard Worker    COMPILE_FLAGS += f" {arg}"
343*795d594fSAndroid Build Coastguard Worker  if args.secondary:
344*795d594fSAndroid Build Coastguard Worker    SECONDARY_DEX = f":{DEX_LOCATION}/{TEST_NAME}-ex.jar"
345*795d594fSAndroid Build Coastguard Worker    # Enable cfg-append to make sure we get the dump for both dex files.
346*795d594fSAndroid Build Coastguard Worker    # (otherwise the runtime compilation of the secondary dex will overwrite
347*795d594fSAndroid Build Coastguard Worker    # the dump of the first one).
348*795d594fSAndroid Build Coastguard Worker    FLAGS += " -Xcompiler-option --dump-cfg-append"
349*795d594fSAndroid Build Coastguard Worker    COMPILE_FLAGS += " --dump-cfg-append"
350*795d594fSAndroid Build Coastguard Worker  for arg in args.android_runtime_option:
351*795d594fSAndroid Build Coastguard Worker    ANDROID_FLAGS += f" {arg}"
352*795d594fSAndroid Build Coastguard Worker  for arg in args.runtime_option:
353*795d594fSAndroid Build Coastguard Worker    FLAGS += f" {arg}"
354*795d594fSAndroid Build Coastguard Worker    if arg == "-Xmethod-trace":
355*795d594fSAndroid Build Coastguard Worker      # Method tracing can slow some tests down a lot.
356*795d594fSAndroid Build Coastguard Worker      TIME_OUT_EXTRA += 1200
357*795d594fSAndroid Build Coastguard Worker  if JVMTI_REDEFINE_STRESS:
358*795d594fSAndroid Build Coastguard Worker    # APP_IMAGE doesn't really work with jvmti redefine stress
359*795d594fSAndroid Build Coastguard Worker    SECONDARY_APP_IMAGE = False
360*795d594fSAndroid Build Coastguard Worker    JVMTI_STRESS = True
361*795d594fSAndroid Build Coastguard Worker  if JVMTI_REDEFINE_STRESS or JVMTI_STEP_STRESS or JVMTI_FIELD_STRESS or JVMTI_TRACE_STRESS:
362*795d594fSAndroid Build Coastguard Worker    USE_JVMTI = True
363*795d594fSAndroid Build Coastguard Worker    JVMTI_STRESS = True
364*795d594fSAndroid Build Coastguard Worker  if HOST:
365*795d594fSAndroid Build Coastguard Worker    ANDROID_ROOT = ANDROID_HOST_OUT
366*795d594fSAndroid Build Coastguard Worker    ANDROID_ART_ROOT = f"{ANDROID_HOST_OUT}/com.android.art"
367*795d594fSAndroid Build Coastguard Worker    ANDROID_I18N_ROOT = f"{ANDROID_HOST_OUT}/com.android.i18n"
368*795d594fSAndroid Build Coastguard Worker    ANDROID_TZDATA_ROOT = f"{ANDROID_HOST_OUT}/com.android.tzdata"
369*795d594fSAndroid Build Coastguard Worker    # On host, we default to using the symlink, as the PREFER_32BIT
370*795d594fSAndroid Build Coastguard Worker    # configuration is the only configuration building a 32bit version of
371*795d594fSAndroid Build Coastguard Worker    # dex2oat.
372*795d594fSAndroid Build Coastguard Worker    DEX2OAT_DEBUG_BINARY = "dex2oatd"
373*795d594fSAndroid Build Coastguard Worker    DEX2OAT_NDEBUG_BINARY = "dex2oat"
374*795d594fSAndroid Build Coastguard Worker  if BIONIC:
375*795d594fSAndroid Build Coastguard Worker    # We need to create an ANDROID_ROOT because currently we cannot create
376*795d594fSAndroid Build Coastguard Worker    # the frameworks/libcore with linux_bionic so we need to use the normal
377*795d594fSAndroid Build Coastguard Worker    # host ones which are in a different location.
378*795d594fSAndroid Build Coastguard Worker    CREATE_ANDROID_ROOT = True
379*795d594fSAndroid Build Coastguard Worker  if WITH_AGENT:
380*795d594fSAndroid Build Coastguard Worker    USE_JVMTI = True
381*795d594fSAndroid Build Coastguard Worker  if DEBUGGER_AGENT:
382*795d594fSAndroid Build Coastguard Worker    DEBUGGER = "agent"
383*795d594fSAndroid Build Coastguard Worker    USE_JVMTI = True
384*795d594fSAndroid Build Coastguard Worker    TIME_OUT = "n"
385*795d594fSAndroid Build Coastguard Worker  if args.debug:
386*795d594fSAndroid Build Coastguard Worker    USE_JVMTI = True
387*795d594fSAndroid Build Coastguard Worker    DEBUGGER = "y"
388*795d594fSAndroid Build Coastguard Worker    TIME_OUT = "n"
389*795d594fSAndroid Build Coastguard Worker  if args.gdbserver_bin:
390*795d594fSAndroid Build Coastguard Worker    arg = args.gdbserver_bin
391*795d594fSAndroid Build Coastguard Worker    GDBSERVER_HOST = arg
392*795d594fSAndroid Build Coastguard Worker    GDBSERVER_DEVICE = arg
393*795d594fSAndroid Build Coastguard Worker  if args.gdbserver or args.gdb or USE_GDB_DEX2OAT:
394*795d594fSAndroid Build Coastguard Worker    TIME_OUT = "n"
395*795d594fSAndroid Build Coastguard Worker  for arg in args.gdb_arg:
396*795d594fSAndroid Build Coastguard Worker    GDB_ARGS += f" {arg}"
397*795d594fSAndroid Build Coastguard Worker  if args.gdb_dex2oat_args:
398*795d594fSAndroid Build Coastguard Worker    for arg in args.gdb_dex2oat_args.split(";"):
399*795d594fSAndroid Build Coastguard Worker      GDB_DEX2OAT_EXTRA_ARGS += f'"{arg}" '
400*795d594fSAndroid Build Coastguard Worker  if args.zygote:
401*795d594fSAndroid Build Coastguard Worker    ZYGOTE = "-Xzygote"
402*795d594fSAndroid Build Coastguard Worker    print("Spawning from zygote")
403*795d594fSAndroid Build Coastguard Worker  if args.baseline:
404*795d594fSAndroid Build Coastguard Worker    FLAGS += " -Xcompiler-option --baseline"
405*795d594fSAndroid Build Coastguard Worker    COMPILE_FLAGS += " --baseline"
406*795d594fSAndroid Build Coastguard Worker  if args.verify_soft_fail:
407*795d594fSAndroid Build Coastguard Worker    VERIFY = "s"
408*795d594fSAndroid Build Coastguard Worker  if args.is64:
409*795d594fSAndroid Build Coastguard Worker    SUFFIX64 = "64"
410*795d594fSAndroid Build Coastguard Worker    ISA = "x86_64"
411*795d594fSAndroid Build Coastguard Worker    GDBSERVER_DEVICE = "gdbserver64"
412*795d594fSAndroid Build Coastguard Worker    DALVIKVM = "dalvikvm64"
413*795d594fSAndroid Build Coastguard Worker    LIBRARY_DIRECTORY = "lib64"
414*795d594fSAndroid Build Coastguard Worker    TEST_DIRECTORY = "nativetest64"
415*795d594fSAndroid Build Coastguard Worker    ARCHITECTURES_PATTERN = ARCHITECTURES_64
416*795d594fSAndroid Build Coastguard Worker    GET_DEVICE_ISA_BITNESS_FLAG = "--64"
417*795d594fSAndroid Build Coastguard Worker    DEX2OAT_NDEBUG_BINARY = "dex2oat64"
418*795d594fSAndroid Build Coastguard Worker    DEX2OAT_DEBUG_BINARY = "dex2oatd64"
419*795d594fSAndroid Build Coastguard Worker  if args.vdex_filter:
420*795d594fSAndroid Build Coastguard Worker    option = args.vdex_filter
421*795d594fSAndroid Build Coastguard Worker    VDEX_ARGS += f" --compiler-filter={option}"
422*795d594fSAndroid Build Coastguard Worker  if args.vdex_arg:
423*795d594fSAndroid Build Coastguard Worker    arg = args.vdex_arg
424*795d594fSAndroid Build Coastguard Worker    VDEX_ARGS += f" {arg}"
425*795d594fSAndroid Build Coastguard Worker
426*795d594fSAndroid Build Coastguard Worker# HACK: Force the use of `signal_dumper` on host.
427*795d594fSAndroid Build Coastguard Worker  if HOST or ON_VM:
428*795d594fSAndroid Build Coastguard Worker    TIME_OUT = "timeout"
429*795d594fSAndroid Build Coastguard Worker
430*795d594fSAndroid Build Coastguard Worker# Give extra 60 min for tests on QEMU (to avoid timeouts in debuggable mode).
431*795d594fSAndroid Build Coastguard Worker  if ON_VM:
432*795d594fSAndroid Build Coastguard Worker    TIME_OUT_EXTRA = 6000
433*795d594fSAndroid Build Coastguard Worker
434*795d594fSAndroid Build Coastguard Worker# If you change this, update the timeout in testrunner.py as well.
435*795d594fSAndroid Build Coastguard Worker  if not TIME_OUT_VALUE:
436*795d594fSAndroid Build Coastguard Worker    # 10 minutes is the default.
437*795d594fSAndroid Build Coastguard Worker    TIME_OUT_VALUE = 600
438*795d594fSAndroid Build Coastguard Worker
439*795d594fSAndroid Build Coastguard Worker    # For sanitized builds use a larger base.
440*795d594fSAndroid Build Coastguard Worker    # TODO: Consider sanitized target builds?
441*795d594fSAndroid Build Coastguard Worker    if SANITIZE_HOST != "":
442*795d594fSAndroid Build Coastguard Worker      TIME_OUT_VALUE = 1500  # 25 minutes.
443*795d594fSAndroid Build Coastguard Worker
444*795d594fSAndroid Build Coastguard Worker    TIME_OUT_VALUE += TIME_OUT_EXTRA
445*795d594fSAndroid Build Coastguard Worker
446*795d594fSAndroid Build Coastguard Worker# Escape hatch for slow hosts or devices. Accept an environment variable as a timeout factor.
447*795d594fSAndroid Build Coastguard Worker  if ART_TIME_OUT_MULTIPLIER:
448*795d594fSAndroid Build Coastguard Worker    TIME_OUT_VALUE *= ART_TIME_OUT_MULTIPLIER
449*795d594fSAndroid Build Coastguard Worker
450*795d594fSAndroid Build Coastguard Worker# The DEX_LOCATION with the chroot prefix, if any.
451*795d594fSAndroid Build Coastguard Worker  CHROOT_DEX_LOCATION = f"{CHROOT}{DEX_LOCATION}"
452*795d594fSAndroid Build Coastguard Worker
453*795d594fSAndroid Build Coastguard Worker  # If running on device, determine the ISA of the device.
454*795d594fSAndroid Build Coastguard Worker  if not HOST and not USE_JVM:
455*795d594fSAndroid Build Coastguard Worker    ISA = get_target_arch(args.is64)
456*795d594fSAndroid Build Coastguard Worker
457*795d594fSAndroid Build Coastguard Worker  if not USE_JVM:
458*795d594fSAndroid Build Coastguard Worker    FLAGS += f" {ANDROID_FLAGS}"
459*795d594fSAndroid Build Coastguard Worker    # we don't want to be trying to get adbconnections since the plugin might
460*795d594fSAndroid Build Coastguard Worker    # not have been built.
461*795d594fSAndroid Build Coastguard Worker    FLAGS += " -XjdwpProvider:none"
462*795d594fSAndroid Build Coastguard Worker    for feature in EXPERIMENTAL:
463*795d594fSAndroid Build Coastguard Worker      FLAGS += f" -Xexperimental:{feature} -Xcompiler-option --runtime-arg -Xcompiler-option -Xexperimental:{feature}"
464*795d594fSAndroid Build Coastguard Worker      COMPILE_FLAGS = f"{COMPILE_FLAGS} --runtime-arg -Xexperimental:{feature}"
465*795d594fSAndroid Build Coastguard Worker
466*795d594fSAndroid Build Coastguard Worker  if CREATE_ANDROID_ROOT:
467*795d594fSAndroid Build Coastguard Worker    ANDROID_ROOT = f"{DEX_LOCATION}/android-root"
468*795d594fSAndroid Build Coastguard Worker
469*795d594fSAndroid Build Coastguard Worker  if ZYGOTE == "":
470*795d594fSAndroid Build Coastguard Worker    if OPTIMIZE:
471*795d594fSAndroid Build Coastguard Worker      if VERIFY == "y":
472*795d594fSAndroid Build Coastguard Worker        DEX_OPTIMIZE = "-Xdexopt:verified"
473*795d594fSAndroid Build Coastguard Worker      else:
474*795d594fSAndroid Build Coastguard Worker        DEX_OPTIMIZE = "-Xdexopt:all"
475*795d594fSAndroid Build Coastguard Worker    else:
476*795d594fSAndroid Build Coastguard Worker      DEX_OPTIMIZE = "-Xdexopt:none"
477*795d594fSAndroid Build Coastguard Worker
478*795d594fSAndroid Build Coastguard Worker    if VERIFY == "y":
479*795d594fSAndroid Build Coastguard Worker      JVM_VERIFY_ARG = "-Xverify:all"
480*795d594fSAndroid Build Coastguard Worker    elif VERIFY == "s":
481*795d594fSAndroid Build Coastguard Worker      JVM_VERIFY_ARG = "Xverify:all"
482*795d594fSAndroid Build Coastguard Worker      DEX_VERIFY = "-Xverify:softfail"
483*795d594fSAndroid Build Coastguard Worker    else:  # VERIFY == "n"
484*795d594fSAndroid Build Coastguard Worker      DEX_VERIFY = "-Xverify:none"
485*795d594fSAndroid Build Coastguard Worker      JVM_VERIFY_ARG = "-Xverify:none"
486*795d594fSAndroid Build Coastguard Worker
487*795d594fSAndroid Build Coastguard Worker  if DEBUGGER == "y":
488*795d594fSAndroid Build Coastguard Worker    # Use this instead for ddms and connect by running 'ddms':
489*795d594fSAndroid Build Coastguard Worker    # DEBUGGER_OPTS="-XjdwpOptions=server=y,suspend=y -XjdwpProvider:adbconnection"
490*795d594fSAndroid Build Coastguard Worker    # TODO: add a separate --ddms option?
491*795d594fSAndroid Build Coastguard Worker
492*795d594fSAndroid Build Coastguard Worker    PORT = 12345
493*795d594fSAndroid Build Coastguard Worker    print("Waiting for jdb to connect:")
494*795d594fSAndroid Build Coastguard Worker    if not HOST:
495*795d594fSAndroid Build Coastguard Worker      print(f"    adb forward tcp:{PORT} tcp:{PORT}")
496*795d594fSAndroid Build Coastguard Worker    print(f"    jdb -attach localhost:{PORT}")
497*795d594fSAndroid Build Coastguard Worker    if not USE_JVM:
498*795d594fSAndroid Build Coastguard Worker      # Use the default libjdwp agent. Use --debug-agent to use a custom one.
499*795d594fSAndroid Build Coastguard Worker      DEBUGGER_OPTS = f"-agentpath:libjdwp.so=transport=dt_socket,address={PORT},server=y,suspend=y -XjdwpProvider:internal"
500*795d594fSAndroid Build Coastguard Worker    else:
501*795d594fSAndroid Build Coastguard Worker      DEBUGGER_OPTS = f"-agentlib:jdwp=transport=dt_socket,address={PORT},server=y,suspend=y"
502*795d594fSAndroid Build Coastguard Worker  elif DEBUGGER == "agent":
503*795d594fSAndroid Build Coastguard Worker    PORT = 12345
504*795d594fSAndroid Build Coastguard Worker    # TODO Support ddms connection and support target.
505*795d594fSAndroid Build Coastguard Worker    assert HOST, "--debug-agent not supported yet for target!"
506*795d594fSAndroid Build Coastguard Worker    AGENTPATH = DEBUGGER_AGENT
507*795d594fSAndroid Build Coastguard Worker    if WRAP_DEBUGGER_AGENT:
508*795d594fSAndroid Build Coastguard Worker      WRAPPROPS = f"{ANDROID_ROOT}/{LIBRARY_DIRECTORY}/libwrapagentpropertiesd.so"
509*795d594fSAndroid Build Coastguard Worker      if TEST_IS_NDEBUG:
510*795d594fSAndroid Build Coastguard Worker        WRAPPROPS = f"{ANDROID_ROOT}/{LIBRARY_DIRECTORY}/libwrapagentproperties.so"
511*795d594fSAndroid Build Coastguard Worker      AGENTPATH = f"{WRAPPROPS}={ANDROID_BUILD_TOP}/art/tools/libjdwp-compat.props,{AGENTPATH}"
512*795d594fSAndroid Build Coastguard Worker    print(f"Connect to localhost:{PORT}")
513*795d594fSAndroid Build Coastguard Worker    DEBUGGER_OPTS = f"-agentpath:{AGENTPATH}=transport=dt_socket,address={PORT},server=y,suspend=y"
514*795d594fSAndroid Build Coastguard Worker
515*795d594fSAndroid Build Coastguard Worker  for agent in WITH_AGENT:
516*795d594fSAndroid Build Coastguard Worker    FLAGS += f" -agentpath:{agent}"
517*795d594fSAndroid Build Coastguard Worker
518*795d594fSAndroid Build Coastguard Worker  if USE_JVMTI:
519*795d594fSAndroid Build Coastguard Worker    if not USE_JVM:
520*795d594fSAndroid Build Coastguard Worker      plugin = "libopenjdkjvmtid.so"
521*795d594fSAndroid Build Coastguard Worker      if TEST_IS_NDEBUG:
522*795d594fSAndroid Build Coastguard Worker        plugin = "libopenjdkjvmti.so"
523*795d594fSAndroid Build Coastguard Worker      # We used to add flags here that made the runtime debuggable but that is not
524*795d594fSAndroid Build Coastguard Worker      # needed anymore since the plugin can do it for us now.
525*795d594fSAndroid Build Coastguard Worker      FLAGS += f" -Xplugin:{plugin}"
526*795d594fSAndroid Build Coastguard Worker
527*795d594fSAndroid Build Coastguard Worker      # For jvmti tests, set the threshold of compilation to 1, so we jit early to
528*795d594fSAndroid Build Coastguard Worker      # provide better test coverage for jvmti + jit. This means we won't run
529*795d594fSAndroid Build Coastguard Worker      # the default --jit configuration but it is not too important test scenario for
530*795d594fSAndroid Build Coastguard Worker      # jvmti tests. This is art specific flag, so don't use it with jvm.
531*795d594fSAndroid Build Coastguard Worker      FLAGS += " -Xjitthreshold:1"
532*795d594fSAndroid Build Coastguard Worker
533*795d594fSAndroid Build Coastguard Worker# Add the libdir to the argv passed to the main function.
534*795d594fSAndroid Build Coastguard Worker  if ADD_LIBDIR_ARGUMENTS:
535*795d594fSAndroid Build Coastguard Worker    if HOST:
536*795d594fSAndroid Build Coastguard Worker      ARGS += f" {ANDROID_HOST_OUT}/{TEST_DIRECTORY}/"
537*795d594fSAndroid Build Coastguard Worker    else:
538*795d594fSAndroid Build Coastguard Worker      ARGS += f" /data/{TEST_DIRECTORY}/art/{ISA}/"
539*795d594fSAndroid Build Coastguard Worker  if IS_JVMTI_TEST:
540*795d594fSAndroid Build Coastguard Worker    agent = "libtiagentd.so"
541*795d594fSAndroid Build Coastguard Worker    lib = "tiagentd"
542*795d594fSAndroid Build Coastguard Worker    if TEST_IS_NDEBUG:
543*795d594fSAndroid Build Coastguard Worker      agent = "libtiagent.so"
544*795d594fSAndroid Build Coastguard Worker      lib = "tiagent"
545*795d594fSAndroid Build Coastguard Worker
546*795d594fSAndroid Build Coastguard Worker    ARGS += f" {lib}"
547*795d594fSAndroid Build Coastguard Worker    if USE_JVM:
548*795d594fSAndroid Build Coastguard Worker      FLAGS += f" -agentpath:{ANDROID_HOST_OUT}/nativetest64/{agent}={TEST_NAME},jvm"
549*795d594fSAndroid Build Coastguard Worker    else:
550*795d594fSAndroid Build Coastguard Worker      FLAGS += f" -agentpath:{agent}={TEST_NAME},art"
551*795d594fSAndroid Build Coastguard Worker
552*795d594fSAndroid Build Coastguard Worker  if JVMTI_STRESS:
553*795d594fSAndroid Build Coastguard Worker    agent = "libtistressd.so"
554*795d594fSAndroid Build Coastguard Worker    if TEST_IS_NDEBUG:
555*795d594fSAndroid Build Coastguard Worker      agent = "libtistress.so"
556*795d594fSAndroid Build Coastguard Worker
557*795d594fSAndroid Build Coastguard Worker    # Just give it a default start so we can always add ',' to it.
558*795d594fSAndroid Build Coastguard Worker    agent_args = "jvmti-stress"
559*795d594fSAndroid Build Coastguard Worker    if JVMTI_REDEFINE_STRESS:
560*795d594fSAndroid Build Coastguard Worker      # We really cannot do this on RI so don't both passing it in that case.
561*795d594fSAndroid Build Coastguard Worker      if not USE_JVM:
562*795d594fSAndroid Build Coastguard Worker        agent_args = f"{agent_args},redefine"
563*795d594fSAndroid Build Coastguard Worker    if JVMTI_FIELD_STRESS:
564*795d594fSAndroid Build Coastguard Worker      agent_args = f"{agent_args},field"
565*795d594fSAndroid Build Coastguard Worker    if JVMTI_STEP_STRESS:
566*795d594fSAndroid Build Coastguard Worker      agent_args = f"{agent_args},step"
567*795d594fSAndroid Build Coastguard Worker    if JVMTI_TRACE_STRESS:
568*795d594fSAndroid Build Coastguard Worker      agent_args = f"{agent_args},trace"
569*795d594fSAndroid Build Coastguard Worker    # In the future add onto this;
570*795d594fSAndroid Build Coastguard Worker    if USE_JVM:
571*795d594fSAndroid Build Coastguard Worker      FLAGS += f" -agentpath:{ANDROID_HOST_OUT}/nativetest64/{agent}={agent_args}"
572*795d594fSAndroid Build Coastguard Worker    else:
573*795d594fSAndroid Build Coastguard Worker      FLAGS += f" -agentpath:{agent}={agent_args}"
574*795d594fSAndroid Build Coastguard Worker
575*795d594fSAndroid Build Coastguard Worker  if USE_JVM:
576*795d594fSAndroid Build Coastguard Worker    ctx.export(
577*795d594fSAndroid Build Coastguard Worker      ANDROID_I18N_ROOT = ANDROID_I18N_ROOT,
578*795d594fSAndroid Build Coastguard Worker      DEX_LOCATION = DEX_LOCATION,
579*795d594fSAndroid Build Coastguard Worker      JAVA_HOME = os.environ["JAVA_HOME"],
580*795d594fSAndroid Build Coastguard Worker      LANG = "en_US.UTF-8",  # Needed to enable unicode and make the output is deterministic.
581*795d594fSAndroid Build Coastguard Worker      LD_LIBRARY_PATH = f"{ANDROID_HOST_OUT}/lib64",
582*795d594fSAndroid Build Coastguard Worker    )
583*795d594fSAndroid Build Coastguard Worker    # Some jvmti tests are flaky without -Xint on the RI.
584*795d594fSAndroid Build Coastguard Worker    if IS_JVMTI_TEST:
585*795d594fSAndroid Build Coastguard Worker      FLAGS += " -Xint"
586*795d594fSAndroid Build Coastguard Worker    # Xmx is necessary since we don't pass down the ART flags to JVM.
587*795d594fSAndroid Build Coastguard Worker    # We pass the classes2 path whether it's used (src-multidex) or not.
588*795d594fSAndroid Build Coastguard Worker    cmdline = f"{JAVA} {DEBUGGER_OPTS} {JVM_VERIFY_ARG} -Xmx256m -classpath classes:classes2 {FLAGS} {MAIN} {ARGS}"
589*795d594fSAndroid Build Coastguard Worker    ctx.run(tee(cmdline), expected_exit_code=args.expected_exit_code)
590*795d594fSAndroid Build Coastguard Worker    return
591*795d594fSAndroid Build Coastguard Worker
592*795d594fSAndroid Build Coastguard Worker  b_path = get_apex_bootclasspath(HOST)
593*795d594fSAndroid Build Coastguard Worker  b_path_locations = get_apex_bootclasspath_locations(HOST)
594*795d594fSAndroid Build Coastguard Worker
595*795d594fSAndroid Build Coastguard Worker  BCPEX = ""
596*795d594fSAndroid Build Coastguard Worker  if isfile(f"{TEST_NAME}-bcpex.jar"):
597*795d594fSAndroid Build Coastguard Worker    BCPEX = f":{DEX_LOCATION}/{TEST_NAME}-bcpex.jar"
598*795d594fSAndroid Build Coastguard Worker
599*795d594fSAndroid Build Coastguard Worker  # Pass down the bootclasspath
600*795d594fSAndroid Build Coastguard Worker  FLAGS += f" -Xbootclasspath:{b_path}{BCPEX}"
601*795d594fSAndroid Build Coastguard Worker  FLAGS += f" -Xbootclasspath-locations:{b_path_locations}{BCPEX}"
602*795d594fSAndroid Build Coastguard Worker  COMPILE_FLAGS += f" --runtime-arg -Xbootclasspath:{b_path}"
603*795d594fSAndroid Build Coastguard Worker  COMPILE_FLAGS += f" --runtime-arg -Xbootclasspath-locations:{b_path_locations}"
604*795d594fSAndroid Build Coastguard Worker
605*795d594fSAndroid Build Coastguard Worker  if not HAVE_IMAGE:
606*795d594fSAndroid Build Coastguard Worker    # Disable image dex2oat - this will forbid the runtime to patch or compile an image.
607*795d594fSAndroid Build Coastguard Worker    FLAGS += " -Xnoimage-dex2oat"
608*795d594fSAndroid Build Coastguard Worker
609*795d594fSAndroid Build Coastguard Worker    # We'll abuse a second flag here to test different behavior. If --relocate, use the
610*795d594fSAndroid Build Coastguard Worker    # existing image - relocation will fail as patching is disallowed. If --no-relocate,
611*795d594fSAndroid Build Coastguard Worker    # pass a non-existent image - compilation will fail as dex2oat is disallowed.
612*795d594fSAndroid Build Coastguard Worker    if not RELOCATE:
613*795d594fSAndroid Build Coastguard Worker      BOOT_IMAGE = "/system/non-existent/boot.art"
614*795d594fSAndroid Build Coastguard Worker    # App images cannot be generated without a boot image.
615*795d594fSAndroid Build Coastguard Worker    APP_IMAGE = False
616*795d594fSAndroid Build Coastguard Worker  DALVIKVM_BOOT_OPT = f"-Ximage:{BOOT_IMAGE}"
617*795d594fSAndroid Build Coastguard Worker
618*795d594fSAndroid Build Coastguard Worker  if USE_GDB_DEX2OAT:
619*795d594fSAndroid Build Coastguard Worker    assert HOST, "The --gdb-dex2oat option is not yet implemented for target."
620*795d594fSAndroid Build Coastguard Worker
621*795d594fSAndroid Build Coastguard Worker  assert not USE_GDBSERVER, "Not supported"
622*795d594fSAndroid Build Coastguard Worker  if USE_GDB:
623*795d594fSAndroid Build Coastguard Worker    if not HOST:
624*795d594fSAndroid Build Coastguard Worker      # We might not have any hostname resolution if we are using a chroot.
625*795d594fSAndroid Build Coastguard Worker      GDB = f"{GDBSERVER_DEVICE} --no-startup-with-shell 127.0.0.1{GDBSERVER_PORT}"
626*795d594fSAndroid Build Coastguard Worker    else:
627*795d594fSAndroid Build Coastguard Worker      GDB = "gdb"
628*795d594fSAndroid Build Coastguard Worker      GDB_ARGS += f" -d '{ANDROID_BUILD_TOP}' --args {DALVIKVM}"
629*795d594fSAndroid Build Coastguard Worker
630*795d594fSAndroid Build Coastguard Worker  if SWITCH_INTERPRETER:
631*795d594fSAndroid Build Coastguard Worker    # run on the slow switch-interpreter enabled with -Xint
632*795d594fSAndroid Build Coastguard Worker    INT_OPTS += " -Xint"
633*795d594fSAndroid Build Coastguard Worker
634*795d594fSAndroid Build Coastguard Worker  if INTERPRETER:
635*795d594fSAndroid Build Coastguard Worker    # run on Nterp the fast interpreter, not the slow switch-interpreter enabled with -Xint
636*795d594fSAndroid Build Coastguard Worker    INT_OPTS += " -Xusejit:false"
637*795d594fSAndroid Build Coastguard Worker
638*795d594fSAndroid Build Coastguard Worker  if JIT:
639*795d594fSAndroid Build Coastguard Worker    INT_OPTS += " -Xusejit:true"
640*795d594fSAndroid Build Coastguard Worker  else:
641*795d594fSAndroid Build Coastguard Worker    INT_OPTS += " -Xusejit:false"
642*795d594fSAndroid Build Coastguard Worker
643*795d594fSAndroid Build Coastguard Worker  if INTERPRETER or SWITCH_INTERPRETER or JIT:
644*795d594fSAndroid Build Coastguard Worker    if VERIFY == "y":
645*795d594fSAndroid Build Coastguard Worker      INT_OPTS += " -Xcompiler-option --compiler-filter=verify"
646*795d594fSAndroid Build Coastguard Worker      COMPILE_FLAGS += " --compiler-filter=verify"
647*795d594fSAndroid Build Coastguard Worker    elif VERIFY == "s":
648*795d594fSAndroid Build Coastguard Worker      INT_OPTS += " -Xcompiler-option --compiler-filter=verify"
649*795d594fSAndroid Build Coastguard Worker      COMPILE_FLAGS += " --compiler-filter=verify"
650*795d594fSAndroid Build Coastguard Worker      DEX_VERIFY = f"{DEX_VERIFY} -Xverify:softfail"
651*795d594fSAndroid Build Coastguard Worker    else:  # VERIFY == "n"
652*795d594fSAndroid Build Coastguard Worker      INT_OPTS += " -Xcompiler-option --compiler-filter=assume-verified"
653*795d594fSAndroid Build Coastguard Worker      COMPILE_FLAGS += " --compiler-filter=assume-verified"
654*795d594fSAndroid Build Coastguard Worker      DEX_VERIFY = f"{DEX_VERIFY} -Xverify:none"
655*795d594fSAndroid Build Coastguard Worker
656*795d594fSAndroid Build Coastguard Worker  JNI_OPTS = "-Xjnigreflimit:512 -Xcheck:jni"
657*795d594fSAndroid Build Coastguard Worker
658*795d594fSAndroid Build Coastguard Worker  COMPILE_FLAGS += " --runtime-arg -Xnorelocate"
659*795d594fSAndroid Build Coastguard Worker  if RELOCATE:
660*795d594fSAndroid Build Coastguard Worker    FLAGS += " -Xrelocate"
661*795d594fSAndroid Build Coastguard Worker  else:
662*795d594fSAndroid Build Coastguard Worker    FLAGS += " -Xnorelocate"
663*795d594fSAndroid Build Coastguard Worker
664*795d594fSAndroid Build Coastguard Worker  if BIONIC and not ON_VM:
665*795d594fSAndroid Build Coastguard Worker    # This is the location that soong drops linux_bionic builds. Despite being
666*795d594fSAndroid Build Coastguard Worker    # called linux_bionic-x86 the build is actually amd64 (x86_64) only.
667*795d594fSAndroid Build Coastguard Worker    assert path.exists(f"{OUT_DIR}/soong/host/linux_bionic-x86"), (
668*795d594fSAndroid Build Coastguard Worker        "linux_bionic-x86 target doesn't seem to have been built!")
669*795d594fSAndroid Build Coastguard Worker    # Set TIMEOUT_DUMPER manually so it works even with apex's
670*795d594fSAndroid Build Coastguard Worker    TIMEOUT_DUMPER = f"{OUT_DIR}/soong/host/linux_bionic-x86/bin/signal_dumper"
671*795d594fSAndroid Build Coastguard Worker
672*795d594fSAndroid Build Coastguard Worker  # Prevent test from silently falling back to interpreter in no-prebuild mode. This happens
673*795d594fSAndroid Build Coastguard Worker  # when DEX_LOCATION path is too long, because vdex/odex filename is constructed by taking
674*795d594fSAndroid Build Coastguard Worker  # full path to dex, stripping leading '/', appending '@classes.vdex' and changing every
675*795d594fSAndroid Build Coastguard Worker  # remaining '/' into '@'.
676*795d594fSAndroid Build Coastguard Worker  if HOST:
677*795d594fSAndroid Build Coastguard Worker    max_filename_size = int(check_output(f"getconf NAME_MAX {DEX_LOCATION}", shell=True))
678*795d594fSAndroid Build Coastguard Worker  else:
679*795d594fSAndroid Build Coastguard Worker    # There is no getconf on device, fallback to standard value.
680*795d594fSAndroid Build Coastguard Worker    # See NAME_MAX in kernel <linux/limits.h>
681*795d594fSAndroid Build Coastguard Worker    max_filename_size = 255
682*795d594fSAndroid Build Coastguard Worker  # Compute VDEX_NAME.
683*795d594fSAndroid Build Coastguard Worker  DEX_LOCATION_STRIPPED = DEX_LOCATION.lstrip("/")
684*795d594fSAndroid Build Coastguard Worker  VDEX_NAME = f"{DEX_LOCATION_STRIPPED}@{TEST_NAME}[email protected]".replace(
685*795d594fSAndroid Build Coastguard Worker      "/", "@")
686*795d594fSAndroid Build Coastguard Worker  assert len(VDEX_NAME) <= max_filename_size, "Dex location path too long"
687*795d594fSAndroid Build Coastguard Worker
688*795d594fSAndroid Build Coastguard Worker  if HOST:
689*795d594fSAndroid Build Coastguard Worker    # On host, run binaries (`dex2oat(d)`, `dalvikvm`, `profman`) from the `bin`
690*795d594fSAndroid Build Coastguard Worker    # directory under the "Android Root" (usually `out/host/linux-x86`).
691*795d594fSAndroid Build Coastguard Worker    #
692*795d594fSAndroid Build Coastguard Worker    # TODO(b/130295968): Adjust this if/when ART host artifacts are installed
693*795d594fSAndroid Build Coastguard Worker    # under the ART root (usually `out/host/linux-x86/com.android.art`).
694*795d594fSAndroid Build Coastguard Worker    ANDROID_ART_BIN_DIR = f"{ANDROID_ROOT}/bin"
695*795d594fSAndroid Build Coastguard Worker  else:
696*795d594fSAndroid Build Coastguard Worker    # On target, run binaries (`dex2oat(d)`, `dalvikvm`, `profman`) from the ART
697*795d594fSAndroid Build Coastguard Worker    # APEX's `bin` directory. This means the linker will observe the ART APEX
698*795d594fSAndroid Build Coastguard Worker    # linker configuration file (`/apex/com.android.art/etc/ld.config.txt`) for
699*795d594fSAndroid Build Coastguard Worker    # these binaries.
700*795d594fSAndroid Build Coastguard Worker    ANDROID_ART_BIN_DIR = f"{ANDROID_ART_ROOT}/bin"
701*795d594fSAndroid Build Coastguard Worker
702*795d594fSAndroid Build Coastguard Worker  # Disable metrics reporting to StatsD for chroot tests.
703*795d594fSAndroid Build Coastguard Worker  if CHROOT:
704*795d594fSAndroid Build Coastguard Worker    FLAGS += " -Xmetrics-write-to-statsd:false"
705*795d594fSAndroid Build Coastguard Worker
706*795d594fSAndroid Build Coastguard Worker  profman_cmdline = "true"
707*795d594fSAndroid Build Coastguard Worker  dex2oat_cmdline = "true"
708*795d594fSAndroid Build Coastguard Worker  vdex_cmdline = "true"
709*795d594fSAndroid Build Coastguard Worker  dm_cmdline = "true"
710*795d594fSAndroid Build Coastguard Worker  mkdir_locations = f"{DEX_LOCATION}/dalvik-cache/{ISA}"
711*795d594fSAndroid Build Coastguard Worker  strip_cmdline = "true"
712*795d594fSAndroid Build Coastguard Worker  sync_cmdline = "true"
713*795d594fSAndroid Build Coastguard Worker  linkroot_cmdline = "true"
714*795d594fSAndroid Build Coastguard Worker  linkroot_overlay_cmdline = "true"
715*795d594fSAndroid Build Coastguard Worker
716*795d594fSAndroid Build Coastguard Worker  def linkdirs(host_out: str, root: str):
717*795d594fSAndroid Build Coastguard Worker    dirs = list(filter(os.path.isdir, glob.glob(os.path.join(host_out, "*"))))
718*795d594fSAndroid Build Coastguard Worker    # Also create a link for the boot image.
719*795d594fSAndroid Build Coastguard Worker    dirs.append(f"{ANDROID_HOST_OUT}/apex/art_boot_images")
720*795d594fSAndroid Build Coastguard Worker    return " && ".join(f"ln -sf {dir} {root}" for dir in dirs)
721*795d594fSAndroid Build Coastguard Worker
722*795d594fSAndroid Build Coastguard Worker  if CREATE_ANDROID_ROOT:
723*795d594fSAndroid Build Coastguard Worker    mkdir_locations += f" {ANDROID_ROOT}"
724*795d594fSAndroid Build Coastguard Worker    linkroot_cmdline = linkdirs(ANDROID_HOST_OUT, ANDROID_ROOT)
725*795d594fSAndroid Build Coastguard Worker    if BIONIC:
726*795d594fSAndroid Build Coastguard Worker      # TODO Make this overlay more generic.
727*795d594fSAndroid Build Coastguard Worker      linkroot_overlay_cmdline = linkdirs(
728*795d594fSAndroid Build Coastguard Worker          f"{OUT_DIR}/soong/host/linux_bionic-x86", ANDROID_ROOT)
729*795d594fSAndroid Build Coastguard Worker    # Replace the boot image to a location expected by the runtime.
730*795d594fSAndroid Build Coastguard Worker    DALVIKVM_BOOT_OPT = f"-Ximage:{ANDROID_ROOT}/art_boot_images/javalib/boot.art"
731*795d594fSAndroid Build Coastguard Worker
732*795d594fSAndroid Build Coastguard Worker  # PROFILE takes precedence over RANDOM_PROFILE, since PROFILE tests require a
733*795d594fSAndroid Build Coastguard Worker  # specific profile to run properly.
734*795d594fSAndroid Build Coastguard Worker  if PROFILE or RANDOM_PROFILE:
735*795d594fSAndroid Build Coastguard Worker    profman_cmdline = f"{ANDROID_ART_BIN_DIR}/profman  \
736*795d594fSAndroid Build Coastguard Worker      --apk={DEX_LOCATION}/{TEST_NAME}.jar \
737*795d594fSAndroid Build Coastguard Worker      --dex-location={DEX_LOCATION}/{TEST_NAME}.jar"
738*795d594fSAndroid Build Coastguard Worker
739*795d594fSAndroid Build Coastguard Worker    if isfile(f"{TEST_NAME}-ex.jar") and SECONDARY_COMPILATION:
740*795d594fSAndroid Build Coastguard Worker      profman_cmdline = f"{profman_cmdline} \
741*795d594fSAndroid Build Coastguard Worker        --apk={DEX_LOCATION}/{TEST_NAME}-ex.jar \
742*795d594fSAndroid Build Coastguard Worker        --dex-location={DEX_LOCATION}/{TEST_NAME}-ex.jar"
743*795d594fSAndroid Build Coastguard Worker
744*795d594fSAndroid Build Coastguard Worker    COMPILE_FLAGS = f"{COMPILE_FLAGS} --profile-file={DEX_LOCATION}/{TEST_NAME}.prof"
745*795d594fSAndroid Build Coastguard Worker    FLAGS = f"{FLAGS} -Xcompiler-option --profile-file={DEX_LOCATION}/{TEST_NAME}.prof"
746*795d594fSAndroid Build Coastguard Worker    if PROFILE:
747*795d594fSAndroid Build Coastguard Worker      profman_cmdline = f"{profman_cmdline} --create-profile-from={DEX_LOCATION}/profile \
748*795d594fSAndroid Build Coastguard Worker          --reference-profile-file={DEX_LOCATION}/{TEST_NAME}.prof"
749*795d594fSAndroid Build Coastguard Worker
750*795d594fSAndroid Build Coastguard Worker    else:
751*795d594fSAndroid Build Coastguard Worker      profman_cmdline = f"{profman_cmdline} --generate-test-profile={DEX_LOCATION}/{TEST_NAME}.prof \
752*795d594fSAndroid Build Coastguard Worker          --generate-test-profile-seed=0"
753*795d594fSAndroid Build Coastguard Worker
754*795d594fSAndroid Build Coastguard Worker  def write_dex2oat_cmdlines(name: str):
755*795d594fSAndroid Build Coastguard Worker    nonlocal dex2oat_cmdline, dm_cmdline, vdex_cmdline
756*795d594fSAndroid Build Coastguard Worker
757*795d594fSAndroid Build Coastguard Worker    class_loader_context = ""
758*795d594fSAndroid Build Coastguard Worker    enable_app_image = False
759*795d594fSAndroid Build Coastguard Worker    if APP_IMAGE:
760*795d594fSAndroid Build Coastguard Worker      enable_app_image = True
761*795d594fSAndroid Build Coastguard Worker
762*795d594fSAndroid Build Coastguard Worker    # If the name ends in -ex then this is a secondary dex file
763*795d594fSAndroid Build Coastguard Worker    if name.endswith("-ex"):
764*795d594fSAndroid Build Coastguard Worker      # Lazily realize the default value in case DEX_LOCATION/TEST_NAME change
765*795d594fSAndroid Build Coastguard Worker      nonlocal SECONDARY_CLASS_LOADER_CONTEXT
766*795d594fSAndroid Build Coastguard Worker      if SECONDARY_CLASS_LOADER_CONTEXT == "":
767*795d594fSAndroid Build Coastguard Worker        if SECONDARY_DEX == "":
768*795d594fSAndroid Build Coastguard Worker          # Tests without `--secondary` load the "-ex" jar in a separate PathClassLoader
769*795d594fSAndroid Build Coastguard Worker          # that is a child of the main PathClassLoader. If the class loader is constructed
770*795d594fSAndroid Build Coastguard Worker          # in any other way, the test needs to specify the secondary CLC explicitly.
771*795d594fSAndroid Build Coastguard Worker          SECONDARY_CLASS_LOADER_CONTEXT = f"PCL[];PCL[{DEX_LOCATION}/{TEST_NAME}.jar]"
772*795d594fSAndroid Build Coastguard Worker        else:
773*795d594fSAndroid Build Coastguard Worker          # Tests with `--secondary` load the `-ex` jar a part of the main PathClassLoader.
774*795d594fSAndroid Build Coastguard Worker          SECONDARY_CLASS_LOADER_CONTEXT = f"PCL[{DEX_LOCATION}/{TEST_NAME}.jar]"
775*795d594fSAndroid Build Coastguard Worker      class_loader_context = f"'--class-loader-context={SECONDARY_CLASS_LOADER_CONTEXT}'"
776*795d594fSAndroid Build Coastguard Worker      enable_app_image = enable_app_image and SECONDARY_APP_IMAGE
777*795d594fSAndroid Build Coastguard Worker
778*795d594fSAndroid Build Coastguard Worker    app_image = ""
779*795d594fSAndroid Build Coastguard Worker    if enable_app_image:
780*795d594fSAndroid Build Coastguard Worker      app_image = f"--app-image-file={DEX_LOCATION}/oat/{ISA}/{name}.art --resolve-startup-const-strings=true"
781*795d594fSAndroid Build Coastguard Worker
782*795d594fSAndroid Build Coastguard Worker    dex2oat_binary = DEX2OAT_DEBUG_BINARY
783*795d594fSAndroid Build Coastguard Worker    if TEST_IS_NDEBUG:
784*795d594fSAndroid Build Coastguard Worker      dex2oat_binary = DEX2OAT_NDEBUG_BINARY
785*795d594fSAndroid Build Coastguard Worker
786*795d594fSAndroid Build Coastguard Worker    dex2oat_cmdline = f"{INVOKE_WITH} "
787*795d594fSAndroid Build Coastguard Worker
788*795d594fSAndroid Build Coastguard Worker    if USE_GDB_DEX2OAT:
789*795d594fSAndroid Build Coastguard Worker      nonlocal GDB_DEX2OAT_EXTRA_ARGS
790*795d594fSAndroid Build Coastguard Worker      dex2oat_cmdline += f"gdb {GDB_DEX2OAT_EXTRA_ARGS} \
791*795d594fSAndroid Build Coastguard Worker                          -d '{ANDROID_BUILD_TOP}' --args "
792*795d594fSAndroid Build Coastguard Worker
793*795d594fSAndroid Build Coastguard Worker    dex2oat_logger = ""
794*795d594fSAndroid Build Coastguard Worker    if ON_VM:
795*795d594fSAndroid Build Coastguard Worker      dex2oat_logger = "--runtime-arg -Xuse-stderr-logger"
796*795d594fSAndroid Build Coastguard Worker
797*795d594fSAndroid Build Coastguard Worker    dex2oat_cmdline += f"'{ANDROID_ART_BIN_DIR}/{dex2oat_binary}' \
798*795d594fSAndroid Build Coastguard Worker                        {COMPILE_FLAGS} \
799*795d594fSAndroid Build Coastguard Worker                        --boot-image={BOOT_IMAGE} \
800*795d594fSAndroid Build Coastguard Worker                        --dex-file={DEX_LOCATION}/{name}.jar \
801*795d594fSAndroid Build Coastguard Worker                        --oat-file={DEX_LOCATION}/oat/{ISA}/{name}.odex \
802*795d594fSAndroid Build Coastguard Worker                        {app_image} \
803*795d594fSAndroid Build Coastguard Worker                        --generate-mini-debug-info \
804*795d594fSAndroid Build Coastguard Worker                        --instruction-set={ISA} \
805*795d594fSAndroid Build Coastguard Worker                        {dex2oat_logger} \
806*795d594fSAndroid Build Coastguard Worker                        {class_loader_context}"
807*795d594fSAndroid Build Coastguard Worker
808*795d594fSAndroid Build Coastguard Worker    if INSTRUCTION_SET_FEATURES != "":
809*795d594fSAndroid Build Coastguard Worker      dex2oat_cmdline += f" --instruction-set-features={INSTRUCTION_SET_FEATURES}"
810*795d594fSAndroid Build Coastguard Worker
811*795d594fSAndroid Build Coastguard Worker    # Add in a timeout. This is important for testing the compilation/verification time of
812*795d594fSAndroid Build Coastguard Worker    # pathological cases. We do not append a timeout when debugging dex2oat because we
813*795d594fSAndroid Build Coastguard Worker    # do not want it to exit while debugging.
814*795d594fSAndroid Build Coastguard Worker    # Note: as we don't know how decent targets are (e.g., emulator), only do this on the host for
815*795d594fSAndroid Build Coastguard Worker    #       now. We should try to improve this.
816*795d594fSAndroid Build Coastguard Worker    #       The current value is rather arbitrary. run-tests should compile quickly.
817*795d594fSAndroid Build Coastguard Worker    # Watchdog timeout is in milliseconds so add 3 '0's to the dex2oat timeout.
818*795d594fSAndroid Build Coastguard Worker    if HOST and not USE_GDB_DEX2OAT:
819*795d594fSAndroid Build Coastguard Worker      # Use SIGRTMIN+2 to try to dump threads.
820*795d594fSAndroid Build Coastguard Worker      # Use -k 1m to SIGKILL it a minute later if it hasn't ended.
821*795d594fSAndroid Build Coastguard Worker      dex2oat_cmdline = f"timeout -k {DEX2OAT_TIMEOUT}s -s SIGRTMIN+2 {DEX2OAT_RT_TIMEOUT}s {dex2oat_cmdline} --watchdog-timeout={DEX2OAT_TIMEOUT}000"
822*795d594fSAndroid Build Coastguard Worker    elif ON_VM:
823*795d594fSAndroid Build Coastguard Worker      # Increase dex2oat timeout for VM testing environment, as some checker tests are slow.
824*795d594fSAndroid Build Coastguard Worker      dex2oat_cmdline = f"{dex2oat_cmdline} --watchdog-timeout={5 * DEX2OAT_TIMEOUT}000"
825*795d594fSAndroid Build Coastguard Worker    if PROFILE or RANDOM_PROFILE:
826*795d594fSAndroid Build Coastguard Worker      vdex_cmdline = f"{dex2oat_cmdline} {VDEX_ARGS} --input-vdex={DEX_LOCATION}/oat/{ISA}/{name}.vdex --output-vdex={DEX_LOCATION}/oat/{ISA}/{name}.vdex"
827*795d594fSAndroid Build Coastguard Worker    elif TEST_VDEX:
828*795d594fSAndroid Build Coastguard Worker      if VDEX_ARGS == "":
829*795d594fSAndroid Build Coastguard Worker        # If no arguments need to be passed, just delete the odex file so that the runtime only picks up the vdex file.
830*795d594fSAndroid Build Coastguard Worker        vdex_cmdline = f"rm {DEX_LOCATION}/oat/{ISA}/{name}.odex"
831*795d594fSAndroid Build Coastguard Worker      else:
832*795d594fSAndroid Build Coastguard Worker        vdex_cmdline = f"{dex2oat_cmdline} {VDEX_ARGS} --input-vdex={DEX_LOCATION}/oat/{ISA}/{name}.vdex"
833*795d594fSAndroid Build Coastguard Worker    elif TEST_DEX2OAT_DM:
834*795d594fSAndroid Build Coastguard Worker      vdex_cmdline = f"{dex2oat_cmdline} {VDEX_ARGS} --dump-timings --dm-file={DEX_LOCATION}/oat/{ISA}/{name}.dm"
835*795d594fSAndroid Build Coastguard Worker      dex2oat_cmdline = f"{dex2oat_cmdline} --copy-dex-files=false --output-vdex={DEX_LOCATION}/oat/{ISA}/primary.vdex"
836*795d594fSAndroid Build Coastguard Worker      dm_cmdline = f"zip -qj {DEX_LOCATION}/oat/{ISA}/{name}.dm {DEX_LOCATION}/oat/{ISA}/primary.vdex"
837*795d594fSAndroid Build Coastguard Worker    elif TEST_RUNTIME_DM:
838*795d594fSAndroid Build Coastguard Worker      dex2oat_cmdline = f"{dex2oat_cmdline} --copy-dex-files=false --output-vdex={DEX_LOCATION}/oat/{ISA}/primary.vdex"
839*795d594fSAndroid Build Coastguard Worker      dm_cmdline = f"zip -qj {DEX_LOCATION}/{name}.dm {DEX_LOCATION}/oat/{ISA}/primary.vdex"
840*795d594fSAndroid Build Coastguard Worker
841*795d594fSAndroid Build Coastguard Worker# Enable mini-debug-info for JIT (if JIT is used).
842*795d594fSAndroid Build Coastguard Worker
843*795d594fSAndroid Build Coastguard Worker  FLAGS += " -Xcompiler-option --generate-mini-debug-info"
844*795d594fSAndroid Build Coastguard Worker
845*795d594fSAndroid Build Coastguard Worker  if PREBUILD:
846*795d594fSAndroid Build Coastguard Worker    mkdir_locations += f" {DEX_LOCATION}/oat/{ISA}"
847*795d594fSAndroid Build Coastguard Worker
848*795d594fSAndroid Build Coastguard Worker    # "Primary".
849*795d594fSAndroid Build Coastguard Worker    write_dex2oat_cmdlines(TEST_NAME)
850*795d594fSAndroid Build Coastguard Worker    dex2oat_cmdline = re.sub(" +", " ", dex2oat_cmdline)
851*795d594fSAndroid Build Coastguard Worker    dm_cmdline = re.sub(" +", " ", dm_cmdline)
852*795d594fSAndroid Build Coastguard Worker    vdex_cmdline = re.sub(" +", " ", vdex_cmdline)
853*795d594fSAndroid Build Coastguard Worker
854*795d594fSAndroid Build Coastguard Worker    # Enable mini-debug-info for JIT (if JIT is used).
855*795d594fSAndroid Build Coastguard Worker    FLAGS += " -Xcompiler-option --generate-mini-debug-info"
856*795d594fSAndroid Build Coastguard Worker
857*795d594fSAndroid Build Coastguard Worker    if isfile(f"{TEST_NAME}-ex.jar") and SECONDARY_COMPILATION:
858*795d594fSAndroid Build Coastguard Worker      # "Secondary" for test coverage.
859*795d594fSAndroid Build Coastguard Worker
860*795d594fSAndroid Build Coastguard Worker      # Store primary values.
861*795d594fSAndroid Build Coastguard Worker      base_dex2oat_cmdline = dex2oat_cmdline
862*795d594fSAndroid Build Coastguard Worker      base_dm_cmdline = dm_cmdline
863*795d594fSAndroid Build Coastguard Worker      base_vdex_cmdline = vdex_cmdline
864*795d594fSAndroid Build Coastguard Worker
865*795d594fSAndroid Build Coastguard Worker      write_dex2oat_cmdlines(f"{TEST_NAME}-ex")
866*795d594fSAndroid Build Coastguard Worker      dex2oat_cmdline = re.sub(" +", " ", dex2oat_cmdline)
867*795d594fSAndroid Build Coastguard Worker      dm_cmdline = re.sub(" +", " ", dm_cmdline)
868*795d594fSAndroid Build Coastguard Worker      vdex_cmdline = re.sub(" +", " ", vdex_cmdline)
869*795d594fSAndroid Build Coastguard Worker
870*795d594fSAndroid Build Coastguard Worker      # Concatenate.
871*795d594fSAndroid Build Coastguard Worker      dex2oat_cmdline = f"{base_dex2oat_cmdline} && {dex2oat_cmdline}"
872*795d594fSAndroid Build Coastguard Worker      dm_cmdline = base_dm_cmdline  # Only use primary dm.
873*795d594fSAndroid Build Coastguard Worker      vdex_cmdline = f"{base_vdex_cmdline} && {vdex_cmdline}"
874*795d594fSAndroid Build Coastguard Worker
875*795d594fSAndroid Build Coastguard Worker  if SYNC_BEFORE_RUN:
876*795d594fSAndroid Build Coastguard Worker    sync_cmdline = "sync"
877*795d594fSAndroid Build Coastguard Worker
878*795d594fSAndroid Build Coastguard Worker  DALVIKVM_ISA_FEATURES_ARGS = ""
879*795d594fSAndroid Build Coastguard Worker  if INSTRUCTION_SET_FEATURES != "":
880*795d594fSAndroid Build Coastguard Worker    DALVIKVM_ISA_FEATURES_ARGS = f"-Xcompiler-option --instruction-set-features={INSTRUCTION_SET_FEATURES}"
881*795d594fSAndroid Build Coastguard Worker
882*795d594fSAndroid Build Coastguard Worker# java.io.tmpdir can only be set at launch time.
883*795d594fSAndroid Build Coastguard Worker  TMP_DIR_OPTION = ""
884*795d594fSAndroid Build Coastguard Worker  if not HOST:
885*795d594fSAndroid Build Coastguard Worker    TMP_DIR_OPTION = "-Djava.io.tmpdir=/data/local/tmp"
886*795d594fSAndroid Build Coastguard Worker
887*795d594fSAndroid Build Coastguard Worker# The build servers have an ancient version of bash so we cannot use @Q.
888*795d594fSAndroid Build Coastguard Worker  QUOTED_DALVIKVM_BOOT_OPT = shlex.quote(DALVIKVM_BOOT_OPT)
889*795d594fSAndroid Build Coastguard Worker
890*795d594fSAndroid Build Coastguard Worker  DALVIKVM_CLASSPATH = f"{DEX_LOCATION}/{TEST_NAME}.jar"
891*795d594fSAndroid Build Coastguard Worker  if isfile(f"{TEST_NAME}-aotex.jar"):
892*795d594fSAndroid Build Coastguard Worker    DALVIKVM_CLASSPATH = f"{DALVIKVM_CLASSPATH}:{DEX_LOCATION}/{TEST_NAME}-aotex.jar"
893*795d594fSAndroid Build Coastguard Worker  DALVIKVM_CLASSPATH = f"{DALVIKVM_CLASSPATH}{SECONDARY_DEX}"
894*795d594fSAndroid Build Coastguard Worker
895*795d594fSAndroid Build Coastguard Worker  # We set DumpNativeStackOnSigQuit to false to avoid stressing libunwind.
896*795d594fSAndroid Build Coastguard Worker  # b/27185632
897*795d594fSAndroid Build Coastguard Worker  # b/24664297
898*795d594fSAndroid Build Coastguard Worker
899*795d594fSAndroid Build Coastguard Worker  dalvikvm_logger = ""
900*795d594fSAndroid Build Coastguard Worker  if ON_VM:
901*795d594fSAndroid Build Coastguard Worker    dalvikvm_logger = "-Xuse-stderr-logger"
902*795d594fSAndroid Build Coastguard Worker
903*795d594fSAndroid Build Coastguard Worker  dalvikvm_cmdline = f"{INVOKE_WITH} {GDB} {ANDROID_ART_BIN_DIR}/{DALVIKVM} \
904*795d594fSAndroid Build Coastguard Worker                       {GDB_ARGS} \
905*795d594fSAndroid Build Coastguard Worker                       {FLAGS} \
906*795d594fSAndroid Build Coastguard Worker                       {DEX_VERIFY} \
907*795d594fSAndroid Build Coastguard Worker                       -XXlib:{LIB} \
908*795d594fSAndroid Build Coastguard Worker                       {DEX2OAT} \
909*795d594fSAndroid Build Coastguard Worker                       {DALVIKVM_ISA_FEATURES_ARGS} \
910*795d594fSAndroid Build Coastguard Worker                       {ZYGOTE} \
911*795d594fSAndroid Build Coastguard Worker                       {JNI_OPTS} \
912*795d594fSAndroid Build Coastguard Worker                       {INT_OPTS} \
913*795d594fSAndroid Build Coastguard Worker                       {DEBUGGER_OPTS} \
914*795d594fSAndroid Build Coastguard Worker                       {QUOTED_DALVIKVM_BOOT_OPT} \
915*795d594fSAndroid Build Coastguard Worker                       {TMP_DIR_OPTION} \
916*795d594fSAndroid Build Coastguard Worker                       {dalvikvm_logger} \
917*795d594fSAndroid Build Coastguard Worker                       -XX:DumpNativeStackOnSigQuit:false \
918*795d594fSAndroid Build Coastguard Worker                       -cp {DALVIKVM_CLASSPATH} {MAIN} {ARGS}"
919*795d594fSAndroid Build Coastguard Worker
920*795d594fSAndroid Build Coastguard Worker  if SIMPLEPERF:
921*795d594fSAndroid Build Coastguard Worker    dalvikvm_cmdline = f"simpleperf record {dalvikvm_cmdline} && simpleperf report"
922*795d594fSAndroid Build Coastguard Worker
923*795d594fSAndroid Build Coastguard Worker  def sanitize_dex2oat_cmdline(cmdline: str) -> str:
924*795d594fSAndroid Build Coastguard Worker    args = []
925*795d594fSAndroid Build Coastguard Worker    for arg in cmdline.split(" "):
926*795d594fSAndroid Build Coastguard Worker      if arg == "--class-loader-context=&":
927*795d594fSAndroid Build Coastguard Worker        arg = "--class-loader-context=\&"
928*795d594fSAndroid Build Coastguard Worker      args.append(arg)
929*795d594fSAndroid Build Coastguard Worker    return " ".join(args)
930*795d594fSAndroid Build Coastguard Worker
931*795d594fSAndroid Build Coastguard Worker  # Remove whitespace.
932*795d594fSAndroid Build Coastguard Worker  dex2oat_cmdline = sanitize_dex2oat_cmdline(dex2oat_cmdline)
933*795d594fSAndroid Build Coastguard Worker  dalvikvm_cmdline = re.sub(" +", " ", dalvikvm_cmdline)
934*795d594fSAndroid Build Coastguard Worker  dm_cmdline = re.sub(" +", " ", dm_cmdline)
935*795d594fSAndroid Build Coastguard Worker  vdex_cmdline = sanitize_dex2oat_cmdline(vdex_cmdline)
936*795d594fSAndroid Build Coastguard Worker  profman_cmdline = re.sub(" +", " ", profman_cmdline)
937*795d594fSAndroid Build Coastguard Worker
938*795d594fSAndroid Build Coastguard Worker  # Use an empty ASAN_OPTIONS to enable defaults.
939*795d594fSAndroid Build Coastguard Worker  # Note: this is required as envsetup right now exports detect_leaks=0.
940*795d594fSAndroid Build Coastguard Worker  RUN_TEST_ASAN_OPTIONS = ""
941*795d594fSAndroid Build Coastguard Worker
942*795d594fSAndroid Build Coastguard Worker  # Multiple shutdown leaks. b/38341789
943*795d594fSAndroid Build Coastguard Worker  if RUN_TEST_ASAN_OPTIONS != "":
944*795d594fSAndroid Build Coastguard Worker    RUN_TEST_ASAN_OPTIONS = f"{RUN_TEST_ASAN_OPTIONS}:"
945*795d594fSAndroid Build Coastguard Worker  RUN_TEST_ASAN_OPTIONS = f"{RUN_TEST_ASAN_OPTIONS}detect_leaks=0"
946*795d594fSAndroid Build Coastguard Worker
947*795d594fSAndroid Build Coastguard Worker  assert not args.external_log_tags, "Deprecated: use --android-log-tags=*:v"
948*795d594fSAndroid Build Coastguard Worker
949*795d594fSAndroid Build Coastguard Worker  ANDROID_LOG_TAGS = args.android_log_tags
950*795d594fSAndroid Build Coastguard Worker
951*795d594fSAndroid Build Coastguard Worker  def filter_output():
952*795d594fSAndroid Build Coastguard Worker    # Remove unwanted log messages from stderr before diffing with the expected output.
953*795d594fSAndroid Build Coastguard Worker    # NB: The unwanted log line can be interleaved in the middle of wanted stderr printf.
954*795d594fSAndroid Build Coastguard Worker    #     In particular, unhandled exception is printed using several unterminated printfs.
955*795d594fSAndroid Build Coastguard Worker    ALL_LOG_TAGS = ["V", "D", "I", "W", "E", "F", "S"]
956*795d594fSAndroid Build Coastguard Worker    skip_tag_set = "|".join(ALL_LOG_TAGS[:ALL_LOG_TAGS.index(args.diff_min_log_tag.upper())])
957*795d594fSAndroid Build Coastguard Worker    skip_reg_exp = fr'#-# #:#:# # # ({skip_tag_set}) [^\n]*\n'
958*795d594fSAndroid Build Coastguard Worker    skip_reg_exp = skip_reg_exp.replace('#', '[0-9.]+').replace(' ', ' +')
959*795d594fSAndroid Build Coastguard Worker    ctx.run(fr"sed -i -z -E 's/{skip_reg_exp}//g' '{args.stderr_file}'")
960*795d594fSAndroid Build Coastguard Worker    if not HAVE_IMAGE:
961*795d594fSAndroid Build Coastguard Worker      message = "(Unable to open file|Could not create image space)"
962*795d594fSAndroid Build Coastguard Worker      ctx.run(fr"sed -i -E '/^.* E dalvikvm(|32|64): .* {message}/d' '{args.stderr_file}'")
963*795d594fSAndroid Build Coastguard Worker    if ANDROID_LOG_TAGS != "*:i" and "D" in skip_tag_set:
964*795d594fSAndroid Build Coastguard Worker      ctx.run(fr"sed -i -E '/^(Time zone|I18n) APEX ICU file found/d' '{args.stderr_file}'")
965*795d594fSAndroid Build Coastguard Worker    if ON_VM:
966*795d594fSAndroid Build Coastguard Worker      messages = "|".join([
967*795d594fSAndroid Build Coastguard Worker        "failed to connect to tombstoned",
968*795d594fSAndroid Build Coastguard Worker        "Failed to write stack traces to tombstoned",
969*795d594fSAndroid Build Coastguard Worker        "Failed to setpriority to :0"])
970*795d594fSAndroid Build Coastguard Worker      ctx.run(fr"sed -i -E '/({messages})/d' '{args.stderr_file}'")
971*795d594fSAndroid Build Coastguard Worker
972*795d594fSAndroid Build Coastguard Worker  if not HOST:
973*795d594fSAndroid Build Coastguard Worker    # Populate LD_LIBRARY_PATH.
974*795d594fSAndroid Build Coastguard Worker    LD_LIBRARY_PATH = ""
975*795d594fSAndroid Build Coastguard Worker    if ANDROID_ROOT != "/system":
976*795d594fSAndroid Build Coastguard Worker      # Current default installation is dalvikvm 64bits and dex2oat 32bits,
977*795d594fSAndroid Build Coastguard Worker      # so we can only use LD_LIBRARY_PATH when testing on a local
978*795d594fSAndroid Build Coastguard Worker      # installation.
979*795d594fSAndroid Build Coastguard Worker      LD_LIBRARY_PATH = f"{ANDROID_ROOT}/{LIBRARY_DIRECTORY}"
980*795d594fSAndroid Build Coastguard Worker
981*795d594fSAndroid Build Coastguard Worker    # This adds libarttest(d).so to the default linker namespace when dalvikvm
982*795d594fSAndroid Build Coastguard Worker    # is run from /apex/com.android.art/bin. Since that namespace is essentially
983*795d594fSAndroid Build Coastguard Worker    # an alias for the com_android_art namespace, that gives libarttest(d).so
984*795d594fSAndroid Build Coastguard Worker    # full access to the internal ART libraries.
985*795d594fSAndroid Build Coastguard Worker    LD_LIBRARY_PATH = f"/data/{TEST_DIRECTORY}/com.android.art/lib{SUFFIX64}:{LD_LIBRARY_PATH}"
986*795d594fSAndroid Build Coastguard Worker    dlib = ("" if TEST_IS_NDEBUG else "d")
987*795d594fSAndroid Build Coastguard Worker    art_test_internal_libraries = [
988*795d594fSAndroid Build Coastguard Worker        f"libartagent{dlib}.so",
989*795d594fSAndroid Build Coastguard Worker        f"libarttest{dlib}.so",
990*795d594fSAndroid Build Coastguard Worker        f"libtiagent{dlib}.so",
991*795d594fSAndroid Build Coastguard Worker        f"libtistress{dlib}.so",
992*795d594fSAndroid Build Coastguard Worker    ]
993*795d594fSAndroid Build Coastguard Worker    NATIVELOADER_DEFAULT_NAMESPACE_LIBS = ":".join(art_test_internal_libraries)
994*795d594fSAndroid Build Coastguard Worker    dlib = ""
995*795d594fSAndroid Build Coastguard Worker    art_test_internal_libraries = []
996*795d594fSAndroid Build Coastguard Worker
997*795d594fSAndroid Build Coastguard Worker    if not ON_VM:
998*795d594fSAndroid Build Coastguard Worker      # Needed to access the test's Odex files.
999*795d594fSAndroid Build Coastguard Worker      LD_LIBRARY_PATH = f"{DEX_LOCATION}/oat/{ISA}:{LD_LIBRARY_PATH}"
1000*795d594fSAndroid Build Coastguard Worker    # Needed to access the test's native libraries (see e.g. 674-hiddenapi,
1001*795d594fSAndroid Build Coastguard Worker    # which generates `libhiddenapitest_*.so` libraries in `{DEX_LOCATION}`).
1002*795d594fSAndroid Build Coastguard Worker    LD_LIBRARY_PATH = f"{DEX_LOCATION}:{LD_LIBRARY_PATH}"
1003*795d594fSAndroid Build Coastguard Worker
1004*795d594fSAndroid Build Coastguard Worker    # Prepend directories to the path on device.
1005*795d594fSAndroid Build Coastguard Worker    PREPEND_TARGET_PATH = ANDROID_ART_BIN_DIR
1006*795d594fSAndroid Build Coastguard Worker    if ANDROID_ROOT != "/system":
1007*795d594fSAndroid Build Coastguard Worker      PREPEND_TARGET_PATH = f"{PREPEND_TARGET_PATH}:{ANDROID_ROOT}/bin"
1008*795d594fSAndroid Build Coastguard Worker
1009*795d594fSAndroid Build Coastguard Worker    timeout_dumper_cmd = ""
1010*795d594fSAndroid Build Coastguard Worker
1011*795d594fSAndroid Build Coastguard Worker    if TIMEOUT_DUMPER:
1012*795d594fSAndroid Build Coastguard Worker      # Use "-l" to dump to logcat. That is convenience for the build bot crash symbolization.
1013*795d594fSAndroid Build Coastguard Worker      # Use exit code 124 for toybox timeout (b/141007616).
1014*795d594fSAndroid Build Coastguard Worker      timeout_dumper_cmd = f"{TIMEOUT_DUMPER} -l -s 15 -e 124"
1015*795d594fSAndroid Build Coastguard Worker
1016*795d594fSAndroid Build Coastguard Worker    timeout_prefix = ""
1017*795d594fSAndroid Build Coastguard Worker    if TIME_OUT == "timeout":
1018*795d594fSAndroid Build Coastguard Worker      # Add timeout command if time out is desired.
1019*795d594fSAndroid Build Coastguard Worker      #
1020*795d594fSAndroid Build Coastguard Worker      # Note: We first send SIGTERM (the timeout default, signal 15) to the signal dumper, which
1021*795d594fSAndroid Build Coastguard Worker      #       will induce a full thread dump before killing the process. To ensure any issues in
1022*795d594fSAndroid Build Coastguard Worker      #       dumping do not lead to a deadlock, we also use the "-k" option to definitely kill the
1023*795d594fSAndroid Build Coastguard Worker      #       child.
1024*795d594fSAndroid Build Coastguard Worker      # Note: Using "--foreground" to not propagate the signal to children, i.e., the runtime.
1025*795d594fSAndroid Build Coastguard Worker      if ON_VM:
1026*795d594fSAndroid Build Coastguard Worker        timeout_prefix = f"timeout -k 120s {TIME_OUT_VALUE}s"
1027*795d594fSAndroid Build Coastguard Worker      else:
1028*795d594fSAndroid Build Coastguard Worker        timeout_prefix = f"timeout --foreground -k 120s {TIME_OUT_VALUE}s {timeout_dumper_cmd}"
1029*795d594fSAndroid Build Coastguard Worker
1030*795d594fSAndroid Build Coastguard Worker    ctx.export(
1031*795d594fSAndroid Build Coastguard Worker      ASAN_OPTIONS = RUN_TEST_ASAN_OPTIONS,
1032*795d594fSAndroid Build Coastguard Worker      ANDROID_DATA = DEX_LOCATION,
1033*795d594fSAndroid Build Coastguard Worker      DEX_LOCATION = DEX_LOCATION,
1034*795d594fSAndroid Build Coastguard Worker      ANDROID_ROOT = ANDROID_ROOT,
1035*795d594fSAndroid Build Coastguard Worker      ANDROID_I18N_ROOT = ANDROID_I18N_ROOT,
1036*795d594fSAndroid Build Coastguard Worker      ANDROID_ART_ROOT = ANDROID_ART_ROOT,
1037*795d594fSAndroid Build Coastguard Worker      ANDROID_TZDATA_ROOT = ANDROID_TZDATA_ROOT,
1038*795d594fSAndroid Build Coastguard Worker      ANDROID_LOG_TAGS = ANDROID_LOG_TAGS,
1039*795d594fSAndroid Build Coastguard Worker      ART_TEST_ON_VM=ON_VM,
1040*795d594fSAndroid Build Coastguard Worker      LD_LIBRARY_PATH = LD_LIBRARY_PATH,
1041*795d594fSAndroid Build Coastguard Worker      NATIVELOADER_DEFAULT_NAMESPACE_LIBS = NATIVELOADER_DEFAULT_NAMESPACE_LIBS,
1042*795d594fSAndroid Build Coastguard Worker      PATH = f"{PREPEND_TARGET_PATH}:$PATH",
1043*795d594fSAndroid Build Coastguard Worker    )
1044*795d594fSAndroid Build Coastguard Worker
1045*795d594fSAndroid Build Coastguard Worker    if USE_GDB or USE_GDBSERVER:
1046*795d594fSAndroid Build Coastguard Worker      print(f"Forward {GDBSERVER_PORT} to local port and connect GDB")
1047*795d594fSAndroid Build Coastguard Worker
1048*795d594fSAndroid Build Coastguard Worker    ctx.run(f"rm -rf {DEX_LOCATION}/{{oat,dalvik-cache}}/ && mkdir -p {mkdir_locations}")
1049*795d594fSAndroid Build Coastguard Worker    ctx.run(f"{profman_cmdline}")
1050*795d594fSAndroid Build Coastguard Worker    ctx.run(f"{dex2oat_cmdline}", desc="Dex2oat")
1051*795d594fSAndroid Build Coastguard Worker    ctx.run(f"{dm_cmdline}")
1052*795d594fSAndroid Build Coastguard Worker    ctx.run(f"{vdex_cmdline}")
1053*795d594fSAndroid Build Coastguard Worker    ctx.run(f"{strip_cmdline}")
1054*795d594fSAndroid Build Coastguard Worker    ctx.run(f"{sync_cmdline}")
1055*795d594fSAndroid Build Coastguard Worker    ctx.run(tee(f"{timeout_prefix} {dalvikvm_cmdline}"),
1056*795d594fSAndroid Build Coastguard Worker            expected_exit_code=args.expected_exit_code, desc="DalvikVM")
1057*795d594fSAndroid Build Coastguard Worker
1058*795d594fSAndroid Build Coastguard Worker    if ON_VM:
1059*795d594fSAndroid Build Coastguard Worker      filter_output()
1060*795d594fSAndroid Build Coastguard Worker
1061*795d594fSAndroid Build Coastguard Worker  else:
1062*795d594fSAndroid Build Coastguard Worker    # Host run.
1063*795d594fSAndroid Build Coastguard Worker    LD_LIBRARY_PATH = f"{ANDROID_ROOT}/{LIBRARY_DIRECTORY}:{ANDROID_ROOT}/{TEST_DIRECTORY}"
1064*795d594fSAndroid Build Coastguard Worker
1065*795d594fSAndroid Build Coastguard Worker    ctx.export(
1066*795d594fSAndroid Build Coastguard Worker      ANDROID_PRINTF_LOG = "brief",
1067*795d594fSAndroid Build Coastguard Worker      ASAN_OPTIONS = RUN_TEST_ASAN_OPTIONS,
1068*795d594fSAndroid Build Coastguard Worker      ANDROID_DATA = DEX_LOCATION,
1069*795d594fSAndroid Build Coastguard Worker      DEX_LOCATION = DEX_LOCATION,
1070*795d594fSAndroid Build Coastguard Worker      ANDROID_ROOT = ANDROID_ROOT,
1071*795d594fSAndroid Build Coastguard Worker      ANDROID_I18N_ROOT = ANDROID_I18N_ROOT,
1072*795d594fSAndroid Build Coastguard Worker      ANDROID_ART_ROOT = ANDROID_ART_ROOT,
1073*795d594fSAndroid Build Coastguard Worker      ANDROID_TZDATA_ROOT = ANDROID_TZDATA_ROOT,
1074*795d594fSAndroid Build Coastguard Worker      ANDROID_LOG_TAGS = ANDROID_LOG_TAGS,
1075*795d594fSAndroid Build Coastguard Worker      LD_LIBRARY_PATH = LD_LIBRARY_PATH,
1076*795d594fSAndroid Build Coastguard Worker      PATH = f"{PATH}:{ANDROID_ART_BIN_DIR}",
1077*795d594fSAndroid Build Coastguard Worker      # Temporarily disable address space layout randomization (ASLR).
1078*795d594fSAndroid Build Coastguard Worker      # This is needed on the host so that the linker loads core.oat at the necessary address.
1079*795d594fSAndroid Build Coastguard Worker      LD_USE_LOAD_BIAS = "1",
1080*795d594fSAndroid Build Coastguard Worker      TERM = os.environ.get("TERM", ""),  # Needed for GDB
1081*795d594fSAndroid Build Coastguard Worker    )
1082*795d594fSAndroid Build Coastguard Worker
1083*795d594fSAndroid Build Coastguard Worker    cmdline = dalvikvm_cmdline
1084*795d594fSAndroid Build Coastguard Worker
1085*795d594fSAndroid Build Coastguard Worker    if TIME_OUT == "gdb":
1086*795d594fSAndroid Build Coastguard Worker      if run("uname").stdout.strip() == "Darwin":
1087*795d594fSAndroid Build Coastguard Worker        # Fall back to timeout on Mac.
1088*795d594fSAndroid Build Coastguard Worker        TIME_OUT = "timeout"
1089*795d594fSAndroid Build Coastguard Worker      elif ISA == "x86":
1090*795d594fSAndroid Build Coastguard Worker        # prctl call may fail in 32-bit on an older (3.2) 64-bit Linux kernel. Fall back to timeout.
1091*795d594fSAndroid Build Coastguard Worker        TIME_OUT = "timeout"
1092*795d594fSAndroid Build Coastguard Worker      else:
1093*795d594fSAndroid Build Coastguard Worker        # Check if gdb is available.
1094*795d594fSAndroid Build Coastguard Worker        proc = run('gdb --eval-command="quit"', check=False, save_cmd=False)
1095*795d594fSAndroid Build Coastguard Worker        if proc.returncode != 0:
1096*795d594fSAndroid Build Coastguard Worker          # gdb isn't available. Fall back to timeout.
1097*795d594fSAndroid Build Coastguard Worker          TIME_OUT = "timeout"
1098*795d594fSAndroid Build Coastguard Worker
1099*795d594fSAndroid Build Coastguard Worker    if TIME_OUT == "timeout":
1100*795d594fSAndroid Build Coastguard Worker      # Add timeout command if time out is desired.
1101*795d594fSAndroid Build Coastguard Worker      #
1102*795d594fSAndroid Build Coastguard Worker      # Note: We first send SIGTERM (the timeout default, signal 15) to the signal dumper, which
1103*795d594fSAndroid Build Coastguard Worker      #       will induce a full thread dump before killing the process. To ensure any issues in
1104*795d594fSAndroid Build Coastguard Worker      #       dumping do not lead to a deadlock, we also use the "-k" option to definitely kill the
1105*795d594fSAndroid Build Coastguard Worker      #       child.
1106*795d594fSAndroid Build Coastguard Worker      # Note: Using "--foreground" to not propagate the signal to children, i.e., the runtime.
1107*795d594fSAndroid Build Coastguard Worker      cmdline = f"timeout --foreground -k 120s {TIME_OUT_VALUE}s {TIMEOUT_DUMPER} -s 15 {cmdline}"
1108*795d594fSAndroid Build Coastguard Worker
1109*795d594fSAndroid Build Coastguard Worker    os.chdir(ANDROID_BUILD_TOP)
1110*795d594fSAndroid Build Coastguard Worker
1111*795d594fSAndroid Build Coastguard Worker    # Make sure we delete any existing compiler artifacts.
1112*795d594fSAndroid Build Coastguard Worker    # This enables tests to call the RUN script multiple times in a row
1113*795d594fSAndroid Build Coastguard Worker    # without worrying about interference.
1114*795d594fSAndroid Build Coastguard Worker    ctx.run(f"rm -rf {DEX_LOCATION}/{{oat,dalvik-cache}}/")
1115*795d594fSAndroid Build Coastguard Worker
1116*795d594fSAndroid Build Coastguard Worker    ctx.run(f"mkdir -p {mkdir_locations}")
1117*795d594fSAndroid Build Coastguard Worker    ctx.run(linkroot_cmdline)
1118*795d594fSAndroid Build Coastguard Worker    ctx.run(linkroot_overlay_cmdline)
1119*795d594fSAndroid Build Coastguard Worker    ctx.run(profman_cmdline)
1120*795d594fSAndroid Build Coastguard Worker    ctx.run(dex2oat_cmdline, desc="Dex2oat")
1121*795d594fSAndroid Build Coastguard Worker    ctx.run(dm_cmdline)
1122*795d594fSAndroid Build Coastguard Worker    ctx.run(vdex_cmdline)
1123*795d594fSAndroid Build Coastguard Worker    ctx.run(strip_cmdline)
1124*795d594fSAndroid Build Coastguard Worker    ctx.run(sync_cmdline)
1125*795d594fSAndroid Build Coastguard Worker
1126*795d594fSAndroid Build Coastguard Worker    if DRY_RUN:
1127*795d594fSAndroid Build Coastguard Worker      return
1128*795d594fSAndroid Build Coastguard Worker
1129*795d594fSAndroid Build Coastguard Worker    if USE_GDB:
1130*795d594fSAndroid Build Coastguard Worker      # When running under gdb, we cannot do piping and grepping...
1131*795d594fSAndroid Build Coastguard Worker      ctx.run(cmdline)
1132*795d594fSAndroid Build Coastguard Worker    else:
1133*795d594fSAndroid Build Coastguard Worker      ctx.run(tee(cmdline), expected_exit_code=args.expected_exit_code, desc="DalvikVM")
1134*795d594fSAndroid Build Coastguard Worker      filter_output()
1135