# 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

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 \
  PATH=$ANDROID_ROOT/bin:$PATH \
  $invoke_with $ANDROID_ROOT/bin/$DALVIKVM $lib \
    -XXlib:$LIBART \
    -Xnorelocate \
    -Ximage:$ANDROID_ROOT/framework/core.art \
    -Xcompiler-option --generate-debug-info \
    "$@"

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
