# Copyright  CNRS, INRIA, Universit Bordeaux 1
# See COPYING in top-level directory.
 
#! /bin/bash

debug=n
mpi=n
show_env=n
remove_new_file=no

USE_DYNINST=no

while getopts 'b:d:m:e' OPTION
do
  case $OPTION in
  b)
	unset USE_DYNINST
	shift
	;;
  d)	debug=y
  	shift
       	;;
  e)
	show_env=y
	shift
	;;
  m)
	mpi=y
	shift
	;;
  ?)	printf "Usage: %s: [-bdem] args\n" $(basename $0) >&2
	exit 2
	;;
  esac
done

prefix=/usr
exec_prefix=${prefix}
libdir=${prefix}/lib/powerpc-linux-gnu
bindir=${exec_prefix}/bin

# make sure eztrace libs are available
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$libdir

# dynamically instrument the program (if possible)
prog_name=$1
shift
new_prog_name=$prog_name

if [ "x$USE_DYNINST" != xno ]; then
  echo "Dynamic instrumentation enabled" >&2
  while [ -f $new_prog_name ];
  do
	new_prog_name="${new_prog_name}_inst"
  done

# find all the dyninst modules
  export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/x86_64-unknown-linux2.4/lib
  dyninst_libs=/x86_64-unknown-linux2.4/lib/libdyninstAPI.so

  if [ "x$EZTRACE_TRACE" != x ]; then
# only use the specified modules
    for module in $EZTRACE_TRACE
    do
      for dir in `echo $EZTRACE_LIBRARY_PATH |sed 's/:/ /g'`
      do
        if [ -f ${dir}/libeztrace-dyninst-$module.so ]; then
  	   dyninst_libs="$dyninst_libs:${dir}/libeztrace-dyninst-$module.so"
	fi
      done
    done
  else

# use all the available modules
    for dir in `echo $EZTRACE_LIBRARY_PATH |sed 's/:/ /g'`
    do
      for module in `ls $dir/libeztrace-dyninst-*.so 2>/dev/null`
      do
        dyninst_libs="$dyninst_libs:$module"
      done
    done
  fi

  export DYNINSTAPI_RT_LIB=/x86_64-unknown-linux2.4/lib/libdyninstAPI_RT.so.1
  LD_PRELOAD=$dyninst_libs ${bindir}/eztrace_dyninst $prog_name $new_prog_name >&2
  ret=$?
  if [ $ret -lt 0 ]; then
    echo "Error: Cannot instrument $prog_name" >&2
    exit 1
  elif [ $ret -ne 0 ]; then
    new_prog_name=$prog_name
#     cp $prog_name $new_prog_name
  else
    remove_new_file=yes
  fi
fi


# libeztrace should always be preloaded!
files=${libdir}/libeztrace-autostart.so.0

EZTRACE_LIBRARY_PATH=${EZTRACE_LIBRARY_PATH}:${libdir}/

if [ "x$EZTRACE_TRACE" != x ]; then

# only use the specified modules
  for module in $EZTRACE_TRACE
  do
    for dir in `echo $EZTRACE_LIBRARY_PATH |sed 's/:/ /g'`
    do
        if [ -f ${dir}/libeztrace-autostart-$module.so.0 ]; then
  	   files="$files:${dir}/libeztrace-autostart-$module.so.0"
	fi
    done
  done
else

# use all the available modules
  for dir in `echo $EZTRACE_LIBRARY_PATH |sed 's/:/ /g'`
  do
    for module in `ls $dir/libeztrace-autostart-*.so.0 2>/dev/null`
    do
      files="$files:$module"
    done
  done
fi

if [ x$debug = xy ]; then

#  generate a gdbinit file that will preload all the modules

   gdbinit_file=`mktemp`
   echo "set env LD_PRELOAD $files" > $gdbinit_file
   echo "set env LD_LIBRARY_PATH $LD_LIBRARY_PATH" >> $gdbinit_file
   echo "echo \n" >> $gdbinit_file
   echo "echo EZTrace: hook loaded\n" >> $gdbinit_file

   gdb -x $gdbinit_file  --args $new_prog_name $*
   rm $gdbinit_file
elif [ x$show_env = xy ]; then
    remove_new_file=no
    echo env LD_PRELOAD=$files LD_LIBRARY_PATH=$LD_LIBRARY_PATH $new_prog_name $*
elif [ x$mpi = xy ]; then
    remove_new_file=no
    echo env LD_PRELOAD $files LD_LIBRARY_PATH $LD_LIBRARY_PATH $new_prog_name $*
else
    LD_PRELOAD=$files $new_prog_name $*
fi

if [ "x$remove_new_file" = "xyes" ]; then
   echo "removing $new_prog_name"
   rm $new_prog_name
fi
