| # Copyright (C) 2011 The Android Open Source Project |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| # This script is used on host and device. It uses a common subset |
| # shell dialect that should work on the host (e.g. bash), and |
| # Android (e.g. mksh). |
| |
| function follow_links() { |
| if [ z"$BASH_SOURCE" != z ]; then |
| file="$BASH_SOURCE" |
| else |
| file="$0" |
| fi |
| while [ -h "$file" ]; do |
| # On Mac OS, readlink -f doesn't work. |
| file="$(readlink "$file")" |
| done |
| echo "$file" |
| } |
| |
| function find_libdir() { |
| # Use realpath instead of readlink because Android does not have a readlink. |
| if [ "$(realpath "$ANDROID_ROOT/bin/$DALVIKVM")" = "$(realpath "$ANDROID_ROOT/bin/dalvikvm64")" ]; then |
| echo "lib64" |
| else |
| echo "lib" |
| fi |
| } |
| |
| invoke_with= |
| DALVIKVM=dalvikvm |
| LIBART=libart.so |
| |
| while true; do |
| if [ "$1" = "--invoke-with" ]; then |
| shift |
| invoke_with="$invoke_with $1" |
| shift |
| elif [ "$1" = "-d" ]; then |
| LIBART="libartd.so" |
| shift |
| elif [ "$1" = "--32" ]; then |
| DALVIKVM=dalvikvm32 |
| shift |
| elif [ "$1" = "--64" ]; then |
| DALVIKVM=dalvikvm64 |
| shift |
| elif [ "$1" = "--perf" ]; then |
| PERF="record" |
| shift |
| elif [ "$1" = "--perf-report" ]; then |
| PERF="report" |
| shift |
| elif expr "$1" : "--" >/dev/null 2>&1; then |
| echo "unknown option: $1" 1>&2 |
| exit 1 |
| else |
| break |
| fi |
| done |
| |
| PROG_NAME="$(follow_links)" |
| PROG_DIR="$(cd "${PROG_NAME%/*}" ; pwd -P)" |
| ANDROID_ROOT=$PROG_DIR/.. |
| LIBDIR=$(find_libdir) |
| LD_LIBRARY_PATH=$ANDROID_ROOT/$LIBDIR |
| DEBUG_OPTION="" |
| |
| DELETE_ANDROID_DATA=false |
| # 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/{arm,arm64,x86,x86_64} |
| DELETE_ANDROID_DATA=true |
| fi |
| |
| if [ z"$PERF" != z ]; then |
| invoke_with="perf record -g -o $ANDROID_DATA/perf.data -e cycles:u $invoke_with" |
| DEBUG_OPTION="-Xcompiler-option --generate-debug-info" |
| fi |
| |
| # We use the PIC core image to work with perf. |
| ANDROID_DATA=$ANDROID_DATA \ |
| ANDROID_ROOT=$ANDROID_ROOT \ |
| LD_LIBRARY_PATH=$LD_LIBRARY_PATH \ |
| PATH=$ANDROID_ROOT/bin:$PATH \ |
| LD_USE_LOAD_BIAS=1 \ |
| $invoke_with $ANDROID_ROOT/bin/$DALVIKVM $lib \ |
| -XXlib:$LIBART \ |
| -Xnorelocate \ |
| -Ximage:$ANDROID_ROOT/framework/core-optimizing-pic.art \ |
| $DEBUG_OPTION \ |
| "$@" |
| |
| EXIT_STATUS=$? |
| |
| if [ z"$PERF" != z ]; then |
| if [ z"$PERF" = zreport ]; then |
| perf report -i $ANDROID_DATA/perf.data |
| fi |
| echo "Perf data saved in: $ANDROID_DATA/perf.data" |
| else |
| if [ "$DELETE_ANDROID_DATA" = "true" ]; then |
| rm -rf $ANDROID_DATA |
| fi |
| fi |
| |
| exit $EXIT_STATUS |