#!/bin/sh
# Should point to the installation directory
prefix="/usr"
exec_prefix="/usr"
VALGRIND="/usr/lib/valgrind"


# Other stuff ...
version="1.0.4"
emailto="jseward@acm.org"

# name we were invoked with
vgname=`echo $0 | sed 's,^.*/,,'`

# Cachegrind options
vgopts=

# Prog and arg to run
argopts=

# Show usage info?
dousage=0

# show version info?
doversion=0

# Collect up args for Cachegrind
while [ $+ != 0 ]
do
  arg=$1
  case "$arg" in
#   options for the user
    --help)                 dousage=1; break;;
    --version)              doversion=1; break;;
    --logfile-fd=*)         vgopts="$vgopts $arg"; shift;;
    -v)                     vgopts="$vgopts $arg"; shift;;
    --verbose)              vgopts="$vgopts -v"; shift;;
    -q)                     vgopts="$vgopts $arg"; shift;;
    --quiet)                vgopts="$vgopts $arg"; shift;;
    --demangle=no)          vgopts="$vgopts $arg"; shift;;
    --demangle=yes)         vgopts="$vgopts $arg"; shift;;
    --trace-children=no)    vgopts="$vgopts $arg"; shift;;
    --trace-children=yes)   vgopts="$vgopts $arg"; shift;;
    --suppressions=*)       vgopts="$vgopts $arg"; shift;;
    --I1=*,*,*)             vgopts="$vgopts $arg"; shift;;
    --D1=*,*,*)             vgopts="$vgopts $arg"; shift;;
    --L2=*,*,*)             vgopts="$vgopts $arg"; shift;;
#   options for debugging Cachegrind
    --sanity-level=*)       vgopts="$vgopts $arg"; shift;;
    --single-step=yes)      vgopts="$vgopts $arg"; shift;;
    --single-step=no)       vgopts="$vgopts $arg"; shift;;
    --optimise=yes)         vgopts="$vgopts $arg"; shift;;
    --optimise=no)          vgopts="$vgopts $arg"; shift;;
    --instrument=yes)       vgopts="$vgopts $arg"; shift;;
    --instrument=no)        vgopts="$vgopts $arg"; shift;;
    --cleanup=yes)          vgopts="$vgopts $arg"; shift;;
    --cleanup=no)           vgopts="$vgopts $arg"; shift;;
    --trace-syscalls=yes)   vgopts="$vgopts $arg"; shift;;
    --trace-syscalls=no)    vgopts="$vgopts $arg"; shift;;
    --trace-signals=yes)    vgopts="$vgopts $arg"; shift;;
    --trace-signals=no)     vgopts="$vgopts $arg"; shift;;
    --trace-symtab=yes)     vgopts="$vgopts $arg"; shift;;
    --trace-symtab=no)      vgopts="$vgopts $arg"; shift;;
    --trace-malloc=yes)     vgopts="$vgopts $arg"; shift;;
    --trace-malloc=no)      vgopts="$vgopts $arg"; shift;;
    --trace-sched=yes)      vgopts="$vgopts $arg"; shift;;
    --trace-sched=no)       vgopts="$vgopts $arg"; shift;;
    --trace-pthread=none)   vgopts="$vgopts $arg"; shift;;
    --trace-pthread=some)   vgopts="$vgopts $arg"; shift;;
    --trace-pthread=all)    vgopts="$vgopts $arg"; shift;;
    --stop-after=*)         vgopts="$vgopts $arg"; shift;;
    --dump-error=*)         vgopts="$vgopts $arg"; shift;;
    -*)                     dousage=1; break;;
    *)                      break;;
  esac
done

if [ z"$doversion" = z1 ]; then
   echo "cachegrind-$version"
   exit 1
fi

if [ $# = 0 ] || [ z"$dousage" = z1 ]; then
   echo
   echo "usage: $vgname [options] prog-and-args"
   echo
   echo "  options for the user, with defaults in [ ], are:"
   echo "    --help                    show this message"
   echo "    --version                 show version"
   echo "    -q --quiet                run silently; only print error msgs"
   echo "    -v --verbose              be more verbose, incl counts of errors"
   echo "    --demangle=no|yes         automatically demangle C++ names? [yes]"
   echo "    --trace-children=no|yes   Cachegrind-ise child processes? [no]"
   echo "    --logfile-fd=<number>     file descriptor for messages [2=stderr]"
   echo "    --suppressions=<filename> is ignored"
   echo "    --I1=<size>,<assoc>,<line_size>  set I1 cache manually"
   echo "    --D1=<size>,<assoc>,<line_size>  set D1 cache manually"
   echo "    --L2=<size>,<assoc>,<line_size>  set L2 cache manually"
   echo
   echo "  options for debugging Cachegrind itself are:"
   echo "    --sanity-level=<number>   level of sanity checking to do [1]"
   echo "    --single-step=no|yes      translate each instr separately? [no]"
   echo "    --optimise=no|yes         improve intermediate code? [yes]"
   echo "    --instrument=no|yes       actually do memory checks? [yes]"
   echo "    --cleanup=no|yes          improve after instrumentation? [yes]"
   echo "    --trace-syscalls=no|yes   show all system calls? [no]"
   echo "    --trace-signals=no|yes    show signal handling details? [no]"
   echo "    --trace-symtab=no|yes     show symbol table details? [no]"
   echo "    --trace-malloc=no|yes     show client malloc details? [no]"
   echo "    --trace-sched=no|yes      show thread scheduler details? [no]"
   echo "    --trace-pthread=none|some|all  show pthread event details? [no]"
   echo "    --stop-after=<number>     switch to real CPU after executing"
   echo "                              <number> basic blocks [infinity]"
   echo "    --dump-error=<number>     show translation for basic block"
   echo "                              associated with <number>'th"
   echo "                              error context [0=don't show any]"
   echo
   echo "  Extra options are read from env variable \$CACHEGRIND_OPTS"
   echo
   echo "  Valgrind is Copyright (C) 2000-2002 Julian Seward"
   echo "  and licensed under the GNU General Public License, version 2."
   echo "  Bug reports, feedback, admiration, abuse, etc, to: $emailto."
   echo
   exit 1
fi

# A bit subtle.  The LD_PRELOAD added entry must be absolute
# and not depend on LD_LIBRARY_PATH.  This is so that we can
# mess with LD_LIBRARY_PATH for child processes, which makes
# libpthread.so fall out of visibility, independently of
# whether valgrind.so is visible.

VG_ARGS="$CACHEGRIND_OPTS $vgsupp $vgopts --cachesim=yes"
export VG_ARGS
LD_LIBRARY_PATH=$VALGRIND:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH
LD_PRELOAD=$VALGRIND/valgrind.so:$LD_PRELOAD
export LD_PRELOAD
#LD_DEBUG=files
#LD_DEBUG=symbols
#export LD_DEBUG
exec "$@"
