# 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() {
  # Get the actual file, $DALVIKVM may be a symbolic link.
  # Use realpath instead of readlink because Android does not have a readlink.
  if [[ "$(realpath "$ANDROID_ROOT/bin/$DALVIKVM")" == *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.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
