Files
mercury/scripts/ml.in
Paul Bone df2349838f Introduce Ralph's History based Garbage Collector (HGC).
This change set creates a new value 'hgc' for the garbage collector grade
component.  This enables a new garbage collector included with the runtime
system.  Note that this garbage collector is experimental and this grade does
not work yet.

This change set represents work done by both myself and Ralph Becket.

runtime/mercury_hgc.c:
runtime/mercury_hgc.h:
    Include the new garbage collector.

runtime/mercury_expanding_array.h:
    This new header file provides a template for a type safe expanding array,
    it is used by HGC.

runtime/Mmakefile:
    Include the new modules in the runtime directory mercury_hgc.[ch] and
    mercury_expanding_array.h.

    Sort the lists of source files and header files.

compiler/globals.m:
    Include 'hgc' in the options for which garbage collector to use.

compiler/handle_options.m:
    Handle the new 'hgc' value for the garbage collector type.

compiler/options.m:
    Print out information about the new 'hgc' option in the --help text of the
    compiler.

compiler/compile_target_code.m:
    Pass the -DMR_HGC option to the C compiler for hgc grades.

compiler/add_pragma.m:
compiler/mercury_compile_mlds_back_end.m:
compiler/mlds_to_c.m:
compiler/peephole.m:
    Conform to changes in globals.m.

library/benchmarking.m:
    Fix a use of MR_CONSERVATIVE_GC that should have been MR_BOEHM_GC.

robdd/bryant.h:
    Include the mercury_hgc.h header file when MR_HGC is defined.

runtime/mercury_init.h:
runtime/mercury_heap.h:
    Include mercury_hgc.h when MR_HGC is defined.

runtime/mercury_memory_zones.c:
    Use mercury_hgc_add_roots_range when appropriate.

runtime/mercury_wrapper.c:
    Include initialisation code for HGC.

util/mkinit.c:
    Include a call to mercury_hgc_set_stack_bot in init files in the HGC grade.

runtime/mercury_conf_param.h:
runtime/mercury_grade.h:
scripts/canonical_grade.sh-subr
scripts/init_grade_options.sh-subr
scripts/mgnuc.in
scripts/ml.in
scripts/parse_grade_options.sh-subr
    Add the new hgc value for the garbage collector grade component.
2010-02-11 04:36:11 +00:00

605 lines
13 KiB
Bash

