# 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="$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

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 -o $ANDROID_DATA/perf.data -e cycles:u $invoke_with"
fi

ANDROID_DATA=$ANDROID_DATA \
  ANDROID_ROOT=$ANDROID_ROOT \
  LD_LIBRARY_PATH=$LD_LIBRARY_PATH \
  $invoke_with $ANDROID_ROOT/bin/$DALVIKVM $lib \
    -XXlib:$LIBART \
    -Ximage:$ANDROID_ROOT/framework/core.art \
    -Xcompiler-option --include-debug-symbols \
    "$@"

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
