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