#! /bin/sh
# vim: ts=4 sw=4 noet
# @configure_input@
#---------------------------------------------------------------------------#
# Copyright (C) 1995-2008, 2010 The University of Melbourne.
# This file may only be copied under the terms of the GNU General
# Public License - see the file COPYING in the Mercury distribution.
#---------------------------------------------------------------------------#
#
# ML - Mercury Linker.
#
# Invokes GCC with the appropriate options to link in the Mercury library.
#
# Usage: see below.
#
# Environment variables: MERCURY_DEFAULT_GRADE, ...
#
# *************************************************************************
# *** IMPORTANT NOTE: any changes to this file may also require similar ***
# *** changes to compiler/compile_target_code.m and configure.in ***
# *************************************************************************
Usage="\
Name: ml - Mercury Linker
Usage: ml [<ml options>] [-- <gcc options>] files..."
FULLARCH=@FULLARCH@
DEFAULT_GRADE=${MERCURY_DEFAULT_GRADE=@DEFAULT_GRADE@}
# include the file `parse_ml_options.sh-subr'
@PARSE_ML_OPTIONS@
# add /usr/local/lib to the default search path, if needed
ALL_LOCAL_C_LIB_DIRS=${MERCURY_ALL_LOCAL_C_LIB_DIRS=@ALL_LOCAL_C_LIB_DIRS@}
NONSHARED_LIB_DIR=${MERCURY_NONSHARED_LIB_DIR=@NONSHARED_LIB_DIR@}
DEMANGLER=${MERCURY_DEMANGLER=mdemangle}
CC=${MERCURY_C_COMPILER="@CC@"}
MKFIFO=${MERCURY_MKFIFO="@MKFIFO@"}
ERROR_UNDEFINED="@ERROR_UNDEFINED@"
ALLOW_UNDEFINED="@ALLOW_UNDEFINED@"
EXE_RPATH_OPT=${MERCURY_EXE_RPATH_OPT="@EXE_RPATH_OPT@"}
EXE_RPATH_SEP=${MERCURY_EXE_RPATH_SEP="@EXE_RPATH_SEP@"}
EXT_FOR_SHARED_LIB=${MERCURY_EXT_FOR_SHARED_LIB="@EXT_FOR_SHARED_LIB@"}
LINK_SHARED_OBJ=${MERCURY_LINK_SHARED_OBJ="@LINK_SHARED_OBJ_SH@"}
SHLIB_RPATH_OPT=${MERCURY_SHLIB_RPATH_OPT="@SHLIB_RPATH_OPT@"}
SHLIB_RPATH_SEP=${MERCURY_SHLIB_RPATH_SEP="@SHLIB_RPATH_SEP@"}
FIX_PATH_FOR_LINKER=${MERCURY_PATH_FOR_LINKER="@FIX_PATH_FOR_CC@"}
LD_STATIC_FLAGS="@LD_STATIC_FLAGS@"
LDFLAGS_FOR_THREADS="@LDFLAGS_FOR_THREADS@"
LDFLAGS_FOR_TRACE="@LDFLAGS_FOR_TRACE@"
LD_LIBFLAGS_FOR_THREADS="@LD_LIBFLAGS_FOR_THREADS@"
THREAD_LIBS="@THREAD_LIBS@"
TRACE_BASE_LIBS_SYSTEM="@TRACE_BASE_LIBS_SYSTEM@"
TMPDIR=${TMPDIR=/tmp}
MATH_LIB=${MERCURY_MATH_LIB="@MATH_LIB@"}
# Note: the setting of SHARED_LIBS needs to come after the setting of MATH_LIB,
# since @SHARED_LIBS_SH@ may refer to $MATH_LIB.
SHARED_LIBS=${MERCURY_SHARED_LIBS="@SHARED_LIBS_SH@"}
# Set the MACOSX_DEPLOYMENT_TARGET environment variable if needed.
@SET_MACOSX_DEPLOYMENT_TARGET@
# When compiling in the hlc.gc grade using the Microsoft Visual C
# compiler, the default maximum stack size of 4Mb is too low for a
# recursive language.
# XXX at some stage this should become an option to ml
LINK=${LINK=/stack:10485760} # 10 Mb
export LINK
case "$CC" in
*gcc*)
COMPILER=gcc
;;
*lcc*)
COMPILER=lcc
;;
*cl* | *CL*)
COMPILER=cl
;;
cc* | */cc*)
COMPILER=cc
;;
*)
COMPILER=unknown
;;
esac
# On some systems we need -ldl (libdl.so) for dlopen() etc.
# The name of the needed library is determined by autoconf and passed through
# this variable.
DL_LIBRARY="@DL_LIBRARY@"
# Likewise for -lreadline -l{termcap,curses,ncurses}
READLINE_LIBRARIES="@READLINE_LIBRARIES@"
# If you change these, you will also need to change the files indicated
# in scripts/c2init.in.
RT_LIB_NAME=mer_rt
STD_LIB_NAME=mer_std
TRACE_LIB_NAME=mer_trace
SSDB_LIB_NAME=mer_ssdb
EVENTSPEC_LIB_NAME=mer_eventspec
BROWSER_LIB_NAME=mer_browser
MDBCOMP_LIB_NAME=mer_mdbcomp
MAYBE_STATIC_OPT=""
case $debug in
true)
trace=true
;;
false)
;;
esac
trace_base=false
case $trace in
true)
trace_base=true
;;
false)
;;
esac
case $ss_debug in
true)
trace_base=true
;;
false)
;;
esac
case "$mercury_stdlib_dir" in
"")
LIBDIR=
;;
*)
LIBDIR=$mercury_stdlib_dir/lib
;;
esac
# If you haven't set mercury_libs, set it to the default value
# (shared on most systems). Note that if you have set all_libs,
# it will also have set mercury_libs.
case $mercury_libs in
default)
mercury_libs=shared
case $FULLARCH in
i*86-*-freebsd*|i*86-*-cygwin*|i*86-*-solaris*)
# Shared libraries are not the default on the above systems.
# See configure.in for details.
case $make_shared_lib in
false)
mercury_libs=static
;;
esac
esac
;;
esac
# If you haven't set all_libs, set it to the default value
# (shared on most systems).
case $all_libs in
default)
all_libs=shared
case $FULLARCH in
i*86-*-freebsd*|i*86-*-cygwin*)
# Shared libraries are not the default on the above systems.
# See configure.in for details.
#
# We don't do this for Solaris/x86 because -ldl is
# only available for dynamically linked executables
# XXX With these defaults linking with Mercury
# libraries other than the standard library will fail.
case $make_shared_lib in
false)
all_libs=static
;;
esac
;;
esac
;;
esac
# Defaults have been set, now set options.
case $all_libs in
static)
MAYBE_STATIC_OPT=$LD_STATIC_FLAGS
;;
esac
#
# compute the canonical grade name from the options settings
#
# include the file `canonical_grade.sh-subr'
@CANONICAL_GRADE@
# if the --print-grade option is specified,
# then all we do is print the grade and then exit
case "$print_grade" in
true)
echo $GRADE
exit 0
;;
esac
# Compute the gc grade from the grade
case "$GRADE" in
*.par*.gcd*.prof*)
gc_grade=par_gc_debug_prof
;;
*.par*.gcd*)
gc_grade=par_gc_debug
;;
*.gcd*.prof*)
gc_grade=gc_debug_prof
;;
*.gcd*)
gc_grade=gc_debug
;;
*.par*.gc*.prof*)
gc_grade=par_gc_prof
;;
*.par*.gc*)
gc_grade=par_gc
;;
*.gc*.prof*)
gc_grade=gc_prof
;;
*.gc*)
gc_grade=gc
;;
*.hgc*)
gc_grade=hgc
;;
*.mps*)
gc_grade=mps
;;
*)
gc_grade=nogc
;;
esac
# if the --print-gc-grade option is specified,
# then all we do is print the gc grade and then exit
case "$print_gc_grade" in
true)
echo $gc_grade
exit 0
;;
esac
case "$gc_grade" in
nogc)
LIBGC=
LIBGC_STATIC=
;;
hgc)
# HGC is part of the runtime, don't link anything extra.
LIBGC=
LIBGC_STATIC=
;;
*)
LIBGC="-l$gc_grade"
LIBGC_STATIC=`$FIX_PATH_FOR_LINKER $LIBDIR/lib$gc_grade.@LIB_SUFFIX@`
;;
esac
case $readline in
true)
;;
false)
READLINE_LIBRARIES=
;;
esac
case $trace_base in
true)
TRACE_BASE_LIBS="-l$EVENTSPEC_LIB_NAME \
-l$BROWSER_LIB_NAME -l$MDBCOMP_LIB_NAME"
TRACE_BASE_LIBS_SYSTEM="$TRACE_BASE_LIBS_SYSTEM \
$READLINE_LIBRARIES"
TRACE_BASE_STATIC_LIBS="\
`$FIX_PATH_FOR_LINKER \
$LIBDIR/$GRADE/lib$EVENTSPEC_LIB_NAME.@LIB_SUFFIX@` \
`$FIX_PATH_FOR_LINKER \
$LIBDIR/$GRADE/lib$BROWSER_LIB_NAME.@LIB_SUFFIX@` \
`$FIX_PATH_FOR_LINKER \
$LIBDIR/$GRADE/lib$MDBCOMP_LIB_NAME.@LIB_SUFFIX@`"
;;
false)
TRACE_BASE_LIBS=
TRACE_BASE_LIBS_SYSTEM=
TRACE_BASE_STATIC_LIBS=
;;
esac
case $trace in
true)
TRACE_LIBS="-l$TRACE_LIB_NAME $TRACE_BASE_LIBS"
TRACE_LIBS_SYSTEM="$TRACE_BASE_LIBS_SYSTEM"
TRACE_STATIC_LIBS="\
`$FIX_PATH_FOR_LINKER \
$LIBDIR/$GRADE/lib$TRACE_LIB_NAME.@LIB_SUFFIX@` \
$TRACE_BASE_STATIC_LIBS"
;;
false)
TRACE_LIBS=
TRACE_LIBS_SYSTEM=
TRACE_STATIC_LIBS=
;;
esac
case $ss_debug in
true)
SSDB_LIBS="-l$SSDB_LIB_NAME"
SSDB_STATIC_LIBS="\
`$FIX_PATH_FOR_LINKER \
$LIBDIR/$GRADE/lib$SSDB_LIB_NAME.@LIB_SUFFIX@`"
;;
false)
SSDB_LIBS=
SSDB_STATIC_LIBS=
;;
esac
case $strip in
true)
STRIP_OPTS="-s"
;;
false)
STRIP_OPTS=""
;;
esac
# Determine whether to link the executable with debugging symbols when using
# MSVC.
if test $strip = "false" -a $COMPILER = "cl"
then
DEBUG_FLAG="/DEBUG"
else
DEBUG_FLAG=""
fi
case $gc_method in
mps)
use_thread_libs=true
;;
esac
case $thread_safe in
true)
use_thread_libs=true
;;
esac
case $use_thread_libs.$make_shared_lib in
true.false)
ARCH_OPTS=$LDFLAGS_FOR_THREADS
;;
true.true)
ARCH_OPTS=$LD_LIBFLAGS_FOR_THREADS
;;
false.*)
THREAD_LIBS=""
;;
esac
# Set the correct flags if we're to use the MS Visual C runtime.
use_msvcrt=@USE_MSVCRT@
if test $use_msvcrt = "yes"
then
MSVCRT_OPTS="/MD" # Enable linking with the MS Visual C runtime.
NODEFAULTLIB_FLAG="/nodefaultlib:libc"
else
MSVCRT_OPTS=""
NODEFAULTLIB_FLAG=""
fi
case $make_shared_lib in
true)
LINKER="$LINK_SHARED_OBJ"
case $allow_undef in
true)
UNDEF_OPT="$ALLOW_UNDEFINED"
;;
false)
UNDEF_OPT="$ERROR_UNDEFINED"
;;
esac
RPATH_OPT="$SHLIB_RPATH_OPT"
RPATH_SEP="$SHLIB_RPATH_SEP"
STDLIBS="$SHARED_LIBS $THREAD_LIBS"
case $trace in
true)
ARCH_OPTS="$ARCH_OPTS $LD_LIBFLAGS_FOR_TRACE"
;;
esac
;;
false)
LINKER="$CC"
UNDEF_OPT=""
RPATH_OPT="$EXE_RPATH_OPT"
RPATH_SEP="$EXE_RPATH_SEP"
STDLIBS="$MATH_LIB $THREAD_LIBS"
case $trace in
true)
ARCH_OPTS="$ARCH_OPTS $LDFLAGS_FOR_TRACE"
;;
esac
;;
esac
# If the --print-link-command option is specified,
# then all we do is print the command used to link executables
# and then exit.
case "$print_link_command" in
true)
echo $LINKER
exit 0
;;
esac
# If the --print-shared-lib-command option is specified,
# then all we do is print the command used to link executables
# and then exit.
case "$print_shared_lib_link_command" in
true)
echo $LINK_SHARED_OBJ
exit 0
;;
esac
if $print_map
then
PRINT_MAP_OPT="-Wl,--print-map"
else
PRINT_MAP_OPT=""
fi
merc_libdir_opts="\
@LIB_LIBPATH@$LIBDIR/$GRADE
@LIB_LIBPATH@$LIBDIR
"
system_libdir_opts=
for dir in $ALL_LOCAL_C_LIB_DIRS kludge_for_broken_shells; do
if test "$dir" != "kludge_for_broken_shells"
then
system_libdir_opts="@LIB_LIBPATH@$dir $system_libdir_opts"
fi
done
LIBDIR_OPTS="$user_libdir_opts $merc_libdir_opts $system_libdir_opts"
case $mercury_libs in
shared)
MERCURY_LIBS=${MERCURY_LIBS="$SSDB_LIBS $TRACE_LIBS \
-l$STD_LIB_NAME -l$RT_LIB_NAME $LIBGC"}
LIBS=${LIBS="$MERCURY_LIBS $TRACE_LIBS_SYSTEM $STDLIBS"}
merc_shlib_dirs="$merc_shlib_dirs $LIBDIR/$GRADE"
merc_shlib_dirs="$merc_shlib_dirs $LIBDIR"
;;
static)
MERCURY_LIBS=${MERCURY_LIBS="$SSDB_STATIC_LIBS \
$TRACE_STATIC_LIBS \
`$FIX_PATH_FOR_LINKER \
$LIBDIR/$GRADE/lib$STD_LIB_NAME.@LIB_SUFFIX@` \
`$FIX_PATH_FOR_LINKER \
$LIBDIR/$GRADE/lib$RT_LIB_NAME.@LIB_SUFFIX@` \
$LIBGC_STATIC"}
LIBS=${LIBS="$MERCURY_LIBS $TRACE_LIBS_SYSTEM $STDLIBS"}
merc_shlib_dirs=""
;;
none)
LIBS="$TRACE_LIBS_SYSTEM $STDLIBS"
LIBDIR_OPTS="$user_libdir_opts $system_libdir_opts"
merc_shlib_dirs=""
;;
esac
case $all_libs in
shared)
system_shlib_dirs=$ALL_LOCAL_C_LIB_DIRS
;;
static)
system_shlib_dirs=""
;;
esac
RPATH_OPT_LIST=
# only set RPATH_OPT_LIST if the system supports shared libraries
case $EXT_FOR_SHARED_LIB in
so)
prev=""
for dir in $user_shlib_dirs $merc_shlib_dirs \
$system_shlib_dirs 'kludge for broken shells'
do
case "$dir" in
'kludge for broken shells')
;;
*)
case "$prev" in
"")
RPATH_OPT_LIST="$RPATH_OPT$dir"
;;
*)
RPATH_OPT_LIST="$RPATH_OPT_LIST$RPATH_SEP$dir"
;;
esac
;;
esac
prev=$dir
done
;;
esac
case "$MKFIFO" in
none)
demangle=false
;;
esac
LINKER_PRE_FLAGS="$MSVCRT_OPTS $PRINT_MAP_OPT $UNDEF_OPT $STRIP_OPTS $MAYBE_STATIC_OPT $ARCH_OPTS"
LINKER_POST_FLAGS="@LINK_OPT_SEP@ $NODEFAULTLIB_FLAG $DEBUG_FLAG $LIBDIR_OPTS $RPATH_OPT_LIST $LIBS"
case $verbose in
true)
echo "ml: using grade \`$GRADE'"
case $demangle in
false)
echo $LINKER $LINKER_PRE_FLAGS "$@" $LINKER_POST_FLAGS
;;
true)
echo $LINKER $LINKER_PRE_FLAGS "$@" $LINKER_POST_FLAGS "|"
echo "$DEMANGLER"
;;
esac
;;
esac
case $demangle in
true)
# We would like to just run $CC and pipe the result into $DEMANGLER,
# but `$CC | $DEMANGLER' would return the wrong exit status, so
# we need to use a named pipe; if the system doesn't have named
# pipes, then we don't use the demangler.
# Create the pipe, making sure we remove it if interrupted.
old_umask=`umask`
umask 022
try=0
until
ML_TMPDIR=$TMPDIR/ml$$.$try
PIPE=$ML_TMPDIR/pipe
trap 'rmdir $ML_TMPDIR >/dev/null 2>&1; exit 1' 1 2 3 13 15
mkdir $ML_TMPDIR
do
try="`expr $try + 1`"
# give up after 20 tries
case "$try" in
20)
echo "ml: unable to create temporary directory for pipe" \
1>&2
exit 1
;;
esac
done
trap 'rm -rf $ML_TMPDIR; exit 1' 1 2 3 13 15
umask $old_umask
$MKFIFO $PIPE
# Execute the demangler in the background, with stdin coming from
# the pipe and with stdout redirected to stderr.
exec $DEMANGLER --explain-link-errors 1>&2 < $PIPE &
# Execute $CC with stdout & stderr redirected to go via the pipe
# to $DEMANGLER and then to stderr.
case $# in
0)
$LINKER $LINKER_PRE_FLAGS $LINKER_POST_FLAGS >$PIPE 2>&1
;;
*)
$LINKER $LINKER_PRE_FLAGS "$@" $LINKER_POST_FLAGS >$PIPE 2>&1
;;
esac
linker_status=$?
# Now we can remove the pipe; since is an open file, it will stay
# around until $DEMANGLER exits.
rm -rf $ML_TMPDIR
# Wait for the demangler to exit before exiting ourselves.
wait
exit $linker_status
;;
false)
case $# in
0)
exec $LINKER $LINKER_PRE_FLAGS $LINKER_POST_FLAGS
;;
*)
exec $LINKER $LINKER_PRE_FLAGS "$@" $LINKER_POST_FLAGS
;;
esac
;;
esac