#!/bin/bash

PIN_ROOT=${PIN_ROOT:-$HOME/pin}
TS_ROOT=${TS_ROOT:-`dirname $0`}
TS_VARIANT=-debug
MT=

UNAME_OS=`uname -o`
if [ "$UNAME_OS" == "GNU/Linux" ]; then
  PIN_BINARY=${PIN_BINARY:-pin}
  DLL=so
  OS=linux
elif [ "$UNAME_OS" == "Cygwin" ]; then
  PIN_BINARY=${PIN_BINARY:-pin.bat}
  DLL=dll
  OS=windows
fi

export MSM_THREAD_SANITIZER=1


FOLLOW=-follow_execv
PIN_FLAGS=${PIN_FLAGS:-""}

TS_FLAGS="-short_name"
PIN_FLAGS=""

VERBOZE=0

for arg in "$@"; do
  case $arg in
    --opt) TS_VARIANT="";;
    --dbg) TS_VARIANT="-debug";;
    --mt)  MT=mt;;
    --v=[1-9]) VERBOZE=1; TS_FLAGS="$TS_FLAGS $arg";;
    --) shift; break;;
    -*) TS_FLAGS="$TS_FLAGS $arg";;
    *) break;;
  esac
  shift
done


ulimit -c 0 # core make very little sense here

if [ $VERBOZE == "1" ] ; then
  printf "PIN_ROOT   : %s\n" "$PIN_ROOT"
  printf "PIN_BINARY : %s\n" "$PIN_BINARY"
  printf "PIN_FLAGS  : %s\n" "$PIN_FLAGS"
  printf "TS_ROOT    : %s\n" "$TS_ROOT"
  printf "TS_VARIANT : %s\n" "$TS_VARIANT"
  printf "TS_FLAGS   : %s\n" "$TS_FLAGS"
  printf "PARAMS     : %s\n" "$*"
fi

if [ "$TS_VARIANT" == "-debug" ] ; then
  TS_FLAGS="$TS_FLAGS -slow_asserts"
fi

TS_PARAMS="$@"

run() {
  echo $@
  $@
}

run $PIN_ROOT/$PIN_BINARY $PIN_FLAGS $FOLLOW \
  -t64 $TS_ROOT/bin/amd64-$OS${TS_VARIANT}-ts_pin$MT.$DLL \
  -t   $TS_ROOT/bin/x86-$OS${TS_VARIANT}-ts_pin$MT.$DLL \
 $TS_FLAGS -- $TS_PARAMS