Files
mercury/scripts/mtc
2020-06-16 17:26:02 +10:00

185 lines
4.7 KiB
Bash
Executable File

#!/bin/sh
#---------------------------------------------------------------------------#
# vim: ts=4 sw=4 expandtab ft=sh
#---------------------------------------------------------------------------#
# Copyright (C) 2005-2006 The University of Melbourne.
# Copyright (C) 2020 The Mercury team.
# This file may only be copied under the terms of the GNU General
# Public License - see the file COPYING in the Mercury distribution.
#---------------------------------------------------------------------------#
#
# IMPORTANT: the manpage is produced automatically from this help
# message, so if you change the help message, don't forget to check
# that the manpage still looks OK.
Help="\
Name: mtc - gathering trace counts from Mercury programs
Usage: mtc [options] <executable> [<args>]...
Description:
\`mtc' invokes the specified command \`<executable> <args>...'.
If that command is a Mercury program that was compiled with debugging
enabled (e.g. using the \`--debug' option), or if that command invokes
such a program, then mtc will cause the program to count the
number of times each event is executed, and to write out that data
to a file. Otherwise, mtc will execute the command line as if the
mtc prefix weren't there.
Options:
-c, --coverage-test
Ordinarily, the generated trace count file contains only
nonzero trace counts. This option causes even zero counts
to be written out, since coverage testing needs to know
which parts of the code are not executed.
-o <filename>, --output-file <filename>
Save the generated trace counts to <filename>.
-s <basename>, --summary-file=<basename>
If this option is given, the trace counts are put into a new
file whose name is <basename>.N for a small integer N, choosing
N to be the smallest integer for which <basename>.N doesn't yet
exist. If this is not initially possible for a small enough N
(due probably to previous runs), then the program will replace
all of the <basename>.N files with a summary named just
<basename>; if <basename> existed already, it will be included
in the summary as well. This way, at the end of a sequence of
runs of the program, the command \"mtc_union <basename>*\"
will compute a summary of all the trace counts files.
--summary-count=<maxN>
Gives the maximum value of N to use with --summary-file.
--help
Display this message.
If neither the -o nor the -s option is given, then the trace counts are put
into a file whose name is automatically generated. This name will start with
the prefix ".mercury_trace_counts", followed by a mangled version of the
name of the executable, and then the process id.
The -o and -s options are mutually exclusive.
Environment variables:
MERCURY_OPTIONS.
"
#---------------------------------------------------------------------------#
#
# process the command line options
#
coverage_test=false
output_file=""
summary_file=""
summary_limit=""
while test "$#" -gt 0
do
case "$1" in
-c|--coverage-test)
coverage_test=true
;;
--help)
echo "${Help}"
exit 0
;;
-o|--output-file)
output_file="$2";
shift
;;
-o*)
output_file="`expr $1 : '-o\(.*\)'`"
;;
--output-file=*)
output_file="`expr $1 : '--output-file=\(.*\)'`"
;;
-s|--summary-file)
summary_file="$2"
shift
;;
-s*)
summary_file="`expr $1 : '-s\(.*\)'`"
;;
--summary-file=*)
summary_file="`expr $1 : '--summary-file=\(.*\)'`"
;;
--summary-limit)
summary_limit="$2"
shift
;;
--summary-limit=*)
summary_limit="`expr $1 : '--summary-limit=\(.*\)'`"
;;
--)
shift
break
;;
-*)
echo "$0: unknown option \`$1'" 1>&2
exit 1
;;
*)
break
;;
esac
shift
done
case $# in
0)
echo "Usage: mtc [options] <executable> [<arg> ...]" 1>&2
exit 1
;;
esac
if test "${output_file}" != "" -a "${summary_file}" != ""
then
echo "The options --output-file and --summary-file are incompatible."
exit 1
fi
#---------------------------------------------------------------------------#
#
# Set the environment variables used by the Mercury runtime to the appropriate
# values to enable the gathering of trace counts, and then finally use
# ${invoke_cmd} to invoke the command.
#
MERCURY_OPTIONS="${MERCURY_OPTIONS} --trace-count"
if "${coverage_test}"
then
MERCURY_OPTIONS="${MERCURY_OPTIONS} --coverage-test"
fi
if test "${summary_file}" != ""
then
MERCURY_OPTIONS="${MERCURY_OPTIONS} --trace-count-summary-file=${summary_file}"
fi
if test "${summary_limit}" != ""
then
MERCURY_OPTIONS="${MERCURY_OPTIONS} --trace-count-summary-limit=${summary_limit}"
fi
if test "${output_file}" != ""
then
MERCURY_OPTIONS="${MERCURY_OPTIONS} --tc-output-file ${output_file}"
fi
export MERCURY_OPTIONS
exec "$@"
#---------------------------------------------------------------------------#