# 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 -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
