Support building with AddressSanitizer and UndefinedBehaviorSanitizer.

configure.ac:
    Add configure option --enable-sanitizers.

Mmake.common.in:
scripts/Mercury.config.in:
    Add variables to be set when --enable-sanitizers is used.

scripts/mgnuc.in:
scripts/ml.in:
    Pass sanitizer options to the C compiler and the linker.

compiler/options.m:
    Add options --cflags-for-sanitizers and --linker-sanitizer-flags
    for receiving the configuration.

    Set --linker-trace-flags and --shlib-linker-trace-flags default
    values to empty instead of "-g" (likely copy error).

compiler/compile_target_code.m:
    Pass sanitizer options to the C compiler, and the linker when
    building an executable or shared library.

runtime/Mmakefile:
trace/Mmakefile:
    Pass sanitizer options to linker when building shared libraries.

README.sanitizers:
    Add instructions.
This commit is contained in:
Peter Wang
2016-10-13 16:41:53 +11:00
parent aa86fbd6bf
commit ef5a4fa59d
10 changed files with 85 additions and 12 deletions

View File

@@ -68,6 +68,7 @@ DEFAULT_MCFLAGS=\
--cflags-for-warnings "@CFLAGS_FOR_WARNINGS@" \
--cflags-for-threads "@CFLAGS_FOR_THREADS@" \
--cflags-for-debug "@CFLAGS_FOR_DEBUG@" \
--cflags-for-sanitizers "@CFLAGS_FOR_SANITIZERS@" \
--cflags-for-regs "@CFLAGS_FOR_REGS@" \
--cflags-for-gotos "@CFLAGS_FOR_GOTOS@" \
--cflags-for-pic "@CFLAGS_FOR_PIC@" \
@@ -104,6 +105,7 @@ DEFAULT_MCFLAGS=\
--linker-strip-flag "@LD_STRIP_FLAG@" \
--linker-debug-flags "@LDFLAGS_FOR_DEBUG@" \
--shlib-linker-debug-flags "@LD_LIBFLAGS_FOR_DEBUG@" \
--linker-sanitizer-flags "@LDFLAGS_FOR_SANITIZERS@" \
--linker-link-lib-flag "@LINK_LIB@" \
--linker-link-lib-suffix "@LINK_LIB_SUFFIX@" \
--shlib-linker-link-lib-flag "@LINK_LIB@" \

View File

@@ -27,6 +27,7 @@ CFLAGS_FOR_GOTOS="@CFLAGS_FOR_GOTOS@"
CFLAGS_FOR_THREADS="@CFLAGS_FOR_THREADS@"
CFLAGS_FOR_NO_STRICT_ALIASING="@CFLAGS_FOR_NO_STRICT_ALIASING@"
CFLAGS_FOR_ANSI="@CFLAGS_FOR_ANSI@"
CFLAGS_FOR_SANITIZERS="@CFLAGS_FOR_SANITIZERS@"
AS="@AS@"
BYTES_PER_WORD="@BYTES_PER_WORD@"
MKTEMP=@MKTEMP@
@@ -501,6 +502,9 @@ case $non_local_gotos in
false) ;;
esac
# if sanitizers were enabled at configure time, add CFLAGS_FOR_SANITIZERS
SANITIZER_OPTS="$CFLAGS_FOR_SANITIZERS"
#
# Special case hacks for particular architectures
# Any code here needs to be duplicated in ../configure.in.
@@ -646,6 +650,7 @@ ALL_CC_OPTS="$MERC_ALL_C_INCL_DIRS\
$RECORD_TERM_SIZE_OPTS\
$MINIMAL_MODEL_OPTS\
$PREGEN_SPF_OPTS\
$SANITIZER_OPTS\
$SPLIT_OPTS\
$THREAD_OPTS\
$THREADSCOPE_OPTS\

View File

@@ -53,6 +53,7 @@ THREAD_LIBS="@THREAD_LIBS@"
HWLOC_LIBS="@HWLOC_LIBS@"
HWLOC_STATIC_LIBS="@HWLOC_STATIC_LIBS@"
TRACE_BASE_LIBS_SYSTEM="@TRACE_BASE_LIBS_SYSTEM@"
LDFLAGS_FOR_SANITIZERS="@LDFLAGS_FOR_SANITIZERS@"
TMPDIR=${TMPDIR=/tmp}
MATH_LIB=${MERCURY_MATH_LIB="@MATH_LIB@"}
@@ -426,6 +427,7 @@ case $make_shared_lib in
ARCH_OPTS="$ARCH_OPTS $LD_LIBFLAGS_FOR_TRACE"
;;
esac
SANITIZER_OPTS="$LDFLAGS_FOR_SANITIZERS"
;;
false)
LINKER="$CC"
@@ -438,6 +440,7 @@ case $make_shared_lib in
ARCH_OPTS="$ARCH_OPTS $LDFLAGS_FOR_TRACE"
;;
esac
SANITIZER_OPTS="$LDFLAGS_FOR_SANITIZERS"
;;
esac
@@ -556,7 +559,7 @@ else
NOLOGO_OPTS=""
fi
LINKER_PRE_FLAGS="$NOLOGO_OPTS $MSVCRT_OPTS $PRINT_MAP_OPT $UNDEF_OPT $STRIP_OPTS $MAYBE_STATIC_OPT $ARCH_OPTS"
LINKER_PRE_FLAGS="$NOLOGO_OPTS $MSVCRT_OPTS $PRINT_MAP_OPT $UNDEF_OPT $STRIP_OPTS $MAYBE_STATIC_OPT $ARCH_OPTS $SANITIZER_OPTS"
LINKER_POST_FLAGS="@LINK_OPT_SEP@ $NODEFAULTLIB_FLAG $DEBUG_FLAG $LIBDIR_OPTS $RPATH_OPT_LIST $LIBS"
case $verbose in