• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/bin/bash
2#
3# Runner for an individual run-test.
4
5msg() {
6    if [ "$QUIET" = "n" ]; then
7        echo "$@"
8    fi
9}
10
11ANDROID_ROOT="/system"
12ANDROID_RUNTIME_ROOT="/apex/com.android.runtime"
13ANDROID_TZDATA_ROOT="/apex/com.android.tzdata"
14ARCHITECTURES_32="(arm|x86|mips|none)"
15ARCHITECTURES_64="(arm64|x86_64|mips64|none)"
16ARCHITECTURES_PATTERN="${ARCHITECTURES_32}"
17BOOT_IMAGE=""
18CHROOT=
19COMPILE_FLAGS=""
20DALVIKVM="dalvikvm32"
21DEBUGGER="n"
22WITH_AGENT=()
23DEBUGGER_AGENT=""
24WRAP_DEBUGGER_AGENT="n"
25DEV_MODE="n"
26DEX2OAT_NDEBUG_BINARY="dex2oat"
27DEX2OAT_DEBUG_BINARY="dex2oatd"
28EXPERIMENTAL=""
29FALSE_BIN="false"
30FLAGS=""
31ANDROID_FLAGS=""
32GDB=""
33GDB_ARGS=""
34GDBSERVER_DEVICE="gdbserver"
35GDBSERVER_HOST="gdbserver"
36HAVE_IMAGE="y"
37HOST="n"
38BIONIC="n"
39CREATE_ANDROID_ROOT="n"
40USE_ZIPAPEX="n"
41ZIPAPEX_LOC=""
42USE_EXTRACTED_ZIPAPEX="n"
43EXTRACTED_ZIPAPEX_LOC=""
44INTERPRETER="n"
45JIT="n"
46INVOKE_WITH=""
47IS_JVMTI_TEST="n"
48ISA=x86
49LIBRARY_DIRECTORY="lib"
50TEST_DIRECTORY="nativetest"
51MAIN=""
52OPTIMIZE="y"
53PREBUILD="y"
54QUIET="n"
55RELOCATE="n"
56STRIP_DEX="n"
57SECONDARY_DEX=""
58TIME_OUT="gdb"  # "n" (disabled), "timeout" (use timeout), "gdb" (use gdb)
59TIMEOUT_DUMPER=timeout_dumper
60# Value in seconds
61if [ "$ART_USE_READ_BARRIER" != "false" ]; then
62  TIME_OUT_VALUE=2400  # 40 minutes.
63else
64  TIME_OUT_VALUE=1200  # 20 minutes.
65fi
66USE_GDB="n"
67USE_GDBSERVER="n"
68GDBSERVER_PORT=":5039"
69USE_JVM="n"
70USE_JVMTI="n"
71VERIFY="y" # y=yes,n=no,s=softfail
72ZYGOTE=""
73DEX_VERIFY=""
74INSTRUCTION_SET_FEATURES=""
75ARGS=""
76VDEX_ARGS=""
77EXTERNAL_LOG_TAGS="n" # if y respect externally set ANDROID_LOG_TAGS.
78DRY_RUN="n" # if y prepare to run the test but don't run it.
79TEST_VDEX="n"
80TEST_DM="n"
81TEST_IS_NDEBUG="n"
82APP_IMAGE="y"
83JVMTI_STRESS="n"
84JVMTI_STEP_STRESS="n"
85JVMTI_FIELD_STRESS="n"
86JVMTI_TRACE_STRESS="n"
87JVMTI_REDEFINE_STRESS="n"
88PROFILE="n"
89RANDOM_PROFILE="n"
90# The normal dex2oat timeout.
91DEX2OAT_TIMEOUT="300" # 5 mins
92# The *hard* timeout where we really start trying to kill the dex2oat.
93DEX2OAT_RT_TIMEOUT="360" # 6 mins
94
95# if "y", run 'sync' before dalvikvm to make sure all files from
96# build step (e.g. dex2oat) were finished writing.
97SYNC_BEFORE_RUN="n"
98
99# When running a debug build, we want to run with all checks.
100ANDROID_FLAGS="${ANDROID_FLAGS} -XX:SlowDebug=true"
101# The same for dex2oatd, both prebuild and runtime-driven.
102ANDROID_FLAGS="${ANDROID_FLAGS} -Xcompiler-option --runtime-arg -Xcompiler-option -XX:SlowDebug=true"
103COMPILER_FLAGS="${COMPILER_FLAGS} --runtime-arg -XX:SlowDebug=true"
104
105while true; do
106    if [ "x$1" = "x--quiet" ]; then
107        QUIET="y"
108        shift
109    elif [ "x$1" = "x--dex2oat-rt-timeout" ]; then
110        shift
111        if [ "x$1" = "x" ]; then
112            echo "$0 missing argument to --dex2oat-rt-timeout" 1>&2
113            exit 1
114        fi
115        DEX2OAT_RT_TIMEOUT="$1"
116        shift
117    elif [ "x$1" = "x--dex2oat-timeout" ]; then
118        shift
119        if [ "x$1" = "x" ]; then
120            echo "$0 missing argument to --dex2oat-timeout" 1>&2
121            exit 1
122        fi
123        DEX2OAT_TIMEOUT="$1"
124        shift
125    elif [ "x$1" = "x--jvmti" ]; then
126        USE_JVMTI="y"
127        IS_JVMTI_TEST="y"
128        shift
129    elif [ "x$1" = "x-O" ]; then
130        TEST_IS_NDEBUG="y"
131        shift
132    elif [ "x$1" = "x--lib" ]; then
133        shift
134        if [ "x$1" = "x" ]; then
135            echo "$0 missing argument to --lib" 1>&2
136            exit 1
137        fi
138        LIB="$1"
139        shift
140    elif [ "x$1" = "x--gc-stress" ]; then
141        # Give an extra 5 mins if we are gc-stress.
142        TIME_OUT_VALUE=$((${TIME_OUT_VALUE} + 300))
143        shift
144    elif [ "x$1" = "x--testlib" ]; then
145        shift
146        if [ "x$1" = "x" ]; then
147            echo "$0 missing argument to --testlib" 1>&2
148            exit 1
149        fi
150        ARGS="${ARGS} $1"
151        shift
152    elif [ "x$1" = "x--args" ]; then
153        shift
154        if [ "x$1" = "x" ]; then
155            echo "$0 missing argument to --args" 1>&2
156            exit 1
157        fi
158        ARGS="${ARGS} $1"
159        shift
160    elif [ "x$1" = "x-Xcompiler-option" ]; then
161        shift
162        option="$1"
163        FLAGS="${FLAGS} -Xcompiler-option $option"
164        COMPILE_FLAGS="${COMPILE_FLAGS} $option"
165        shift
166    elif [ "x$1" = "x--android-runtime-option" ]; then
167        shift
168        option="$1"
169        ANDROID_FLAGS="${ANDROID_FLAGS} $option"
170        shift
171    elif [ "x$1" = "x--runtime-option" ]; then
172        shift
173        option="$1"
174        FLAGS="${FLAGS} $option"
175        shift
176    elif [ "x$1" = "x--boot" ]; then
177        shift
178        BOOT_IMAGE="$1"
179        shift
180    elif [ "x$1" = "x--relocate" ]; then
181        RELOCATE="y"
182        shift
183    elif [ "x$1" = "x--no-relocate" ]; then
184        RELOCATE="n"
185        shift
186    elif [ "x$1" = "x--prebuild" ]; then
187        PREBUILD="y"
188        shift
189    elif [ "x$1" = "x--compact-dex-level" ]; then
190        shift
191        COMPILE_FLAGS="${COMPILE_FLAGS} --compact-dex-level=$1"
192        shift
193    elif [ "x$1" = "x--jvmti-redefine-stress" ]; then
194        # APP_IMAGE doesn't really work with jvmti redefine stress
195        USE_JVMTI="y"
196        APP_IMAGE="n"
197        JVMTI_STRESS="y"
198        JVMTI_REDEFINE_STRESS="y"
199        shift
200    elif [ "x$1" = "x--jvmti-step-stress" ]; then
201        USE_JVMTI="y"
202        JVMTI_STRESS="y"
203        JVMTI_STEP_STRESS="y"
204        shift
205    elif [ "x$1" = "x--jvmti-field-stress" ]; then
206        USE_JVMTI="y"
207        JVMTI_STRESS="y"
208        JVMTI_FIELD_STRESS="y"
209        shift
210    elif [ "x$1" = "x--jvmti-trace-stress" ]; then
211        USE_JVMTI="y"
212        JVMTI_STRESS="y"
213        JVMTI_TRACE_STRESS="y"
214        shift
215    elif [ "x$1" = "x--no-app-image" ]; then
216        APP_IMAGE="n"
217        shift
218    elif [ "x$1" = "x--strip-dex" ]; then
219        STRIP_DEX="y"
220        shift
221    elif [ "x$1" = "x--host" ]; then
222        HOST="y"
223        ANDROID_ROOT="${ANDROID_HOST_OUT}"
224        ANDROID_RUNTIME_ROOT="${ANDROID_HOST_OUT}/com.android.runtime"
225        ANDROID_TZDATA_ROOT="${ANDROID_HOST_OUT}/com.android.tzdata"
226        shift
227    elif [ "x$1" = "x--bionic" ]; then
228        BIONIC="y"
229        # We need to create an ANDROID_ROOT because currently we cannot create
230        # the frameworks/libcore with linux_bionic so we need to use the normal
231        # host ones which are in a different location.
232        CREATE_ANDROID_ROOT="y"
233        shift
234    elif [ "x$1" = "x--runtime-extracted-zipapex" ]; then
235        shift
236        USE_EXTRACTED_ZIPAPEX="y"
237        EXTRACTED_ZIPAPEX_LOC="$1"
238        shift
239    elif [ "x$1" = "x--runtime-zipapex" ]; then
240        shift
241        USE_ZIPAPEX="y"
242        ZIPAPEX_LOC="$1"
243        # TODO (b/119942078): Currently apex does not support
244        # symlink_preferred_arch so we will not have a dex2oatd to execute and
245        # need to manually provide
246        # dex2oatd64.
247        DEX2OAT_DEBUG_BINARY="dex2oatd64"
248        shift
249    elif [ "x$1" = "x--no-prebuild" ]; then
250        PREBUILD="n"
251        shift
252    elif [ "x$1" = "x--no-image" ]; then
253        HAVE_IMAGE="n"
254        shift
255    elif [ "x$1" = "x--secondary" ]; then
256        SECONDARY_DEX=":$DEX_LOCATION/$TEST_NAME-ex.jar"
257        # Enable cfg-append to make sure we get the dump for both dex files.
258        # (otherwise the runtime compilation of the secondary dex will overwrite
259        # the dump of the first one).
260        FLAGS="${FLAGS} -Xcompiler-option --dump-cfg-append"
261        COMPILE_FLAGS="${COMPILE_FLAGS} --dump-cfg-append"
262        shift
263    elif [ "x$1" = "x--with-agent" ]; then
264        shift
265        USE_JVMTI="y"
266        WITH_AGENT+=("$1")
267        shift
268    elif [ "x$1" = "x--debug-wrap-agent" ]; then
269        WRAP_DEBUGGER_AGENT="y"
270        shift
271    elif [ "x$1" = "x--debug-agent" ]; then
272        shift
273        DEBUGGER="agent"
274        USE_JVMTI="y"
275        DEBUGGER_AGENT="$1"
276        TIME_OUT="n"
277        shift
278    elif [ "x$1" = "x--debug" ]; then
279        DEBUGGER="y"
280        TIME_OUT="n"
281        shift
282    elif [ "x$1" = "x--gdbserver-port" ]; then
283        shift
284        GDBSERVER_PORT=$1
285        shift
286    elif [ "x$1" = "x--gdbserver-bin" ]; then
287        shift
288        GDBSERVER_HOST=$1
289        GDBSERVER_DEVICE=$1
290        shift
291    elif [ "x$1" = "x--gdbserver" ]; then
292        USE_GDBSERVER="y"
293        DEV_MODE="y"
294        TIME_OUT="n"
295        HOST="y"
296        ANDROID_ROOT="${ANDROID_HOST_OUT}"
297        ANDROID_RUNTIME_ROOT="${ANDROID_HOST_OUT}/com.android.runtime"
298        ANDROID_TZDATA_ROOT="${ANDROID_HOST_OUT}/com.android.tzdata"
299        shift
300    elif [ "x$1" = "x--gdb" ]; then
301        USE_GDB="y"
302        DEV_MODE="y"
303        TIME_OUT="n"
304        shift
305    elif [ "x$1" = "x--gdb-arg" ]; then
306        shift
307        gdb_arg="$1"
308        GDB_ARGS="${GDB_ARGS} $gdb_arg"
309        shift
310    elif [ "x$1" = "x--zygote" ]; then
311        ZYGOTE="-Xzygote"
312        msg "Spawning from zygote"
313        shift
314    elif [ "x$1" = "x--dev" ]; then
315        DEV_MODE="y"
316        shift
317    elif [ "x$1" = "x--interpreter" ]; then
318        INTERPRETER="y"
319        shift
320    elif [ "x$1" = "x--jit" ]; then
321        JIT="y"
322        shift
323    elif [ "x$1" = "x--baseline" ]; then
324        FLAGS="${FLAGS} -Xcompiler-option --baseline"
325        COMPILE_FLAGS="${COMPILE_FLAGS} --baseline"
326        shift
327    elif [ "x$1" = "x--jvm" ]; then
328        USE_JVM="y"
329        shift
330    elif [ "x$1" = "x--invoke-with" ]; then
331        shift
332        if [ "x$1" = "x" ]; then
333            echo "$0 missing argument to --invoke-with" 1>&2
334            exit 1
335        fi
336        if [ "x$INVOKE_WITH" = "x" ]; then
337            INVOKE_WITH="$1"
338        else
339            INVOKE_WITH="$INVOKE_WITH $1"
340        fi
341        shift
342    elif [ "x$1" = "x--no-verify" ]; then
343        VERIFY="n"
344        shift
345    elif [ "x$1" = "x--verify-soft-fail" ]; then
346        VERIFY="s"
347        shift
348    elif [ "x$1" = "x--no-optimize" ]; then
349        OPTIMIZE="n"
350        shift
351    elif [ "x$1" = "x--chroot" ]; then
352        shift
353        CHROOT="$1"
354        shift
355    elif [ "x$1" = "x--android-root" ]; then
356        shift
357        ANDROID_ROOT="$1"
358        shift
359    elif [ "x$1" = "x--android-runtime-root" ]; then
360        shift
361        ANDROID_RUNTIME_ROOT="$1"
362        shift
363    elif [ "x$1" = "x--android-tzdata-root" ]; then
364        shift
365        ANDROID_TZDATA_ROOT="$1"
366        shift
367    elif [ "x$1" = "x--instruction-set-features" ]; then
368        shift
369        INSTRUCTION_SET_FEATURES="$1"
370        shift
371    elif [ "x$1" = "x--timeout" ]; then
372        shift
373        TIME_OUT_VALUE="$1"
374        shift
375    elif [ "x$1" = "x--" ]; then
376        shift
377        break
378    elif [ "x$1" = "x--64" ]; then
379        ISA="x86_64"
380        GDBSERVER_DEVICE="gdbserver64"
381        DALVIKVM="dalvikvm64"
382        LIBRARY_DIRECTORY="lib64"
383        TEST_DIRECTORY="nativetest64"
384        ARCHITECTURES_PATTERN="${ARCHITECTURES_64}"
385        shift
386    elif [ "x$1" = "x--experimental" ]; then
387        if [ "$#" -lt 2 ]; then
388            echo "missing --experimental option" 1>&2
389            exit 1
390        fi
391        EXPERIMENTAL="$EXPERIMENTAL $2"
392        shift 2
393    elif [ "x$1" = "x--external-log-tags" ]; then
394        EXTERNAL_LOG_TAGS="y"
395        shift
396    elif [ "x$1" = "x--dry-run" ]; then
397        DRY_RUN="y"
398        shift
399    elif [ "x$1" = "x--vdex" ]; then
400        TEST_VDEX="y"
401        shift
402    elif [ "x$1" = "x--dm" ]; then
403        TEST_DM="y"
404        shift
405    elif [ "x$1" = "x--vdex-filter" ]; then
406        shift
407        option="$1"
408        VDEX_ARGS="${VDEX_ARGS} --compiler-filter=$option"
409        shift
410    elif [ "x$1" = "x--vdex-arg" ]; then
411        shift
412        VDEX_ARGS="${VDEX_ARGS} $1"
413        shift
414    elif [ "x$1" = "x--sync" ]; then
415        SYNC_BEFORE_RUN="y"
416        shift
417    elif [ "x$1" = "x--profile" ]; then
418        PROFILE="y"
419        shift
420    elif [ "x$1" = "x--random-profile" ]; then
421        RANDOM_PROFILE="y"
422        shift
423    elif expr "x$1" : "x--" >/dev/null 2>&1; then
424        echo "unknown $0 option: $1" 1>&2
425        exit 1
426    else
427        break
428    fi
429done
430
431# The DEX_LOCATION with the chroot prefix, if any.
432CHROOT_DEX_LOCATION="$CHROOT$DEX_LOCATION"
433
434if [ "$USE_JVM" = "n" ]; then
435    FLAGS="${FLAGS} ${ANDROID_FLAGS}"
436    # we don't want to be trying to get adbconnections since the plugin might
437    # not have been built.
438    FLAGS="${FLAGS} -XjdwpProvider:none"
439    for feature in ${EXPERIMENTAL}; do
440        FLAGS="${FLAGS} -Xexperimental:${feature} -Xcompiler-option --runtime-arg -Xcompiler-option -Xexperimental:${feature}"
441        COMPILE_FLAGS="${COMPILE_FLAGS} --runtime-arg -Xexperimental:${feature}"
442    done
443fi
444
445if [ "$CREATE_ANDROID_ROOT" = "y" ]; then
446    ANDROID_ROOT=$DEX_LOCATION/android-root
447fi
448
449if [ "x$1" = "x" ] ; then
450  MAIN="Main"
451else
452  MAIN="$1"
453  shift
454fi
455
456if [ "$ZYGOTE" = "" ]; then
457    if [ "$OPTIMIZE" = "y" ]; then
458        if [ "$VERIFY" = "y" ]; then
459            DEX_OPTIMIZE="-Xdexopt:verified"
460        else
461            DEX_OPTIMIZE="-Xdexopt:all"
462        fi
463        msg "Performing optimizations"
464    else
465        DEX_OPTIMIZE="-Xdexopt:none"
466        msg "Skipping optimizations"
467    fi
468
469    if [ "$VERIFY" = "y" ]; then
470        JVM_VERIFY_ARG="-Xverify:all"
471        msg "Performing verification"
472    elif [ "$VERIFY" = "s" ]; then
473        JVM_VERIFY_ARG="Xverify:all"
474        DEX_VERIFY="-Xverify:softfail"
475        msg "Forcing verification to be soft fail"
476    else # VERIFY = "n"
477        DEX_VERIFY="-Xverify:none"
478        JVM_VERIFY_ARG="-Xverify:none"
479        msg "Skipping verification"
480    fi
481fi
482
483msg "------------------------------"
484
485if [ "$DEBUGGER" = "y" ]; then
486  # Use this instead for ddms and connect by running 'ddms':
487  # DEBUGGER_OPTS="-agentlib:jdwp=transport=dt_android_adb,server=y,suspend=y"
488  # TODO: add a separate --ddms option?
489
490  PORT=12345
491  msg "Waiting for jdb to connect:"
492  if [ "$HOST" = "n" ]; then
493    msg "    adb forward tcp:$PORT tcp:$PORT"
494  fi
495  msg "    jdb -attach localhost:$PORT"
496  if [ "$USE_JVM" = "n" ]; then
497    # TODO We should switch over to using the jvmti agent by default.
498    # Need to tell the runtime to enable the internal jdwp implementation.
499    DEBUGGER_OPTS="-XjdwpOptions:transport=dt_socket,address=$PORT,server=y,suspend=y -XjdwpProvider:internal"
500  else
501    DEBUGGER_OPTS="-agentlib:jdwp=transport=dt_socket,address=$PORT,server=y,suspend=y"
502  fi
503elif [ "$DEBUGGER" = "agent" ]; then
504  PORT=12345
505  # TODO Support ddms connection and support target.
506  if [ "$HOST" = "n" ]; then
507    echo "--debug-agent not supported yet for target!"
508    exit 1
509  fi
510  AGENTPATH=${DEBUGGER_AGENT}
511  if [ "$WRAP_DEBUGGER_AGENT" = "y" ]; then
512    WRAPPROPS="${ANDROID_ROOT}/${LIBRARY_DIRECTORY}/libwrapagentpropertiesd.so"
513    if [ "$TEST_IS_NDEBUG" = "y" ]; then
514      WRAPPROPS="${ANDROID_ROOT}/${LIBRARY_DIRECTORY}/libwrapagentproperties.so"
515    fi
516    AGENTPATH="${WRAPPROPS}=${ANDROID_BUILD_TOP}/art/tools/libjdwp-compat.props,${AGENTPATH}"
517  fi
518  msg "Connect to localhost:$PORT"
519  DEBUGGER_OPTS="-agentpath:${AGENTPATH}=transport=dt_socket,address=$PORT,server=y,suspend=y"
520fi
521
522for agent in "${WITH_AGENT[@]}"; do
523  FLAGS="${FLAGS} -agentpath:${agent}"
524done
525
526if [ "$USE_JVMTI" = "y" ]; then
527  if [ "$USE_JVM" = "n" ]; then
528    plugin=libopenjdkjvmtid.so
529    if  [[ "$TEST_IS_NDEBUG" = "y" ]]; then
530      plugin=libopenjdkjvmti.so
531    fi
532    # We used to add flags here that made the runtime debuggable but that is not
533    # needed anymore since the plugin can do it for us now.
534    FLAGS="${FLAGS} -Xplugin:${plugin}"
535  fi
536fi
537
538if [ "$IS_JVMTI_TEST" = "y" ]; then
539  agent=libtiagentd.so
540  lib=tiagentd
541  if  [[ "$TEST_IS_NDEBUG" = "y" ]]; then
542    agent=libtiagent.so
543    lib=tiagent
544  fi
545
546  ARGS="${ARGS} ${lib}"
547  if [[ "$USE_JVM" = "y" ]]; then
548    FLAGS="${FLAGS} -agentpath:${ANDROID_HOST_OUT}/nativetest64/${agent}=${TEST_NAME},jvm"
549  else
550    FLAGS="${FLAGS} -agentpath:${agent}=${TEST_NAME},art"
551  fi
552fi
553
554if [[ "$JVMTI_STRESS" = "y" ]]; then
555  agent=libtistressd.so
556  if  [[ "$TEST_IS_NDEBUG" = "y" ]]; then
557    agent=libtistress.so
558  fi
559
560  # Just give it a default start so we can always add ',' to it.
561  agent_args="jvmti-stress"
562  if [[ "$JVMTI_REDEFINE_STRESS" = "y" ]]; then
563    # We really cannot do this on RI so don't both passing it in that case.
564    if [[ "$USE_JVM" = "n" ]]; then
565      agent_args="${agent_args},redefine"
566    fi
567  fi
568  if [[ "$JVMTI_FIELD_STRESS" = "y" ]]; then
569    agent_args="${agent_args},field"
570  fi
571  if [[ "$JVMTI_STEP_STRESS" = "y" ]]; then
572    agent_args="${agent_args},step"
573  fi
574  if [[ "$JVMTI_TRACE_STRESS" = "y" ]]; then
575    agent_args="${agent_args},trace"
576  fi
577  # In the future add onto this;
578  if [[ "$USE_JVM" = "y" ]]; then
579    FLAGS="${FLAGS} -agentpath:${ANDROID_HOST_OUT}/nativetest64/${agent}=${agent_args}"
580  else
581    FLAGS="${FLAGS} -agentpath:${agent}=${agent_args}"
582  fi
583fi
584
585if [ "$USE_JVM" = "y" ]; then
586  export LD_LIBRARY_PATH=${ANDROID_HOST_OUT}/lib64
587  # Some jvmti tests are flaky without -Xint on the RI.
588  if [ "$IS_JVMTI_TEST" = "y" ]; then
589    FLAGS="${FLAGS} -Xint"
590  fi
591  # Xmx is necessary since we don't pass down the ART flags to JVM.
592  # We pass the classes2 path whether it's used (src-multidex) or not.
593  cmdline="${JAVA} ${DEBUGGER_OPTS} ${JVM_VERIFY_ARG} -Xmx256m -classpath classes:classes2 ${FLAGS} $MAIN $@ ${ARGS}"
594  if [ "$DEV_MODE" = "y" ]; then
595    echo $cmdline
596  fi
597  $cmdline
598  exit
599fi
600
601# Note: This must start with the CORE_IMG_JARS in Android.common_path.mk
602# because that's what we use for compiling the core.art image.
603# It may contain additional modules from TEST_CORE_JARS.
604bpath_modules="core-oj core-libart okhttp bouncycastle apache-xml conscrypt"
605if [ "${HOST}" = "y" ]; then
606    framework="${ANDROID_HOST_OUT}/framework"
607    if [ "${ANDROID_HOST_OUT:0:${#ANDROID_BUILD_TOP}+1}" = "${ANDROID_BUILD_TOP}/" ]; then
608      framework_location="${ANDROID_HOST_OUT:${#ANDROID_BUILD_TOP}+1}/framework"
609    else
610      echo "error: ANDROID_BUILD_TOP/ is not a prefix of ANDROID_HOST_OUT"
611      echo "ANDROID_BUILD_TOP=${ANDROID_BUILD_TOP}"
612      echo "ANDROID_HOST_OUT=${ANDROID_HOST_OUT}"
613      exit
614    fi
615    bpath_suffix="-hostdex"
616else
617    framework="${ANDROID_ROOT}/framework"
618    framework_location="${ANDROID_ROOT}/framework"
619    bpath_suffix="-testdex"
620fi
621bpath=""
622bpath_locations=""
623bpath_separator=""
624for bpath_module in ${bpath_modules}; do
625  bpath+="${bpath_separator}${framework}/${bpath_module}${bpath_suffix}.jar"
626  bpath_locations+="${bpath_separator}${framework_location}/${bpath_module}${bpath_suffix}.jar"
627  bpath_separator=":"
628done
629# Pass down the bootclasspath
630FLAGS="${FLAGS} -Xbootclasspath:${bpath}"
631FLAGS="${FLAGS} -Xbootclasspath-locations:${bpath_locations}"
632COMPILE_FLAGS="${COMPILE_FLAGS} --runtime-arg -Xbootclasspath:${bpath}"
633COMPILE_FLAGS="${COMPILE_FLAGS} --runtime-arg -Xbootclasspath-locations:${bpath_locations}"
634
635if [ "$HAVE_IMAGE" = "n" ]; then
636    # Disable image dex2oat - this will forbid the runtime to patch or compile an image.
637    FLAGS="${FLAGS} -Xnoimage-dex2oat"
638
639    # We'll abuse a second flag here to test different behavior. If --relocate, use the
640    # existing image - relocation will fail as patching is disallowed. If --no-relocate,
641    # pass a non-existent image - compilation will fail as dex2oat is disallowed.
642    if [ "${RELOCATE}" = "y" ] ; then
643      DALVIKVM_BOOT_OPT="-Ximage:${BOOT_IMAGE}"
644    else
645      DALVIKVM_BOOT_OPT="-Ximage:/system/non-existent/core.art"
646    fi
647else
648    DALVIKVM_BOOT_OPT="-Ximage:${BOOT_IMAGE}"
649fi
650
651
652if [ "$USE_GDB" = "y" ]; then
653  if [ "$USE_GDBSERVER" = "y" ]; then
654    echo "Cannot pass both --gdb and --gdbserver at the same time!" >&2
655    exit 1
656  elif [ "$HOST" = "n" ]; then
657    GDB="$GDBSERVER_DEVICE $GDBSERVER_PORT"
658  else
659    if [ `uname` = "Darwin" ]; then
660        GDB=lldb
661        GDB_ARGS="$GDB_ARGS -- $DALVIKVM"
662        DALVIKVM=
663    else
664        GDB=gdb
665        GDB_ARGS="$GDB_ARGS --args $DALVIKVM"
666        # Enable for Emacs "M-x gdb" support. TODO: allow extra gdb arguments on command line.
667        # gdbargs="--annotate=3 $gdbargs"
668    fi
669  fi
670elif [ "$USE_GDBSERVER" = "y" ]; then
671  if [ "$HOST" = "n" ]; then
672    echo "Cannot use --gdbserver in non-host configs" >&2
673    exit 1
674  fi
675  GDB="$GDBSERVER_HOST $GDBSERVER_PORT"
676fi
677
678if [ "$INTERPRETER" = "y" ]; then
679    INT_OPTS="${INT_OPTS} -Xint"
680    if [ "$VERIFY" = "y" ] ; then
681      INT_OPTS="${INT_OPTS} -Xcompiler-option --compiler-filter=quicken"
682      COMPILE_FLAGS="${COMPILE_FLAGS} --compiler-filter=quicken"
683    elif [ "$VERIFY" = "s" ]; then
684      INT_OPTS="${INT_OPTS} -Xcompiler-option --compiler-filter=extract"
685      COMPILE_FLAGS="${COMPILE_FLAGS} --compiler-filter=extract"
686      DEX_VERIFY="${DEX_VERIFY} -Xverify:softfail"
687    else # VERIFY = "n"
688      INT_OPTS="${INT_OPTS} -Xcompiler-option --compiler-filter=assume-verified"
689      COMPILE_FLAGS="${COMPILE_FLAGS} --compiler-filter=assume-verified"
690      DEX_VERIFY="${DEX_VERIFY} -Xverify:none"
691    fi
692fi
693
694if [ "$JIT" = "y" ]; then
695    INT_OPTS="${INT_OPTS} -Xusejit:true"
696    if [ "$VERIFY" = "y" ] ; then
697      INT_OPTS="${INT_OPTS} -Xcompiler-option --compiler-filter=quicken"
698      COMPILE_FLAGS="${COMPILE_FLAGS} --compiler-filter=quicken"
699    else
700      INT_OPTS="${INT_OPTS} -Xcompiler-option --compiler-filter=assume-verified"
701      COMPILE_FLAGS="${COMPILE_FLAGS} --compiler-filter=assume-verified"
702      DEX_VERIFY="${DEX_VERIFY} -Xverify:none"
703    fi
704else
705    INT_OPTS="${INT_OPTS} -Xusejit:false"
706fi
707
708JNI_OPTS="-Xjnigreflimit:512 -Xcheck:jni"
709
710COMPILE_FLAGS="${COMPILE_FLAGS} --runtime-arg -Xnorelocate"
711if [ "$RELOCATE" = "y" ]; then
712    FLAGS="${FLAGS} -Xrelocate"
713else
714    FLAGS="$FLAGS -Xnorelocate"
715fi
716
717if [ "$HOST" = "n" ]; then
718  # Need to be root to query /data/dalvik-cache
719  adb root > /dev/null
720  adb wait-for-device
721  ISA=
722  ISA_adb_invocation=
723  ISA_outcome=
724  # We iterate a few times to workaround an adb issue. b/32655576
725  for i in {1..10}; do
726    ISA_adb_invocation=$(adb shell ls -F /data/dalvik-cache)
727    ISA_outcome=$?
728    ISA=$(echo $ISA_adb_invocation | grep -Ewo "${ARCHITECTURES_PATTERN}")
729    if [ x"$ISA" != "x" ]; then
730      break;
731    fi
732  done
733  if [ x"$ISA" = "x" ]; then
734    echo "Unable to determine architecture"
735    # Print a few things for helping diagnosing the problem.
736    echo "adb invocation output: $ISA_adb_invocation"
737    echo "adb invocation outcome: $ISA_outcome"
738    echo $(adb shell ls -F /data/dalvik-cache)
739    echo $(adb shell ls /data/dalvik-cache)
740    echo ${ARCHITECTURES_PATTERN}
741    echo $(adb shell ls -F /data/dalvik-cache | grep -Ewo "${ARCHITECTURES_PATTERN}")
742    exit 1
743  fi
744fi
745
746if [ "$BIONIC" = "y" ]; then
747  # This is the location that soong drops linux_bionic builds. Despite being
748  # called linux_bionic-x86 the build is actually amd64 (x86_64) only.
749  if [ ! -e "$OUT_DIR/soong/host/linux_bionic-x86" ]; then
750    echo "linux_bionic-x86 target doesn't seem to have been built!" >&2
751    exit 1
752  fi
753  # Set timeout_dumper manually so it works even with apex's
754  TIMEOUT_DUMPER=$OUT_DIR/soong/host/linux_bionic-x86/bin/timeout_dumper
755fi
756
757# Prevent test from silently falling back to interpreter in no-prebuild mode. This happens
758# when DEX_LOCATION path is too long, because vdex/odex filename is constructed by taking
759# full path to dex, stripping leading '/', appending '@classes.vdex' and changing every
760# remaining '/' into '@'.
761if [ "$HOST" = "y" ]; then
762  max_filename_size=$(getconf NAME_MAX $DEX_LOCATION)
763else
764  # There is no getconf on device, fallback to standard value.
765  # See NAME_MAX in kernel <linux/limits.h>
766  max_filename_size=255
767fi
768# Compute VDEX_NAME.
769DEX_LOCATION_STRIPPED="${DEX_LOCATION#/}"
770VDEX_NAME="${DEX_LOCATION_STRIPPED//\//@}@$TEST_NAME.jar@classes.vdex"
771if [ ${#VDEX_NAME} -gt $max_filename_size ]; then
772    echo "Dex location path too long:"
773    echo "$VDEX_NAME is ${#VDEX_NAME} character long, and the limit is $max_filename_size."
774    exit 1
775fi
776
777BIN_DIR=$ANDROID_ROOT/bin
778
779profman_cmdline="true"
780dex2oat_cmdline="true"
781vdex_cmdline="true"
782dm_cmdline="true"
783mkdir_locations="${DEX_LOCATION}/dalvik-cache/$ISA"
784strip_cmdline="true"
785sync_cmdline="true"
786linkroot_cmdline="true"
787linkroot_overlay_cmdline="true"
788setupapex_cmdline="true"
789installapex_cmdline="true"
790
791linkdirs() {
792  find "$1" -maxdepth 1 -mindepth 1 -type d | xargs -i ln -sf '{}' "$2"
793}
794
795if [ "$CREATE_ANDROID_ROOT" = "y" ]; then
796  mkdir_locations="${mkdir_locations} ${ANDROID_ROOT}"
797  linkroot_cmdline="linkdirs ${ANDROID_HOST_OUT} ${ANDROID_ROOT}"
798  if [ "${BIONIC}" = "y" ]; then
799    # TODO Make this overlay more generic.
800    linkroot_overlay_cmdline="linkdirs $OUT_DIR/soong/host/linux_bionic-x86 ${ANDROID_ROOT}"
801  fi
802fi
803
804if [ "$USE_ZIPAPEX" = "y" ]; then
805  # TODO Currently this only works for linux_bionic zipapexes because those are
806  # stripped and so small enough that the ulimit doesn't kill us.
807  mkdir_locations="${mkdir_locations} $DEX_LOCATION/zipapex"
808  zip_options="-qq"
809  if [ "$DEV_MODE" = "y" ]; then
810    zip_options=""
811  fi
812  setupapex_cmdline="unzip -o -u ${zip_options} ${ZIPAPEX_LOC} apex_payload.zip -d ${DEX_LOCATION}"
813  installapex_cmdline="unzip -o -u ${zip_options} ${DEX_LOCATION}/apex_payload.zip -d ${DEX_LOCATION}/zipapex"
814  BIN_DIR=$DEX_LOCATION/zipapex/bin
815elif [ "$USE_EXTRACTED_ZIPAPEX" = "y" ]; then
816  # Just symlink the zipapex binaries
817  BIN_DIR=$DEX_LOCATION/zipapex/bin
818  # Force since some tests manually run this file twice.
819  ln_options=""
820  if [ "$DEV_MODE" = "y" ]; then
821    ln_options="--verbose"
822  fi
823  installapex_cmdline="ln -s -f ${ln_options} ${EXTRACTED_ZIPAPEX_LOC} ${DEX_LOCATION}/zipapex"
824fi
825
826# PROFILE takes precedence over RANDOM_PROFILE, since PROFILE tests require a
827# specific profile to run properly.
828if [ "$PROFILE" = "y" ] || [ "$RANDOM_PROFILE" = "y" ]; then
829  profman_cmdline="$BIN_DIR/profman  \
830    --apk=$DEX_LOCATION/$TEST_NAME.jar \
831    --dex-location=$DEX_LOCATION/$TEST_NAME.jar"
832  if [ -f $DEX_LOCATION/$TEST_NAME-ex.jar ]; then
833    profman_cmdline="${profman_cmdline} \
834      --apk=$DEX_LOCATION/$TEST_NAME-ex.jar \
835      --dex-location=$DEX_LOCATION/$TEST_NAME-ex.jar"
836  fi
837  COMPILE_FLAGS="${COMPILE_FLAGS} --profile-file=$DEX_LOCATION/$TEST_NAME.prof"
838  FLAGS="${FLAGS} -Xcompiler-option --profile-file=$DEX_LOCATION/$TEST_NAME.prof"
839  if [ "$PROFILE" = "y" ]; then
840    profman_cmdline="${profman_cmdline} --create-profile-from=$DEX_LOCATION/profile \
841        --reference-profile-file=$DEX_LOCATION/$TEST_NAME.prof"
842  else
843    profman_cmdline="${profman_cmdline} --generate-test-profile=$DEX_LOCATION/$TEST_NAME.prof \
844        --generate-test-profile-seed=0"
845  fi
846fi
847
848if [ "$PREBUILD" = "y" ]; then
849  mkdir_locations="${mkdir_locations} ${DEX_LOCATION}/oat/$ISA"
850  if [ "$APP_IMAGE" = "y" ]; then
851    # Pick a base that will force the app image to get relocated.
852    app_image="--base=0x4000 --app-image-file=$DEX_LOCATION/oat/$ISA/$TEST_NAME.art --resolve-startup-const-strings=true"
853  fi
854
855  dex2oat_binary=${DEX2OAT_DEBUG_BINARY}
856  if  [[ "$TEST_IS_NDEBUG" = "y" ]]; then
857    dex2oat_binary=${DEX2OAT_NDEBUG_BINARY}
858  fi
859  dex2oat_cmdline="$INVOKE_WITH $BIN_DIR/$dex2oat_binary \
860                      $COMPILE_FLAGS \
861                      --boot-image=${BOOT_IMAGE} \
862                      --dex-file=$DEX_LOCATION/$TEST_NAME.jar \
863                      --oat-file=$DEX_LOCATION/oat/$ISA/$TEST_NAME.odex \
864                      ${app_image} \
865                      --instruction-set=$ISA"
866  if [ "x$INSTRUCTION_SET_FEATURES" != "x" ] ; then
867    dex2oat_cmdline="${dex2oat_cmdline} --instruction-set-features=${INSTRUCTION_SET_FEATURES}"
868  fi
869
870  # Add in a timeout. This is important for testing the compilation/verification time of
871  # pathological cases.
872  # Note: as we don't know how decent targets are (e.g., emulator), only do this on the host for
873  #       now. We should try to improve this.
874  #       The current value is rather arbitrary. run-tests should compile quickly.
875  # Watchdog timeout is in milliseconds so add 3 '0's to the dex2oat timeout.
876  if [ "$HOST" != "n" ]; then
877    # Use SIGRTMIN+2 to try to dump threads.
878    # Use -k 1m to SIGKILL it a minute later if it hasn't ended.
879    dex2oat_cmdline="timeout -k ${DEX2OAT_TIMEOUT}s -s SIGRTMIN+2 ${DEX2OAT_RT_TIMEOUT}s ${dex2oat_cmdline} --watchdog-timeout=${DEX2OAT_TIMEOUT}000"
880  fi
881  if [ "$PROFILE" = "y" ] || [ "$RANDOM_PROFILE" = "y" ]; then
882    vdex_cmdline="${dex2oat_cmdline} ${VDEX_ARGS} --input-vdex=$DEX_LOCATION/oat/$ISA/$TEST_NAME.vdex --output-vdex=$DEX_LOCATION/oat/$ISA/$TEST_NAME.vdex"
883  elif [ "$TEST_VDEX" = "y" ]; then
884    vdex_cmdline="${dex2oat_cmdline} ${VDEX_ARGS} --input-vdex=$DEX_LOCATION/oat/$ISA/$TEST_NAME.vdex"
885  elif [ "$TEST_DM" = "y" ]; then
886    dex2oat_cmdline="${dex2oat_cmdline} --output-vdex=$DEX_LOCATION/oat/$ISA/primary.vdex"
887    dm_cmdline="zip -qj $DEX_LOCATION/oat/$ISA/$TEST_NAME.dm $DEX_LOCATION/oat/$ISA/primary.vdex"
888    vdex_cmdline="${dex2oat_cmdline} ${VDEX_ARGS} --dump-timings --dm-file=$DEX_LOCATION/oat/$ISA/$TEST_NAME.dm"
889  elif [ "$PROFILE" = "y" ] || [ "$RANDOM_PROFILE" = "y" ]; then
890    vdex_cmdline="${dex2oat_cmdline} --input-vdex=$DEX_LOCATION/oat/$ISA/$TEST_NAME.vdex --output-vdex=$DEX_LOCATION/oat/$ISA/$TEST_NAME.vdex"
891  fi
892fi
893
894if [ "$STRIP_DEX" = "y" ]; then
895  strip_cmdline="zip --quiet --delete $DEX_LOCATION/$TEST_NAME.jar classes.dex"
896fi
897
898if [ "$SYNC_BEFORE_RUN" = "y" ]; then
899  sync_cmdline="sync"
900fi
901
902DALVIKVM_ISA_FEATURES_ARGS=""
903if [ "x$INSTRUCTION_SET_FEATURES" != "x" ] ; then
904  DALVIKVM_ISA_FEATURES_ARGS="-Xcompiler-option --instruction-set-features=${INSTRUCTION_SET_FEATURES}"
905fi
906
907# java.io.tmpdir can only be set at launch time.
908TMP_DIR_OPTION=""
909if [ "$HOST" = "n" ]; then
910  TMP_DIR_OPTION="-Djava.io.tmpdir=/data/local/tmp"
911fi
912
913# We set DumpNativeStackOnSigQuit to false to avoid stressing libunwind.
914# b/27185632
915# b/24664297
916dalvikvm_cmdline="$INVOKE_WITH $GDB $BIN_DIR/$DALVIKVM \
917                  $GDB_ARGS \
918                  $FLAGS \
919                  $DEX_VERIFY \
920                  -XXlib:$LIB \
921                  $DEX2OAT \
922                  $DALVIKVM_ISA_FEATURES_ARGS \
923                  $ZYGOTE \
924                  $JNI_OPTS \
925                  $INT_OPTS \
926                  $DEBUGGER_OPTS \
927                  $DALVIKVM_BOOT_OPT \
928                  $TMP_DIR_OPTION \
929                  -XX:DumpNativeStackOnSigQuit:false \
930                  -cp $DEX_LOCATION/$TEST_NAME.jar$SECONDARY_DEX $MAIN $ARGS"
931
932# Remove whitespace.
933dex2oat_cmdline=$(echo $dex2oat_cmdline)
934dalvikvm_cmdline=$(echo $dalvikvm_cmdline)
935dm_cmdline=$(echo $dm_cmdline)
936vdex_cmdline=$(echo $vdex_cmdline)
937profman_cmdline=$(echo $profman_cmdline)
938
939# Use an empty ASAN_OPTIONS to enable defaults.
940# Note: this is required as envsetup right now exports detect_leaks=0.
941RUN_TEST_ASAN_OPTIONS=""
942
943# Multiple shutdown leaks. b/38341789
944if [ "x$RUN_TEST_ASAN_OPTIONS" != "x" ] ; then
945  RUN_TEST_ASAN_OPTIONS="${RUN_TEST_ASAN_OPTIONS}:"
946fi
947RUN_TEST_ASAN_OPTIONS="${RUN_TEST_ASAN_OPTIONS}detect_leaks=0"
948
949# For running, we must turn off logging when dex2oat is missing. Otherwise we use
950# the same defaults as for prebuilt: everything when --dev, otherwise errors and above only.
951if [ "$EXTERNAL_LOG_TAGS" = "n" ]; then
952  if [ "$DEV_MODE" = "y" ]; then
953      export ANDROID_LOG_TAGS='*:d'
954  elif [ "$HAVE_IMAGE" = "n" ]; then
955      # All tests would log the error of missing image. Be silent here and only log fatal
956      # events.
957      export ANDROID_LOG_TAGS='*:s'
958  else
959      # We are interested in LOG(ERROR) output.
960      export ANDROID_LOG_TAGS='*:e'
961  fi
962fi
963
964if [ "$HOST" = "n" ]; then
965    adb root > /dev/null
966    adb wait-for-device
967    if [ "$QUIET" = "n" ]; then
968      adb shell rm -rf $CHROOT_DEX_LOCATION
969      adb shell mkdir -p $CHROOT_DEX_LOCATION
970      adb push $TEST_NAME.jar $CHROOT_DEX_LOCATION
971      adb push $TEST_NAME-ex.jar $CHROOT_DEX_LOCATION
972      if [ "$PROFILE" = "y" ] || [ "$RANDOM_PROFILE" = "y" ]; then
973        adb push profile $CHROOT_DEX_LOCATION
974      fi
975      # Copy resource folder
976      if [ -d res ]; then
977        adb push res $CHROOT_DEX_LOCATION
978      fi
979    else
980      adb shell rm -rf $CHROOT_DEX_LOCATION >/dev/null 2>&1
981      adb shell mkdir -p $CHROOT_DEX_LOCATION >/dev/null 2>&1
982      adb push $TEST_NAME.jar $CHROOT_DEX_LOCATION >/dev/null 2>&1
983      adb push $TEST_NAME-ex.jar $CHROOT_DEX_LOCATION >/dev/null 2>&1
984      if [ "$PROFILE" = "y" ] || [ "$RANDOM_PROFILE" = "y" ]; then
985        adb push profile $CHROOT_DEX_LOCATION >/dev/null 2>&1
986      fi
987      # Copy resource folder
988      if [ -d res ]; then
989        adb push res $CHROOT_DEX_LOCATION >/dev/null 2>&1
990      fi
991    fi
992
993    LD_LIBRARY_PATH=/data/$TEST_DIRECTORY/art/$ISA
994    if [ "$ANDROID_ROOT" != "/system" ]; then
995      # Current default installation is dalvikvm 64bits and dex2oat 32bits,
996      # so we can only use LD_LIBRARY_PATH when testing on a local
997      # installation.
998      LD_LIBRARY_PATH="$ANDROID_ROOT/$LIBRARY_DIRECTORY:$LD_LIBRARY_PATH"
999    fi
1000
1001    # System libraries needed by libarttestd.so
1002    PUBLIC_LIBS=libc++.so:libbacktrace.so:libbase.so:libnativehelper.so
1003    if [ "$TEST_IS_NDEBUG" = "y" ]; then
1004      PUBLIC_LIBS=$PUBLIC_LIBS:libart.so:libdexfile.so:libprofile.so:libartbase.so
1005    else
1006      PUBLIC_LIBS=$PUBLIC_LIBS:libartd.so:libdexfiled.so:libprofiled.so:libartbased.so
1007    fi
1008
1009    # Create a script with the command. The command can get longer than the longest
1010    # allowed adb command and there is no way to get the exit status from a adb shell
1011    # command. Dalvik cache is cleaned before running to make subsequent executions
1012    # of the script follow the same runtime path.
1013    cmdline="cd $DEX_LOCATION && \
1014             export ASAN_OPTIONS=$RUN_TEST_ASAN_OPTIONS && \
1015             export ANDROID_DATA=$DEX_LOCATION && \
1016             export ANDROID_ADDITIONAL_PUBLIC_LIBRARIES=$PUBLIC_LIBS && \
1017             export DEX_LOCATION=$DEX_LOCATION && \
1018             export ANDROID_ROOT=$ANDROID_ROOT && \
1019             export ANDROID_RUNTIME_ROOT=$ANDROID_RUNTIME_ROOT && \
1020             export ANDROID_TZDATA_ROOT=$ANDROID_TZDATA_ROOT && \
1021             export ANDROID_LOG_TAGS=$ANDROID_LOG_TAGS && \
1022             rm -rf ${DEX_LOCATION}/dalvik-cache/ && \
1023             mkdir -p ${mkdir_locations} && \
1024             export LD_LIBRARY_PATH=$LD_LIBRARY_PATH && \
1025             export PATH=$BIN_DIR:$PATH && \
1026             $profman_cmdline && \
1027             $dex2oat_cmdline && \
1028             $dm_cmdline && \
1029             $vdex_cmdline && \
1030             $strip_cmdline && \
1031             $sync_cmdline && \
1032             $dalvikvm_cmdline"
1033
1034    cmdfile=$(tempfile -p "cmd-" -s "-$TEST_NAME")
1035    echo "$cmdline" > $cmdfile
1036
1037    if [ "$DEV_MODE" = "y" ]; then
1038      echo $cmdline
1039    fi
1040
1041    if [ "$QUIET" = "n" ]; then
1042      adb push $cmdfile $CHROOT_DEX_LOCATION/cmdline.sh
1043    else
1044      adb push $cmdfile $CHROOT_DEX_LOCATION/cmdline.sh >/dev/null 2>&1
1045    fi
1046
1047    exit_status=0
1048    if [ "$DRY_RUN" != "y" ]; then
1049      if [ -n "$CHROOT" ]; then
1050        adb shell chroot "$CHROOT" sh $DEX_LOCATION/cmdline.sh
1051      else
1052        adb shell sh $DEX_LOCATION/cmdline.sh
1053      fi
1054      exit_status=$?
1055    fi
1056
1057    rm -f $cmdfile
1058    exit $exit_status
1059else
1060    # Host run.
1061    export ANDROID_PRINTF_LOG=brief
1062
1063    export ANDROID_DATA="$DEX_LOCATION"
1064    export ANDROID_ROOT="${ANDROID_ROOT}"
1065    export ANDROID_RUNTIME_ROOT="${ANDROID_RUNTIME_ROOT}"
1066    export ANDROID_TZDATA_ROOT="${ANDROID_TZDATA_ROOT}"
1067    if [ "$USE_ZIPAPEX" = "y" ] || [ "$USE_EXRACTED_ZIPAPEX" = "y" ]; then
1068      # Put the zipapex files in front of the ld-library-path
1069      export LD_LIBRARY_PATH="${ANDROID_DATA}/zipapex/${LIBRARY_DIRECTORY}:${ANDROID_ROOT}/${TEST_DIRECTORY}"
1070      export DYLD_LIBRARY_PATH="${ANDROID_DATA}/zipapex/${LIBRARY_DIRECTORY}:${ANDROID_ROOT}/${TEST_DIRECTORY}"
1071    else
1072      export LD_LIBRARY_PATH="${ANDROID_ROOT}/${LIBRARY_DIRECTORY}:${ANDROID_ROOT}/${TEST_DIRECTORY}"
1073      export DYLD_LIBRARY_PATH="${ANDROID_ROOT}/${LIBRARY_DIRECTORY}:${ANDROID_ROOT}/${TEST_DIRECTORY}"
1074    fi
1075    export PATH="$PATH:$BIN_DIR"
1076
1077    # Temporarily disable address space layout randomization (ASLR).
1078    # This is needed on the host so that the linker loads core.oat at the necessary address.
1079    export LD_USE_LOAD_BIAS=1
1080
1081    cmdline="$dalvikvm_cmdline"
1082
1083    if [ "$TIME_OUT" = "gdb" ]; then
1084      if [ `uname` = "Darwin" ]; then
1085        # Fall back to timeout on Mac.
1086        TIME_OUT="timeout"
1087      elif [ "$ISA" = "x86" ]; then
1088        # prctl call may fail in 32-bit on an older (3.2) 64-bit Linux kernel. Fall back to timeout.
1089        TIME_OUT="timeout"
1090      else
1091        # Check if gdb is available.
1092        gdb --eval-command="quit" > /dev/null 2>&1
1093        if [ $? != 0 ]; then
1094          # gdb isn't available. Fall back to timeout.
1095          TIME_OUT="timeout"
1096        fi
1097      fi
1098    fi
1099
1100    if [ "$TIME_OUT" = "timeout" ]; then
1101      # Add timeout command if time out is desired.
1102      #
1103      # Note: We first send SIGRTMIN+2 (usually 36) to ART, which will induce a full thread dump
1104      #       before abort. However, dumping threads might deadlock, so we also use the "-k"
1105      #       option to definitely kill the child.
1106      # Note: Using "--foreground" to not propagate the signal to children, i.e., the runtime.
1107      cmdline="timeout --foreground -k 120s -s SIGRTMIN+2 ${TIME_OUT_VALUE}s ${TIMEOUT_DUMPER} $cmdline"
1108    fi
1109
1110    if [ "$DEV_MODE" = "y" ]; then
1111      for var in ANDROID_PRINTF_LOG ANDROID_DATA ANDROID_ROOT LD_LIBRARY_PATH DYLD_LIBRARY_PATH PATH LD_USE_LOAD_BIAS; do
1112        echo EXPORT $var=${!var}
1113      done
1114      echo "$(declare -f linkdirs)"
1115      echo "mkdir -p ${mkdir_locations} && $setupapex_cmdline && $installapex_cmdline && $linkroot_cmdline && $linkroot_overlay_cmdline && $profman_cmdline && $dex2oat_cmdline && $dm_cmdline && $vdex_cmdline && $strip_cmdline && $sync_cmdline && $cmdline"
1116    fi
1117
1118    cd $ANDROID_BUILD_TOP
1119
1120    # Make sure we delete any existing compiler artifacts.
1121    # This enables tests to call the RUN script multiple times in a row
1122    # without worrying about interference.
1123    rm -rf ${DEX_LOCATION}/oat
1124    rm -rf ${DEX_LOCATION}/dalvik-cache/
1125
1126    export ASAN_OPTIONS=$RUN_TEST_ASAN_OPTIONS
1127
1128    mkdir -p ${mkdir_locations} || exit 1
1129    $setupapex_cmdline || { echo "zipapex extraction failed." >&2 ; exit 2; }
1130    $installapex_cmdline || { echo "zipapex install failed. cmd was: ${installapex_cmdline}." >&2; find ${mkdir_locations} -type f >&2; exit 2; }
1131    $linkroot_cmdline || { echo "create symlink android-root failed." >&2 ; exit 2; }
1132    $linkroot_overlay_cmdline || { echo "overlay android-root failed." >&2 ; exit 2; }
1133    $profman_cmdline || { echo "Profman failed." >&2 ; exit 2; }
1134    $dex2oat_cmdline || { echo "Dex2oat failed." >&2 ; exit 2; }
1135    $dm_cmdline || { echo "Dex2oat failed." >&2 ; exit 2; }
1136    $vdex_cmdline || { echo "Dex2oat failed." >&2 ; exit 2; }
1137    $strip_cmdline || { echo "Strip failed." >&2 ; exit 3; }
1138    $sync_cmdline || { echo "Sync failed." >&2 ; exit 4; }
1139
1140    if [ "$DRY_RUN" = "y" ]; then
1141      exit 0
1142    fi
1143
1144    if [ "$USE_GDB" = "y" ]; then
1145      # When running under gdb, we cannot do piping and grepping...
1146      $cmdline "$@"
1147    elif [ "$USE_GDBSERVER" = "y" ]; then
1148      echo "Connect to $GDBSERVER_PORT"
1149      # When running under gdb, we cannot do piping and grepping...
1150      $cmdline "$@"
1151    else
1152      if [ "$TIME_OUT" != "gdb" ]; then
1153        trap 'kill -INT -$pid' INT
1154        $cmdline "$@" 2>&1 & pid=$!
1155        wait $pid
1156        exit_value=$?
1157        # Add extra detail if time out is enabled.
1158        if [ $exit_value = 124 ] && [ "$TIME_OUT" = "timeout" ]; then
1159          echo -e "\e[91mTEST TIMED OUT!\e[0m" >&2
1160        fi
1161        exit $exit_value
1162      else
1163        # With a thread dump that uses gdb if a timeout.
1164        trap 'kill -INT -$pid' INT
1165        $cmdline "$@" 2>&1 & pid=$!
1166        # Spawn a watcher process.
1167        ( sleep $TIME_OUT_VALUE && \
1168          echo "##### Thread dump using gdb on test timeout" && \
1169          ( gdb -q -p $pid --eval-command="info thread" --eval-command="thread apply all bt" \
1170                           --eval-command="call exit(124)" --eval-command=quit || \
1171            kill $pid )) 2> /dev/null & watcher=$!
1172        wait $pid
1173        test_exit_status=$?
1174        pkill -P $watcher 2> /dev/null # kill the sleep which will in turn end the watcher as well
1175        if [ $test_exit_status = 0 ]; then
1176          # The test finished normally.
1177          exit 0
1178        else
1179          # The test failed or timed out.
1180          if [ $test_exit_status = 124 ]; then
1181            # The test timed out.
1182            echo -e "\e[91mTEST TIMED OUT!\e[0m" >&2
1183          fi
1184          exit $test_exit_status
1185        fi
1186      fi
1187    fi
1188fi
1189