Files
mercury/tools/binary_step
Zoltan Somogyi bdc7c0ce09 Improvements to the infrastructure for debugging code generator changes.
Estimated hours taken: 5

Improvements to the infrastructure for debugging code generator changes.

tools/binary:
	If either stage2.ok or stage2.bad is missing object files, then do not
	complain: instead, recreate the missing object files.

	Fix a bug: copy the library's .pic_o files together with its .o files.

	Fix a bug: make sure that we link *all* the possible relevant .init
	files from the runtime to the stage2 directory.

	If the search narrows down to one file, and the script is trying to
	find out which part of the file is in error, then consider all the
	parts that are identical between the stage2.ok and stage2.bad to be
	known good from the start. This can reduce the number of bootchecks
	needed by one or two.

tools/binary:
tools/binary_step:
	Allow the test to be the successful compilation of the stage 3 library
	directory. (In almost all cases, bad stage 2 compilers fail while
	compiling the stage 3 library. By not compiling the stage 3 compiler
	if the compilation of the stage 3 library succeeds, we can save a lot
	of time.)

	If the search narrows down to one file, and the script is trying to
	find out which part of the file is in error, watch out for errors that
	prevent the stage 2 executable from being built. If such an error
	occurs, then stop right then and there. In such cases, there is no
	point in further binary search, since each further invocation of
	binary_step will just indicate that the source files in stage2.bad and
	stage2.ok are not compatible (e.g. because they do not use the same
	mapping from static term numbers to static term contents.)

tools/binary_step:
	Reduce the time for declaring a program to be in an infinite loop,
	since the slowest machine we may want to use is faster now.

tools/makebatch:
	Fix some glaring bugs: e.g. test uses -lt, not < for comparisons.

	Add an option, --stop-at-failure, that stops makebatch if a bootcheck
	fails and thus preserves the stage[23] directories involved in the
	failure. This allows one to verify that a change works in many grades
	without sacrificing the ability to debug any problems.

	Add another option --c-files, that gathers the C files created
	in each bootcheck. This allows the C files to be compared, e.g.
	for efficiency problems.
2000-07-19 03:45:11 +00:00

355 lines
7.8 KiB
Bash
Executable File

