mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-17 02:13:54 +00:00
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.
355 lines
7.8 KiB
Bash
Executable File
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
|