Revert "Invoke dex2oat explictly before dalvikvm"
Fails on device with:
07-13 04:35:49.410 24424 24424 F dex2oat : instruction_set_features.cc:58] static std::unique_ptr<const InstructionSetFeatures> art::InstructionSetFeatures::FromVariant(art::InstructionSet, const std::string &, std::string *) unimplemented None
Bug: 36824842
This reverts commit 4806f7afc92b1812cefaab291235d01773732400.
Change-Id: I34a23fb69b0284e6d70ec0a54d5ada9e107ffeb7
diff --git a/tools/art b/tools/art
index b9c986c..933ad7a 100644
--- a/tools/art
+++ b/tools/art
@@ -17,8 +17,8 @@
# Android (e.g. mksh).
# Globals
+ARCHS={arm,arm64,mips,mips64,x86,x86_64}
ART_BINARY=dalvikvm
-DEX2OAT_BINARY=dex2oat
DELETE_ANDROID_DATA="no"
LAUNCH_WRAPPER=
LIBART=libart.so
@@ -46,6 +46,29 @@
fi
}
+function replace_compiler_filter_with_interepret_only() {
+ ARGS_WITH_INTERPRET_ONLY=("$@")
+
+ found="false"
+ ((index=0))
+ while ((index <= $#)); do
+ what="${ARGS_WITH_INTERPRET_ONLY[$index]}"
+
+ case "$what" in
+ --compiler-filter=*)
+ ARGS_WITH_INTERPRET_ONLY[$index]="--compiler-filter=interpret-only"
+ found="true"
+ ;;
+ esac
+
+ ((index++))
+ shift
+ done
+ if [ "$found" != "true" ]; then
+ ARGS_WITH_INTERPRET_ONLY=(-Xcompiler-option --compiler-filter=interpret-only "${ARGS_WITH_INTERPRET_ONLY[@]}")
+ fi
+}
+
function usage() {
cat 1>&2 <<EOF
Usage: art [OPTIONS] [--] [ART_OPTIONS] CLASS
@@ -66,8 +89,6 @@
--verbose Run script verbosely.
The ART_OPTIONS are passed directly to the Android Runtime.
-Before calling ART, the script will invoke dex2oat on each element of the
-classpath. '-Xcompiler-option' and '-Ximage' will be forwarded to dex2oat.
Example:
art --32 -cp my_classes.dex MainClass
@@ -102,71 +123,10 @@
$LAUNCH_WRAPPER $ART_BINARY_PATH $lib \
-XXlib:$LIBART \
-Xnorelocate \
- -Ximage:$DEFAULT_IMAGE \
+ -Ximage:$ANDROID_ROOT/framework/core.art \
"$@"
}
-function run_dex2oat() {
- for dex_file in "${DEX2OAT_CLASSPATH[@]}"
- do
- while [ -h "$dex_file" ]; do
- # On Mac OS, readlink -f doesn't work.
- dex_file="$(readlink "$dex_file")"
- done
- local dalvik_cache=$ANDROID_DATA/dalvik-cache/$ISA
- # The oat file name if the absolute path of the dex file where '/' is
- # replaced by '@'. The first '/' in the path is ignored and must be removed.
- local oat_file=${dex_file//\//@}
- local oat_file=${oat_file:1}
- # When running dex2oat use the exact same context as when running dalvikvm.
- # (see run_art function)
- verbose_run ANDROID_DATA=$ANDROID_DATA \
- ANDROID_ROOT=$ANDROID_ROOT \
- LD_LIBRARY_PATH=$LD_LIBRARY_PATH \
- PATH=$ANDROID_ROOT/bin:$PATH \
- LD_USE_LOAD_BIAS=1 \
- $DEX2OAT_BINARY_PATH \
- --runtime-arg -Xnorelocate \
- --boot-image=$DEX2OAT_BOOTIMAGE \
- --instruction-set=$ISA \
- "${DEX2OAT_FLAGS[@]}" \
- --dex-file="$dex_file" \
- --oat-file="$dalvik_cache/$oat_file"
- done
-}
-
-# Extract the dex2oat flags from the list of arguments.
-# -Xcompiler-options arguments are stored in DEX2OAT_FLAGS array
-# -cp argument is split by ':' and stored in DEX2OAT_CLASSPATH
-# -Ximage argument is stored in DEX2OAT_BOOTIMAGE
-function extract_dex2oat_flags() {
- while [ $# -gt 0 ]; do
- case $1 in
- -Xcompiler-option)
- DEX2OAT_FLAGS+=("$2")
- shift
- ;;
- -Ximage:*)
- DEX2OAT_BOOTIMAGE=$1
- # Remove '-Ximage:' from the argument.
- DEX2OAT_BOOTIMAGE=${DEX2OAT_BOOTIMAGE##-Ximage:}
- ;;
- -cp)
- # TODO: support -classpath and CLASSPATH
- local oifs=$IFS
- IFS=':'
- for classpath_elem in $2
- do
- DEX2OAT_CLASSPATH+=("$classpath_elem")
- done
- shift
- IFS=$oifs
- ;;
- esac
- shift
- done
-}
-
while [[ "$1" = "-"* ]]; do
case $1 in
--)
@@ -187,11 +147,9 @@
;& # Fallthrough
--debug)
LIBART="libartd.so"
- DEX2OAT_BINARY="dex2oatd"
;;
--gdb)
LIBART="libartd.so"
- DEX2OAT_BINARY="dex2oatd"
LAUNCH_WRAPPER="gdb --args"
;;
--help)
@@ -234,15 +192,6 @@
PROG_DIR="$(cd "${PROG_NAME%/*}" ; pwd -P)"
ANDROID_ROOT=$PROG_DIR/..
ART_BINARY_PATH=$ANDROID_ROOT/bin/$ART_BINARY
-DEX2OAT_BINARY_PATH=$ANDROID_ROOT/bin/$DEX2OAT_BINARY
-
-if [ ! -x "$DEX2OAT_BINARY_PATH" ]; then
- cat 1>&2 <<EOF
-Android Runtime not found: $DEX2OAT_BINARY_PATH
-This script should be in the same directory as the Android Runtime ($DEX2OAT_BINARY).
-EOF
- exit 1
-fi
if [ ! -x "$ART_BINARY_PATH" ]; then
cat 1>&2 <<EOF
@@ -256,23 +205,11 @@
LD_LIBRARY_PATH=$ANDROID_ROOT/$LIBDIR
EXTRA_OPTIONS=""
-DEFAULT_IMAGE=$ANDROID_ROOT/framework/core.art
-DEX2OAT_FLAGS=()
-DEX2OAT_CLASSPATH=()
-DEX2OAT_BOOTIMAGE=$DEFAULT_IMAGE
-ISA=$($ART_BINARY_PATH -showversion | (read art version number isa && echo $isa))
-
-# Extract the dex2oat flags from the list of arguments.
-# -Xcompiler-options arguments are stored in DEX2OAT_FLAGS array
-# -cp argument is split by ':' and stored in DEX2OAT_CLASSPATH
-# -Ximage argument is stored in DEX2OAT_BOOTIMAGE
-extract_dex2oat_flags "$@"
-
# If ANDROID_DATA is the system ANDROID_DATA or is not set, use our own,
# and ensure we delete it at the end.
if [ "$ANDROID_DATA" = "/data" ] || [ "$ANDROID_DATA" = "" ]; then
ANDROID_DATA=$PWD/android-data$$
- mkdir -p "$ANDROID_DATA/dalvik-cache/$ISA"
+ mkdir -p $ANDROID_DATA/dalvik-cache/$ARCHS
DELETE_ANDROID_DATA="yes"
fi
@@ -281,6 +218,40 @@
EXTRA_OPTIONS="-Xcompiler-option --generate-debug-info"
fi
+if [ "$JIT_PROFILE" = "yes" ]; then
+ # Create the profile. The runtime expects profiles to be created before
+ # execution.
+ PROFILE_PATH="$ANDROID_DATA/primary.prof"
+ touch $PROFILE_PATH
+
+ # Replace the compiler filter with interpret-only so that we
+ # can capture the profile.
+ ARGS_WITH_INTERPRET_ONLY=
+ replace_compiler_filter_with_interepret_only "$@"
+
+ run_art -Xjitsaveprofilinginfo \
+ -Xps-min-methods-to-save:1 \
+ -Xps-min-classes-to-save:1 \
+ -Xps-min-notification-before-wake:10 \
+ -Xps-profile-path:$PROFILE_PATH \
+ -Xusejit:true \
+ "${ARGS_WITH_INTERPRET_ONLY[@]}" \
+ "&>" "$ANDROID_DATA/profile_gen.log"
+ EXIT_STATUS=$?
+
+ if [ $EXIT_STATUS != 0 ]; then
+ cat "$ANDROID_DATA/profile_gen.log"
+ clean_android_data
+ exit $EXIT_STATUS
+ fi
+
+ # Wipe dalvik-cache to prepare it for the next invocation.
+ rm -rf $ANDROID_DATA/dalvik-cache/$ARCHS/*
+
+ # Append arguments so next invocation of run_art uses the profile.
+ EXTRA_OPTIONS="$EXTRA_OPTIONS -Xcompiler-option --profile-file=$PROFILE_PATH"
+fi
+
# Protect additional arguments in quotes to preserve whitespaces when evaluated.
# This is for run-jdwp-test.sh which uses this script and has arguments with
# whitespaces when running on device.
@@ -289,43 +260,6 @@
shift
done
-if [ "$JIT_PROFILE" = "yes" ]; then
- # Create the profile. The runtime expects profiles to be created before
- # execution.
- PROFILE_PATH="$ANDROID_DATA/primary.prof"
- touch $PROFILE_PATH
-
- run_art -Xjitsaveprofilinginfo \
- -Xps-min-methods-to-save:1 \
- -Xps-min-classes-to-save:1 \
- -Xps-min-notification-before-wake:10 \
- -Xps-profile-path:$PROFILE_PATH \
- -Xusejit:true \
- $EXTRA_OPTIONS \
- "&>" "$ANDROID_DATA/profile_gen.log"
-
- DEX2OAT_FLAGS+=("--profile-file=$PROFILE_PATH")
-
- EXIT_STATUS=$?
-
- if [ $EXIT_STATUS != 0 ]; then
- cat "$ANDROID_DATA/profile_gen.log"
- clean_android_data
- exit $EXIT_STATUS
- fi
-fi
-
-# Run dex2oat before launching ART to generate the oat files for the classpath.
-run_dex2oat
-
-# Do not continue if the dex2oat failed.
-EXIT_STATUS=$?
-if [ $EXIT_STATUS != 0 ]; then
- echo "Failed dex2oat invocation" >&2
- exit $EXIT_STATUS
-fi
-
-# Launch ART using the additional arguments stored in EXTRA_OPTIONS.
run_art $EXTRA_OPTIONS
EXIT_STATUS=$?