#!/bin/sh
# Test the stage2 directory to see whether it passes
# a bootstrap check and/or a check using the tests directory.
# If stage2 passes, binary_step returns an exit status of 0 (true);
# if it fails, binary_step returns an exit status of 1 (false).
#
# binary_step remakes the archive in stage2/library and the executable
# in stage2/compiler. In the intended use, the binary script sets up
# these directories so that these actions cause no recompilations,
# either Mercury to C or C to object, only linking. Other uses probably
# won't work.
usage="\
Usage: $0 [options]
Options:
-b, --no-bootcheck
Do not perform a bootcheck; check only the tests directory.
-c, --compile-only
Check the successful creation of the stage3 .c files,
but do not compare stage2.ok and stage3.
-C, --compare-to-bad
Compile stage3 using the parameter settings in the stage2.bad
directory, and compare stage3 to stage2.bad, not stage2.ok.
-d, --dependency-only
Check only that the dependencies can be made in stage3.
-h, --help
Display this usage message.
-j <num-jobs>, --jobs <num-jobs>
Run using <num-jobs> different parallel processes.
-l, --library-only
Check the successful creation of the stage3 .c files in the
library, but do not compile the compiler directory.
-m <mmake-args>, --mmake-args <mmake-args>
Pass <mmake-args> as options to \`mmake'.
-o <filename>, --output-file <filename>
Output results to <filename>.
-s <command>, --single-command <command>
Execute the given command using the constructed compiler.
-t <testdir>, --test-dir <testdir>
Execute runtests from the named subdirectory of tests.
"
# If you change this, you will also need to change scripts/ml.in,
# scripts/c2init.in, Mmake.common.in, tools/bootcheck, tools/binary
# and tools/linear.
STD_LIB_NAME=mer_std
set -x
alltestdirs="benchmarks general hard_coded invalid valid warnings"
bootcheck="true"
compile_only="false"
dependency_only="false"
library_only="false"
jfactor=""
mmake_opts=""
outfile="DIFF.BINARY"
single_command=""
testdirs=""
basis="ok"
while [ $# -gt 0 ]; do
case "$1" in
-b|--no-bootcheck)
bootcheck="false" ;;
-c|--compile-only)
compile_only="true" ;;
-C|--compare-to-bad)
basis="bad" ;;
-d|--dependency-only)
dependency_only="true" ;;
-h|--help)
echo "$usage"
exit 0 ;;
-j|--jobs)
jfactor="-j$2"; shift ;;
-j*)
jfactor="-j` expr $1 : '-j\(.*\)' `" ;;
--jobs*)
jfactor="--jobs` expr $1 : '--jobs\(.*\)' `" ;;
-l|--library-only)
library_only="true" ;;
-m|--mmake)
mmake_opts="$mmake_opts $2"; shift ;;
-o|--output-file)
outfile="$2"; shift ;;
-o*)
outfile="` expr $1 : '-o\(.*\)' `"; ;;
-s|--single-command)
single_command="$2"; shift ;;
-s*)
single_command="` expr $1 : '-s\(.*\)' `" ;;
--single-command*)
single_command="` expr $1 : '--single-command\(.*\)' `" ;;
-t|--test-dir)
testdir="$2"; shift
if test -d tests/$testdir
then
testdirs="$testdirs $testdir"
else
if test "$testdir" = "all"
then
testdirs="$alltestdirs"
else
echo "tests has no subdirectory named $testdir"
fi
fi ;;
-t*)
testdir="` expr $1 : '-t\(.*\)' `"
if test -d tests/$testdir
then
testdirs="$testdirs $testdir"
else
if test "$testdir" = "all"
then
testdirs="$alltestdirs"
else
echo "tests has no subdirectory named $testdir"
fi
fi ;;
-*)
echo "$0: unknown option \`$1'" 1>&2
echo "$usage" 1>&2
exit 1 ;;
*)
echo "$usage" 1>&2
exit 1 ;;
esac
shift
done
root=`/bin/pwd`
MERCURY_COMPILER=$root/compiler/mercury_compile
export MERCURY_COMPILER
MERCURY_INT_DIR=$root/stage2/library
export MERCURY_INT_DIR
MMAKE_VPATH=.
export MMAKE_VPATH
MMAKE_DIR=../scripts
export MMAKE_DIR
# Ensure that mmake will not disturb the .o and .c files placed there by binary
set +x
touch stage2/library/*.c
touch stage2/compiler/*.c
sleep 2
touch stage2/library/*.int3
touch stage2/compiler/*.int3
sleep 2
touch stage2/library/*.date3
touch stage2/compiler/*.date3
touch stage2/library/*.int2
touch stage2/library/*.int
touch stage2/compiler/*.int2
touch stage2/compiler/*.int
sleep 2
touch stage2/library/*.date
touch stage2/compiler/*.date
touch stage2/library/*.opt
sleep 2
touch stage2/library/*.optdate
touch stage2/library/*.trans_opt
sleep 2
touch stage2/library/*.trans_opt_date
touch stage2/library/*.o
touch stage2/library/*.pic_o
touch stage2/compiler/*.o
# Rebuild the stage2 library and compiler from the components already there.
/bin/rm -f stage2/library/lib$STD_LIB_NAME.a stage2/library/lib$STD_LIB_NAME.so
/bin/rm -f stage2/compiler/mercury_compile
set -x
# the `RM_C=:' ensures that the `.c' files do not get deleted
if (cd stage2/library ; mmake $mmake_opts $jfactor RM_C=: )
then
echo "building of stage 2 library successful"
else
echo "building of stage 2 library not successful"
touch .stage2_problem
exit 1
fi
if (cd stage2/compiler ; mmake $mmake_opts $jfactor RM_C=: mercury_compile)
then
echo "building of stage 2 compiler successful"
else
echo "building of stage 2 compiler not successful"
touch .stage2_problem
exit 1
fi
unset MMAKE_VPATH
unset MMAKE_DIR
MERCURY_COMPILER=$root/stage2/compiler/mercury_compile
export MERCURY_COMPILER
MERCURY_INT_DIR=$root/stage3/library
export MERCURY_INT_DIR
ulimit -t 200
if test "$single_command" != ""
then
echo "executing $single_command"
arg $single_command
if $single_command
then
echo "command successful"
else
echo "command not successful"
exit 1
fi
fi
if "$bootcheck"
then
# Rebuild the stage3 library and compiler from scratch
/bin/rm -f stage3/library/*.c
/bin/rm -f stage3/library/*.d
/bin/rm -f stage3/library/*.optdate
/bin/rm -f stage3/library/*.trans_opt_date
/bin/rm -f stage3/library/*.date3
/bin/rm -f stage3/library/*.date
/bin/rm -f stage3/library/*.opt
/bin/rm -f stage3/library/*.trans_opt
/bin/rm -f stage3/library/*.int3
/bin/rm -f stage3/library/*.int2
/bin/rm -f stage3/library/*.int
/bin/rm -f stage3/compiler/*.c
/bin/rm -f stage3/compiler/*.d
/bin/rm -f stage3/compiler/*.optdate
/bin/rm -f stage3/compiler/*.trans_opt_date
/bin/rm -f stage3/compiler/*.date3
/bin/rm -f stage3/compiler/*.date
/bin/rm -f stage3/compiler/*.opt
/bin/rm -f stage3/compiler/*.trans_opt
/bin/rm -f stage3/compiler/*.int3
/bin/rm -f stage3/compiler/*.int2
/bin/rm -f stage3/compiler/*.int
if (cd stage3 ; mmake $mmake_opts depend_library depend_compiler)
then
echo "building of stage 3 dependencies successful"
if $dependency_only
then
exit 0
fi
else
echo "building of stage 3 dependencies not successful"
exit 1
fi
MMAKE_VPATH=.
export MMAKE_VPATH
MMAKE_DIR=../scripts
export MMAKE_DIR
if (cd stage3/library ; mmake -S $mmake_opts $jfactor ints ; mmake -S $mmake_opts $jfactor cs)
then
echo "building of stage 3 library successful"
if $library_only
then
exit 0
fi
else
echo "building of stage 3 library not successful"
exit 1
fi
if (cd stage3/compiler ; mmake -S $mmake_opts $jfactor ints ; mmake -S $mmake_opts $jfactor cs)
then
echo "building of stage 3 compiler successful"
else
echo "building of stage 3 compiler not successful"
exit 1
fi
if test "$compile_only" = false
then
founddiff=false
cat /dev/null > $outfile
for dir in library compiler
do
for file in stage2.$basis/$dir/*.c
do
stage3file="stage3/$dir/`basename $file`"
diff -u $file $stage3file >> $outfile ||
founddiff=true
done
done
if "$founddiff" = true
then
echo "error - stage2.$basis and stage3 differ!"
exit 1
else
echo "stage2.$basis and stage3 compare ok"
fi
fi
else
# since we have not created any stage3, we can't let MERCURY_INT_DIR
# to continue to refer to stage3/library
MERCURY_INT_DIR=$root/stage2/library
export MERCURY_INT_DIR
fi
for testdir in $testdirs
do
if (cd tests/$testdir; runtests)
then
echo "tests in the $testdir directory successful"
else
echo "tests in the $testdir directory not successful"
exit 1
fi
done
exit 0