mirror of
https://github.com/Mercury-Language/mercury.git
synced 2025-12-06 07:49:02 +00:00
doc/mercury_user_guide.texi:
Fit the compilation section into its new position.
Fix the description of C# compilation.
scripts/mgnuc.in:
Change the help message NOT to assume that the C compiler is gcc,
since we have supported other C compilers as well for a long time.
Move a comment to the code it applies to.
compiler/mercury_compile_augment.m:
Add a comment.
compiler/export.m:
Replace /* */ C commments with // commments.
740 lines
22 KiB
Bash
740 lines
22 KiB
Bash
#! /bin/sh
|
|
#---------------------------------------------------------------------------#
|
|
# vim: ts=4 sw=4 expandtab ft=sh
|
|
#---------------------------------------------------------------------------#
|
|
# @configure_input@
|
|
#---------------------------------------------------------------------------#
|
|
# Copyright (C) 1995-2007, 2010-2012 The University of Melbourne.
|
|
# Copyright (C) 2013-2020, 2022-2023, 2025 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 NOTE: any changes to this file may also require similar ***
|
|
# *** changes to compiler/compile_target_code.m ***
|
|
# *************************************************************************
|
|
|
|
FULLARCH=@FULLARCH@
|
|
|
|
DEFAULT_GRADE=${MERCURY_DEFAULT_GRADE=@DEFAULT_GRADE@}
|
|
CC=${MERCURY_C_COMPILER="@CC@"}
|
|
C_COMPILER_TYPE=${MERCURY_C_COMPILER_TYPE="@C_COMPILER_TYPE@"}
|
|
CFLAGS_FOR_REGS="@CFLAGS_FOR_REGS@"
|
|
CFLAGS_FOR_GOTOS="@CFLAGS_FOR_GOTOS@"
|
|
CFLAGS_FOR_THREADS="@CFLAGS_FOR_THREADS@"
|
|
CFLAGS_FOR_LTO="@CFLAGS_FOR_LTO@"
|
|
CFLAGS_FOR_NO_STRICT_ALIASING="@CFLAGS_FOR_NO_STRICT_ALIASING@"
|
|
CFLAGS_FOR_ANSI="@CFLAGS_FOR_ANSI@"
|
|
CFLAGS_FOR_SANITIZERS="@CFLAGS_FOR_SANITIZERS@"
|
|
BYTES_PER_WORD="@BYTES_PER_WORD@"
|
|
MKTEMP=@MKTEMP@
|
|
TMPDIR=${TMPDIR=/tmp}
|
|
|
|
case "${C_COMPILER_TYPE}" in
|
|
gcc*)
|
|
CHECK_OPTS="
|
|
-Wall -Wwrite-strings
|
|
-Wshadow -Wstrict-prototypes -Wmissing-prototypes -Wno-unused"
|
|
|
|
# XXX The following comment is *very* old.
|
|
# Note: we do not enable the following gcc warnings:
|
|
# -Wredundant-decls causes too many complaints in system header files
|
|
# -Wpointer-arith causes too many complaints in system header files
|
|
# (fixed in gcc 3.0, though, so at some point
|
|
# we should re-enable this)
|
|
# -Wtraditional we don't care about compatibility with pre-ANSI C
|
|
# -Wconversion really only intended to help people using \`unprotoize'
|
|
# -Waggregate-return not useful, IMHO
|
|
|
|
# -Wcast-qual causes LOTS of redundant warnings
|
|
# -Wcast-align causes redundant warnings in memory.c
|
|
# -pedantic causes unsuppressable warnings about LVALUE_CAST()
|
|
# -Wnested-externs causes unsuppressable warnings about callentry()
|
|
# -Wid-clash-31 causes warnings about entry_mercury__xxx ...
|
|
# we don't care about compatibility with C compilers
|
|
# that have short fixed limits on identifier length
|
|
# -Wenum-clash is for C++ only
|
|
# -Wunused causes various spurious warnings
|
|
|
|
# Enabling -fomit-frame-pointer causes setjmp/longjmp to misbehave
|
|
# with MinGW on Windows XP.
|
|
case "${FULLARCH}" in
|
|
*mingw*)
|
|
OPT_OPTS="-O2 ${CFLAGS_FOR_NO_STRICT_ALIASING}"
|
|
;;
|
|
*)
|
|
OPT_OPTS="-O2 ${CFLAGS_FOR_NO_STRICT_ALIASING} -fomit-frame-pointer"
|
|
;;
|
|
esac
|
|
DEBUG_OPTS="-g"
|
|
DISABLE_OPTS_OPT="-O0"
|
|
COMPILER_HALT_AT_WARN_OPT="-Werror"
|
|
COMPILER=gcc
|
|
;;
|
|
clang*)
|
|
CHECK_OPTS="-w"
|
|
OPT_OPTS="@OPT_FLAGS_FOR_CLANG@ ${CFLAGS_FOR_NO_STRICT_ALIASING} -fomit-frame-pointer"
|
|
DEBUG_OPTS="-g"
|
|
DISABLE_OPTS_OPT="-O0"
|
|
COMPILER_HALT_AT_WARN_OPT="-Werror"
|
|
COMPILER=clang
|
|
;;
|
|
msvc*)
|
|
CHECK_OPTS="-nologo" # Suppress the MSVC banner message.
|
|
OPT_OPTS="-O1"
|
|
# See README.MS-VisualC for why we don't enable C level debugging.
|
|
#DEBUG_OPTS="-Zi"
|
|
DEBUG_OPTS=""
|
|
DISABLE_OPTS_OPT="-Od"
|
|
COMPILER_HALT_AT_WARN_OPT=""
|
|
COMPILER=cl
|
|
;;
|
|
*)
|
|
CHECK_OPTS=
|
|
OPT_OPTS="-O"
|
|
DEBUG_OPTS="-g"
|
|
DISABLE_OPTS_OPT="-O0"
|
|
COMPILER_HALT_AT_WARN_OPT=""
|
|
COMPILER=unknown
|
|
;;
|
|
esac
|
|
|
|
SPLIT_OPTS=""
|
|
INLINE_ALLOC_OPTS=""
|
|
|
|
verbose=false
|
|
mgnu_c_debug=false
|
|
c_optimize=true
|
|
use_activation_counts=false
|
|
preserve_tail_recursion=true
|
|
mercury_config_dir=${MERCURY_STDLIB_DIR-@LIBDIR@}
|
|
mercury_config_dir=${MERCURY_CONFIG_DIR=${mercury_config_dir}}
|
|
mercury_stdlib_dir=${MERCURY_STDLIB_DIR=@LIBDIR@}
|
|
do_filter_cc=true
|
|
halt_at_warn_if_possible=false
|
|
|
|
# include the file `init_grade_options.sh-subr'
|
|
@INIT_GRADE_OPTIONS@
|
|
|
|
# IMPORTANT: The manpage is produced automatically from this help message,
|
|
# so if you change it, do not forget to check that the manpage still looks OK.
|
|
|
|
Help="\
|
|
Name: mgnuc - Mercury front-end to GNU C
|
|
Usage: mgnuc [<options>] [-- <gcc/clang/msvc options>] files...
|
|
Options:
|
|
-v, --verbose
|
|
Echo gcc command before executing it.
|
|
--no-ansi
|
|
This option is deprecatd and no longer has any effect.
|
|
--no-check
|
|
Don't enable any of gcc's warnings.
|
|
-g, --c-debug
|
|
Generate object files that can debugged with C debuggers such as gdb.
|
|
--no-c-optimize
|
|
Disable optimization by the C compiler.
|
|
--inline-alloc
|
|
Inline calls to the memory allocator.
|
|
--mercury-standard-library-directory <directory>
|
|
--mercury-stdlib-dir <directory>
|
|
The directory containing the installed Mercury standard library.
|
|
--no-mercury-standard-library-directory, --no-mercury-stdlib-dir
|
|
Don't use an installed Mercury standard library.
|
|
--no-filter-cc
|
|
Do not filter warnings from the C compiler.
|
|
--halt-at-warn-if-possible
|
|
Convert warnings into errors if (a) the C compiler supports this,
|
|
and (b) the grade is an MLDS grade. (LLDS grades get some warnings
|
|
that cannot be avoided.)
|
|
|
|
${grade_usage}
|
|
|
|
Description:
|
|
This command runs the configured C compiler (usually gcc, clang, or msvc)
|
|
with the appropriate options for compiling Mercury programs.
|
|
Normally it invokes the C compiler with almost all warnings enabled,
|
|
but this can be changed using \`--no-check' option.
|
|
Environment variables:
|
|
MERCURY_DEFAULT_GRADE.
|
|
Files:
|
|
If the current directory contains a file named .mgnuc_copts, then mgnuc
|
|
will assume that it contains C compiler options that should be included
|
|
on the C compiler's command line. This is usually used to specify C
|
|
compiler search paths.
|
|
"
|
|
|
|
while true
|
|
do
|
|
case "$1" in
|
|
-h|--help|"-?")
|
|
echo "${Help}"
|
|
exit 0
|
|
;;
|
|
|
|
@MGNUC_FILE_OPTS@
|
|
|
|
--mercury-standard-library-directory|--mercury-stdlib-dir)
|
|
mercury_stdlib_dir="$2"
|
|
mercury_config_dir="$2"
|
|
shift
|
|
;;
|
|
|
|
--mercury-config-directory|--mercury-config-dir)
|
|
mercury_config_dir="$2"
|
|
shift
|
|
;;
|
|
|
|
# We don't allow `MERCURY_CONFIG_DIR' to be unset
|
|
# without `MERCURY_STDLIB_DIR' also being unset.
|
|
|
|
# include the file `parse_grade_options.sh-subr'
|
|
@PARSE_GRADE_OPTIONS@
|
|
|
|
--)
|
|
shift
|
|
break
|
|
;;
|
|
|
|
*)
|
|
break
|
|
;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
if test -r .mgnuc_opts
|
|
then
|
|
for opt in `cat .mgnuc_opts`
|
|
do
|
|
case "${opt}" in
|
|
|
|
@MGNUC_FILE_OPTS@
|
|
|
|
*)
|
|
echo "unknown option ${opt} in .mgnuc_opts"
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
fi
|
|
|
|
# Include the file `final_grade_options.sh-subr'.
|
|
@FINAL_GRADE_OPTIONS@
|
|
|
|
# Compute the canonical grade name from the options settings.
|
|
|
|
# Include the file `canonical_grade.sh-subr'.
|
|
@CANONICAL_GRADE@
|
|
|
|
case "${mercury_stdlib_dir}" in
|
|
"")
|
|
MERC_ALL_C_INCL_DIRS=
|
|
;;
|
|
*)
|
|
# The option setting code above guarantees that if
|
|
# `--mercury-stdlib-dir' is set, `--mercury-config-dir'
|
|
# is also set.
|
|
MERC_ALL_C_INCL_DIRS="-I${mercury_config_dir}/conf -I${mercury_stdlib_dir}/inc -I${mercury_stdlib_dir}/lib/${GRADE}/inc"
|
|
;;
|
|
esac
|
|
|
|
# Add /usr/local/include to the default search path, if needed.
|
|
ALL_LOCAL_C_INCL_DIRS=${MERCURY_ALL_LOCAL_C_INCL_DIRS=@ALL_LOCAL_C_INCL_DIRS@}
|
|
|
|
# Convert non-grade mgnuc options into gcc options.
|
|
#
|
|
# IMPORTANT: any changes here will require similar changes to
|
|
# compiler/compile_target_code.m.
|
|
|
|
case ${mgnu_c_debug} in
|
|
# We set a variable named MGNUC_C_DEBUG_OPTS here, in the code that handles
|
|
# a -g or a --c-debug option being given to mgnuc.
|
|
|
|
true)
|
|
# Because below we handle the related but nevertheless separate
|
|
# target_debug grade component, and *that* code sets a variable
|
|
# named TARGET_DEBUG_GRADE_OPTS, we have to zero out ${DEBUG_OPTS}
|
|
# to prevent *that* code from including *another* copy of the
|
|
# *original* ${DEBUG_OPTS} in the final list of C compiler options.
|
|
MGNUC_C_DEBUG_OPTS="${DEBUG_OPTS}"
|
|
DEBUG_OPTS=""
|
|
;;
|
|
false)
|
|
MGNUC_C_DEBUG_OPTS=""
|
|
;;
|
|
esac
|
|
|
|
case ${c_optimize} in
|
|
true) ;;
|
|
false) OPT_OPTS="" ;;
|
|
esac
|
|
|
|
# Convert grade mgnuc options into gcc options.
|
|
#
|
|
# IMPORTANT: any changes here may require similar changes to all the files
|
|
# mentioned in runtime/mercury_grade.h.
|
|
|
|
HALT_AT_WARN_OPT=""
|
|
case ${highlevel_code} in
|
|
true)
|
|
HLC_OPTS="-DMR_HIGHLEVEL_CODE"
|
|
case ${halt_at_warn_if_possible} in
|
|
true)
|
|
HALT_AT_WARN_OPT="${COMPILER_HALT_AT_WARN_OPT}"
|
|
;;
|
|
esac
|
|
;;
|
|
false)
|
|
HLC_OPTS=""
|
|
;;
|
|
esac
|
|
|
|
case ${asm_labels} in
|
|
true) ASM_OPTS="-DMR_USE_ASM_LABELS" ;;
|
|
false) ASM_OPTS="" ;;
|
|
esac
|
|
|
|
case ${non_local_gotos} in
|
|
true) GOTO_OPTS="-DMR_USE_GCC_NONLOCAL_GOTOS" ;;
|
|
false) GOTO_OPTS="" ;;
|
|
esac
|
|
|
|
case ${global_regs} in
|
|
true) REG_OPTS="-DMR_USE_GCC_GLOBAL_REGISTERS" ;;
|
|
false) REG_OPTS="" ;;
|
|
esac
|
|
|
|
case ${thread_safe} in
|
|
true)
|
|
THREAD_OPTS="-DMR_THREAD_SAFE ${CFLAGS_FOR_THREADS}"
|
|
;;
|
|
false)
|
|
THREAD_OPTS=""
|
|
;;
|
|
esac
|
|
|
|
case ${threadscope} in
|
|
true) THREADSCOPE_OPTS="-DMR_THREADSCOPE" ;;
|
|
false) THREADSCOPE_OPTS="" ;;
|
|
esac
|
|
|
|
# Set the correct flags if we are to use the MS Visual C runtime.
|
|
use_msvcrt=@USE_MSVCRT@
|
|
if test ${use_msvcrt} = "yes"
|
|
then
|
|
case ${thread_safe} in
|
|
# -MD states that we will use the MSVC runtime, the boehm_gc collector
|
|
# assumes that the collector has been built as a DLL if we are using
|
|
# the MSVC runtime so we need to define GC_NOT_DLL when the collector
|
|
# isn't built as a DLL.
|
|
true) MSVCRT_OPTS="-MD" ;;
|
|
false) MSVCRT_OPTS="-DGC_NOT_DLL -MD" ;;
|
|
esac
|
|
else
|
|
MSVCRT_OPTS=""
|
|
fi
|
|
|
|
boehm_opts="-DMR_CONSERVATIVE_GC -DMR_BOEHM_GC "
|
|
case ${gc_method} in
|
|
accurate) GC_OPTS="-DMR_NATIVE_GC" ;;
|
|
boehm) GC_OPTS="${boehm_opts}" ;;
|
|
boehm_debug) GC_OPTS="${boehm_opts} -DMR_BOEHM_GC_DEBUG -DGC_DEBUG -DKEEP_BACK_PTRS" ;;
|
|
hgc) GC_OPTS="-DMR_CONSERVATIVE_GC -DMR_HGC" ;;
|
|
conservative) GC_OPTS="-DMR_CONSERVATIVE_GC -DMR_BOEHM_GC" ;;
|
|
none) GC_OPTS="" ;;
|
|
esac
|
|
|
|
case ${profile_time} in
|
|
true) PROF_TIME_OPTS="-DMR_MPROF_PROFILE_TIME" ;;
|
|
false) PROF_TIME_OPTS="" ;;
|
|
esac
|
|
|
|
case ${profile_calls} in
|
|
true) PROF_CALLS_OPTS="-DMR_MPROF_PROFILE_CALLS" ;;
|
|
false) PROF_CALLS_OPTS="" ;;
|
|
esac
|
|
|
|
case ${profile_memory} in
|
|
true) PROF_MEMORY_OPTS="-DMR_MPROF_PROFILE_MEMORY" ;;
|
|
false) PROF_MEMORY_OPTS="" ;;
|
|
esac
|
|
|
|
case ${use_activation_counts} in
|
|
true) ACTIVATION_COUNT_OPT="-DMR_USE_ACTIVATION_COUNTS" ;;
|
|
false) ACTIVATION_COUNT_OPT="";;
|
|
esac
|
|
|
|
case ${preserve_tail_recursion} in
|
|
true) PRESERVE_TAIL_RECURSION_OPT="-DMR_DEEP_PROFILING_TAIL_RECURSION" ;;
|
|
false) PRESERVE_TAIL_RECURSION_OPT="";;
|
|
esac
|
|
|
|
case ${profile_deep} in
|
|
true) PROF_DEEP_OPTS="-DMR_DEEP_PROFILING ${ACTIVATION_COUNT_OPT} ${PRESERVE_TAIL_RECURSION_OPT}" ;;
|
|
false) PROF_DEEP_OPTS="" ;;
|
|
esac
|
|
|
|
case ${record_term_sizes_as_words},${record_term_sizes_as_cells} in
|
|
true,true)
|
|
progname=`basename $0`
|
|
echo "${progname}: we can't record both cell and word sizes"
|
|
exit 1
|
|
;;
|
|
true,false)
|
|
RECORD_TERM_SIZE_OPTS="-DMR_RECORD_TERM_SIZES" ;;
|
|
false,true)
|
|
RECORD_TERM_SIZE_OPTS="-DMR_RECORD_TERM_SIZES -DMR_RECORD_TERM_SIZES_AS_CELLS" ;;
|
|
false,false)
|
|
RECORD_TERM_SIZE_OPTS="" ;;
|
|
esac
|
|
|
|
case ${use_trail} in
|
|
true)
|
|
TRAIL_OPTS="-DMR_USE_TRAIL"
|
|
# See the comment in compile_c_file/7 in compiler/compile_target_code.m
|
|
# for an explanation of this.
|
|
case ${COMPILER} in
|
|
gcc|clang) FN_ALIGN_OPTS="-falign-functions=${BYTES_PER_WORD}" ;;
|
|
*) FN_ALIGN_OPTS="" ;;
|
|
esac
|
|
;;
|
|
false)
|
|
TRAIL_OPTS=""
|
|
;;
|
|
esac
|
|
|
|
case ${use_minimal_model_stack_copy},${use_minimal_model_own_stacks} in
|
|
true,true)
|
|
progname=`basename $0`
|
|
echo "${progname}: can't enable both forms of minimal model tabling at once"
|
|
exit 1
|
|
;;
|
|
true,false)
|
|
MINIMAL_MODEL_OPTS="-DMR_USE_MINIMAL_MODEL_STACK_COPY"
|
|
;;
|
|
false,true)
|
|
MINIMAL_MODEL_OPTS="-DMR_USE_MINIMAL_MODEL_OWN_STACKS"
|
|
;;
|
|
false,false)
|
|
MINIMAL_MODEL_OPTS=""
|
|
;;
|
|
esac
|
|
|
|
case ${use_minimal_model},${minimal_model_debug} in
|
|
true,false) ;; # MINIMAL_MODEL_OPTS is already set
|
|
true,true) MINIMAL_MODEL_OPTS="${MINIMAL_MODEL_OPTS} -DMR_MINIMAL_MODEL_DEBUG" ;;
|
|
*) MINIMAL_MODEL_OPTS="" ;;
|
|
esac
|
|
|
|
case ${pregenerated_dist},${single_prec_float} in
|
|
true,true)
|
|
progname=`basename $0`
|
|
echo "${progname}: cannot enable both pregenerated dist and single-prec float"
|
|
exit 1
|
|
;;
|
|
true,false)
|
|
PREGEN_SPF_OPTS="-DMR_PREGENERATED_DIST"
|
|
;;
|
|
false,true)
|
|
PREGEN_SPF_OPTS="-DMR_USE_SINGLE_PREC_FLOAT"
|
|
;;
|
|
false,false)
|
|
PREGEN_SPF_OPTS=""
|
|
;;
|
|
esac
|
|
|
|
case ${debug} in
|
|
true) TRACE_OPTS="-DMR_EXEC_TRACE" ;;
|
|
false) TRACE_OPTS="" ;;
|
|
esac
|
|
|
|
case ${decl_debug} in
|
|
true) DECL_DEBUG_OPTS="-DMR_DECL_DEBUG" ;;
|
|
false) DECL_DEBUG_OPTS="" ;;
|
|
esac
|
|
|
|
case ${ss_debug} in
|
|
true) SS_DEBUG_OPTS="-DMR_SS_DEBUG" ;;
|
|
false) SS_DEBUG_OPTS="" ;;
|
|
esac
|
|
|
|
case ${target_debug_grade} in
|
|
true) TARGET_DEBUG_GRADE_OPTS="-DMR_TARGET_DEBUG_GRADE ${DEBUG_OPTS} ${DISABLE_OPTS_OPT}" ;;
|
|
false) TARGET_DEBUG_GRADE_OPTS="" ;;
|
|
esac
|
|
|
|
case ${extend_stacks} in
|
|
true) EXTEND_STACKS_OPTS="-DMR_EXTEND_STACKS_WHEN_NEEDED" ;;
|
|
false) EXTEND_STACKS_OPTS="" ;;
|
|
esac
|
|
|
|
case ${stack_segments} in
|
|
true) STACK_SEGMENTS_OPTS="-DMR_STACK_SEGMENTS" ;;
|
|
false) STACK_SEGMENTS_OPTS="" ;;
|
|
esac
|
|
|
|
case ${use_regions} in
|
|
true)
|
|
REGION_OPTS_0="-DMR_USE_REGIONS"
|
|
case ${use_regions_debug} in
|
|
true) REGION_OPTS_1="${REGION_OPTS_0} -DMR_RBMM_DEBUG" ;;
|
|
false) REGION_OPTS_1="${REGION_OPTS_0}" ;;
|
|
esac
|
|
case ${use_regions_profiling} in
|
|
true) REGION_OPTS="${REGION_OPTS_1} -DMR_RBMM_PROFILING" ;;
|
|
false) REGION_OPTS="${REGION_OPTS_1}" ;;
|
|
esac
|
|
;;
|
|
false)
|
|
REGION_OPTS=""
|
|
;;
|
|
esac
|
|
|
|
GCC_OPTS="${ASM_OPTS} ${GOTO_OPTS} ${REG_OPTS}"
|
|
|
|
# check that special grades are only used with gcc
|
|
case ${COMPILER} in
|
|
gcc|unknown)
|
|
;;
|
|
*) case "${GCC_OPTS}" in
|
|
*USE_GCC*)
|
|
progname=`basename $0`
|
|
echo "${progname}: For compilers other than GNU C, the only" 1>&2
|
|
echo "${progname}: base grade allowed is \`none'" 1>&2
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|
|
|
|
# If we are using global registers, add CFLAGS_FOR_REGS.
|
|
case ${global_regs} in
|
|
true) GCC_OPTS="${GCC_OPTS} ${CFLAGS_FOR_REGS}" ;;
|
|
false) ;;
|
|
esac
|
|
|
|
# If we are using non-local gotos, add CFLAGS_FOR_GOTOS.
|
|
case ${non_local_gotos} in
|
|
true) GCC_OPTS="${GCC_OPTS} ${CFLAGS_FOR_GOTOS}" ;;
|
|
false) ;;
|
|
esac
|
|
|
|
# If sanitizers were enabled at configure time, add CFLAGS_FOR_SANITIZERS.
|
|
SANITIZER_OPTS="${CFLAGS_FOR_SANITIZERS}"
|
|
|
|
# Use any applicable LTO options
|
|
LTO_OPTS="${CFLAGS_FOR_LTO}"
|
|
|
|
#
|
|
# Special case hacks for particular architectures
|
|
# Any code here needs to be duplicated in ../configure.ac.
|
|
#
|
|
|
|
ARCH_OPTS=""
|
|
|
|
# XXX gcc generates warnings about possibly uninitialized variables in
|
|
# high-level C code. clang would, too, if we did not suppress all warnings.
|
|
case "${COMPILER},${highlevel_code}" in
|
|
gcc,true)
|
|
CHECK_OPTS="${CHECK_OPTS} -Wno-uninitialized"
|
|
;;
|
|
esac
|
|
|
|
case "${FULLARCH}" in
|
|
i*86-*|x86_64*)
|
|
# The use of stack_pointer in the ASM_JUMP macro defined in
|
|
# runtime/mercury_goto.h causes lots of warnings about using possibly
|
|
# uninitialized variables; there's no easy way to suppress them except
|
|
# by disabling the warning.
|
|
case "${COMPILER},${highlevel_code}" in
|
|
gcc,false)
|
|
CHECK_OPTS="${CHECK_OPTS} -Wno-uninitialized"
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|
|
# gcc versions 9-12 replace calls to strcmp and related functions with
|
|
# specialised code when some of the arguments are string constants.
|
|
# The above versions of gcc emit spurious warnings about the code they
|
|
# introduce when -Warray-bounds is enabled.
|
|
# We currently disable the warning for all versions of GCC > 8 since
|
|
# the problem is not known to have been fixed in any later version (as of
|
|
# 2022-06-18).
|
|
|
|
case "${C_COMPILER_TYPE}" in
|
|
gcc_9_*|gcc_1[0-9]_*)
|
|
CHECK_OPTS="${CHECK_OPTS} -Wno-array-bounds"
|
|
;;
|
|
esac
|
|
|
|
case ${COMPILER} in gcc)
|
|
case "${FULLARCH}" in
|
|
i*86*)
|
|
case "$*" in
|
|
# Workarounds for internal problems with GCC in asm_fast.gc
|
|
# on i*86. Reported against gcc 4.4.5 and 4.6.0.
|
|
*" ml_backend.ml_closure_gen.c "*)
|
|
ARCH_OPTS="${ARCH_OPTS} -O0"
|
|
;;
|
|
*" ml_backend.ml_unify_gen.c "*)
|
|
ARCH_OPTS="${ARCH_OPTS} -O0"
|
|
;;
|
|
*" ml_backend.rtti_to_mlds.c "*)
|
|
ARCH_OPTS="${ARCH_OPTS} -O0"
|
|
;;
|
|
*" display_report.c "*)
|
|
ARCH_OPTS="${ARCH_OPTS} -O0"
|
|
;;
|
|
# Workaround for a internal compiler error with GCC 4.8
|
|
# in grades that use global registers.
|
|
*" mercury_ho_call.c "*)
|
|
case ${global_regs} in true)
|
|
ARCH_OPTS="${ARCH_OPTS} -O0"
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|
|
|
|
# On sparc-sun-solaris2, we need to use -fPIC rather than -fpic,
|
|
# because otherwise the Mercury standard library overflows the fixed limit
|
|
# on the number of "small pic" references.
|
|
# Similarly, on sparc64 OpenBSD, no grades fit into the 13-bit GOT.
|
|
|
|
case "${FULLARCH}" in
|
|
sparc-sun-solaris2*|sparc64*-openbsd*)
|
|
case "$*" in
|
|
*-fpic*)
|
|
echo "mgnuc: using -fPIC rather than -fpic"
|
|
OVERRIDE_OPTS="${OVERRIDE_OPTS} -fPIC"
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|
|
|
|
# Using global register variables triggers an internal error in the LRA pass of
|
|
# GCC 9.1 and 9.2 on x86_64 systems in debug grades unless we compile at -O0.
|
|
# See: <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91430>
|
|
#
|
|
# Changes to this need to be reflected in the predicate
|
|
# gather_c_compiler_flags/3 in compiler/compile_target_code.m.
|
|
|
|
case "${FULLARCH}" in x86_64*)
|
|
case ${global_regs},${debug} in
|
|
true,true)
|
|
case "${C_COMPILER_TYPE}" in
|
|
gcc_9_*)
|
|
ARCH_OPTS="${ARCH_OPTS} -O0"
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|
|
|
|
# At -O2 compilation times on Mac OS X are extremely slow for
|
|
# Apple GCC 4.{0,2}. We must force GCC to use -O0 here in order
|
|
# to get acceptable compilation times.
|
|
# Changes to this need to be reflected in the predicate
|
|
# gather_c_compiler_flags/3 in compiler/compile_target_code.m.
|
|
|
|
case ${FULLARCH} in
|
|
*apple*darwin*)
|
|
case ${debug} in
|
|
true)
|
|
case ${COMPILER} in
|
|
gcc)
|
|
OVERRIDE_OPTS="${OVERRIDE_OPTS} -O0"
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|
|
|
|
if test -r .mgnuc_copts
|
|
then
|
|
INVISIBLE_OPTS=`cat .mgnuc_copts`
|
|
else
|
|
INVISIBLE_OPTS=""
|
|
fi
|
|
|
|
FILTERCC=""
|
|
case ${asm_labels},${do_filter_cc} in
|
|
true,true)
|
|
# Check if mfiltercc is available, as we may be bootstrapping with
|
|
# an older compiler which did not have it.
|
|
if test -n "${MKTEMP}" && mfiltercc </dev/null 2>/dev/null
|
|
then
|
|
FILTERCC="mfiltercc"
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
ALL_CC_OPTS="${MERC_ALL_C_INCL_DIRS}\
|
|
${CHECK_OPTS}\
|
|
${OPT_OPTS}\
|
|
${LTO_OPTS}\
|
|
${HLC_OPTS}\
|
|
${GCC_OPTS}\
|
|
${HALT_AT_WARN_OPT}\
|
|
${MSVCRT_OPTS}\
|
|
${GC_OPTS}\
|
|
${DEFINE_OPTS}\
|
|
${STACK_TRACE_OPTS}\
|
|
${TRACE_OPTS}\
|
|
${DECL_DEBUG_OPTS}\
|
|
${SS_DEBUG_OPTS}\
|
|
${TARGET_DEBUG_GRADE_OPTS}\
|
|
${EXTEND_STACKS_OPTS}\
|
|
${STACK_SEGMENTS_OPTS}\
|
|
${MGNUC_C_DEBUG_OPTS}\
|
|
${PROF_TIME_OPTS}\
|
|
${PROF_CALLS_OPTS}\
|
|
${PROF_MEMORY_OPTS}\
|
|
${PROF_DEEP_OPTS}\
|
|
${INLINE_ALLOC_OPTS}\
|
|
${TRAIL_OPTS}\
|
|
${RECORD_TERM_SIZE_OPTS}\
|
|
${MINIMAL_MODEL_OPTS}\
|
|
${PREGEN_SPF_OPTS}\
|
|
${SANITIZER_OPTS}\
|
|
${SPLIT_OPTS}\
|
|
${THREAD_OPTS}\
|
|
${THREADSCOPE_OPTS}\
|
|
${REGION_OPTS}\
|
|
${ARCH_OPTS}\
|
|
${FN_ALIGN_OPTS}\
|
|
${INVISIBLE_OPTS}"
|
|
|
|
case $# in
|
|
0)
|
|
set ${CC} ${ALL_CC_OPTS} ${OVERRIDE_OPTS}
|
|
;;
|
|
*)
|
|
set ${CC} ${ALL_CC_OPTS} "$@" ${OVERRIDE_OPTS} ${ALL_LOCAL_C_INCL_DIRS}
|
|
;;
|
|
esac
|
|
|
|
case ${verbose} in
|
|
true)
|
|
echo "$@"
|
|
;;
|
|
esac
|
|
|
|
if test -z "${FILTERCC}"
|
|
then
|
|
exec "$@"
|
|
fi
|
|
|
|
# mktemp should give its own error message.
|
|
tmp=`${MKTEMP} ${TMPDIR}/mgnuc.XXXXXX` || exit 1
|
|
trap 'status=$?; rm -f ${tmp}; exit ${status}' 0 1 2 3 13 15
|
|
"$@" 2> ${tmp}
|
|
status=$?
|
|
"${FILTERCC}" < ${tmp} >&2
|
|
exit ${status}
|