ftmemsim-valgrind/configure.ac
Paul Floyd 3e7774ea5a Bug 452274 memcheck crashes with Assertion 'sci->status.what == SsIdle' failed
FreeBSD (and Darwin) use the carry flag for syscall syscall status.
That means that in the assembler for do_syscall_for_client_WRK
they have a call to LibVEX_GuestAMD64_put_rflag_c (amd64) or
LibVEX_GuestX86_put_eflag_c (x86). These also call WRK functions.

The problem is that do_syscall_for_client_WRK has carefully crafted
labels correspinding to IP addresses. If a signal interrupts
processdings, IP can be compared to these addresses so that
VG_(fixup_guest_state_after_syscall_interrupted) can work
out how to resume the syscall. But if IP is in the save
carry flag functions, the address is not recognized and
VG_(fixup_guest_state_after_syscall_interrupted) fails.

The crash in the title happens because the interrupted
syscall does not reset its status, and on the next syscall
it is expected that the status be idle.

To fix this I added global variables that get set to 1
just before calling the save carry flag functions, and cleared
just after. VG_(fixup_guest_state_after_syscall_interrupted)
can then check this and work out which section we are in
and resume the syscall correctly.

Also:

Start a new NEWS section for 3.20

Add a regtest for this and also a similar one for Bug 445032
(x86-freebsd only, new subdir).

I saw that this problem also probably exists with macOS, so I made
the same changes there (not yet tested)
2022-04-12 23:50:48 +02:00

5430 lines
168 KiB
Plaintext
Executable File

##------------------------------------------------------------##
#
# The multiple-architecture stuff in this file is pretty
# cryptic. Read docs/internals/multiple-architectures.txt
# for at least a partial explanation of what is going on.
#
##------------------------------------------------------------##
# Process this file with autoconf to produce a configure script.
#
# Define major, minor, micro and suffix here once, then reuse them
# for version number in valgrind.h and vg-entities (documentation).
# suffix must be empty for a release, otherwise it is GIT or RC1, etc.
# Also set the (expected/last) release date here.
# Do not forget to rerun ./autogen.sh
m4_define([v_major_ver], [3])
m4_define([v_minor_ver], [19])
m4_define([v_micro_ver], [0])
m4_define([v_suffix_ver], [])
m4_define([v_rel_date], ["11 Apr 2022"])
m4_define([v_version],
m4_if(v_suffix_ver, [],
[v_major_ver.v_minor_ver.v_micro_ver],
[v_major_ver.v_minor_ver.v_micro_ver.v_suffix_ver]))
AC_INIT([Valgrind],[v_version],[valgrind-users@lists.sourceforge.net])
# For valgrind.h
AC_SUBST(VG_VER_MAJOR, v_major_ver)
AC_SUBST(VG_VER_MINOR, v_minor_ver)
# For docs/xml/vg-entities.xml
AC_SUBST(VG_DATE, v_rel_date)
AC_CONFIG_SRCDIR(coregrind/m_main.c)
AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE([foreign dist-bzip2 subdir-objects])
AM_MAINTAINER_MODE
#----------------------------------------------------------------------------
# Do NOT modify these flags here. Except in feature tests in which case
# the original values must be properly restored.
#----------------------------------------------------------------------------
CFLAGS="$CFLAGS"
CXXFLAGS="$CXXFLAGS"
#----------------------------------------------------------------------------
# Checks for various programs.
#----------------------------------------------------------------------------
AC_PROG_LN_S
AC_PROG_CC
AM_PROG_CC_C_O
AC_PROG_CPP
AC_PROG_CXX
# AC_PROG_OBJC apparently causes problems on older Linux distros (eg. with
# autoconf 2.59). If we ever have any Objective-C code in the Valgrind code
# base (eg. most likely as Darwin-specific tests) we'll need one of the
# following:
# - put AC_PROG_OBJC in a Darwin-specific part of this file
# - Use AC_PROG_OBJC here and up the minimum autoconf version
# - Use the following, which is apparently equivalent:
# m4_ifdef([AC_PROG_OBJC],
# [AC_PROG_OBJC],
# [AC_CHECK_TOOL([OBJC], [gcc])
# AC_SUBST([OBJC])
# AC_SUBST([OBJCFLAGS])
# ])
AC_PROG_RANLIB
# Set LTO_RANLIB variable to an lto enabled ranlib
if test "x$LTO_RANLIB" = "x"; then
AC_PATH_PROGS([LTO_RANLIB], [gcc-ranlib])
fi
AC_ARG_VAR([LTO_RANLIB],[Library indexer command for link time optimisation])
# provide a very basic definition for AC_PROG_SED if it's not provided by
# autoconf (as e.g. in autoconf 2.59).
m4_ifndef([AC_PROG_SED],
[AC_DEFUN([AC_PROG_SED],
[AC_ARG_VAR([SED])
AC_CHECK_PROGS([SED],[gsed sed])])])
AC_PROG_SED
# If no AR variable was specified, look up the name of the archiver. Otherwise
# do not touch the AR variable.
if test "x$AR" = "x"; then
AC_PATH_PROGS([AR], [`echo $LD | $SED 's/ld$/ar/'` "ar"], [ar])
fi
AC_ARG_VAR([AR],[Archiver command])
# same for LTO_AR variable for lto enabled archiver
if test "x$LTO_AR" = "x"; then
AC_PATH_PROGS([LTO_AR], [gcc-ar])
fi
AC_ARG_VAR([LTO_AR],[Archiver command for link time optimisation])
# Check for the compiler support
if test "${GCC}" != "yes" ; then
AC_MSG_ERROR([Valgrind relies on GCC to be compiled])
fi
# figure out where perl lives
AC_PATH_PROG(PERL, perl)
# figure out where gdb lives
AC_PATH_PROG(GDB, gdb, "/no/gdb/was/found/at/configure/time")
AC_DEFINE_UNQUOTED(GDB_PATH, "$GDB", [path to GDB])
# some older automake's don't have it so try something on our own
ifdef([AM_PROG_AS],[AM_PROG_AS],
[
AS="${CC}"
AC_SUBST(AS)
ASFLAGS=""
AC_SUBST(ASFLAGS)
])
# Check if 'diff' supports -u (universal diffs) and use it if possible.
AC_MSG_CHECKING([for diff -u])
AC_SUBST(DIFF)
# Comparing two identical files results in 0.
tmpfile="tmp-xxx-yyy-zzz"
touch $tmpfile;
if diff -u $tmpfile $tmpfile ; then
AC_MSG_RESULT([yes])
DIFF="diff -u"
else
AC_MSG_RESULT([no])
DIFF="diff"
fi
rm $tmpfile
# Make sure we can compile in C99 mode.
AC_PROG_CC_C99
if test "$ac_cv_prog_cc_c99" = "no"; then
AC_MSG_ERROR([Valgrind relies on a C compiler supporting C99])
fi
# We don't want gcc < 3.0
AC_MSG_CHECKING([for a supported version of gcc])
# Obtain the compiler version.
#
# A few examples of how the ${CC} --version output looks like:
#
# ######## gcc variants ########
# Arch Linux: i686-pc-linux-gnu-gcc (GCC) 4.6.2
# Debian Linux: gcc (Debian 4.3.2-1.1) 4.3.2
# openSUSE: gcc (SUSE Linux) 4.5.1 20101208 [gcc-4_5-branch revision 167585]
# Exherbo Linux: x86_64-pc-linux-gnu-gcc (Exherbo gcc-4.6.2) 4.6.2
# MontaVista Linux for ARM: arm-none-linux-gnueabi-gcc (Sourcery G++ Lite 2009q1-203) 4.3.3
# OS/X 10.6: i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5666) (dot 3)
# OS/X 10.7: i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)
#
# ######## clang variants ########
# Clang: clang version 2.9 (tags/RELEASE_29/final)
# Apple clang: Apple clang version 3.1 (tags/Apple/clang-318.0.58) (based on LLVM 3.1svn)
# FreeBSD clang: FreeBSD clang version 3.1 (branches/release_31 156863) 20120523
#
# ######## Apple LLVM variants ########
# Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)
# Apple LLVM version 6.0 (clang-600.0.51) (based on LLVM 3.5svn)
#
[
if test "x`${CC} --version | $SED -n -e 's/.*\Apple \(LLVM\) version.*clang.*/\1/p'`" = "xLLVM" ;
then
is_clang="applellvm"
gcc_version=`${CC} --version | $SED -n -e 's/.*LLVM version \([0-9.]*\).*$/\1/p'`
elif test "x`${CC} --version | $SED -n -e 's/.*\(clang\) version.*/\1/p'`" = "xclang" ;
then
is_clang="clang"
# Don't use -dumpversion with clang: it will always produce "4.2.1".
gcc_version=`${CC} --version | $SED -n -e 's/.*clang version \([0-9.]*\).*$/\1/p'`
elif test "x`${CC} --version | $SED -n -e 's/icc.*\(ICC\).*/\1/p'`" = "xICC" ;
then
is_clang="icc"
gcc_version=`${CC} -dumpversion 2>/dev/null`
else
is_clang="notclang"
gcc_version=`${CC} -dumpversion 2>/dev/null`
if test "x$gcc_version" = x; then
gcc_version=`${CC} --version | $SED -n -e 's/[^ ]*gcc[^ ]* ([^)]*) \([0-9.]*\).*$/\1/p'`
fi
fi
]
AM_CONDITIONAL(COMPILER_IS_CLANG, test $is_clang = clang -o $is_clang = applellvm)
AM_CONDITIONAL(COMPILER_IS_ICC, test $is_clang = icc)
# Note: m4 arguments are quoted with [ and ] so square brackets in shell
# statements have to be quoted.
case "${is_clang}-${gcc_version}" in
applellvm-5.1|applellvm-[[6-9]].*|applellvm-[[1-9][0-9]]*)
AC_MSG_RESULT([ok (Apple LLVM version ${gcc_version})])
;;
icc-1[[3-9]].*|icc-202[[0-9]].*)
AC_MSG_RESULT([ok (ICC version ${gcc_version})])
;;
notclang-[[3-9]]|notclang-[[3-9]].*|notclang-[[1-9][0-9]]*)
AC_MSG_RESULT([ok (${gcc_version})])
;;
clang-2.9|clang-[[3-9]].*|clang-[[1-9][0-9]]*)
AC_MSG_RESULT([ok (clang-${gcc_version})])
;;
*)
AC_MSG_RESULT([no (${is_clang}-${gcc_version})])
AC_MSG_ERROR([please use gcc >= 3.0 or clang >= 2.9 or icc >= 13.0 or Apple LLVM >= 5.1])
;;
esac
#----------------------------------------------------------------------------
# Arch/OS/platform tests.
#----------------------------------------------------------------------------
# We create a number of arch/OS/platform-related variables. We prefix them
# all with "VGCONF_" which indicates that they are defined at
# configure-time, and distinguishes them from the VGA_*/VGO_*/VGP_*
# variables used when compiling C files.
AC_CANONICAL_HOST
AC_MSG_CHECKING([for a supported CPU])
# ARCH_MAX reflects the most that this CPU can do: for example if it
# is a 64-bit capable PowerPC, then it must be set to ppc64 and not ppc32.
# Ditto for amd64. It is used for more configuration below, but is not used
# outside this file.
#
# Power PC returns powerpc for Big Endian. This was not changed when Little
# Endian support was added to the 64-bit architecture. The 64-bit Little
# Endian systems explicitly state le in the host_cpu. For clarity in the
# Valgrind code, the ARCH_MAX name will state LE or BE for the endianness of
# the 64-bit system. Big Endian is the only mode supported on 32-bit Power PC.
# The abreviation PPC or ppc refers to 32-bit and 64-bit systems with either
# Endianness. The name PPC64 or ppc64 to 64-bit systems of either Endianness.
# The names ppc64be or PPC64BE refer to only 64-bit systems that are Big
# Endian. Similarly, ppc64le or PPC64LE refer to only 64-bit systems that are
# Little Endian.
case "${host_cpu}" in
i?86)
AC_MSG_RESULT([ok (${host_cpu})])
ARCH_MAX="x86"
;;
x86_64|amd64)
AC_MSG_RESULT([ok (${host_cpu})])
ARCH_MAX="amd64"
;;
powerpc64)
# this only referrs to 64-bit Big Endian
AC_MSG_RESULT([ok (${host_cpu})])
ARCH_MAX="ppc64be"
;;
powerpc64le)
# this only referrs to 64-bit Little Endian
AC_MSG_RESULT([ok (${host_cpu})])
ARCH_MAX="ppc64le"
;;
powerpc)
# On Linux this means only a 32-bit capable CPU.
AC_MSG_RESULT([ok (${host_cpu})])
ARCH_MAX="ppc32"
;;
s390x)
AC_MSG_RESULT([ok (${host_cpu})])
ARCH_MAX="s390x"
;;
armv7*)
AC_MSG_RESULT([ok (${host_cpu})])
ARCH_MAX="arm"
;;
aarch64*)
AC_MSG_RESULT([ok (${host_cpu})])
ARCH_MAX="arm64"
;;
mips)
AC_MSG_RESULT([ok (${host_cpu})])
ARCH_MAX="mips32"
;;
mipsel)
AC_MSG_RESULT([ok (${host_cpu})])
ARCH_MAX="mips32"
;;
mipsisa32r2)
AC_MSG_RESULT([ok (${host_cpu})])
ARCH_MAX="mips32"
;;
mips64*)
AC_MSG_RESULT([ok (${host_cpu})])
ARCH_MAX="mips64"
;;
mipsisa64*)
AC_MSG_RESULT([ok (${host_cpu})])
ARCH_MAX="mips64"
;;
nanomips)
AC_MSG_RESULT([ok (${host_cpu})])
ARCH_MAX="nanomips"
;;
*)
AC_MSG_RESULT([no (${host_cpu})])
AC_MSG_ERROR([Unsupported host architecture. Sorry])
;;
esac
#----------------------------------------------------------------------------
# Sometimes it's convenient to subvert the bi-arch build system and
# just have a single build even though the underlying platform is
# capable of both. Hence handle --enable-only64bit and
# --enable-only32bit. Complain if both are issued :-)
# [Actually, if either of these options are used, I think both get built,
# but only one gets installed. So if you use an in-place build, both can be
# used. --njn]
# Check if a 64-bit only build has been requested
AC_CACHE_CHECK([for a 64-bit only build], vg_cv_only64bit,
[AC_ARG_ENABLE(only64bit,
[ --enable-only64bit do a 64-bit only build],
[vg_cv_only64bit=$enableval],
[vg_cv_only64bit=no])])
# Check if a 32-bit only build has been requested
AC_CACHE_CHECK([for a 32-bit only build], vg_cv_only32bit,
[AC_ARG_ENABLE(only32bit,
[ --enable-only32bit do a 32-bit only build],
[vg_cv_only32bit=$enableval],
[vg_cv_only32bit=no])])
# Stay sane
if test x$vg_cv_only64bit = xyes -a x$vg_cv_only32bit = xyes; then
AC_MSG_ERROR(
[Nonsensical: both --enable-only64bit and --enable-only32bit.])
fi
#----------------------------------------------------------------------------
# VGCONF_OS is the primary build OS, eg. "linux". It is passed in to
# compilation of many C files via -VGO_$(VGCONF_OS) and
# -VGP_$(VGCONF_ARCH_PRI)_$(VGCONF_OS).
AC_MSG_CHECKING([for a supported OS])
AC_SUBST(VGCONF_OS)
DEFAULT_SUPP=""
case "${host_os}" in
*linux*)
AC_MSG_RESULT([ok (${host_os})])
VGCONF_OS="linux"
# Ok, this is linux. Check the kernel version
AC_MSG_CHECKING([for the kernel version])
kernel=`uname -r`
case "${kernel}" in
0.*|1.*|2.0.*|2.1.*|2.2.*|2.3.*|2.4.*|2.5.*)
AC_MSG_RESULT([unsupported (${kernel})])
AC_MSG_ERROR([Valgrind needs a Linux kernel >= 2.6])
;;
*)
AC_MSG_RESULT([2.6 or later (${kernel})])
;;
esac
;;
*freebsd*)
AC_MSG_RESULT([ok (${host_os})])
VGCONF_OS="freebsd"
AC_DEFINE([FREEBSD_10], 1000, [FREEBSD_VERS value for FreeBSD 10.x])
freebsd_10=1000
AC_DEFINE([FREEBSD_11], 1100, [FREEBSD_VERS value for FreeBSD 11.x])
freebsd_11=1100
AC_DEFINE([FREEBSD_12], 1200, [FREEBSD_VERS value for FreeBSD 12.0 to 12.1])
freebsd_12=1200
AC_DEFINE([FREEBSD_12_2], 1220, [FREEBSD_VERS value for FreeBSD 12.2])
freebsd_12_2=1220
AC_DEFINE([FREEBSD_13_0], 1300, [FREEBSD_VERS value for FreeBSD 13.0])
freebsd_13_0=1300
AC_DEFINE([FREEBSD_13_1], 1310, [FREEBSD_VERS value for FreeBSD 13.1+])
freebsd_13_1=1310
AC_DEFINE([FREEBSD_14], 1400, [FREEBSD_VERS value for FreeBSD 14.x])
freebsd_14=1400
AC_MSG_CHECKING([for the kernel version])
kernel=`uname -r`
case "${kernel}" in
10.*)
AC_MSG_RESULT([FreeBSD 10.x (${kernel})])
AC_DEFINE([FREEBSD_VERS], FREEBSD_10, [FreeBSD version])
freebsd_vers=$freebsd_10
;;
11.*)
AC_MSG_RESULT([FreeBSD 11.x (${kernel})])
AC_DEFINE([FREEBSD_VERS], FREEBSD_11, [FreeBSD version])
freebsd_vers=$freebsd_11
;;
12.*)
case "${kernel}" in
12.[[0-1]]-*)
AC_MSG_RESULT([FreeBSD 12.x (${kernel})])
AC_DEFINE([FREEBSD_VERS], FREEBSD_12, [FreeBSD version])
freebsd_vers=$freebsd_12
;;
*)
AC_MSG_RESULT([FreeBSD 12.x (${kernel})])
AC_DEFINE([FREEBSD_VERS], FREEBSD_12_2, [FreeBSD version])
freebsd_vers=$freebsd_12_2
;;
esac
;;
13.*)
case "${kernel}" in
13.0-*)
AC_MSG_RESULT([FreeBSD 13.0 (${kernel})])
AC_DEFINE([FREEBSD_VERS], FREEBSD_13_0, [FreeBSD version])
freebsd_vers=$freebsd_13_0
;;
*)
AC_MSG_RESULT([FreeBSD 13.1+ (${kernel})])
AC_DEFINE([FREEBSD_VERS], FREEBSD_13_1, [FreeBSD version])
freebsd_vers=$freebsd_13_1
;;
esac
;;
14.*)
AC_MSG_RESULT([FreeBSD 14.x (${kernel})])
AC_DEFINE([FREEBSD_VERS], FREEBSD_14, [FreeBSD version])
freebsd_vers=$freebsd_14
;;
*)
AC_MSG_RESULT([unsupported (${kernel})])
AC_MSG_ERROR([Valgrind works on FreeBSD 10.x to 14.x])
;;
esac
DEFAULT_SUPP="$srcdir/freebsd.supp $srcdir/freebsd-helgrind.supp $srcdir/freebsd-drd.supp ${DEFAULT_SUPP}"
;;
*darwin*)
AC_MSG_RESULT([ok (${host_os})])
VGCONF_OS="darwin"
AC_DEFINE([DARWIN_10_5], 100500, [DARWIN_VERS value for Mac OS X 10.5])
AC_DEFINE([DARWIN_10_6], 100600, [DARWIN_VERS value for Mac OS X 10.6])
AC_DEFINE([DARWIN_10_7], 100700, [DARWIN_VERS value for Mac OS X 10.7])
AC_DEFINE([DARWIN_10_8], 100800, [DARWIN_VERS value for Mac OS X 10.8])
AC_DEFINE([DARWIN_10_9], 100900, [DARWIN_VERS value for Mac OS X 10.9])
AC_DEFINE([DARWIN_10_10], 101000, [DARWIN_VERS value for Mac OS X 10.10])
AC_DEFINE([DARWIN_10_11], 101100, [DARWIN_VERS value for Mac OS X 10.11])
AC_DEFINE([DARWIN_10_12], 101200, [DARWIN_VERS value for macOS 10.12])
AC_DEFINE([DARWIN_10_13], 101300, [DARWIN_VERS value for macOS 10.13])
AC_MSG_CHECKING([for the kernel version])
kernel=`uname -r`
# Nb: for Darwin we set DEFAULT_SUPP here. That's because Darwin
# has only one relevant version, the OS version. The `uname` check
# is a good way to get that version (i.e. "Darwin 9.6.0" is Mac OS
# X 10.5.6, and "Darwin 10.x" is Mac OS X 10.6.x Snow Leopard,
# and possibly "Darwin 11.x" is Mac OS X 10.7.x Lion),
# and we don't know of an macros similar to __GLIBC__ to get that info.
#
# XXX: `uname -r` won't do the right thing for cross-compiles, but
# that's not a problem yet.
#
# jseward 21 Sept 2011: I seriously doubt whether V 3.7.0 will work
# on OS X 10.5.x; I haven't tested yet, and only plan to test 3.7.0
# on 10.6.8 and 10.7.1. Although tempted to delete the configure
# time support for 10.5 (the 9.* pattern just below), I'll leave it
# in for now, just in case anybody wants to give it a try. But I'm
# assuming that 3.7.0 is a Snow Leopard and Lion-only release.
case "${kernel}" in
9.*)
AC_MSG_RESULT([Darwin 9.x (${kernel}) / Mac OS X 10.5 Leopard])
AC_DEFINE([DARWIN_VERS], DARWIN_10_5, [Darwin / Mac OS X version])
DEFAULT_SUPP="$srcdir/darwin9.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="$srcdir/darwin9-drd.supp ${DEFAULT_SUPP}"
;;
10.*)
AC_MSG_RESULT([Darwin 10.x (${kernel}) / Mac OS X 10.6 Snow Leopard])
AC_DEFINE([DARWIN_VERS], DARWIN_10_6, [Darwin / Mac OS X version])
DEFAULT_SUPP="$srcdir/darwin10.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="$srcdir/darwin10-drd.supp ${DEFAULT_SUPP}"
;;
11.*)
AC_MSG_RESULT([Darwin 11.x (${kernel}) / Mac OS X 10.7 Lion])
AC_DEFINE([DARWIN_VERS], DARWIN_10_7, [Darwin / Mac OS X version])
DEFAULT_SUPP="$srcdir/darwin11.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="$srcdir/darwin10-drd.supp ${DEFAULT_SUPP}"
;;
12.*)
AC_MSG_RESULT([Darwin 12.x (${kernel}) / Mac OS X 10.8 Mountain Lion])
AC_DEFINE([DARWIN_VERS], DARWIN_10_8, [Darwin / Mac OS X version])
DEFAULT_SUPP="$srcdir/darwin12.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="$srcdir/darwin10-drd.supp ${DEFAULT_SUPP}"
;;
13.*)
AC_MSG_RESULT([Darwin 13.x (${kernel}) / Mac OS X 10.9 Mavericks])
AC_DEFINE([DARWIN_VERS], DARWIN_10_9, [Darwin / Mac OS X version])
DEFAULT_SUPP="$srcdir/darwin13.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="$srcdir/darwin10-drd.supp ${DEFAULT_SUPP}"
;;
14.*)
AC_MSG_RESULT([Darwin 14.x (${kernel}) / Mac OS X 10.10 Yosemite])
AC_DEFINE([DARWIN_VERS], DARWIN_10_10, [Darwin / Mac OS X version])
DEFAULT_SUPP="$srcdir/darwin14.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="$srcdir/darwin10-drd.supp ${DEFAULT_SUPP}"
;;
15.*)
AC_MSG_RESULT([Darwin 15.x (${kernel}) / Mac OS X 10.11 El Capitan])
AC_DEFINE([DARWIN_VERS], DARWIN_10_11, [Darwin / Mac OS X version])
DEFAULT_SUPP="$srcdir/darwin15.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="$srcdir/darwin10-drd.supp ${DEFAULT_SUPP}"
;;
16.*)
AC_MSG_RESULT([Darwin 16.x (${kernel}) / macOS 10.12 Sierra])
AC_DEFINE([DARWIN_VERS], DARWIN_10_12, [Darwin / Mac OS X version])
DEFAULT_SUPP="$srcdir/darwin16.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="$srcdir/darwin10-drd.supp ${DEFAULT_SUPP}"
;;
17.*)
AC_MSG_RESULT([Darwin 17.x (${kernel}) / macOS 10.13 High Sierra])
AC_DEFINE([DARWIN_VERS], DARWIN_10_13, [Darwin / Mac OS X version])
DEFAULT_SUPP="$srcdir/darwin17.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="$srcdir/darwin10-drd.supp ${DEFAULT_SUPP}"
;;
*)
AC_MSG_RESULT([unsupported (${kernel})])
AC_MSG_ERROR([Valgrind works on Darwin 10.x, 11.x, 12.x, 13.x, 14.x, 15.x, 16.x and 17.x (Mac OS X 10.6/7/8/9/10/11 and macOS 10.12/13)])
;;
esac
;;
solaris2.11*)
AC_MSG_RESULT([ok (${host_os})])
VGCONF_OS="solaris"
uname_v=$( uname -v )
case "$uname_v" in
11.4.*)
DEFAULT_SUPP="$srcdir/solaris12.supp ${DEFAULT_SUPP}"
;;
*)
DEFAULT_SUPP="$srcdir/solaris11.supp ${DEFAULT_SUPP}"
;;
esac
;;
solaris2.12*)
AC_MSG_RESULT([ok (${host_os})])
VGCONF_OS="solaris"
DEFAULT_SUPP="$srcdir/solaris12.supp ${DEFAULT_SUPP}"
;;
*)
AC_MSG_RESULT([no (${host_os})])
AC_MSG_ERROR([Valgrind is operating system specific. Sorry.])
;;
esac
#----------------------------------------------------------------------------
# If we are building on a 64 bit platform test to see if the system
# supports building 32 bit programs and disable 32 bit support if it
# does not support building 32 bit programs
case "$ARCH_MAX-$VGCONF_OS" in
amd64-linux|ppc64be-linux|arm64-linux|amd64-solaris)
AC_MSG_CHECKING([for 32 bit build support])
safe_CFLAGS=$CFLAGS
CFLAGS="-m32"
AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[
return 0;
]])], [
AC_MSG_RESULT([yes])
], [
vg_cv_only64bit="yes"
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS;;
mips64-linux)
AC_MSG_CHECKING([for 32 bit build support])
safe_CFLAGS=$CFLAGS
CFLAGS="$CFLAGS -mips32 -mabi=32"
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#include <sys/prctl.h>
]], [[]])], [
AC_MSG_RESULT([yes])
], [
vg_cv_only64bit="yes"
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS;;
esac
if test x$vg_cv_only64bit = xyes -a x$vg_cv_only32bit = xyes; then
AC_MSG_ERROR(
[--enable-only32bit was specified but system does not support 32 bit builds])
fi
#----------------------------------------------------------------------------
# VGCONF_ARCH_PRI is the arch for the primary build target, eg. "amd64". By
# default it's the same as ARCH_MAX. But if, say, we do a build on an amd64
# machine, but --enable-only32bit has been requested, then ARCH_MAX (see
# above) will be "amd64" since that reflects the most that this cpu can do,
# but VGCONF_ARCH_PRI will be downgraded to "x86", since that reflects the
# arch corresponding to the primary build (VGCONF_PLATFORM_PRI_CAPS). It is
# passed in to compilation of many C files via -VGA_$(VGCONF_ARCH_PRI) and
# -VGP_$(VGCONF_ARCH_PRI)_$(VGCONF_OS).
AC_SUBST(VGCONF_ARCH_PRI)
# VGCONF_ARCH_SEC is the arch for the secondary build target, eg. "x86".
# It is passed in to compilation of many C files via -VGA_$(VGCONF_ARCH_SEC)
# and -VGP_$(VGCONF_ARCH_SEC)_$(VGCONF_OS), if there is a secondary target.
# It is empty if there is no secondary target.
AC_SUBST(VGCONF_ARCH_SEC)
# VGCONF_PLATFORM_PRI_CAPS is the primary build target, eg. "AMD64_LINUX".
# The entire system, including regression and performance tests, will be
# built for this target. The "_CAPS" indicates that the name is in capital
# letters, and it also uses '_' rather than '-' as a separator, because it's
# used to create various Makefile variables, which are all in caps by
# convention and cannot contain '-' characters. This is in contrast to
# VGCONF_ARCH_PRI and VGCONF_OS which are not in caps.
AC_SUBST(VGCONF_PLATFORM_PRI_CAPS)
# VGCONF_PLATFORM_SEC_CAPS is the secondary build target, if there is one.
# Valgrind and tools will also be built for this target, but not the
# regression or performance tests.
#
# By default, the primary arch is the same as the "max" arch, as commented
# above (at the definition of ARCH_MAX). We may choose to downgrade it in
# the big case statement just below here, in the case where we're building
# on a 64 bit machine but have been requested only to do a 32 bit build.
AC_SUBST(VGCONF_PLATFORM_SEC_CAPS)
AC_MSG_CHECKING([for a supported CPU/OS combination])
# NB. The load address for a given platform may be specified in more
# than one place, in some cases, depending on whether we're doing a biarch,
# 32-bit only or 64-bit only build. eg see case for amd64-linux below.
# Be careful to give consistent values in all subcases. Also, all four
# valt_load_addres_{pri,sec}_{norml,inner} values must always be set,
# even if it is to "0xUNSET".
#
case "$ARCH_MAX-$VGCONF_OS" in
x86-linux)
VGCONF_ARCH_PRI="x86"
VGCONF_ARCH_SEC=""
VGCONF_PLATFORM_PRI_CAPS="X86_LINUX"
VGCONF_PLATFORM_SEC_CAPS=""
valt_load_address_pri_norml="0x58000000"
valt_load_address_pri_inner="0x38000000"
valt_load_address_sec_norml="0xUNSET"
valt_load_address_sec_inner="0xUNSET"
AC_MSG_RESULT([ok (${ARCH_MAX}-${VGCONF_OS})])
;;
amd64-linux)
valt_load_address_sec_norml="0xUNSET"
valt_load_address_sec_inner="0xUNSET"
if test x$vg_cv_only64bit = xyes; then
VGCONF_ARCH_PRI="amd64"
VGCONF_ARCH_SEC=""
VGCONF_PLATFORM_PRI_CAPS="AMD64_LINUX"
VGCONF_PLATFORM_SEC_CAPS=""
valt_load_address_pri_norml="0x58000000"
valt_load_address_pri_inner="0x38000000"
elif test x$vg_cv_only32bit = xyes; then
VGCONF_ARCH_PRI="x86"
VGCONF_ARCH_SEC=""
VGCONF_PLATFORM_PRI_CAPS="X86_LINUX"
VGCONF_PLATFORM_SEC_CAPS=""
valt_load_address_pri_norml="0x58000000"
valt_load_address_pri_inner="0x38000000"
else
VGCONF_ARCH_PRI="amd64"
VGCONF_ARCH_SEC="x86"
VGCONF_PLATFORM_PRI_CAPS="AMD64_LINUX"
VGCONF_PLATFORM_SEC_CAPS="X86_LINUX"
valt_load_address_pri_norml="0x58000000"
valt_load_address_pri_inner="0x38000000"
valt_load_address_sec_norml="0x58000000"
valt_load_address_sec_inner="0x38000000"
fi
AC_MSG_RESULT([ok (${ARCH_MAX}-${VGCONF_OS})])
;;
ppc32-linux)
VGCONF_ARCH_PRI="ppc32"
VGCONF_ARCH_SEC=""
VGCONF_PLATFORM_PRI_CAPS="PPC32_LINUX"
VGCONF_PLATFORM_SEC_CAPS=""
valt_load_address_pri_norml="0x58000000"
valt_load_address_pri_inner="0x38000000"
valt_load_address_sec_norml="0xUNSET"
valt_load_address_sec_inner="0xUNSET"
AC_MSG_RESULT([ok (${ARCH_MAX}-${VGCONF_OS})])
;;
ppc64be-linux)
valt_load_address_sec_norml="0xUNSET"
valt_load_address_sec_inner="0xUNSET"
if test x$vg_cv_only64bit = xyes; then
VGCONF_ARCH_PRI="ppc64be"
VGCONF_ARCH_SEC=""
VGCONF_PLATFORM_PRI_CAPS="PPC64BE_LINUX"
VGCONF_PLATFORM_SEC_CAPS=""
valt_load_address_pri_norml="0x58000000"
valt_load_address_pri_inner="0x38000000"
elif test x$vg_cv_only32bit = xyes; then
VGCONF_ARCH_PRI="ppc32"
VGCONF_ARCH_SEC=""
VGCONF_PLATFORM_PRI_CAPS="PPC32_LINUX"
VGCONF_PLATFORM_SEC_CAPS=""
valt_load_address_pri_norml="0x58000000"
valt_load_address_pri_inner="0x38000000"
else
VGCONF_ARCH_PRI="ppc64be"
VGCONF_ARCH_SEC="ppc32"
VGCONF_PLATFORM_PRI_CAPS="PPC64BE_LINUX"
VGCONF_PLATFORM_SEC_CAPS="PPC32_LINUX"
valt_load_address_pri_norml="0x58000000"
valt_load_address_pri_inner="0x38000000"
valt_load_address_sec_norml="0x58000000"
valt_load_address_sec_inner="0x38000000"
fi
AC_MSG_RESULT([ok (${ARCH_MAX}-${VGCONF_OS})])
;;
ppc64le-linux)
# Little Endian is only supported on PPC64
valt_load_address_sec_norml="0xUNSET"
valt_load_address_sec_inner="0xUNSET"
VGCONF_ARCH_PRI="ppc64le"
VGCONF_ARCH_SEC=""
VGCONF_PLATFORM_PRI_CAPS="PPC64LE_LINUX"
VGCONF_PLATFORM_SEC_CAPS=""
valt_load_address_pri_norml="0x58000000"
valt_load_address_pri_inner="0x38000000"
AC_MSG_RESULT([ok (${ARCH_MAX}-${VGCONF_OS})])
;;
x86-freebsd)
VGCONF_ARCH_PRI="x86"
VGCONF_ARCH_SEC=""
VGCONF_PLATFORM_PRI_CAPS="X86_FREEBSD"
VGCONF_PLATFORM_SEC_CAPS=""
valt_load_address_pri_norml="0x38000000"
valt_load_address_pri_inner="0x28000000"
valt_load_address_sec_norml="0xUNSET"
valt_load_address_sec_inner="0xUNSET"
AC_MSG_RESULT([ok (${ARCH_MAX}-${VGCONF_OS})])
;;
amd64-freebsd)
if test x$vg_cv_only64bit = xyes; then
VGCONF_ARCH_PRI="amd64"
VGCONF_ARCH_SEC=""
VGCONF_PLATFORM_PRI_CAPS="AMD64_FREEBSD"
VGCONF_PLATFORM_SEC_CAPS=""
elif test x$vg_cv_only32bit = xyes; then
VGCONF_ARCH_PRI="x86"
VGCONF_ARCH_SEC=""
VGCONF_PLATFORM_PRI_CAPS="X86_FREEBSD"
VGCONF_PLATFORM_SEC_CAPS=""
else
VGCONF_ARCH_PRI="amd64"
VGCONF_ARCH_SEC="x86"
VGCONF_PLATFORM_PRI_CAPS="AMD64_FREEBSD"
VGCONF_PLATFORM_SEC_CAPS="X86_FREEBSD"
fi
# These work with either base clang or ports installed gcc
# Hand rolled compilers probably need INSTALL_DIR/lib (at least for gcc)
if test x$is_clang = xclang ; then
FLAG_32ON64="-B/usr/lib32"
else
GCC_MAJOR_VERSION=`${CC} -dumpversion | $SED 's/\..*//' 2>/dev/null`
FLAG_32ON64="-B/usr/local/lib32/gcc${GCC_MAJOR_VERSION} -Wl,-rpath,/usr/local/lib32/gcc${GCC_MAJOR_VERSION}/"
fi
valt_load_address_pri_norml="0x38000000"
valt_load_address_pri_inner="0x28000000"
valt_load_address_sec_norml="0x38000000"
valt_load_address_sec_inner="0x28000000"
AC_MSG_RESULT([ok (${ARCH_MAX}-${VGCONF_OS})])
;;
# Darwin gets identified as 32-bit even when it supports 64-bit.
# (Not sure why, possibly because 'uname' returns "i386"?) Just about
# all Macs support both 32-bit and 64-bit, so we just build both. If
# someone has a really old 32-bit only machine they can (hopefully?)
# build with --enable-only32bit. See bug 243362.
x86-darwin|amd64-darwin)
ARCH_MAX="amd64"
valt_load_address_sec_norml="0xUNSET"
valt_load_address_sec_inner="0xUNSET"
if test x$vg_cv_only64bit = xyes; then
VGCONF_ARCH_PRI="amd64"
VGCONF_ARCH_SEC=""
VGCONF_PLATFORM_PRI_CAPS="AMD64_DARWIN"
VGCONF_PLATFORM_SEC_CAPS=""
valt_load_address_pri_norml="0x158000000"
valt_load_address_pri_inner="0x138000000"
elif test x$vg_cv_only32bit = xyes; then
VGCONF_ARCH_PRI="x86"
VGCONF_ARCH_SEC=""
VGCONF_PLATFORM_PRI_CAPS="X86_DARWIN"
VGCONF_PLATFORM_SEC_CAPS=""
VGCONF_ARCH_PRI_CAPS="x86"
valt_load_address_pri_norml="0x58000000"
valt_load_address_pri_inner="0x38000000"
else
VGCONF_ARCH_PRI="amd64"
VGCONF_ARCH_SEC="x86"
VGCONF_PLATFORM_PRI_CAPS="AMD64_DARWIN"
VGCONF_PLATFORM_SEC_CAPS="X86_DARWIN"
valt_load_address_pri_norml="0x158000000"
valt_load_address_pri_inner="0x138000000"
valt_load_address_sec_norml="0x58000000"
valt_load_address_sec_inner="0x38000000"
fi
AC_MSG_RESULT([ok (${ARCH_MAX}-${VGCONF_OS})])
;;
arm-linux)
VGCONF_ARCH_PRI="arm"
VGCONF_PLATFORM_PRI_CAPS="ARM_LINUX"
VGCONF_PLATFORM_SEC_CAPS=""
valt_load_address_pri_norml="0x58000000"
valt_load_address_pri_inner="0x38000000"
valt_load_address_sec_norml="0xUNSET"
valt_load_address_sec_inner="0xUNSET"
AC_MSG_RESULT([ok (${host_cpu}-${host_os})])
;;
arm64-linux)
valt_load_address_sec_norml="0xUNSET"
valt_load_address_sec_inner="0xUNSET"
if test x$vg_cv_only64bit = xyes; then
VGCONF_ARCH_PRI="arm64"
VGCONF_ARCH_SEC=""
VGCONF_PLATFORM_PRI_CAPS="ARM64_LINUX"
VGCONF_PLATFORM_SEC_CAPS=""
valt_load_address_pri_norml="0x58000000"
valt_load_address_pri_inner="0x38000000"
elif test x$vg_cv_only32bit = xyes; then
VGCONF_ARCH_PRI="arm"
VGCONF_ARCH_SEC=""
VGCONF_PLATFORM_PRI_CAPS="ARM_LINUX"
VGCONF_PLATFORM_SEC_CAPS=""
valt_load_address_pri_norml="0x58000000"
valt_load_address_pri_inner="0x38000000"
else
VGCONF_ARCH_PRI="arm64"
VGCONF_ARCH_SEC="arm"
VGCONF_PLATFORM_PRI_CAPS="ARM64_LINUX"
VGCONF_PLATFORM_SEC_CAPS="ARM_LINUX"
valt_load_address_pri_norml="0x58000000"
valt_load_address_pri_inner="0x38000000"
valt_load_address_sec_norml="0x58000000"
valt_load_address_sec_inner="0x38000000"
fi
AC_MSG_RESULT([ok (${ARCH_MAX}-${VGCONF_OS})])
;;
s390x-linux)
VGCONF_ARCH_PRI="s390x"
VGCONF_ARCH_SEC=""
VGCONF_PLATFORM_PRI_CAPS="S390X_LINUX"
VGCONF_PLATFORM_SEC_CAPS=""
# To improve branch prediction hit rate we want to have
# the generated code close to valgrind (host) code
valt_load_address_pri_norml="0x800000000"
valt_load_address_pri_inner="0x810000000"
valt_load_address_sec_norml="0xUNSET"
valt_load_address_sec_inner="0xUNSET"
AC_MSG_RESULT([ok (${ARCH_MAX}-${VGCONF_OS})])
;;
mips32-linux)
VGCONF_ARCH_PRI="mips32"
VGCONF_ARCH_SEC=""
VGCONF_PLATFORM_PRI_CAPS="MIPS32_LINUX"
VGCONF_PLATFORM_SEC_CAPS=""
valt_load_address_pri_norml="0x58000000"
valt_load_address_pri_inner="0x38000000"
valt_load_address_sec_norml="0xUNSET"
valt_load_address_sec_inner="0xUNSET"
AC_MSG_RESULT([ok (${ARCH_MAX}-${VGCONF_OS})])
;;
mips64-linux)
valt_load_address_sec_norml="0xUNSET"
valt_load_address_sec_inner="0xUNSET"
if test x$vg_cv_only64bit = xyes; then
VGCONF_ARCH_PRI="mips64"
VGCONF_PLATFORM_SEC_CAPS=""
VGCONF_PLATFORM_PRI_CAPS="MIPS64_LINUX"
VGCONF_PLATFORM_SEC_CAPS=""
valt_load_address_pri_norml="0x58000000"
valt_load_address_pri_inner="0x38000000"
elif test x$vg_cv_only32bit = xyes; then
VGCONF_ARCH_PRI="mips32"
VGCONF_ARCH_SEC=""
VGCONF_PLATFORM_PRI_CAPS="MIPS32_LINUX"
VGCONF_PLATFORM_SEC_CAPS=""
valt_load_address_pri_norml="0x58000000"
valt_load_address_pri_inner="0x38000000"
else
VGCONF_ARCH_PRI="mips64"
VGCONF_ARCH_SEC="mips32"
VGCONF_PLATFORM_PRI_CAPS="MIPS64_LINUX"
VGCONF_PLATFORM_SEC_CAPS="MIPS32_LINUX"
valt_load_address_pri_norml="0x58000000"
valt_load_address_pri_inner="0x38000000"
valt_load_address_sec_norml="0x58000000"
valt_load_address_sec_inner="0x38000000"
fi
AC_MSG_RESULT([ok (${ARCH_MAX}-${VGCONF_OS})])
;;
nanomips-linux)
VGCONF_ARCH_PRI="nanomips"
VGCONF_ARCH_SEC=""
VGCONF_PLATFORM_PRI_CAPS="NANOMIPS_LINUX"
VGCONF_PLATFORM_SEC_CAPS=""
valt_load_address_pri_norml="0x58000000"
valt_load_address_pri_inner="0x38000000"
valt_load_address_sec_norml="0xUNSET"
valt_load_address_sec_inner="0xUNSET"
AC_MSG_RESULT([ok (${ARCH_MAX}-${VGCONF_OS})])
;;
x86-solaris)
VGCONF_ARCH_PRI="x86"
VGCONF_ARCH_SEC=""
VGCONF_PLATFORM_PRI_CAPS="X86_SOLARIS"
VGCONF_PLATFORM_SEC_CAPS=""
valt_load_address_pri_norml="0x58000000"
valt_load_address_pri_inner="0x38000000"
valt_load_address_sec_norml="0xUNSET"
valt_load_address_sec_inner="0xUNSET"
AC_MSG_RESULT([ok (${ARCH_MAX}-${VGCONF_OS})])
;;
amd64-solaris)
valt_load_address_sec_norml="0xUNSET"
valt_load_address_sec_inner="0xUNSET"
if test x$vg_cv_only64bit = xyes; then
VGCONF_ARCH_PRI="amd64"
VGCONF_ARCH_SEC=""
VGCONF_PLATFORM_PRI_CAPS="AMD64_SOLARIS"
VGCONF_PLATFORM_SEC_CAPS=""
valt_load_address_pri_norml="0x58000000"
valt_load_address_pri_inner="0x38000000"
elif test x$vg_cv_only32bit = xyes; then
VGCONF_ARCH_PRI="x86"
VGCONF_ARCH_SEC=""
VGCONF_PLATFORM_PRI_CAPS="X86_SOLARIS"
VGCONF_PLATFORM_SEC_CAPS=""
valt_load_address_pri_norml="0x58000000"
valt_load_address_pri_inner="0x38000000"
else
VGCONF_ARCH_PRI="amd64"
VGCONF_ARCH_SEC="x86"
VGCONF_PLATFORM_PRI_CAPS="AMD64_SOLARIS"
VGCONF_PLATFORM_SEC_CAPS="X86_SOLARIS"
valt_load_address_pri_norml="0x58000000"
valt_load_address_pri_inner="0x38000000"
valt_load_address_sec_norml="0x58000000"
valt_load_address_sec_inner="0x38000000"
fi
AC_MSG_RESULT([ok (${ARCH_MAX}-${VGCONF_OS})])
;;
*)
VGCONF_ARCH_PRI="unknown"
VGCONF_ARCH_SEC="unknown"
VGCONF_PLATFORM_PRI_CAPS="UNKNOWN"
VGCONF_PLATFORM_SEC_CAPS="UNKNOWN"
valt_load_address_pri_norml="0xUNSET"
valt_load_address_pri_inner="0xUNSET"
valt_load_address_sec_norml="0xUNSET"
valt_load_address_sec_inner="0xUNSET"
AC_MSG_RESULT([no (${ARCH_MAX}-${VGCONF_OS})])
AC_MSG_ERROR([Valgrind is platform specific. Sorry. Please consider doing a port.])
;;
esac
#----------------------------------------------------------------------------
# Set up VGCONF_ARCHS_INCLUDE_<arch>. Either one or two of these become
# defined.
AM_CONDITIONAL(VGCONF_ARCHS_INCLUDE_X86,
test x$VGCONF_PLATFORM_PRI_CAPS = xX86_LINUX \
-o x$VGCONF_PLATFORM_SEC_CAPS = xX86_LINUX \
-o x$VGCONF_PLATFORM_PRI_CAPS = xX86_FREEBSD \
-o x$VGCONF_PLATFORM_SEC_CAPS = xX86_FREEBSD \
-o x$VGCONF_PLATFORM_PRI_CAPS = xX86_DARWIN \
-o x$VGCONF_PLATFORM_SEC_CAPS = xX86_DARWIN \
-o x$VGCONF_PLATFORM_PRI_CAPS = xX86_SOLARIS \
-o x$VGCONF_PLATFORM_SEC_CAPS = xX86_SOLARIS )
AM_CONDITIONAL(VGCONF_ARCHS_INCLUDE_AMD64,
test x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_LINUX \
-o x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_FREEBSD \
-o x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_DARWIN \
-o x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_SOLARIS )
AM_CONDITIONAL(VGCONF_ARCHS_INCLUDE_PPC32,
test x$VGCONF_PLATFORM_PRI_CAPS = xPPC32_LINUX \
-o x$VGCONF_PLATFORM_SEC_CAPS = xPPC32_LINUX )
AM_CONDITIONAL(VGCONF_ARCHS_INCLUDE_PPC64,
test x$VGCONF_PLATFORM_PRI_CAPS = xPPC64BE_LINUX \
-o x$VGCONF_PLATFORM_PRI_CAPS = xPPC64LE_LINUX )
AM_CONDITIONAL(VGCONF_ARCHS_INCLUDE_ARM,
test x$VGCONF_PLATFORM_PRI_CAPS = xARM_LINUX \
-o x$VGCONF_PLATFORM_SEC_CAPS = xARM_LINUX )
AM_CONDITIONAL(VGCONF_ARCHS_INCLUDE_ARM64,
test x$VGCONF_PLATFORM_PRI_CAPS = xARM64_LINUX )
AM_CONDITIONAL(VGCONF_ARCHS_INCLUDE_S390X,
test x$VGCONF_PLATFORM_PRI_CAPS = xS390X_LINUX )
AM_CONDITIONAL(VGCONF_ARCHS_INCLUDE_MIPS32,
test x$VGCONF_PLATFORM_PRI_CAPS = xMIPS32_LINUX \
-o x$VGCONF_PLATFORM_SEC_CAPS = xMIPS32_LINUX )
AM_CONDITIONAL(VGCONF_ARCHS_INCLUDE_MIPS64,
test x$VGCONF_PLATFORM_PRI_CAPS = xMIPS64_LINUX )
AM_CONDITIONAL(VGCONF_ARCHS_INCLUDE_NANOMIPS,
test x$VGCONF_PLATFORM_PRI_CAPS = xNANOMIPS_LINUX )
# Set up VGCONF_PLATFORMS_INCLUDE_<platform>. Either one or two of these
# become defined.
AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_X86_LINUX,
test x$VGCONF_PLATFORM_PRI_CAPS = xX86_LINUX \
-o x$VGCONF_PLATFORM_SEC_CAPS = xX86_LINUX)
AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_AMD64_LINUX,
test x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_LINUX)
AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_PPC32_LINUX,
test x$VGCONF_PLATFORM_PRI_CAPS = xPPC32_LINUX \
-o x$VGCONF_PLATFORM_SEC_CAPS = xPPC32_LINUX)
AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_PPC64BE_LINUX,
test x$VGCONF_PLATFORM_PRI_CAPS = xPPC64BE_LINUX)
AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_PPC64LE_LINUX,
test x$VGCONF_PLATFORM_PRI_CAPS = xPPC64LE_LINUX)
AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_ARM_LINUX,
test x$VGCONF_PLATFORM_PRI_CAPS = xARM_LINUX \
-o x$VGCONF_PLATFORM_SEC_CAPS = xARM_LINUX)
AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_ARM64_LINUX,
test x$VGCONF_PLATFORM_PRI_CAPS = xARM64_LINUX)
AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_S390X_LINUX,
test x$VGCONF_PLATFORM_PRI_CAPS = xS390X_LINUX \
-o x$VGCONF_PLATFORM_SEC_CAPS = xS390X_LINUX)
AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_MIPS32_LINUX,
test x$VGCONF_PLATFORM_PRI_CAPS = xMIPS32_LINUX \
-o x$VGCONF_PLATFORM_SEC_CAPS = xMIPS32_LINUX)
AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_MIPS64_LINUX,
test x$VGCONF_PLATFORM_PRI_CAPS = xMIPS64_LINUX)
AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_NANOMIPS_LINUX,
test x$VGCONF_PLATFORM_PRI_CAPS = xNANOMIPS_LINUX)
AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_X86_FREEBSD,
test x$VGCONF_PLATFORM_PRI_CAPS = xX86_FREEBSD \
-o x$VGCONF_PLATFORM_SEC_CAPS = xX86_FREEBSD)
AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_AMD64_FREEBSD,
test x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_FREEBSD)
AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_X86_DARWIN,
test x$VGCONF_PLATFORM_PRI_CAPS = xX86_DARWIN \
-o x$VGCONF_PLATFORM_SEC_CAPS = xX86_DARWIN)
AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_AMD64_DARWIN,
test x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_DARWIN)
AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_X86_SOLARIS,
test x$VGCONF_PLATFORM_PRI_CAPS = xX86_SOLARIS \
-o x$VGCONF_PLATFORM_SEC_CAPS = xX86_SOLARIS)
AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_AMD64_SOLARIS,
test x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_SOLARIS)
# Similarly, set up VGCONF_OS_IS_<os>. Exactly one of these becomes defined.
# Relies on the assumption that the primary and secondary targets are
# for the same OS, so therefore only necessary to test the primary.
AM_CONDITIONAL(VGCONF_OS_IS_LINUX,
test x$VGCONF_PLATFORM_PRI_CAPS = xX86_LINUX \
-o x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_LINUX \
-o x$VGCONF_PLATFORM_PRI_CAPS = xPPC32_LINUX \
-o x$VGCONF_PLATFORM_PRI_CAPS = xPPC64BE_LINUX \
-o x$VGCONF_PLATFORM_PRI_CAPS = xPPC64LE_LINUX \
-o x$VGCONF_PLATFORM_PRI_CAPS = xARM_LINUX \
-o x$VGCONF_PLATFORM_PRI_CAPS = xARM64_LINUX \
-o x$VGCONF_PLATFORM_PRI_CAPS = xS390X_LINUX \
-o x$VGCONF_PLATFORM_PRI_CAPS = xMIPS32_LINUX \
-o x$VGCONF_PLATFORM_PRI_CAPS = xMIPS64_LINUX \
-o x$VGCONF_PLATFORM_PRI_CAPS = xNANOMIPS_LINUX)
AM_CONDITIONAL(VGCONF_OS_IS_FREEBSD,
test x$VGCONF_PLATFORM_PRI_CAPS = xX86_FREEBSD \
-o x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_FREEBSD)
AM_CONDITIONAL(VGCONF_OS_IS_DARWIN,
test x$VGCONF_PLATFORM_PRI_CAPS = xX86_DARWIN \
-o x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_DARWIN)
AM_CONDITIONAL(VGCONF_OS_IS_SOLARIS,
test x$VGCONF_PLATFORM_PRI_CAPS = xX86_SOLARIS \
-o x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_SOLARIS)
AM_CONDITIONAL(VGCONF_OS_IS_DARWIN_OR_FREEBSD,
test x$VGCONF_PLATFORM_PRI_CAPS = xX86_FREEBSD \
-o x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_FREEBSD \
-o x$VGCONF_PLATFORM_PRI_CAPS = xX86_DARWIN \
-o x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_DARWIN)
# Sometimes, in the Makefile.am files, it's useful to know whether or not
# there is a secondary target.
AM_CONDITIONAL(VGCONF_HAVE_PLATFORM_SEC,
test x$VGCONF_PLATFORM_SEC_CAPS != x)
dnl automake-1.10 does not have AM_COND_IF (added in 1.11), so we supply a
dnl fallback definition
dnl The macro is courtesy of Dave Hart:
dnl https://lists.gnu.org/archive/html/automake/2010-12/msg00045.html
m4_ifndef([AM_COND_IF], [AC_DEFUN([AM_COND_IF], [
if test -z "$$1_TRUE"; then :
m4_n([$2])[]dnl
m4_ifval([$3],
[else
$3
])dnl
fi[]dnl
])])
#----------------------------------------------------------------------------
# Inner Valgrind?
#----------------------------------------------------------------------------
# Check if this should be built as an inner Valgrind, to be run within
# another Valgrind. Choose the load address accordingly.
AC_SUBST(VALT_LOAD_ADDRESS_PRI)
AC_SUBST(VALT_LOAD_ADDRESS_SEC)
AC_CACHE_CHECK([for use as an inner Valgrind], vg_cv_inner,
[AC_ARG_ENABLE(inner,
[ --enable-inner enables self-hosting],
[vg_cv_inner=$enableval],
[vg_cv_inner=no])])
if test "$vg_cv_inner" = yes; then
AC_DEFINE([ENABLE_INNER], 1, [configured to run as an inner Valgrind])
VALT_LOAD_ADDRESS_PRI=$valt_load_address_pri_inner
VALT_LOAD_ADDRESS_SEC=$valt_load_address_sec_inner
else
VALT_LOAD_ADDRESS_PRI=$valt_load_address_pri_norml
VALT_LOAD_ADDRESS_SEC=$valt_load_address_sec_norml
fi
#----------------------------------------------------------------------------
# Undefined behaviour sanitiser
#----------------------------------------------------------------------------
# Check whether we should build with the undefined beahviour sanitiser.
AC_CACHE_CHECK([for using the undefined behaviour sanitiser], vg_cv_ubsan,
[AC_ARG_ENABLE(ubsan,
[ --enable-ubsan enables the undefined behaviour sanitiser],
[vg_cv_ubsan=$enableval],
[vg_cv_ubsan=no])])
#----------------------------------------------------------------------------
# Extra fine-tuning of installation directories
#----------------------------------------------------------------------------
AC_ARG_WITH(tmpdir,
[ --with-tmpdir=PATH Specify path for temporary files],
tmpdir="$withval",
tmpdir="/tmp")
AC_DEFINE_UNQUOTED(VG_TMPDIR, "$tmpdir", [Temporary files directory])
AC_SUBST(VG_TMPDIR, [$tmpdir])
#----------------------------------------------------------------------------
# Detect xcode path
#----------------------------------------------------------------------------
AM_COND_IF([VGCONF_OS_IS_DARWIN],
[AC_CHECK_PROG([XCRUN], [xcrun], [yes], [no])
AC_MSG_CHECKING([for xcode sdk include path])
AC_ARG_WITH(xcodedir,
[ --with-xcode-path=PATH Specify path for xcode sdk includes],
[xcodedir="$withval"],
[
if test "x$XCRUN" != "xno" -a ! -d /usr/include; then
xcrundir=`xcrun --sdk macosx --show-sdk-path`
if test -z "$xcrundir"; then
xcodedir="/usr/include"
else
xcodedir="$xcrundir/usr/include"
fi
else
xcodedir="/usr/include"
fi
])
AC_MSG_RESULT([$xcodedir])
AC_DEFINE_UNQUOTED(XCODE_DIR, "$xcodedir", [xcode sdk include directory])
AC_SUBST(XCODE_DIR, [$xcodedir])])
#----------------------------------------------------------------------------
# Libc and suppressions
#----------------------------------------------------------------------------
# This variable will collect the suppression files to be used.
AC_SUBST(DEFAULT_SUPP)
AC_CHECK_HEADER([features.h])
if test x$ac_cv_header_features_h = xyes; then
rm -f conftest.$ac_ext
cat <<_ACEOF >conftest.$ac_ext
#include <features.h>
#if defined(__GNU_LIBRARY__) && defined(__GLIBC__) && defined(__GLIBC_MINOR__)
glibc version is: __GLIBC__ __GLIBC_MINOR__
#endif
_ACEOF
GLIBC_VERSION="`$CPP -P conftest.$ac_ext | $SED -n 's/^glibc version is: //p' | $SED 's/ /./g'`"
fi
# not really a version check
AC_EGREP_CPP([DARWIN_LIBC], [
#include <sys/cdefs.h>
#if defined(__DARWIN_VERS_1050)
DARWIN_LIBC
#endif
],
GLIBC_VERSION="darwin")
AC_EGREP_CPP([FREEBSD_LIBC], [
#include <sys/cdefs.h>
#if defined(__FreeBSD__)
FREEBSD_LIBC
#endif
],
GLIBC_VERSION="freebsd")
# not really a version check
AC_EGREP_CPP([BIONIC_LIBC], [
#if defined(__ANDROID__)
BIONIC_LIBC
#endif
],
GLIBC_VERSION="bionic")
# there is only one version of libc on Solaris
if test x$VGCONF_PLATFORM_PRI_CAPS = xX86_SOLARIS \
-o x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_SOLARIS; then
GLIBC_VERSION="solaris"
fi
# GLIBC_VERSION is empty if a musl libc is used, so use the toolchain tuple
# in this case.
if test x$GLIBC_VERSION = x; then
if $CC -dumpmachine | grep -q musl; then
GLIBC_VERSION=musl
fi
fi
# If this is glibc then figure out the generic (in file) libc.so and
# libpthread.so file paths to use in suppressions. Before 2.34 libpthread
# was a separate library, afterwards it was merged into libc.so and
# the library is called libc.so.6 (before it was libc-2.[0-9]+.so).
# Use this fact to set GLIBC_LIBC_PATH and GLIBC_LIBPTHREAD_PATH.
case ${GLIBC_VERSION} in
2*)
AC_MSG_CHECKING([whether pthread_create needs libpthread])
AC_LINK_IFELSE([AC_LANG_CALL([], [pthread_create])],
[
AC_MSG_RESULT([no])
GLIBC_LIBC_PATH="*/lib*/libc.so.6"
GLIBC_LIBPTHREAD_PATH="$GLIBC_LIBC_PATH"
], [
AC_MSG_RESULT([yes])
GLIBC_LIBC_PATH="*/lib*/libc-2.*so*"
GLIBC_LIBPTHREAD_PATH="*/lib*/libpthread-2.*so*"
])
;;
*)
AC_MSG_CHECKING([not glibc...])
AC_MSG_RESULT([${GLIBC_VERSION}])
;;
esac
AC_MSG_CHECKING([the glibc version])
case "${GLIBC_VERSION}" in
2.2)
AC_MSG_RESULT(${GLIBC_VERSION} family)
DEFAULT_SUPP="$srcdir/glibc-2.2.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="$srcdir/glibc-2.2-LinuxThreads-helgrind.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="glibc-2.X-drd.supp ${DEFAULT_SUPP}"
;;
2.[[3-6]])
AC_MSG_RESULT(${GLIBC_VERSION} family)
DEFAULT_SUPP="$srcdir/glibc-${GLIBC_VERSION}.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="glibc-2.X-helgrind.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="glibc-2.X-drd.supp ${DEFAULT_SUPP}"
;;
2.[[7-9]])
AC_MSG_RESULT(${GLIBC_VERSION} family)
DEFAULT_SUPP="glibc-2.X.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="glibc-2.X-helgrind.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="glibc-2.X-drd.supp ${DEFAULT_SUPP}"
;;
2.10|2.11)
AC_MSG_RESULT(${GLIBC_VERSION} family)
AC_DEFINE([GLIBC_MANDATORY_STRLEN_REDIRECT], 1,
[Define to 1 if strlen() has been optimized heavily (amd64 glibc >= 2.10)])
DEFAULT_SUPP="glibc-2.X.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="glibc-2.X-helgrind.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="glibc-2.X-drd.supp ${DEFAULT_SUPP}"
;;
2.*)
AC_MSG_RESULT(${GLIBC_VERSION} family)
AC_DEFINE([GLIBC_MANDATORY_STRLEN_REDIRECT], 1,
[Define to 1 if strlen() has been optimized heavily (amd64 glibc >= 2.10)])
AC_DEFINE([GLIBC_MANDATORY_INDEX_AND_STRLEN_REDIRECT], 1,
[Define to 1 if index() and strlen() have been optimized heavily (x86 glibc >= 2.12)])
DEFAULT_SUPP="glibc-2.X.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="glibc-2.X-helgrind.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="glibc-2.X-drd.supp ${DEFAULT_SUPP}"
;;
darwin)
AC_MSG_RESULT(Darwin)
AC_DEFINE([DARWIN_LIBC], 1, [Define to 1 if you're using Darwin])
# DEFAULT_SUPP set by kernel version check above.
;;
freebsd)
AC_MSG_RESULT(FreeBSD)
AC_DEFINE([FREEBSD_LIBC], 1, [Define to 1 if you're using FreeBSD])
# DEFAULT_SUPP set by kernel version check above.
;;
bionic)
AC_MSG_RESULT(Bionic)
AC_DEFINE([BIONIC_LIBC], 1, [Define to 1 if you're using Bionic])
DEFAULT_SUPP="$srcdir/bionic.supp ${DEFAULT_SUPP}"
;;
solaris)
AC_MSG_RESULT(Solaris)
# DEFAULT_SUPP set in host_os switch-case above.
# No other suppression file is used.
;;
musl)
AC_MSG_RESULT(Musl)
AC_DEFINE([MUSL_LIBC], 1, [Define to 1 if you're using Musl libc])
DEFAULT_SUPP="$srcdir/musl.supp ${DEFAULT_SUPP}"
;;
2.0|2.1|*)
AC_MSG_RESULT([unsupported version ${GLIBC_VERSION}])
AC_MSG_ERROR([Valgrind requires glibc version 2.2 or later, uClibc,])
AC_MSG_ERROR([musl libc, Darwin libc, Bionic libc or Solaris libc])
;;
esac
AC_SUBST(GLIBC_VERSION)
AC_SUBST(GLIBC_LIBC_PATH)
AC_SUBST(GLIBC_LIBPTHREAD_PATH)
if test "$VGCONF_OS" != "solaris"; then
# Add default suppressions for the X client libraries. Make no
# attempt to detect whether such libraries are installed on the
# build machine (or even if any X facilities are present); just
# add the suppressions antidisirregardless.
DEFAULT_SUPP="$srcdir/xfree-4.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="$srcdir/xfree-3.supp ${DEFAULT_SUPP}"
fi
#----------------------------------------------------------------------------
# Platform variants?
#----------------------------------------------------------------------------
# Normally the PLAT = (ARCH, OS) characterisation of the platform is enough.
# But there are times where we need a bit more control. The motivating
# and currently only case is Android: this is almost identical to
# {x86,arm,mips}-linux, but not quite. So this introduces the concept of
# platform variant tags, which get passed in the compile as
# -DVGPV_<arch>_<os>_<variant> along with the main -DVGP_<arch>_<os> definition.
#
# In almost all cases, the <variant> bit is "vanilla". But for Android
# it is "android" instead.
#
# Consequently (eg), plain arm-linux would build with
#
# -DVGP_arm_linux -DVGPV_arm_linux_vanilla
#
# whilst an Android build would have
#
# -DVGP_arm_linux -DVGPV_arm_linux_android
#
# Same for x86. The setup of the platform variant is pushed relatively far
# down this file in order that we can inspect any of the variables set above.
# In the normal case ..
VGCONF_PLATVARIANT="vanilla"
# Android ?
if test "$GLIBC_VERSION" = "bionic";
then
VGCONF_PLATVARIANT="android"
fi
AC_SUBST(VGCONF_PLATVARIANT)
# FIXME: do we also want to define automake variables
# VGCONF_PLATVARIANT_IS_<WHATEVER>, where WHATEVER is (currently)
# VANILLA or ANDROID ? This would be in the style of VGCONF_ARCHS_INCLUDE,
# VGCONF_PLATFORMS_INCLUDE and VGCONF_OS_IS above? Could easily enough
# do that. Problem is that we can't do and-ing in Makefile.am's, but
# that's what we'd need to do to use this, since what we'd want to write
# is something like
#
# VGCONF_PLATFORMS_INCLUDE_ARM_LINUX && VGCONF_PLATVARIANT_IS_ANDROID
#
# Hmm. Can't think of a nice clean solution to this.
AM_CONDITIONAL(VGCONF_PLATVARIANT_IS_VANILLA,
test x$VGCONF_PLATVARIANT = xvanilla)
AM_CONDITIONAL(VGCONF_PLATVARIANT_IS_ANDROID,
test x$VGCONF_PLATVARIANT = xandroid)
#----------------------------------------------------------------------------
# Checking for various library functions and other definitions
#----------------------------------------------------------------------------
# Check for AT_FDCWD
AC_MSG_CHECKING([for AT_FDCWD])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#define _GNU_SOURCE
#include <fcntl.h>
#include <unistd.h>
]], [[
int a = AT_FDCWD;
]])], [
ac_have_at_fdcwd=yes
AC_MSG_RESULT([yes])
], [
ac_have_at_fdcwd=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL([HAVE_AT_FDCWD], [test x$ac_have_at_fdcwd = xyes])
# Check for stpncpy function definition in string.h
# This explicitly checks with _GNU_SOURCE defined since that is also
# used in the test case (some systems might define it without anyway
# since stpncpy is part of The Open Group Base Specifications Issue 7
# IEEE Std 1003.1-2008.
AC_MSG_CHECKING([for stpncpy])
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#define _GNU_SOURCE
#include <string.h>
]], [[
char *d;
char *s;
size_t n = 0;
char *r = stpncpy(d, s, n);
]])], [
ac_have_gnu_stpncpy=yes
AC_MSG_RESULT([yes])
], [
ac_have_gnu_stpncpy=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL([HAVE_GNU_STPNCPY], [test x$ac_have_gnu_stpncpy = xyes])
# Check for PTRACE_GETREGS
AC_MSG_CHECKING([for PTRACE_GETREGS])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <stdlib.h>
#include <stddef.h>
#include <sys/ptrace.h>
#include <sys/user.h>
]], [[
void *p;
long res = ptrace (PTRACE_GETREGS, 0, p, p);
]])], [
AC_MSG_RESULT([yes])
AC_DEFINE([HAVE_PTRACE_GETREGS], 1,
[Define to 1 if you have the `PTRACE_GETREGS' ptrace request.])
], [
AC_MSG_RESULT([no])
])
# Check for CLOCK_MONOTONIC
AC_MSG_CHECKING([for CLOCK_MONOTONIC])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <time.h>
]], [[
struct timespec t;
clock_gettime(CLOCK_MONOTONIC, &t);
return 0;
]])], [
AC_MSG_RESULT([yes])
AC_DEFINE([HAVE_CLOCK_MONOTONIC], 1,
[Define to 1 if you have the `CLOCK_MONOTONIC' constant.])
], [
AC_MSG_RESULT([no])
])
# Check for ELF32/64_CHDR
AC_CHECK_TYPES([Elf32_Chdr, Elf64_Chdr], [], [], [[#include <elf.h>]])
# Check for PTHREAD_RWLOCK_T
AC_MSG_CHECKING([for pthread_rwlock_t])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#define _GNU_SOURCE
#include <pthread.h>
]], [[
pthread_rwlock_t rwl;
]])], [
AC_MSG_RESULT([yes])
AC_DEFINE([HAVE_PTHREAD_RWLOCK_T], 1,
[Define to 1 if you have the `pthread_rwlock_t' type.])
], [
AC_MSG_RESULT([no])
])
# Check for CLOCKID_T
AC_MSG_CHECKING([for clockid_t])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <time.h>
]], [[
clockid_t c;
]])], [
AC_MSG_RESULT([yes])
AC_DEFINE([HAVE_CLOCKID_T], 1,
[Define to 1 if you have the `clockid_t' type.])
], [
AC_MSG_RESULT([no])
])
# Check for PTHREAD_MUTEX_ADAPTIVE_NP
AC_MSG_CHECKING([for PTHREAD_MUTEX_ADAPTIVE_NP])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#define _GNU_SOURCE
#include <pthread.h>
]], [[
return (PTHREAD_MUTEX_ADAPTIVE_NP);
]])], [
AC_MSG_RESULT([yes])
AC_DEFINE([HAVE_PTHREAD_MUTEX_ADAPTIVE_NP], 1,
[Define to 1 if you have the `PTHREAD_MUTEX_ADAPTIVE_NP' constant.])
], [
AC_MSG_RESULT([no])
])
# Check for PTHREAD_MUTEX_ERRORCHECK_NP
AC_MSG_CHECKING([for PTHREAD_MUTEX_ERRORCHECK_NP])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#define _GNU_SOURCE
#include <pthread.h>
]], [[
return (PTHREAD_MUTEX_ERRORCHECK_NP);
]])], [
AC_MSG_RESULT([yes])
AC_DEFINE([HAVE_PTHREAD_MUTEX_ERRORCHECK_NP], 1,
[Define to 1 if you have the `PTHREAD_MUTEX_ERRORCHECK_NP' constant.])
], [
AC_MSG_RESULT([no])
])
# Check for PTHREAD_MUTEX_RECURSIVE_NP
AC_MSG_CHECKING([for PTHREAD_MUTEX_RECURSIVE_NP])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#define _GNU_SOURCE
#include <pthread.h>
]], [[
return (PTHREAD_MUTEX_RECURSIVE_NP);
]])], [
AC_MSG_RESULT([yes])
AC_DEFINE([HAVE_PTHREAD_MUTEX_RECURSIVE_NP], 1,
[Define to 1 if you have the `PTHREAD_MUTEX_RECURSIVE_NP' constant.])
], [
AC_MSG_RESULT([no])
])
# Check for PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
AC_MSG_CHECKING([for PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#define _GNU_SOURCE
#include <pthread.h>
]], [[
pthread_mutex_t m = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
return 0;
]])], [
AC_MSG_RESULT([yes])
AC_DEFINE([HAVE_PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP], 1,
[Define to 1 if you have the `PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP' constant.])
], [
AC_MSG_RESULT([no])
])
# Check whether pthread_mutex_t has a member called __m_kind.
AC_CHECK_MEMBER([pthread_mutex_t.__m_kind],
[AC_DEFINE([HAVE_PTHREAD_MUTEX_T__M_KIND],
1,
[Define to 1 if pthread_mutex_t has a member called __m_kind.])
],
[],
[#include <pthread.h>])
# Check whether pthread_mutex_t has a member called __data.__kind.
AC_CHECK_MEMBER([pthread_mutex_t.__data.__kind],
[AC_DEFINE([HAVE_PTHREAD_MUTEX_T__DATA__KIND],
1,
[Define to 1 if pthread_mutex_t has a member __data.__kind.])
],
[],
[#include <pthread.h>])
# Convenience function. Set flags based on the existing HWCAP entries.
# The AT_HWCAP entries are generated by glibc, and are based on
# functions supported by the hardware/system/libc.
# Subsequent support for whether the capability will actually be utilized
# will also be checked against the compiler capabilities.
# called as
# AC_HWCAP_CONTAINS_FLAG[hwcap_string_to_match],[VARIABLE_TO_SET]
AC_DEFUN([AC_HWCAP_CONTAINS_FLAG],[
AUXV_CHECK_FOR=$1
AC_MSG_CHECKING([if AT_HWCAP contains the $AUXV_CHECK_FOR indicator])
if env LD_SHOW_AUXV=1 true | grep ^AT_HWCAP | grep -q -w ${AUXV_CHECK_FOR}
then
AC_MSG_RESULT([yes])
AC_SUBST([$2],[yes])
else
AC_MSG_RESULT([no])
AC_SUBST([$2],[])
fi
])
# gather hardware capabilities. (hardware/kernel/libc)
AC_HWCAP_CONTAINS_FLAG([altivec],[HWCAP_HAS_ALTIVEC])
AC_HWCAP_CONTAINS_FLAG([vsx],[HWCAP_HAS_VSX])
AC_HWCAP_CONTAINS_FLAG([dfp],[HWCAP_HAS_DFP])
AC_HWCAP_CONTAINS_FLAG([arch_2_05],[HWCAP_HAS_ISA_2_05])
AC_HWCAP_CONTAINS_FLAG([arch_2_06],[HWCAP_HAS_ISA_2_06])
AC_HWCAP_CONTAINS_FLAG([arch_2_07],[HWCAP_HAS_ISA_2_07])
AC_HWCAP_CONTAINS_FLAG([arch_3_00],[HWCAP_HAS_ISA_3_00])
AC_HWCAP_CONTAINS_FLAG([arch_3_1],[HWCAP_HAS_ISA_3_1])
AC_HWCAP_CONTAINS_FLAG([htm],[HWCAP_HAS_HTM])
AC_HWCAP_CONTAINS_FLAG([mma],[HWCAP_HAS_MMA])
# ISA Levels
AM_CONDITIONAL(HAS_ISA_2_05, [test x$HWCAP_HAS_ISA_2_05 = xyes])
AM_CONDITIONAL(HAS_ISA_2_06, [test x$HWCAP_HAS_ISA_2_06 = xyes])
# compiler support for isa 2.07 level instructions
AC_MSG_CHECKING([that assembler knows ISA 2.07 instructions ])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
]], [[
__asm__ __volatile__("mtvsrd 1,2 ");
]])], [
ac_asm_have_isa_2_07=yes
AC_MSG_RESULT([yes])
], [
ac_asm_have_isa_2_07=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(HAS_ISA_2_07, [test x$ac_asm_have_isa_2_07 = xyes \
-a x$HWCAP_HAS_ISA_2_07 = xyes])
# altivec (vsx) support.
# does this compiler support -maltivec and does it have the include file
# <altivec.h> ?
AC_MSG_CHECKING([for Altivec support in the compiler ])
safe_CFLAGS=$CFLAGS
CFLAGS="-maltivec -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <altivec.h>
]], [[
vector unsigned int v;
]])], [
ac_have_altivec=yes
AC_MSG_RESULT([yes])
], [
ac_have_altivec=no
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
AM_CONDITIONAL([HAS_ALTIVEC], [test x$ac_have_altivec = xyes \
-a x$HWCAP_HAS_ALTIVEC = xyes])
# Check that both: the compiler supports -mvsx and that the assembler
# understands VSX instructions. If either of those doesn't work,
# conclude that we can't do VSX.
AC_MSG_CHECKING([for VSX compiler flag support])
safe_CFLAGS=$CFLAGS
CFLAGS="-mvsx -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
]], [[
]])], [
ac_compiler_supports_vsx_flag=yes
AC_MSG_RESULT([yes])
], [
ac_compiler_supports_vsx_flag=no
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
AC_MSG_CHECKING([for VSX support in the assembler ])
safe_CFLAGS=$CFLAGS
CFLAGS="-mvsx -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <altivec.h>
]], [[
vector unsigned int v;
__asm__ __volatile__("xsmaddadp 32, 32, 33" ::: "memory","cc");
]])], [
ac_compiler_supports_vsx=yes
AC_MSG_RESULT([yes])
], [
ac_compiler_supports_vsx=no
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
AM_CONDITIONAL([HAS_VSX], [test x$ac_compiler_supports_vsx_flag = xyes \
-a x$ac_compiler_supports_vsx = xyes \
-a x$HWCAP_HAS_VSX = xyes ])
# DFP (Decimal Float)
# The initial DFP support was added in Power 6. The dcffix instruction
# support was added in Power 7.
AC_MSG_CHECKING([that assembler knows DFP])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
]], [[
#ifdef __s390__
__asm__ __volatile__("adtr 1, 2, 3")
#else
__asm__ __volatile__(".machine power7;\n" \
"dadd 1, 2, 3;\n" \
"dcffix 1, 2");
#endif
]])], [
ac_asm_have_dfp=yes
AC_MSG_RESULT([yes])
], [
ac_asm_have_dfp=no
AC_MSG_RESULT([no])
])
AC_MSG_CHECKING([that compiler knows -mhard-dfp switch])
safe_CFLAGS=$CFLAGS
CFLAGS="-mhard-dfp -Werror"
# The dcffix instruction is Power 7
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
]], [[
#ifdef __s390__
__asm__ __volatile__("adtr 1, 2, 3")
#else
__asm__ __volatile__(".machine power7;\n" \
"dadd 1, 2, 3;\n" \
"dcffix 1, 2");
#endif
]])], [
ac_compiler_have_dfp=yes
AC_MSG_RESULT([yes])
], [
ac_compiler_have_dfp=no
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
AM_CONDITIONAL(HAS_DFP, test x$ac_asm_have_dfp = xyes \
-a x$ac_compiler_have_dfp = xyes \
-a x$HWCAP_HAS_DFP = xyes )
AC_MSG_CHECKING([that compiler knows DFP datatypes])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
]], [[
_Decimal64 x = 0.0DD;
]])], [
ac_compiler_have_dfp_type=yes
AC_MSG_RESULT([yes])
], [
ac_compiler_have_dfp_type=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(BUILD_DFP_TESTS, test x$ac_compiler_have_dfp_type = xyes \
-a x$HWCAP_HAS_DFP = xyes )
# HTM (Hardware Transactional Memory)
AC_MSG_CHECKING([if compiler accepts the -mhtm flag])
safe_CFLAGS=$CFLAGS
CFLAGS="-mhtm -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
]], [[
return 0;
]])], [
AC_MSG_RESULT([yes])
ac_compiler_supports_htm=yes
], [
AC_MSG_RESULT([no])
ac_compiler_supports_htm=no
])
CFLAGS=$safe_CFLAGS
AC_MSG_CHECKING([if compiler can find the htm builtins])
safe_CFLAGS=$CFLAGS
CFLAGS="-mhtm -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
]], [[
if (__builtin_tbegin (0))
__builtin_tend (0);
]])], [
AC_MSG_RESULT([yes])
ac_compiler_sees_htm_builtins=yes
], [
AC_MSG_RESULT([no])
ac_compiler_sees_htm_builtins=no
])
CFLAGS=$safe_CFLAGS
AM_CONDITIONAL(SUPPORTS_HTM, test x$ac_compiler_supports_htm = xyes \
-a x$ac_compiler_sees_htm_builtins = xyes \
-a x$HWCAP_HAS_HTM = xyes )
# isa 3.0 checking. (actually 3.0 or newer)
AC_MSG_CHECKING([that assembler knows ISA 3.00 ])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
]], [[
__asm__ __volatile__ (".machine power9;\n" \
"cnttzw 1,3; \n" );
]])], [
# guest_ppc_helpers.c needs the HAS_ISA_3_OO to enable copy, paste,
# cpabort support
safe_CFLAGS=$CFLAGS
CFLAGS="-DHAS_ISA_3_00"
ac_asm_have_isa_3_00=yes
AC_MSG_RESULT([yes])
], [
ac_asm_have_isa_3_00=no
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
# xscvhpdp checking
AC_MSG_CHECKING([that assembler knows xscvhpdp ])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
]], [[
__asm__ __volatile__ (".machine power9;\n" \
"xscvhpdp 1,2;\n" );
]])], [
ac_asm_have_xscvhpdp=yes
AC_MSG_RESULT([yes])
], [
ac_asm_have_xscvhpdp=no
AC_MSG_RESULT([no])
])
# darn instruction checking
AC_MSG_CHECKING([that assembler knows darn instruction ])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
]], [[
__asm__ __volatile__(".machine power9; darn 1,0 ");
]])], [
ac_asm_have_darn_inst=yes
AC_MSG_RESULT([yes])
], [
ac_asm_have_darn_inst=no
AC_MSG_RESULT([no])
])
# isa 3.01 checking
AC_MSG_CHECKING([that assembler knows ISA 3.1 ])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
]], [[
__asm__ __volatile__ (".machine power10;\n" \
"brh 1,2;\n ");
]])], [
ac_asm_have_isa_3_1=yes
AC_MSG_RESULT([yes])
], [
ac_asm_have_isa_3_1=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(HAS_ISA_3_00, [test x$ac_asm_have_isa_3_00 = xyes \
-a x$HWCAP_HAS_ISA_3_00 = xyes])
AM_CONDITIONAL(HAS_XSCVHPDP, [test x$ac_asm_have_xscvhpdp = xyes])
AM_CONDITIONAL(HAS_DARN, [test x$ac_asm_have_darn_inst = xyes])
AM_CONDITIONAL(HAS_ISA_3_1, [test x$ac_asm_have_isa_3_1 = xyes \
-a x$HWCAP_HAS_ISA_3_1 = xyes])
# Check for pthread_create@GLIBC2.0
AC_MSG_CHECKING([for pthread_create@GLIBC2.0()])
safe_CFLAGS=$CFLAGS
CFLAGS="-lpthread -Werror"
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
extern int pthread_create_glibc_2_0(void*, const void*,
void *(*)(void*), void*);
__asm__(".symver pthread_create_glibc_2_0, pthread_create@GLIBC_2.0");
]], [[
#ifdef __powerpc__
/*
* Apparently on PowerPC linking this program succeeds and generates an
* executable with the undefined symbol pthread_create@GLIBC_2.0.
*/
#error This test does not work properly on PowerPC.
#else
pthread_create_glibc_2_0(0, 0, 0, 0);
#endif
return 0;
]])], [
ac_have_pthread_create_glibc_2_0=yes
AC_MSG_RESULT([yes])
AC_DEFINE([HAVE_PTHREAD_CREATE_GLIBC_2_0], 1,
[Define to 1 if you have the `pthread_create@glibc2.0' function.])
], [
ac_have_pthread_create_glibc_2_0=no
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
AM_CONDITIONAL(HAVE_PTHREAD_CREATE_GLIBC_2_0,
test x$ac_have_pthread_create_glibc_2_0 = xyes)
# Check for dlinfo RTLD_DI_TLS_MODID
AC_MSG_CHECKING([for dlinfo RTLD_DI_TLS_MODID])
safe_LIBS="$LIBS"
LIBS="-ldl"
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#include <link.h>
#include <dlfcn.h>
]], [[
size_t sizes[10000];
size_t modid_offset;
(void) dlinfo ((void*)sizes, RTLD_DI_TLS_MODID, &modid_offset);
return 0;
]])], [
ac_have_dlinfo_rtld_di_tls_modid=yes
AC_MSG_RESULT([yes])
AC_DEFINE([HAVE_DLINFO_RTLD_DI_TLS_MODID], 1,
[Define to 1 if you have a dlinfo that can do RTLD_DI_TLS_MODID.])
], [
ac_have_dlinfo_rtld_di_tls_modid=no
AC_MSG_RESULT([no])
])
LIBS=$safe_LIBS
AM_CONDITIONAL(HAVE_DLINFO_RTLD_DI_TLS_MODID,
test x$ac_have_dlinfo_rtld_di_tls_modid = xyes)
# Check for eventfd_t, eventfd() and eventfd_read()
AC_MSG_CHECKING([for eventfd()])
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#include <sys/eventfd.h>
]], [[
eventfd_t ev;
int fd;
fd = eventfd(5, 0);
eventfd_read(fd, &ev);
return 0;
]])], [
AC_MSG_RESULT([yes])
AC_DEFINE([HAVE_EVENTFD], 1,
[Define to 1 if you have the `eventfd' function.])
AC_DEFINE([HAVE_EVENTFD_READ], 1,
[Define to 1 if you have the `eventfd_read' function.])
], [
AC_MSG_RESULT([no])
])
# Check whether compiler can process #include <thread> without errors
# clang 3.3 cannot process <thread> from e.g.
# gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
AC_MSG_CHECKING([that C++ compiler can include <thread> header file])
AC_LANG(C++)
safe_CXXFLAGS=$CXXFLAGS
CXXFLAGS=-std=c++0x
AC_COMPILE_IFELSE([AC_LANG_SOURCE([
#include <thread>
])],
[
ac_cxx_can_include_thread_header=yes
AC_MSG_RESULT([yes])
], [
ac_cxx_can_include_thread_header=no
AC_MSG_RESULT([no])
])
CXXFLAGS=$safe_CXXFLAGS
AC_LANG(C)
AM_CONDITIONAL(CXX_CAN_INCLUDE_THREAD_HEADER, test x$ac_cxx_can_include_thread_header = xyes)
# Check whether compiler can process #include <condition_variable> without errors
AC_MSG_CHECKING([that C++ compiler can include <condition_variable> header file])
AC_LANG(C++)
safe_CXXFLAGS=$CXXFLAGS
CXXFLAGS=-std=c++0x
AC_COMPILE_IFELSE([AC_LANG_SOURCE([
#include <condition_variable>
])],
[
ac_cxx_can_include_condition_variable_header=yes
AC_MSG_RESULT([yes])
], [
ac_cxx_can_include_condition_variable_header=no
AC_MSG_RESULT([no])
])
CXXFLAGS=$safe_CXXFLAGS
AC_LANG(C)
AM_CONDITIONAL(CXX_CAN_INCLUDE_CONDITION_VARIABLE_HEADER, test x$ac_cxx_can_include_condition_variable_header = xyes)
# check for std::shared_timed_mutex, this is a C++ 14 feature
AC_MSG_CHECKING([that C++ compiler can use std::shared_timed_mutex])
AC_LANG(C++)
safe_CXXFLAGS=$CXXFLAGS
CXXFLAGS="-std=c++1y -pthread"
AC_COMPILE_IFELSE([AC_LANG_SOURCE([
#include <shared_mutex>
std::shared_timed_mutex test_mutex;
])],
[
ac_cxx_can_use_shared_timed_mutex=yes
AC_MSG_RESULT([yes])
], [
ac_cxx_can_use_shared_timed_mutex=no
AC_MSG_RESULT([no])
])
CXXFLAGS=$safe_CXXFLAGS
AC_LANG(C)
AM_CONDITIONAL(CXX_CAN_USE_SHARED_TIMED_MUTEX, test x$ac_cxx_can_use_shared_timed_mutex = xyes)
# check for std::shared_mutex, this is a C++ 11 feature
AC_MSG_CHECKING([that C++ compiler can use std::timed_mutex])
AC_LANG(C++)
safe_CXXFLAGS=$CXXFLAGS
CXXFLAGS="-std=c++0x -pthread"
AC_COMPILE_IFELSE([AC_LANG_SOURCE([
#include <mutex>
std::timed_mutex test_mutex;
])],
[
ac_cxx_can_use_timed_mutex=yes
AC_MSG_RESULT([yes])
], [
ac_cxx_can_use_timed_mutex=no
AC_MSG_RESULT([no])
])
CXXFLAGS=$safe_CXXFLAGS
AC_LANG(C)
AM_CONDITIONAL(CXX_CAN_USE_TIMED_MUTEX, test x$ac_cxx_can_use_timed_mutex = xyes)
# On aarch64 before glibc 2.20 we would get the kernel user_pt_regs instead
# of the user_regs_struct from sys/user.h. They are structurally the same
# but we get either one or the other.
AC_CHECK_TYPE([struct user_regs_struct],
[sys_user_has_user_regs=yes], [sys_user_has_user_regs=no],
[[#include <sys/ptrace.h>]
[#include <sys/time.h>]
[#include <sys/user.h>]])
if test "$sys_user_has_user_regs" = "yes"; then
AC_DEFINE(HAVE_SYS_USER_REGS, 1,
[Define to 1 if <sys/user.h> defines struct user_regs_struct])
fi
AC_MSG_CHECKING([for __NR_membarrier])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <linux/unistd.h>
]], [[
return __NR_membarrier
]])], [
ac_have_nr_membarrier=yes
AC_MSG_RESULT([yes])
], [
ac_have_nr_membarrier=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(HAVE_NR_MEMBARRIER, [test x$ac_have_nr_membarrier = xyes])
#----------------------------------------------------------------------------
# Checking for supported compiler flags.
#----------------------------------------------------------------------------
case "${host_cpu}" in
mips*)
ARCH=$(echo "$CFLAGS" | grep -E -e '-march=@<:@^ @:>@+' -e '\B-mips@<:@^ +@:>@')
if test -z "$ARCH"; then
# does this compiler support -march=mips32 (mips32 default) ?
AC_MSG_CHECKING([if gcc accepts -march=mips32 -mabi=32])
safe_CFLAGS=$CFLAGS
CFLAGS="$CFLAGS -mips32 -mabi=32 -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
return 0;
]])], [
FLAG_M32="-mips32 -mabi=32"
AC_MSG_RESULT([yes])
], [
FLAG_M32=""
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
AC_SUBST(FLAG_M32)
# does this compiler support -march=mips64r2 (mips64r2 default) ?
AC_MSG_CHECKING([if gcc accepts -march=mips64r2 -mabi=64])
safe_CFLAGS=$CFLAGS
CFLAGS="$CFLAGS -march=mips64r2 -mabi=64 -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
return 0;
]])], [
FLAG_M64="-march=mips64r2 -mabi=64"
AC_MSG_RESULT([yes])
], [
FLAG_M64=""
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
AC_SUBST(FLAG_M64)
fi
;;
nanomips*)
;;
*)
# does this compiler support -m32 ?
AC_MSG_CHECKING([if gcc accepts -m32])
safe_CFLAGS=$CFLAGS
CFLAGS="${FLAG_32ON64} -m32 -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
return 0;
]])], [
FLAG_M32="${FLAG_32ON64} -m32"
AC_MSG_RESULT([yes])
], [
FLAG_M32=""
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
AC_SUBST(FLAG_M32)
# does this compiler support -m64 ?
AC_MSG_CHECKING([if gcc accepts -m64])
safe_CFLAGS=$CFLAGS
CFLAGS="-m64 -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
return 0;
]])], [
FLAG_M64="-m64"
AC_MSG_RESULT([yes])
], [
FLAG_M64=""
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
AC_SUBST(FLAG_M64)
;;
esac
ARCH=$(echo "$CFLAGS" | grep -E -e '-march=@<:@^ @:>@+' -e '\B-mips@<:@^ +@:>@')
if test -z "$ARCH"; then
# does this compiler support -march=octeon (Cavium OCTEON I Specific) ?
AC_MSG_CHECKING([if gcc accepts -march=octeon])
safe_CFLAGS=$CFLAGS
CFLAGS="$CFLAGS $FLAG_M64 -march=octeon -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
return 0;
]])], [
FLAG_OCTEON="-march=octeon"
AC_MSG_RESULT([yes])
], [
FLAG_OCTEON=""
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
AC_SUBST(FLAG_OCTEON)
# does this compiler support -march=octeon2 (Cavium OCTEON II Specific) ?
AC_MSG_CHECKING([if gcc accepts -march=octeon2])
safe_CFLAGS=$CFLAGS
CFLAGS="$CFLAGS $FLAG_M64 -march=octeon2 -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
return 0;
]])], [
FLAG_OCTEON2="-march=octeon2"
AC_MSG_RESULT([yes])
], [
FLAG_OCTEON2=""
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
AC_SUBST(FLAG_OCTEON2)
fi
# does this compiler support -mmsa (MIPS MSA ASE) ?
AC_MSG_CHECKING([if gcc accepts -mmsa])
safe_CFLAGS=$CFLAGS
CFLAGS="$CFLAGS -mmsa -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
return 0;
]])], [
FLAG_MSA="-mmsa"
AC_MSG_RESULT([yes])
], [
FLAG_MSA=""
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
AC_SUBST(FLAG_MSA)
# Are we compiling for the MIPS64 n32 ABI?
AC_MSG_CHECKING([if gcc is producing mips n32 binaries])
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
#if !defined(_MIPS_SIM) || (defined(_MIPS_SIM) && (_MIPS_SIM != _ABIN32))
#error NO
#endif
]])], [
VGCONF_ABI=N32
FLAG_M64="-march=mips64r2 -mabi=n32"
AC_MSG_RESULT([yes])
], [
AC_MSG_RESULT([no])
])
# Are we compiling for the MIPS64 n64 ABI?
AC_MSG_CHECKING([if gcc is producing mips n64 binaries])
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
#if !defined(_MIPS_SIM) || (defined(_MIPS_SIM) && (_MIPS_SIM != _ABI64))
#error NO
#endif
]])], [
VGCONF_ABI=64
AC_MSG_RESULT([yes])
], [
AC_MSG_RESULT([no])
])
# We enter the code block below in the following case:
# Target architecture is set to mips64, the desired abi
# was not specified and the compiler's default abi setting
# is neither n32 nor n64.
# Probe for and set the abi to either n64 or n32, in that order,
# which is required for a mips64 build of valgrind.
if test "$ARCH_MAX" = "mips64" -a "x$VGCONF_ABI" = "x"; then
safe_CFLAGS=$CFLAGS
CFLAGS="$CFLAGS -mabi=64 -Werror"
AC_MSG_CHECKING([if gcc is n64 capable])
AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[
return 0;
]])], [
VGCONF_ABI=64
AC_MSG_RESULT([yes])
], [
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
if test "x$VGCONF_ABI" = "x"; then
safe_CFLAGS=$CFLAGS
CFLAGS="$CFLAGS -mabi=n32 -Werror"
AC_MSG_CHECKING([if gcc is n32 capable])
AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[
return 0;
]])], [
VGCONF_ABI=N32
FLAG_M64="-march=mips64r2 -mabi=n32"
AC_MSG_RESULT([yes])
], [
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
fi
fi
AM_CONDITIONAL([VGCONF_HAVE_ABI],
[test x$VGCONF_ABI != x])
AC_SUBST(VGCONF_ABI)
# does this compiler support -mmmx ?
AC_MSG_CHECKING([if gcc accepts -mmmx])
safe_CFLAGS=$CFLAGS
CFLAGS="-mmmx -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
return 0;
]])], [
FLAG_MMMX="-mmmx"
AC_MSG_RESULT([yes])
], [
FLAG_MMMX=""
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
AC_SUBST(FLAG_MMMX)
# does this compiler support -msse ?
AC_MSG_CHECKING([if gcc accepts -msse])
safe_CFLAGS=$CFLAGS
CFLAGS="-msse -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
return 0;
]])], [
FLAG_MSSE="-msse"
AC_MSG_RESULT([yes])
], [
FLAG_MSSE=""
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
AC_SUBST(FLAG_MSSE)
# does this compiler support -mpreferred-stack-boundary=2 when
# generating code for a 32-bit target? Note that we only care about
# this when generating code for (32-bit) x86, so if the compiler
# doesn't recognise -m32 it's no big deal. We'll just get code for
# the Memcheck and other helper functions, that is a bit slower than
# it could be, on x86; and no difference at all on any other platform.
AC_MSG_CHECKING([if gcc accepts -mpreferred-stack-boundary=2 -m32])
safe_CFLAGS=$CFLAGS
CFLAGS="-mpreferred-stack-boundary=2 -m32 -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
return 0;
]])], [
PREFERRED_STACK_BOUNDARY_2="-mpreferred-stack-boundary=2"
AC_MSG_RESULT([yes])
], [
PREFERRED_STACK_BOUNDARY_2=""
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
AC_SUBST(PREFERRED_STACK_BOUNDARY_2)
# does this compiler support -mlong-double-128 ?
AC_MSG_CHECKING([if gcc accepts -mlong-double-128])
safe_CFLAGS=$CFLAGS
CFLAGS="-mlong-double-128 -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
return 0;
]])], [
ac_compiler_supports_mlong_double_128=yes
AC_MSG_RESULT([yes])
], [
ac_compiler_supports_mlong_double_128=no
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
AM_CONDITIONAL(HAS_MLONG_DOUBLE_128, test x$ac_compiler_supports_mlong_double_128 = xyes)
FLAG_MLONG_DOUBLE_128="-mlong-double-128"
AC_SUBST(FLAG_MLONG_DOUBLE_128)
# does this toolchain support lto ?
# Not checked for if --enable-lto=no was given, or if LTO_AR or LTO_RANLIG
# are not defined
# If not enable-lto=* arg is provided, default to no, as lto builds are
# a lot slower, and so not appropriate for Valgrind developments.
# --enable-lto=yes should be used by distro packagers.
AC_CACHE_CHECK([for using the link time optimisation], vg_cv_lto,
[AC_ARG_ENABLE(lto,
[ --enable-lto enables building with link time optimisation],
[vg_cv_lto=$enableval],
[vg_cv_lto=no])])
if test "x${vg_cv_lto}" != "xno" -a "x${LTO_AR}" != "x" -a "x${LTO_RANLIB}" != "x"; then
AC_MSG_CHECKING([if toolchain accepts lto])
safe_CFLAGS=$CFLAGS
TEST_LTO_CFLAGS="-flto -flto-partition=one -fuse-linker-plugin"
# Note : using 'one' partition is giving a slightly smaller/faster memcheck
# and ld/lto-trans1 still needs a reasonable memory (about 0.5GB) when linking.
CFLAGS="$TEST_LTO_CFLAGS -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
extern void somefun(void);
somefun();
return 0;
]])], [
LTO_CFLAGS=$TEST_LTO_CFLAGS
AC_MSG_RESULT([yes])
], [
LTO_CFLAGS=""
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
fi
AC_SUBST(LTO_CFLAGS)
# if we could not compile with lto args, or lto was disabled,
# then set LTO_AR/LTO_RANLIB to the non lto values
# define in config.h ENABLE_LTO (not needed by the code currently, but
# this guarantees we recompile everything if we re-configure and rebuild
# in a build dir previously build with another value of --enable-lto
if test "x${LTO_CFLAGS}" = "x"; then
LTO_AR=${AR}
LTO_RANLIB=${RANLIB}
vg_cv_lto=no
else
vg_cv_lto=yes
AC_DEFINE([ENABLE_LTO], 1, [configured to build with lto link time optimisation])
fi
# Convenience function to check whether GCC supports a particular
# warning option. Takes two arguments,
# first the warning flag name to check (without -W), then the
# substitution name to set with -Wno-warning-flag if the flag exists,
# or the empty string if the compiler doesn't accept the flag. Note
# that checking is done against the warning flag itself, but the
# substitution is then done to cancel the warning flag.
AC_DEFUN([AC_GCC_WARNING_SUBST_NO],[
AC_MSG_CHECKING([if gcc accepts -W$1])
safe_CFLAGS=$CFLAGS
CFLAGS="-W$1 -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[;]])], [
AC_SUBST([$2], [-Wno-$1])
AC_MSG_RESULT([yes])], [
AC_SUBST([$2], [])
AC_MSG_RESULT([no])])
CFLAGS=$safe_CFLAGS
])
# Convenience function. Like AC_GCC_WARNING_SUBST_NO, except it substitutes
# -W$1 (instead of -Wno-$1).
AC_DEFUN([AC_GCC_WARNING_SUBST],[
AC_MSG_CHECKING([if gcc accepts -W$1])
safe_CFLAGS=$CFLAGS
CFLAGS="-W$1 -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[;]])], [
AC_SUBST([$2], [-W$1])
AC_MSG_RESULT([yes])], [
AC_SUBST([$2], [])
AC_MSG_RESULT([no])])
CFLAGS=$safe_CFLAGS
])
AC_GCC_WARNING_SUBST_NO([memset-transposed-args], [FLAG_W_NO_MEMSET_TRANSPOSED_ARGS])
AC_GCC_WARNING_SUBST_NO([nonnull], [FLAG_W_NO_NONNULL])
AC_GCC_WARNING_SUBST_NO([overflow], [FLAG_W_NO_OVERFLOW])
AC_GCC_WARNING_SUBST_NO([pointer-sign], [FLAG_W_NO_POINTER_SIGN])
AC_GCC_WARNING_SUBST_NO([uninitialized], [FLAG_W_NO_UNINITIALIZED])
AC_GCC_WARNING_SUBST_NO([unused-function], [FLAG_W_NO_UNUSED_FUNCTION])
AC_GCC_WARNING_SUBST_NO([static-local-in-inline], [FLAG_W_NO_STATIC_LOCAL_IN_INLINE])
AC_GCC_WARNING_SUBST_NO([mismatched-new-delete], [FLAG_W_NO_MISMATCHED_NEW_DELETE])
AC_GCC_WARNING_SUBST_NO([infinite-recursion], [FLAG_W_NO_INFINITE_RECURSION])
AC_GCC_WARNING_SUBST_NO([expansion-to-defined], [FLAG_W_NO_EXPANSION_TO_DEFINED])
AC_GCC_WARNING_SUBST([write-strings], [FLAG_W_WRITE_STRINGS])
AC_GCC_WARNING_SUBST([empty-body], [FLAG_W_EMPTY_BODY])
AC_GCC_WARNING_SUBST([format], [FLAG_W_FORMAT])
AC_GCC_WARNING_SUBST([format-signedness], [FLAG_W_FORMAT_SIGNEDNESS])
AC_GCC_WARNING_SUBST([cast-qual], [FLAG_W_CAST_QUAL])
AC_GCC_WARNING_SUBST([old-style-declaration], [FLAG_W_OLD_STYLE_DECLARATION])
AC_GCC_WARNING_SUBST([ignored-qualifiers], [FLAG_W_IGNORED_QUALIFIERS])
AC_GCC_WARNING_SUBST([missing-parameter-type], [FLAG_W_MISSING_PARAMETER_TYPE])
AC_GCC_WARNING_SUBST([logical-op], [FLAG_W_LOGICAL_OP])
AC_GCC_WARNING_SUBST([enum-conversion], [FLAG_W_ENUM_CONVERSION])
AC_GCC_WARNING_SUBST([implicit-fallthrough=2], [FLAG_W_IMPLICIT_FALLTHROUGH])
# Does this compiler support -Wformat-security ?
# Special handling is needed, because certain GCC versions require -Wformat
# being present if -Wformat-security is given. Otherwise a warning is issued.
# However, AC_GCC_WARNING_SUBST will stick in -Werror (see r15323 for rationale).
# And with that the warning will be turned into an error with the result
# that -Wformat-security is believed to be unsupported when in fact it is.
AC_MSG_CHECKING([if gcc accepts -Wformat-security])
safe_CFLAGS=$CFLAGS
CFLAGS="-Wformat -Wformat-security -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[;]])], [
AC_SUBST([FLAG_W_FORMAT_SECURITY], [-Wformat-security])
AC_MSG_RESULT([yes])], [
AC_SUBST([FLAG_W_FORMAT_SECURITY], [])
AC_MSG_RESULT([no])])
CFLAGS=$safe_CFLAGS
# does this compiler support -Wextra or the older -W ?
AC_MSG_CHECKING([if gcc accepts -Wextra or -W])
safe_CFLAGS=$CFLAGS
CFLAGS="-Wextra -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ ]], [[
return 0;
]])], [
AC_SUBST([FLAG_W_EXTRA], [-Wextra])
AC_MSG_RESULT([-Wextra])
], [
CFLAGS="-W -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ ]], [[
return 0;
]])], [
AC_SUBST([FLAG_W_EXTRA], [-W])
AC_MSG_RESULT([-W])
], [
AC_SUBST([FLAG_W_EXTRA], [])
AC_MSG_RESULT([not supported])
])
])
CFLAGS=$safe_CFLAGS
# On ARM we do not want to pass -Wcast-align as that produces loads
# of warnings. GCC is just being conservative. See here:
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65459#c4
if test "X$VGCONF_ARCH_PRI" = "Xarm"; then
AC_SUBST([FLAG_W_CAST_ALIGN], [""])
else
AC_SUBST([FLAG_W_CAST_ALIGN], [-Wcast-align])
fi
# does this compiler support -faligned-new ?
AC_MSG_CHECKING([if g++ accepts -faligned-new])
safe_CXXFLAGS=$CXXFLAGS
CXXFLAGS="-faligned-new -Werror"
AC_LANG(C++)
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
return 0;
]])], [
FLAG_FALIGNED_NEW="-faligned-new"
AC_MSG_RESULT([yes])
], [
FLAG_FALIGNED_NEW=""
AC_MSG_RESULT([no])
])
CXXFLAGS=$safe_CXXFLAGS
AC_LANG(C)
AC_SUBST(FLAG_FALIGNED_NEW)
# does this compiler support -fsized-deallocation ?
AC_MSG_CHECKING([if g++ accepts -fsized-deallocation])
safe_CXXFLAGS=$CXXFLAGS
CXXFLAGS="-fsized-deallocation -Werror"
AC_LANG(C++)
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
return 0;
]])], [
FLAG_FSIZED_DEALLOCATION="-fsized-deallocation"
ac_have_sized_deallocation=yes
AC_MSG_RESULT([yes])
], [
FLAG_FSIZED_DEALLOCATION=""
ac_have_sized_deallocation=no
AC_MSG_RESULT([no])
])
CXXFLAGS=$safe_CXXFLAGS
AC_LANG(C)
AC_SUBST(FLAG_FSIZED_DEALLOCATION)
AM_CONDITIONAL([HAVE_FSIZED_DEALLOCATION], [test x$ac_have_sized_deallocation = xyes])
# does this compiler support C++17 aligned new/delete?
AC_MSG_CHECKING([if g++ supports aligned new and delete])
safe_CXXFLAGS=$CXXFLAGS
CXXFLAGS="-std=c++17"
AC_LANG(C++)
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <cstdlib>
#include <new>
]], [[
operator delete(nullptr, std::align_val_t(64U));
]])], [
ac_have_aligned_cxx_alloc=yes
AC_MSG_RESULT([yes])
], [
ac_have_aligned_cxx_alloc=no
AC_MSG_RESULT([no])
])
CXXFLAGS=$safe_CXXFLAGS
AC_LANG(C)
AM_CONDITIONAL([HAVE_ALIGNED_CXX_ALLOC], [test x$ac_have_aligned_cxx_alloc = xyes])
# does this compiler support -fno-stack-protector ?
AC_MSG_CHECKING([if gcc accepts -fno-stack-protector])
safe_CFLAGS=$CFLAGS
CFLAGS="-fno-stack-protector -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
return 0;
]])], [
no_stack_protector=yes
FLAG_FNO_STACK_PROTECTOR="-fno-stack-protector"
AC_MSG_RESULT([yes])
], [
no_stack_protector=no
FLAG_FNO_STACK_PROTECTOR=""
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
AC_SUBST(FLAG_FNO_STACK_PROTECTOR)
# does this compiler support -finline-functions ?
AC_MSG_CHECKING([if gcc accepts -finline-functions])
safe_CFLAGS=$CFLAGS
CFLAGS="-finline-functions -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
return 0;
]])], [
inline_functions=yes
FLAG_FINLINE_FUNCTIONS="-finline-functions"
AC_MSG_RESULT([yes])
], [
inline_functions=no
FLAG_FINLINE_FUNCTIONS=""
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
AC_SUBST(FLAG_FINLINE_FUNCTIONS)
# Does GCC support disabling Identical Code Folding?
# We want to disabled Identical Code Folding for the
# tools preload shared objects to get better backraces.
# For GCC 5.1+ -fipa-icf is enabled by default at -O2.
# "The optimization reduces code size and may disturb
# unwind stacks by replacing a function by equivalent
# one with a different name."
AC_MSG_CHECKING([if gcc accepts -fno-ipa-icf])
safe_CFLAGS=$CFLAGS
CFLAGS="-fno-ipa-icf -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
return 0;
]])], [
no_ipa_icf=yes
FLAG_FNO_IPA_ICF="-fno-ipa-icf"
AC_MSG_RESULT([yes])
], [
no_ipa_icf=no
FLAG_FNO_IPA_ICF=""
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
AC_SUBST(FLAG_FNO_IPA_ICF)
# Does this compiler support -fsanitize=undefined. This is true for
# GCC 4.9 and newer. However, the undefined behaviour sanitiser in GCC 5.1
# also checks for alignment violations on memory accesses which the valgrind
# code base is sprinkled (if not littered) with. As those alignment issues
# don't pose a problem we want to suppress warnings about them.
# In GCC 5.1 this can be done by passing -fno-sanitize=alignment. Earlier
# GCCs do not support that.
#
# Only checked for if --enable-ubsan was given.
if test "x${vg_cv_ubsan}" = "xyes"; then
AC_MSG_CHECKING([if gcc accepts -fsanitize=undefined -fno-sanitize=alignment])
safe_CFLAGS=$CFLAGS
CFLAGS="-fsanitize=undefined -fno-sanitize=alignment -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
return 0;
]])], [
FLAG_FSANITIZE="-fsanitize=undefined -fno-sanitize=alignment"
LIB_UBSAN="-static-libubsan"
AC_MSG_RESULT([yes])
], [
CFLAGS="-fsanitize=undefined -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
return 0;
]])], [
FLAG_FSANITIZE="-fsanitize=undefined"
LIB_UBSAN="-static-libubsan"
AC_MSG_RESULT([yes])
], [
FLAG_FSANITIZE=""
LIB_UBSAN=""
AC_MSG_RESULT([no])
])
])
CFLAGS=$safe_CFLAGS
AC_SUBST(FLAG_FSANITIZE)
AC_SUBST(LIB_UBSAN)
fi
# does this compiler support --param inline-unit-growth=... ?
AC_MSG_CHECKING([if gcc accepts --param inline-unit-growth])
safe_CFLAGS=$CFLAGS
CFLAGS="--param inline-unit-growth=900 -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ ]], [[
return 0;
]])], [
AC_SUBST([FLAG_UNLIMITED_INLINE_UNIT_GROWTH],
["--param inline-unit-growth=900"])
AC_MSG_RESULT([yes])
], [
AC_SUBST([FLAG_UNLIMITED_INLINE_UNIT_GROWTH], [""])
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
# does this compiler support -gdwarf-4 -fdebug-types-section ?
AC_MSG_CHECKING([if gcc accepts -gdwarf-4 -fdebug-types-section])
safe_CFLAGS=$CFLAGS
CFLAGS="-gdwarf-4 -fdebug-types-section -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ ]], [[
return 0;
]])], [
ac_have_dwarf4=yes
AC_MSG_RESULT([yes])
], [
ac_have_dwarf4=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(DWARF4, test x$ac_have_dwarf4 = xyes)
CFLAGS=$safe_CFLAGS
# does this compiler support -g -gz=zlib ?
AC_MSG_CHECKING([if gcc accepts -g -gz=zlib])
safe_CFLAGS=$CFLAGS
CFLAGS="-g -gz=zlib"
AC_LINK_IFELSE([AC_LANG_PROGRAM([[ ]], [[
return 0;
]])], [
ac_have_gz_zlib=yes
AC_MSG_RESULT([yes])
], [
ac_have_gz_zlib=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(GZ_ZLIB, test x$ac_have_gz_zlib = xyes)
CFLAGS=$safe_CFLAGS
# does this compiler support -g -gz=zlib-gnu ?
AC_MSG_CHECKING([if gcc accepts -g -gz=zlib-gnu])
safe_CFLAGS=$CFLAGS
CFLAGS="-g -gz=zlib-gnu"
AC_LINK_IFELSE([AC_LANG_PROGRAM([[ ]], [[
return 0;
]])], [
ac_have_gz_zlib_gnu=yes
AC_MSG_RESULT([yes])
], [
ac_have_gz_zlib_gnu=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(GZ_ZLIB_GNU, test x$ac_have_gz_zlib_gnu = xyes)
CFLAGS=$safe_CFLAGS
# does this compiler support nested functions ?
AC_MSG_CHECKING([if gcc accepts nested functions])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
int foo() { return 1; }
return foo();
]])], [
ac_have_nested_functions=yes
AC_MSG_RESULT([yes])
], [
ac_have_nested_functions=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL([HAVE_NESTED_FUNCTIONS], [test x$ac_have_nested_functions = xyes])
# does this compiler support the 'p' constraint in ASM statements ?
AC_MSG_CHECKING([if gcc accepts the 'p' constraint in asm statements])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
char *p;
__asm__ __volatile__ ("movdqa (%0),%%xmm6\n" : "=p" (p));
]])], [
ac_have_asm_constraint_p=yes
AC_MSG_RESULT([yes])
], [
ac_have_asm_constraint_p=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL([HAVE_ASM_CONSTRAINT_P], [test x$ac_have_asm_constraint_p = xyes])
# Does this compiler and linker support -pie?
# Some compilers actually do not support -pie and report its usage
# as an error. We need to check if it is safe to use it first.
AC_MSG_CHECKING([if gcc accepts -pie])
safe_CFLAGS=$CFLAGS
CFLAGS="-pie"
AC_LINK_IFELSE([AC_LANG_PROGRAM([[ ]], [[
return 0;
]])], [
AC_SUBST([FLAG_PIE], ["-pie"])
AC_MSG_RESULT([yes])
], [
AC_SUBST([FLAG_PIE], [""])
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
# Does this compiler support -no-pie?
# On Ubuntu 16.10+, gcc produces position independent executables (PIE) by
# default. However this gets in the way with some tests, we use -no-pie
# for these.
AC_MSG_CHECKING([if gcc accepts -no-pie])
safe_CFLAGS=$CFLAGS
CFLAGS="-no-pie -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ ]], [[
return 0;
]])], [
AC_SUBST([FLAG_NO_PIE], ["-no-pie"])
AC_MSG_RESULT([yes])
], [
AC_SUBST([FLAG_NO_PIE], [""])
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
# We want to use use the -Ttext-segment option to the linker.
# GNU (bfd) ld supports this directly. Newer GNU gold linkers
# support it as an alias of -Ttext. Sadly GNU (bfd) ld's -Ttext
# semantics are NOT what we want (GNU gold -Ttext is fine).
#
# For GNU (bfd) ld -Ttext-segment chooses the base at which ELF headers
# will reside. -Ttext aligns just the .text section start (but not any
# other section).
#
# LLVM ld.lld 10.0 changed the semantics of its -Ttext. See "Breaking changes"
# in https://releases.llvm.org/10.0.0/tools/lld/docs/ReleaseNotes.html
# The --image-base option (since version 6.0?) provides the semantics needed.
# -Ttext-segment generates an error, but -Ttext now more closely
# follows the GNU (bfd) ld's -Ttext.
#
# So test first for --image-base support, and if that fails then
# for -Ttext-segment which is supported by all bfd ld versions
# and use that if it exists. If it doesn't exist it must be an older
# version of gold and we can fall back to using -Ttext which has the
# right semantics.
safe_CFLAGS=$CFLAGS
AC_MSG_CHECKING([if the linker accepts -Wl,--image-base])
CFLAGS="-static -nodefaultlibs -nostartfiles -Wl,--image-base=$valt_load_address_pri_norml -Werror"
AC_LINK_IFELSE(
[AC_LANG_SOURCE([int _start () { return 0; }])],
[
linker_using_t_text="no"
AC_SUBST([FLAG_T_TEXT], ["--image-base"])
AC_MSG_RESULT([yes])
], [
AC_MSG_RESULT([no])
AC_MSG_CHECKING([if the linker accepts -Wl,-Ttext-segment])
CFLAGS="-static -nodefaultlibs -nostartfiles -Wl,-Ttext-segment=$valt_load_address_pri_norml -Werror"
AC_LINK_IFELSE(
[AC_LANG_SOURCE([int _start () { return 0; }])],
[
linker_using_t_text="no"
AC_SUBST([FLAG_T_TEXT], ["-Ttext-segment"])
AC_MSG_RESULT([yes])
], [
linker_using_t_text="yes"
AC_SUBST([FLAG_T_TEXT], ["-Ttext"])
AC_MSG_RESULT([no])
])
])
CFLAGS=$safe_CFLAGS
# If the linker only supports -Ttext (not -Ttext-segment or --image-base) then we will
# have to strip any build-id ELF NOTEs from the statically linked tools.
# Otherwise the build-id NOTE might end up at the default load address.
# (Pedantically if the linker is gold then -Ttext is fine, but newer
# gold versions also support -Ttext-segment. So just assume that unless
# we can use -Ttext-segment we need to strip the build-id NOTEs.
if test "x${linker_using_t_text}" = "xyes"; then
AC_MSG_NOTICE([ld -Ttext used, need to strip build-id NOTEs.])
# does the linker support -Wl,--build-id=none ? Note, it's
# important that we test indirectly via whichever C compiler
# is selected, rather than testing /usr/bin/ld or whatever
# directly.
AC_MSG_CHECKING([if the linker accepts -Wl,--build-id=none])
safe_CFLAGS=$CFLAGS
CFLAGS="-Wl,--build-id=none -Werror"
AC_LINK_IFELSE(
[AC_LANG_PROGRAM([ ], [return 0;])],
[
AC_SUBST([FLAG_NO_BUILD_ID], ["-Wl,--build-id=none"])
AC_MSG_RESULT([yes])
], [
AC_SUBST([FLAG_NO_BUILD_ID], [""])
AC_MSG_RESULT([no])
])
else
AC_MSG_NOTICE([ld --image-base or -Ttext-segment used, no need to strip build-id NOTEs.])
AC_SUBST([FLAG_NO_BUILD_ID], [""])
fi
CFLAGS=$safe_CFLAGS
# does the ppc assembler support "mtocrf" et al?
AC_MSG_CHECKING([if ppc32/64 as supports mtocrf/mfocrf])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
__asm__ __volatile__("mtocrf 4,0");
__asm__ __volatile__("mfocrf 0,4");
]])], [
ac_have_as_ppc_mftocrf=yes
AC_MSG_RESULT([yes])
], [
ac_have_as_ppc_mftocrf=no
AC_MSG_RESULT([no])
])
if test x$ac_have_as_ppc_mftocrf = xyes ; then
AC_DEFINE(HAVE_AS_PPC_MFTOCRF, 1, [Define to 1 if as supports mtocrf/mfocrf.])
fi
# does the ppc assembler support "lfdp" and other phased out floating point insns?
AC_MSG_CHECKING([if ppc32/64 asm supports phased out floating point instructions])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
do { typedef struct {
double hi;
double lo;
} dbl_pair_t;
dbl_pair_t dbl_pair[3];
__asm__ volatile ("lfdp 10, %0"::"m" (dbl_pair[0]));
} while (0)
]])], [
ac_have_as_ppc_fpPO=yes
AC_MSG_RESULT([yes])
], [
ac_have_as_ppc_fpPO=no
AC_MSG_RESULT([no])
])
if test x$ac_have_as_ppc_fpPO = xyes ; then
AC_DEFINE(HAVE_AS_PPC_FPPO, 1, [Define to 1 if as supports floating point phased out category.])
fi
# does the amd64 assembler understand "fxsave64" and "fxrstor64"?
AC_MSG_CHECKING([if amd64 assembler supports fxsave64/fxrstor64])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
void* p;
asm __volatile__("fxsave64 (%0)" : : "r" (p) : "memory" );
asm __volatile__("fxrstor64 (%0)" : : "r" (p) : "memory" );
]])], [
ac_have_as_amd64_fxsave64=yes
AC_MSG_RESULT([yes])
], [
ac_have_as_amd64_fxsave64=no
AC_MSG_RESULT([no])
])
if test x$ac_have_as_amd64_fxsave64 = xyes ; then
AC_DEFINE(HAVE_AS_AMD64_FXSAVE64, 1, [Define to 1 if as supports fxsave64/fxrstor64.])
fi
# does the x86/amd64 assembler understand SSE3 instructions?
# Note, this doesn't generate a C-level symbol. It generates a
# automake-level symbol (BUILD_SSE3_TESTS), used in test Makefile.am's
AC_MSG_CHECKING([if x86/amd64 assembler speaks SSE3])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
do { long long int x;
__asm__ __volatile__("fisttpq (%0)" : :"r"(&x) ); }
while (0)
]])], [
ac_have_as_sse3=yes
AC_MSG_RESULT([yes])
], [
ac_have_as_sse3=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(BUILD_SSE3_TESTS, test x$ac_have_as_sse3 = xyes)
# Ditto for SSSE3 instructions (note extra S)
# Note, this doesn't generate a C-level symbol. It generates a
# automake-level symbol (BUILD_SSSE3_TESTS), used in test Makefile.am's
AC_MSG_CHECKING([if x86/amd64 assembler speaks SSSE3])
save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -msse -Werror"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
do { long long int x;
__asm__ __volatile__(
"pabsb (%0),%%xmm7" : : "r"(&x) : "xmm7" ); }
while (0)
]])], [
ac_have_as_ssse3=yes
AC_MSG_RESULT([yes])
], [
ac_have_as_ssse3=no
AC_MSG_RESULT([no])
])
CFLAGS="$save_CFLAGS"
AM_CONDITIONAL(BUILD_SSSE3_TESTS, test x$ac_have_as_ssse3 = xyes)
# does the x86/amd64 assembler understand the PCLMULQDQ instruction?
# Note, this doesn't generate a C-level symbol. It generates a
# automake-level symbol (BUILD_PCLMULQDQ_TESTS), used in test Makefile.am's
AC_MSG_CHECKING([if x86/amd64 assembler supports 'pclmulqdq'])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
do {
__asm__ __volatile__(
"pclmulqdq \$17,%%xmm6,%%xmm7" : : : "xmm6", "xmm7" ); }
while (0)
]])], [
ac_have_as_pclmulqdq=yes
AC_MSG_RESULT([yes])
], [
ac_have_as_pclmulqdq=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(BUILD_PCLMULQDQ_TESTS, test x$ac_have_as_pclmulqdq = xyes)
# does the x86/amd64 assembler understand the VPCLMULQDQ instruction?
# Note, this doesn't generate a C-level symbol. It generates a
# automake-level symbol (BUILD_VPCLMULQDQ_TESTS), used in test Makefile.am's
AC_MSG_CHECKING([if x86/amd64 assembler supports 'vpclmulqdq'])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
do {
/*
* Carry-less multiplication of xmm1 with xmm2 and store the result in
* xmm3. The immediate is used to determine which quadwords of xmm1 and
* xmm2 should be used.
*/
__asm__ __volatile__(
"vpclmulqdq \$0,%%xmm1,%%xmm2,%%xmm3" : : : );
} while (0)
]])], [
ac_have_as_vpclmulqdq=yes
AC_MSG_RESULT([yes])
], [
ac_have_as_vpclmulqdq=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(BUILD_VPCLMULQDQ_TESTS, test x$ac_have_as_vpclmulqdq = xyes)
# does the x86/amd64 assembler understand FMA4 instructions?
# Note, this doesn't generate a C-level symbol. It generates a
# automake-level symbol (BUILD_AFM4_TESTS), used in test Makefile.am's
AC_MSG_CHECKING([if x86/amd64 assembler supports FMA4 'vfmaddpd'])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
do {
__asm__ __volatile__(
"vfmaddpd %%xmm7,%%xmm8,%%xmm6,%%xmm9" : : : );
} while (0)
]])], [
ac_have_as_vfmaddpd=yes
AC_MSG_RESULT([yes])
], [
ac_have_as_vfmaddpd=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(BUILD_FMA4_TESTS, test x$ac_have_as_vfmaddpd = xyes)
# does the x86/amd64 assembler understand the LZCNT instruction?
# Note, this doesn't generate a C-level symbol. It generates a
# automake-level symbol (BUILD_LZCNT_TESTS), used in test Makefile.am's
AC_MSG_CHECKING([if x86/amd64 assembler supports 'lzcnt'])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
do {
__asm__ __volatile__("lzcnt %%rax,%%rax" : : : "rax");
} while (0)
]])], [
ac_have_as_lzcnt=yes
AC_MSG_RESULT([yes])
], [
ac_have_as_lzcnt=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL([BUILD_LZCNT_TESTS], [test x$ac_have_as_lzcnt = xyes])
# does the x86/amd64 assembler understand the LOOPNEL instruction?
# Note, this doesn't generate a C-level symbol. It generates a
# automake-level symbol (BUILD_LOOPNEL_TESTS), used in test Makefile.am's
AC_MSG_CHECKING([if x86/amd64 assembler supports 'loopnel'])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
do {
__asm__ __volatile__("1: loopnel 1b\n");
} while (0)
]])], [
ac_have_as_loopnel=yes
AC_MSG_RESULT([yes])
], [
ac_have_as_loopnel=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL([BUILD_LOOPNEL_TESTS], [test x$ac_have_as_loopnel = xyes])
# does the x86/amd64 assembler understand ADDR32 ?
# Note, this doesn't generate a C-level symbol. It generates a
# automake-level symbol (BUILD_ADDR32_TESTS), used in test Makefile.am's
AC_MSG_CHECKING([if x86/amd64 assembler supports 'addr32'])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
do {
asm volatile ("addr32 rep movsb");
} while (0)
]])], [
ac_have_as_addr32=yes
AC_MSG_RESULT([yes])
], [
ac_have_as_addr32=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL([BUILD_ADDR32_TESTS], [test x$ac_have_as_addr32 = xyes])
# does the x86/amd64 assembler understand SSE 4.2 instructions?
# Note, this doesn't generate a C-level symbol. It generates a
# automake-level symbol (BUILD_SSE42_TESTS), used in test Makefile.am's
AC_MSG_CHECKING([if x86/amd64 assembler speaks SSE4.2])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
do { long long int x;
__asm__ __volatile__(
"crc32q %%r15,%%r15" : : : "r15" );
__asm__ __volatile__(
"pblendvb (%%rcx), %%xmm11" : : : "memory", "xmm11");
__asm__ __volatile__(
"aesdec %%xmm2, %%xmm1" : : : "xmm2", "xmm1"); }
while (0)
]])], [
ac_have_as_sse42=yes
AC_MSG_RESULT([yes])
], [
ac_have_as_sse42=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(BUILD_SSE42_TESTS, test x$ac_have_as_sse42 = xyes)
# does the x86/amd64 assembler understand AVX instructions?
# Note, this doesn't generate a C-level symbol. It generates a
# automake-level symbol (BUILD_AVX_TESTS), used in test Makefile.am's
AC_MSG_CHECKING([if x86/amd64 assembler speaks AVX])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
do { long long int x;
__asm__ __volatile__(
"vmovupd (%%rsp), %%ymm7" : : : "xmm7" );
__asm__ __volatile__(
"vaddpd %%ymm6,%%ymm7,%%ymm8" : : : "xmm6","xmm7","xmm8"); }
while (0)
]])], [
ac_have_as_avx=yes
AC_MSG_RESULT([yes])
], [
ac_have_as_avx=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(BUILD_AVX_TESTS, test x$ac_have_as_avx = xyes)
# does the x86/amd64 assembler understand AVX2 instructions?
# Note, this doesn't generate a C-level symbol. It generates a
# automake-level symbol (BUILD_AVX2_TESTS), used in test Makefile.am's
AC_MSG_CHECKING([if x86/amd64 assembler speaks AVX2])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
do { long long int x;
__asm__ __volatile__(
"vpsravd (%%rsp), %%ymm8, %%ymm7" : : : "xmm7", "xmm8" );
__asm__ __volatile__(
"vpaddb %%ymm6,%%ymm7,%%ymm8" : : : "xmm6","xmm7","xmm8"); }
while (0)
]])], [
ac_have_as_avx2=yes
AC_MSG_RESULT([yes])
], [
ac_have_as_avx2=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(BUILD_AVX2_TESTS, test x$ac_have_as_avx2 = xyes)
# does the x86/amd64 assembler understand TSX instructions and
# the XACQUIRE/XRELEASE prefixes?
# Note, this doesn't generate a C-level symbol. It generates a
# automake-level symbol (BUILD_TSX_TESTS), used in test Makefile.am's
AC_MSG_CHECKING([if x86/amd64 assembler speaks TSX])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
do {
__asm__ __volatile__(
" xbegin Lfoo \n\t"
"Lfoo: xend \n\t"
" xacquire lock incq 0(%rsp) \n\t"
" xrelease lock incq 0(%rsp) \n"
);
} while (0)
]])], [
ac_have_as_tsx=yes
AC_MSG_RESULT([yes])
], [
ac_have_as_tsx=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(BUILD_TSX_TESTS, test x$ac_have_as_tsx = xyes)
# does the x86/amd64 assembler understand BMI1 and BMI2 instructions?
# Note, this doesn't generate a C-level symbol. It generates a
# automake-level symbol (BUILD_BMI_TESTS), used in test Makefile.am's
AC_MSG_CHECKING([if x86/amd64 assembler speaks BMI1 and BMI2])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
do { unsigned int h, l;
__asm__ __volatile__( "mulx %rax,%rcx,%r8" );
__asm__ __volatile__(
"andn %2, %1, %0" : "=r" (h) : "r" (0x1234567), "r" (0x7654321) );
__asm__ __volatile__(
"movl %2, %%edx; mulx %3, %1, %0" : "=r" (h), "=r" (l) : "g" (0x1234567), "rm" (0x7654321) : "edx" ); }
while (0)
]])], [
ac_have_as_bmi=yes
AC_MSG_RESULT([yes])
], [
ac_have_as_bmi=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(BUILD_BMI_TESTS, test x$ac_have_as_bmi = xyes)
# does the x86/amd64 assembler understand FMA instructions?
# Note, this doesn't generate a C-level symbol. It generates a
# automake-level symbol (BUILD_FMA_TESTS), used in test Makefile.am's
AC_MSG_CHECKING([if x86/amd64 assembler speaks FMA])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
do { unsigned int h, l;
__asm__ __volatile__(
"vfmadd132ps (%%rsp), %%ymm8, %%ymm7" : : : "xmm7", "xmm8" );
__asm__ __volatile__(
"vfnmsub231sd (%%rsp), %%xmm8, %%xmm7" : : : "xmm7", "xmm8" );
__asm__ __volatile__(
"vfmsubadd213pd (%%rsp), %%xmm8, %%xmm7" : : : "xmm7", "xmm8" ); }
while (0)
]])], [
ac_have_as_fma=yes
AC_MSG_RESULT([yes])
], [
ac_have_as_fma=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(BUILD_FMA_TESTS, test x$ac_have_as_fma = xyes)
# does the amd64 assembler understand MPX instructions?
# Note, this doesn't generate a C-level symbol. It generates a
# automake-level symbol (BUILD_MPX_TESTS), used in test Makefile.am's
AC_MSG_CHECKING([if amd64 assembler knows the MPX instructions])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
do {
asm ("bndmov %bnd0,(%rsp)");
asm ("bndldx 3(%rbx,%rdx), %bnd2");
asm ("bnd call foo\n"
bnd jmp end\n"
foo: bnd ret\n"
end: nop");
} while (0)
]])], [
ac_have_as_mpx=yes
AC_MSG_RESULT([yes])
], [
ac_have_as_mpx=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(BUILD_MPX_TESTS, test x$ac_have_as_mpx = xyes)
# does the amd64 assembler understand ADX instructions?
# Note, this doesn't generate a C-level symbol. It generates a
# automake-level symbol (BUILD_ADX_TESTS), used in test Makefile.am's
AC_MSG_CHECKING([if amd64 assembler knows the ADX instructions])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
do {
asm ("adcxq %r14,%r8");
} while (0)
]])], [
ac_have_as_adx=yes
AC_MSG_RESULT([yes])
], [
ac_have_as_adx=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(BUILD_ADX_TESTS, test x$ac_have_as_adx = xyes)
# does the amd64 assembler understand the RDRAND instruction?
# Note, this doesn't generate a C-level symbol. It generates a
# automake-level symbol (BUILD_RDRAND_TESTS), used in test Makefile.am's
AC_MSG_CHECKING([if amd64 assembler knows the RDRAND instruction])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
do {
asm ("rdrand %r14");
asm ("rdrand %r14d");
asm ("rdrand %r14w");
} while (0)
]])], [
ac_have_as_rdrand=yes
AC_MSG_RESULT([yes])
], [
ac_have_as_rdrand=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(BUILD_RDRAND_TESTS, test x$ac_have_as_rdrand = xyes)
# does the amd64 assembler understand the RDSEED instruction?
# Note, this doesn't generate a C-level symbol. It generates a
# automake-level symbol (BUILD_RDSEED_TESTS), used in test Makefile.am's
AC_MSG_CHECKING([if amd64 assembler knows the RDSEED instruction])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
do {
asm ("rdseed %r14");
asm ("rdseed %r14d");
asm ("rdseed %r14w");
} while (0)
]])], [
ac_have_as_rdseed=yes
AC_MSG_RESULT([yes])
], [
ac_have_as_rdseed=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(BUILD_RDSEED_TESTS, test x$ac_have_as_rdseed = xyes)
# does the amd64 assembler understand the F16C instructions (VCVTPH2PS and
# VCVTPS2PH) ?
# Note, this doesn't generate a C-level symbol. It generates a
# automake-level symbol (BUILD_F16C_TESTS), used in test Makefile.am's
AC_MSG_CHECKING([if amd64 assembler knows the F16C instructions])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
do {
asm ("vcvtph2ps %xmm5, %ymm10");
// If we put the dollar sign and zero together, the shell processing
// this configure.ac script substitutes the command name in. Sigh.
asm ("vcvtps2ph $" "0, %ymm10, %xmm5");
} while (0)
]])], [
ac_have_as_f16c=yes
AC_MSG_RESULT([yes])
], [
ac_have_as_f16c=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(BUILD_F16C_TESTS, test x$ac_have_as_f16c = xyes)
# does the x86/amd64 assembler understand MOVBE?
# Note, this doesn't generate a C-level symbol. It generates a
# automake-level symbol (BUILD_MOVBE_TESTS), used in test Makefile.am's
AC_MSG_CHECKING([if x86/amd64 assembler knows the MOVBE insn])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
do { long long int x;
__asm__ __volatile__(
"movbe (%%rsp), %%r15" : : : "memory", "r15" ); }
while (0)
]])], [
ac_have_as_movbe=yes
AC_MSG_RESULT([yes])
], [
ac_have_as_movbe=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(BUILD_MOVBE_TESTS, test x$ac_have_as_movbe = xyes)
# Does the C compiler support the "ifunc" attribute
# Note, this doesn't generate a C-level symbol. It generates a
# automake-level symbol (BUILD_IFUNC_TESTS), used in test Makefile.am's
AC_MSG_CHECKING([if gcc supports the ifunc attribute])
AC_LINK_IFELSE([AC_LANG_SOURCE([[
static void mytest(void) {}
static void (*resolve_test(void))(void)
{
return (void (*)(void))&mytest;
}
void test(void) __attribute__((ifunc("resolve_test")));
int main()
{
test();
return 0;
}
]])], [
ac_have_ifunc_attr=yes
AC_MSG_RESULT([yes])
], [
ac_have_ifunc_attr=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(BUILD_IFUNC_TESTS, test x$ac_have_ifunc_attr = xyes)
# Does the C compiler support the armv8 crc feature flag
# Note, this doesn't generate a C-level symbol. It generates a
# automake-level symbol (BUILD_ARMV8_CRC_TESTS), used in test Makefile.am's
AC_MSG_CHECKING([if gcc supports the armv8 crc feature flag])
save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -march=armv8-a+crc -Werror"
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
int main()
{
return 0;
}
]])], [
ac_have_armv8_crc_feature=yes
AC_MSG_RESULT([yes])
], [
ac_have_armv8_crc_feature=no
AC_MSG_RESULT([no])
])
CFLAGS="$save_CFLAGS"
AM_CONDITIONAL(BUILD_ARMV8_CRC_TESTS, test x$ac_have_armv8_crc_feature = xyes)
# Does the C compiler support the armv81 flag and the assembler v8.1 instructions
# Note, this doesn't generate a C-level symbol. It generates a
# automake-level symbol (BUILD_ARMV81_TESTS), used in test Makefile.am's
AC_MSG_CHECKING([if gcc supports the armv81 feature flag and assembler supports v8.1 instructions])
save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -march=armv8.1-a -Werror"
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
int main()
{
__asm__ __volatile__("ldadd x0, x1, [x2]" ::: "memory");
return 0;
}
]])], [
ac_have_armv81_feature=yes
AC_MSG_RESULT([yes])
], [
ac_have_armv81_feature=no
AC_MSG_RESULT([no])
])
CFLAGS="$save_CFLAGS"
AM_CONDITIONAL(BUILD_ARMV81_TESTS, test x$ac_have_armv81_feature = xyes)
# Does the C compiler support the armv82 flag and the assembler v8.2 instructions
# Note, this doesn't generate a C-level symbol. It generates a
# automake-level symbol (BUILD_ARMV82_TESTS), used in test Makefile.am's
AC_MSG_CHECKING([if gcc supports the armv82 feature flag and assembler supports v8.2 instructions])
save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -march=armv8.2-a+fp16 -Werror"
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
int main()
{
__asm__ __volatile__("faddp h0, v1.2h");
return 0;
}
]])], [
ac_have_armv82_feature=yes
AC_MSG_RESULT([yes])
], [
ac_have_armv82_feature=no
AC_MSG_RESULT([no])
])
CFLAGS="$save_CFLAGS"
AM_CONDITIONAL(BUILD_ARMV82_TESTS, test x$ac_have_armv82_feature = xyes)
# XXX JRS 2010 Oct 13: what is this for? For sure, we don't need this
# when building the tool executables. I think we should get rid of it.
#
# Check for TLS support in the compiler and linker
AC_LINK_IFELSE([AC_LANG_PROGRAM([[static __thread int foo;]],
[[return foo;]])],
[vg_cv_linktime_tls=yes],
[vg_cv_linktime_tls=no])
# Native compilation: check whether running a program using TLS succeeds.
# Linking only is not sufficient -- e.g. on Red Hat 7.3 linking TLS programs
# succeeds but running programs using TLS fails.
# Cross-compiling: check whether linking a program using TLS succeeds.
AC_CACHE_CHECK([for TLS support], vg_cv_tls,
[AC_ARG_ENABLE(tls, [ --enable-tls platform supports TLS],
[vg_cv_tls=$enableval],
[AC_RUN_IFELSE([AC_LANG_PROGRAM([[static __thread int foo;]],
[[return foo;]])],
[vg_cv_tls=yes],
[vg_cv_tls=no],
[vg_cv_tls=$vg_cv_linktime_tls])])])
if test "$vg_cv_tls" = yes -a $is_clang != applellvm; then
AC_DEFINE([HAVE_TLS], 1, [can use __thread to define thread-local variables])
fi
#----------------------------------------------------------------------------
# Solaris-specific checks.
#----------------------------------------------------------------------------
if test "$VGCONF_OS" = "solaris" ; then
AC_CHECK_HEADERS([sys/lgrp_user_impl.h])
# Solaris-specific check determining if the Sun Studio Assembler is used to
# build Valgrind. The test checks if the x86/amd64 assembler understands the
# cmovl.l instruction, if yes then it's Sun Assembler.
#
# C-level symbol: none
# Automake-level symbol: SOLARIS_SUN_STUDIO_AS
#
AC_MSG_CHECKING([if x86/amd64 assembler speaks cmovl.l (Solaris-specific)])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
]], [[
__asm__ __volatile__("cmovl.l %edx, %eax");
]])], [
solaris_have_sun_studio_as=yes
AC_MSG_RESULT([yes])
], [
solaris_have_sun_studio_as=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(SOLARIS_SUN_STUDIO_AS, test x$solaris_have_sun_studio_as = xyes)
# Solaris-specific check determining if symbols __xpg4 and __xpg6
# are present in linked shared libraries when gcc is invoked with -std=gnu99.
# See solaris/vgpreload-solaris.mapfile for details.
# gcc on older Solaris instructs linker to include these symbols,
# gcc on illumos and newer Solaris does not.
#
# C-level symbol: none
# Automake-level symbol: SOLARIS_XPG_SYMBOLS_PRESENT
#
save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -std=gnu99"
AC_MSG_CHECKING([if xpg symbols are present with -std=gnu99 (Solaris-specific)])
temp_dir=$( /usr/bin/mktemp -d )
cat <<_ACEOF >${temp_dir}/mylib.c
#include <stdio.h>
int myfunc(void) { printf("LaPutyka\n"); }
_ACEOF
${CC} ${CFLAGS} -fpic -shared -o ${temp_dir}/mylib.so ${temp_dir}/mylib.c
xpg_present=$( /usr/bin/nm ${temp_dir}/mylib.so | ${EGREP} '(__xpg4|__xpg6)' )
if test "x${xpg_present}" = "x" ; then
solaris_xpg_symbols_present=no
AC_MSG_RESULT([no])
else
solaris_xpg_symbols_present=yes
AC_MSG_RESULT([yes])
fi
rm -rf ${temp_dir}
AM_CONDITIONAL(SOLARIS_XPG_SYMBOLS_PRESENT, test x$solaris_xpg_symbols_present = xyes)
CFLAGS="$save_CFLAGS"
# Solaris-specific check determining if gcc enables largefile support by
# default for 32-bit executables. If it does, then set SOLARIS_UNDEF_LARGESOURCE
# variable with gcc flags which disable it.
#
AC_MSG_CHECKING([if gcc enables largefile support for 32-bit apps (Solaris-specific)])
save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -m32"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
return _LARGEFILE_SOURCE;
]])], [
SOLARIS_UNDEF_LARGESOURCE="-U_LARGEFILE_SOURCE -U_LARGEFILE64_SOURCE -U_FILE_OFFSET_BITS"
AC_MSG_RESULT([yes])
], [
SOLARIS_UNDEF_LARGESOURCE=""
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
AC_SUBST(SOLARIS_UNDEF_LARGESOURCE)
# Solaris-specific check determining if /proc/self/cmdline
# or /proc/<pid>/cmdline is supported.
#
# C-level symbol: SOLARIS_PROC_CMDLINE
# Automake-level symbol: SOLARIS_PROC_CMDLINE
#
AC_CHECK_FILE([/proc/self/cmdline],
[
solaris_proc_cmdline=yes
AC_DEFINE([SOLARIS_PROC_CMDLINE], 1,
[Define to 1 if you have /proc/self/cmdline.])
], [
solaris_proc_cmdline=no
])
AM_CONDITIONAL(SOLARIS_PROC_CMDLINE, test x$solaris_proc_cmdline = xyes)
# Solaris-specific check determining default platform for the Valgrind launcher.
# Used in case the launcher cannot select platform by looking at the client
# image (for example because the executable is a shell script).
#
# C-level symbol: SOLARIS_LAUNCHER_DEFAULT_PLATFORM
# Automake-level symbol: none
#
AC_MSG_CHECKING([for default platform of Valgrind launcher (Solaris-specific)])
# Get the ELF class of /bin/sh first.
if ! test -f /bin/sh; then
AC_MSG_ERROR([Shell interpreter `/bin/sh' not found.])
fi
elf_class=$( /usr/bin/file /bin/sh | sed -n 's/.*ELF \(..\)-bit.*/\1/p' )
case "$elf_class" in
64)
default_arch="$VGCONF_ARCH_PRI";
;;
32)
if test "x$VGCONF_ARCH_SEC" != "x"; then
default_arch="$VGCONF_ARCH_SEC"
else
default_arch="$VGCONF_ARCH_PRI";
fi
;;
*)
AC_MSG_ERROR([Cannot determine ELF class of `/bin/sh'.])
;;
esac
default_platform="$default_arch-$VGCONF_OS"
AC_MSG_RESULT([$default_platform])
AC_DEFINE_UNQUOTED([SOLARIS_LAUNCHER_DEFAULT_PLATFORM], ["$default_platform"],
[Default platform for Valgrind launcher.])
# Solaris-specific check determining if the old syscalls are available.
#
# C-level symbol: SOLARIS_OLD_SYSCALLS
# Automake-level symbol: SOLARIS_OLD_SYSCALLS
#
AC_MSG_CHECKING([for the old Solaris syscalls (Solaris-specific)])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <sys/syscall.h>
]], [[
return !SYS_open;
]])], [
solaris_old_syscalls=yes
AC_MSG_RESULT([yes])
AC_DEFINE([SOLARIS_OLD_SYSCALLS], 1,
[Define to 1 if you have the old Solaris syscalls.])
], [
solaris_old_syscalls=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(SOLARIS_OLD_SYSCALLS, test x$solaris_old_syscalls = xyes)
# Solaris-specific check determining if the new accept() syscall is available.
#
# Old syscall:
# int accept(int sock, struct sockaddr *name, socklen_t *namelenp,
# int version);
#
# New syscall (available on illumos):
# int accept(int sock, struct sockaddr *name, socklen_t *namelenp,
# int version, int flags);
#
# If the old syscall is present then the following syscall will fail with
# ENOTSOCK (because file descriptor 0 is not a socket), if the new syscall is
# available then it will fail with EINVAL (because the flags parameter is
# invalid).
#
# C-level symbol: SOLARIS_NEW_ACCEPT_SYSCALL
# Automake-level symbol: none
#
AC_MSG_CHECKING([for the new `accept' syscall (Solaris-specific)])
AC_RUN_IFELSE([AC_LANG_PROGRAM([[
#include <sys/syscall.h>
#include <errno.h>
]], [[
errno = 0;
syscall(SYS_accept, 0, 0, 0, 0, -1);
return !(errno == EINVAL);
]])], [
AC_MSG_RESULT([yes])
AC_DEFINE([SOLARIS_NEW_ACCEPT_SYSCALL], 1,
[Define to 1 if you have the new `accept' syscall.])
], [
AC_MSG_RESULT([no])
])
# Solaris-specific check determining if the new illumos pipe() syscall is
# available.
#
# Old syscall:
# longlong_t pipe();
#
# New syscall (available on illumos):
# int pipe(intptr_t arg, int flags);
#
# If the old syscall is present then the following call will succeed, if the
# new syscall is available then it will fail with EFAULT (because address 0
# cannot be accessed).
#
# C-level symbol: SOLARIS_NEW_PIPE_SYSCALL
# Automake-level symbol: none
#
AC_MSG_CHECKING([for the new `pipe' syscall (Solaris-specific)])
AC_RUN_IFELSE([AC_LANG_PROGRAM([[
#include <sys/syscall.h>
#include <errno.h>
]], [[
errno = 0;
syscall(SYS_pipe, 0, 0);
return !(errno == EFAULT);
]])], [
AC_MSG_RESULT([yes])
AC_DEFINE([SOLARIS_NEW_PIPE_SYSCALL], 1,
[Define to 1 if you have the new `pipe' syscall.])
], [
AC_MSG_RESULT([no])
])
# Solaris-specific check determining if the new lwp_sigqueue() syscall is
# available.
#
# Old syscall:
# int lwp_kill(id_t lwpid, int sig);
#
# New syscall (available on Solaris 11):
# int lwp_sigqueue(id_t lwpid, int sig, void *value,
# int si_code, timespec_t *timeout);
#
# C-level symbol: SOLARIS_LWP_SIGQUEUE_SYSCALL
# Automake-level symbol: SOLARIS_LWP_SIGQUEUE_SYSCALL
#
AC_MSG_CHECKING([for the new `lwp_sigqueue' syscall (Solaris-specific)])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <sys/syscall.h>
]], [[
return !SYS_lwp_sigqueue;
]])], [
solaris_lwp_sigqueue_syscall=yes
AC_MSG_RESULT([yes])
AC_DEFINE([SOLARIS_LWP_SIGQUEUE_SYSCALL], 1,
[Define to 1 if you have the new `lwp_sigqueue' syscall.])
], [
solaris_lwp_sigqueue_syscall=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(SOLARIS_LWP_SIGQUEUE_SYSCALL, test x$solaris_lwp_sigqueue_syscall = xyes)
# Solaris-specific check determining if the lwp_sigqueue() syscall
# takes both pid and thread id arguments or just thread id.
#
# Old syscall (available up to Solaris 11.3):
# int lwp_sigqueue(id_t lwpid, int sig, void *value,
# int si_code, timespec_t *timeout);
#
# New syscall (available since Solaris 11.4):
# int lwp_sigqueue(pid_t pid, id_t lwpid, int sig, void *value,
# int si_code, timespec_t *timeout);
#
# If the old syscall is present then the following syscall will fail with
# EINVAL (because signal is out of range); if the new syscall is available
# then it will fail with ESRCH (because it would not find such thread in the
# current process).
#
# C-level symbol: SOLARIS_LWP_SIGQUEUE_SYSCALL_TAKES_PID
# Automake-level symbol: SOLARIS_LWP_SIGQUEUE_SYSCALL_TAKES_PID
#
AM_COND_IF(SOLARIS_LWP_SIGQUEUE_SYSCALL,
AC_MSG_CHECKING([if the `lwp_sigqueue' syscall accepts pid (Solaris-specific)])
AC_RUN_IFELSE([AC_LANG_PROGRAM([[
#include <sys/syscall.h>
#include <errno.h>
]], [[
errno = 0;
syscall(SYS_lwp_sigqueue, 0, 101, 0, 0, 0, 0);
return !(errno == ESRCH);
]])], [
solaris_lwp_sigqueue_syscall_takes_pid=yes
AC_MSG_RESULT([yes])
AC_DEFINE([SOLARIS_LWP_SIGQUEUE_SYSCALL_TAKES_PID], 1,
[Define to 1 if you have the new `lwp_sigqueue' syscall which accepts pid.])
], [
solaris_lwp_sigqueue_syscall_takes_pid=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(SOLARIS_LWP_SIGQUEUE_SYSCALL_TAKES_PID,
test x$solaris_lwp_sigqueue_syscall_takes_pid = xyes)
,
AM_CONDITIONAL(SOLARIS_LWP_SIGQUEUE_SYSCALL_TAKES_PID, test x = y)
)
# Solaris-specific check determining if the new lwp_name() syscall is
# available.
#
# New syscall (available on Solaris 11):
# int lwp_name(int opcode, id_t lwpid, char *name, size_t len);
#
# C-level symbol: SOLARIS_LWP_NAME_SYSCALL
# Automake-level symbol: SOLARIS_LWP_NAME_SYSCALL
#
AC_MSG_CHECKING([for the new `lwp_name' syscall (Solaris-specific)])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <sys/syscall.h>
]], [[
return !SYS_lwp_name;
]])], [
solaris_lwp_name_syscall=yes
AC_MSG_RESULT([yes])
AC_DEFINE([SOLARIS_LWP_NAME_SYSCALL], 1,
[Define to 1 if you have the new `lwp_name' syscall.])
], [
solaris_lwp_name_syscall=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(SOLARIS_LWP_NAME_SYSCALL, test x$solaris_lwp_name_syscall = xyes)
# Solaris-specific check determining if the new getrandom() syscall is
# available.
#
# New syscall (available on Solaris 11):
# int getrandom(void *buf, size_t buflen, uint_t flags);
#
# C-level symbol: SOLARIS_GETRANDOM_SYSCALL
# Automake-level symbol: SOLARIS_GETRANDOM_SYSCALL
#
AC_MSG_CHECKING([for the new `getrandom' syscall (Solaris-specific)])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <sys/syscall.h>
]], [[
return !SYS_getrandom;
]])], [
solaris_getrandom_syscall=yes
AC_MSG_RESULT([yes])
AC_DEFINE([SOLARIS_GETRANDOM_SYSCALL], 1,
[Define to 1 if you have the new `getrandom' syscall.])
], [
solaris_getrandom_syscall=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(SOLARIS_GETRANDOM_SYSCALL, test x$solaris_getrandom_syscall = xyes)
# Solaris-specific check determining if the new zone() syscall subcodes
# ZONE_LIST_DEFUNCT and ZONE_GETATTR_DEFUNCT are available. These subcodes
# were added in Solaris 11 but are missing on illumos.
#
# C-level symbol: SOLARIS_ZONE_DEFUNCT
# Automake-level symbol: SOLARIS_ZONE_DEFUNCT
#
AC_MSG_CHECKING([for ZONE_LIST_DEFUNCT and ZONE_GETATTR_DEFUNCT (Solaris-specific)])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <sys/zone.h>
]], [[
return !(ZONE_LIST_DEFUNCT && ZONE_GETATTR_DEFUNCT);
]])], [
solaris_zone_defunct=yes
AC_MSG_RESULT([yes])
AC_DEFINE([SOLARIS_ZONE_DEFUNCT], 1,
[Define to 1 if you have the `ZONE_LIST_DEFUNCT' and `ZONE_GETATTR_DEFUNC' constants.])
], [
solaris_zone_defunct=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(SOLARIS_ZONE_DEFUNCT, test x$solaris_zone_defunct = xyes)
# Solaris-specific check determining if commands A_GETSTAT and A_SETSTAT
# for auditon(2) subcode of the auditsys() syscall are available.
# These commands are available in Solaris 11 and illumos but were removed
# in Solaris 11.4.
#
# C-level symbol: SOLARIS_AUDITON_STAT
# Automake-level symbol: SOLARIS_AUDITON_STAT
#
AC_MSG_CHECKING([for A_GETSTAT and A_SETSTAT auditon(2) commands (Solaris-specific)])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <bsm/audit.h>
]], [[
return !(A_GETSTAT && A_SETSTAT);
]])], [
solaris_auditon_stat=yes
AC_MSG_RESULT([yes])
AC_DEFINE([SOLARIS_AUDITON_STAT], 1,
[Define to 1 if you have the `A_GETSTAT' and `A_SETSTAT' constants.])
], [
solaris_auditon_stat=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(SOLARIS_AUDITON_STAT, test x$solaris_auditon_stat = xyes)
# Solaris-specific check determining if the new shmsys() syscall subcodes
# IPC_XSTAT64, SHMADV, SHM_ADV_GET, SHM_ADV_SET and SHMGET_OSM are available.
# These subcodes were added in Solaris 11 but are missing on illumos.
#
# C-level symbol: SOLARIS_SHM_NEW
# Automake-level symbol: SOLARIS_SHM_NEW
#
AC_MSG_CHECKING([for SHMADV, SHM_ADV_GET, SHM_ADV_SET and SHMGET_OSM (Solaris-specific)])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <sys/ipc_impl.h>
#include <sys/shm.h>
#include <sys/shm_impl.h>
]], [[
return !(IPC_XSTAT64 && SHMADV && SHM_ADV_GET && SHM_ADV_SET && SHMGET_OSM);
]])], [
solaris_shm_new=yes
AC_MSG_RESULT([yes])
AC_DEFINE([SOLARIS_SHM_NEW], 1,
[Define to 1 if you have the `IPC_XSTAT64', `SHMADV', `SHM_ADV_GET', `SHM_ADV_SET' and `SHMGET_OSM' constants.])
], [
solaris_shm_new=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(SOLARIS_SHM_NEW, test x$solaris_shm_new = xyes)
# Solaris-specific check determining if prxregset_t is available. Illumos
# currently does not define it on the x86 platform.
#
# C-level symbol: SOLARIS_PRXREGSET_T
# Automake-level symbol: SOLARIS_PRXREGSET_T
#
AC_MSG_CHECKING([for the `prxregset_t' type (Solaris-specific)])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <sys/procfs_isa.h>
]], [[
return !sizeof(prxregset_t);
]])], [
solaris_prxregset_t=yes
AC_MSG_RESULT([yes])
AC_DEFINE([SOLARIS_PRXREGSET_T], 1,
[Define to 1 if you have the `prxregset_t' type.])
], [
solaris_prxregset_t=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(SOLARIS_PRXREGSET_T, test x$solaris_prxregset_t = xyes)
# Solaris-specific check determining if the new frealpathat() syscall is
# available.
#
# New syscall (available on Solaris 11.1):
# int frealpathat(int fd, char *path, char *buf, size_t buflen);
#
# C-level symbol: SOLARIS_FREALPATHAT_SYSCALL
# Automake-level symbol: SOLARIS_FREALPATHAT_SYSCALL
#
AC_MSG_CHECKING([for the new `frealpathat' syscall (Solaris-specific)])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <sys/syscall.h>
]], [[
return !SYS_frealpathat;
]])], [
solaris_frealpathat_syscall=yes
AC_MSG_RESULT([yes])
AC_DEFINE([SOLARIS_FREALPATHAT_SYSCALL], 1,
[Define to 1 if you have the new `frealpathat' syscall.])
], [
solaris_frealpathat_syscall=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(SOLARIS_FREALPATHAT_SYSCALL, test x$solaris_frealpathat_syscall = xyes)
# Solaris-specific check determining if the new uuidsys() syscall is
# available.
#
# New syscall (available on newer Solaris):
# int uuidsys(struct uuid *uuid);
#
# C-level symbol: SOLARIS_UUIDSYS_SYSCALL
# Automake-level symbol: SOLARIS_UUIDSYS_SYSCALL
#
AC_MSG_CHECKING([for the new `uuidsys' syscall (Solaris-specific)])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <sys/syscall.h>
]], [[
return !SYS_uuidsys;
]])], [
solaris_uuidsys_syscall=yes
AC_MSG_RESULT([yes])
AC_DEFINE([SOLARIS_UUIDSYS_SYSCALL], 1,
[Define to 1 if you have the new `uuidsys' syscall.])
], [
solaris_uuidsys_syscall=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(SOLARIS_UUIDSYS_SYSCALL, test x$solaris_uuidsys_syscall = xyes)
# Solaris-specific check determining if the new labelsys() syscall subcode
# TNDB_GET_TNIP is available. This subcode was added in Solaris 11 but is
# missing on illumos.
#
# C-level symbol: SOLARIS_TNDB_GET_TNIP
# Automake-level symbol: SOLARIS_TNDB_GET_TNIP
#
AC_MSG_CHECKING([for TNDB_GET_TNIP (Solaris-specific)])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <sys/tsol/tndb.h>
]], [[
return !TNDB_GET_TNIP;
]])], [
solaris_tndb_get_tnip=yes
AC_MSG_RESULT([yes])
AC_DEFINE([SOLARIS_TNDB_GET_TNIP], 1,
[Define to 1 if you have the `TNDB_GET_TNIP' constant.])
], [
solaris_tndb_get_tnip=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(SOLARIS_TNDB_GET_TNIP, test x$solaris_tndb_get_tnip = xyes)
# Solaris-specific check determining if the new labelsys() syscall opcodes
# TSOL_GETCLEARANCE and TSOL_SETCLEARANCE are available. These opcodes were
# added in Solaris 11 but are missing on illumos.
#
# C-level symbol: SOLARIS_TSOL_CLEARANCE
# Automake-level symbol: SOLARIS_TSOL_CLEARANCE
#
AC_MSG_CHECKING([for TSOL_GETCLEARANCE and TSOL_SETCLEARANCE (Solaris-specific)])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <sys/tsol/tsyscall.h>
]], [[
return !(TSOL_GETCLEARANCE && TSOL_SETCLEARANCE);
]])], [
solaris_tsol_clearance=yes
AC_MSG_RESULT([yes])
AC_DEFINE([SOLARIS_TSOL_CLEARANCE], 1,
[Define to 1 if you have the `TSOL_GETCLEARANCE' and `TSOL_SETCLEARANCE' constants.])
], [
solaris_tsol_clearance=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(SOLARIS_TSOL_CLEARANCE, test x$solaris_tsol_clearance = xyes)
# Solaris-specific check determining if the new pset() syscall subcode
# PSET_GET_NAME is available. This subcode was added in Solaris 11.4 but
# is missing on illumos and Solaris 11.3.
#
# C-level symbol: SOLARIS_PSET_GET_NAME
# Automake-level symbol: SOLARIS_PSET_GET_NAME
#
AC_MSG_CHECKING([for PSET_GET_NAME (Solaris-specific)])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <sys/pset.h>
]], [[
return !(PSET_GET_NAME);
]])], [
solaris_pset_get_name=yes
AC_MSG_RESULT([yes])
AC_DEFINE([SOLARIS_PSET_GET_NAME], 1,
[Define to 1 if you have the `PSET_GET_NAME' constants.])
], [
solaris_pset_get_name=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(SOLARIS_PSET_GET_NAME, test x$solaris_pset_get_name = xyes)
# Solaris-specific check determining if the utimesys() syscall is
# available (on illumos and older Solaris).
#
# C-level symbol: SOLARIS_UTIMESYS_SYSCALL
# Automake-level symbol: SOLARIS_UTIMESYS_SYSCALL
#
AC_MSG_CHECKING([for the `utimesys' syscall (Solaris-specific)])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <sys/syscall.h>
]], [[
return !SYS_utimesys;
]])], [
solaris_utimesys_syscall=yes
AC_MSG_RESULT([yes])
AC_DEFINE([SOLARIS_UTIMESYS_SYSCALL], 1,
[Define to 1 if you have the `utimesys' syscall.])
], [
solaris_utimesys_syscall=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(SOLARIS_UTIMESYS_SYSCALL, test x$solaris_utimesys_syscall = xyes)
# Solaris-specific check determining if the utimensat() syscall is
# available (on newer Solaris).
#
# C-level symbol: SOLARIS_UTIMENSAT_SYSCALL
# Automake-level symbol: SOLARIS_UTIMENSAT_SYSCALL
#
AC_MSG_CHECKING([for the `utimensat' syscall (Solaris-specific)])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <sys/syscall.h>
]], [[
return !SYS_utimensat;
]])], [
solaris_utimensat_syscall=yes
AC_MSG_RESULT([yes])
AC_DEFINE([SOLARIS_UTIMENSAT_SYSCALL], 1,
[Define to 1 if you have the `utimensat' syscall.])
], [
solaris_utimensat_syscall=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(SOLARIS_UTIMENSAT_SYSCALL, test x$solaris_utimensat_syscall = xyes)
# Solaris-specific check determining if the spawn() syscall is available
# (on newer Solaris).
#
# C-level symbol: SOLARIS_SPAWN_SYSCALL
# Automake-level symbol: SOLARIS_SPAWN_SYSCALL
#
AC_MSG_CHECKING([for the `spawn' syscall (Solaris-specific)])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <sys/syscall.h>
]], [[
return !SYS_spawn;
]])], [
solaris_spawn_syscall=yes
AC_MSG_RESULT([yes])
AC_DEFINE([SOLARIS_SPAWN_SYSCALL], 1,
[Define to 1 if you have the `spawn' syscall.])
], [
solaris_spawn_syscall=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(SOLARIS_SPAWN_SYSCALL, test x$solaris_spawn_syscall = xyes)
# Solaris-specific check determining if commands MODNVL_CTRLMAP through
# MODDEVINFO_CACHE_TS for modctl() syscall are available (on newer Solaris).
#
# C-level symbol: SOLARIS_MODCTL_MODNVL
# Automake-level symbol: SOLARIS_MODCTL_MODNVL
#
AC_MSG_CHECKING([for MODNVL_CTRLMAP through MODDEVINFO_CACHE_TS modctl(2) commands (Solaris-specific)])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <sys/modctl.h>
]], [[
return !(MODNVL_CTRLMAP && MODDEVINFO_CACHE_TS);
]])], [
solaris_modctl_modnvl=yes
AC_MSG_RESULT([yes])
AC_DEFINE([SOLARIS_MODCTL_MODNVL], 1,
[Define to 1 if you have the `MODNVL_CTRLMAP' through `MODDEVINFO_CACHE_TS' constants.])
], [
solaris_modctl_modnvl=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(SOLARIS_MODCTL_MODNVL, test x$solaris_modctl_modnvl = xyes)
# Solaris-specific check determining whether nscd (name switch cache daemon)
# attaches its door at /system/volatile/name_service_door (Solaris)
# or at /var/run/name_service_door (illumos).
#
# Note that /var/run is a symlink to /system/volatile on Solaris
# but not vice versa on illumos.
#
# C-level symbol: SOLARIS_NSCD_DOOR_SYSTEM_VOLATILE
# Automake-level symbol: SOLARIS_NSCD_DOOR_SYSTEM_VOLATILE
#
AC_MSG_CHECKING([for nscd door location (Solaris-specific)])
if test -e /system/volatile/name_service_door; then
solaris_nscd_door_system_volatile=yes
AC_MSG_RESULT([/system/volatile/name_service_door])
AC_DEFINE([SOLARIS_NSCD_DOOR_SYSTEM_VOLATILE], 1,
[Define to 1 if nscd attaches to /system/volatile/name_service_door.])
else
solaris_nscd_door_system_volatile=no
AC_MSG_RESULT([/var/run/name_service_door])
fi
AM_CONDITIONAL(SOLARIS_NSCD_DOOR_SYSTEM_VOLATILE, test x$solaris_nscd_door_system_volatile = xyes)
# Solaris-specific check determining if the new gethrt() fasttrap is available.
#
# New fasttrap (available on Solaris 11):
# hrt_t *gethrt(void);
#
# C-level symbol: SOLARIS_GETHRT_FASTTRAP
# Automake-level symbol: SOLARIS_GETHRT_FASTTRAP
#
AC_MSG_CHECKING([for the new `gethrt' fasttrap (Solaris-specific)])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <sys/trap.h>
]], [[
return !T_GETHRT;
]])], [
solaris_gethrt_fasttrap=yes
AC_MSG_RESULT([yes])
AC_DEFINE([SOLARIS_GETHRT_FASTTRAP], 1,
[Define to 1 if you have the new `gethrt' fasttrap.])
], [
solaris_gethrt_fasttrap=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(SOLARIS_GETHRT_FASTTRAP, test x$solaris_gethrt_fasttrap = xyes)
# Solaris-specific check determining if the new get_zone_offset() fasttrap
# is available.
#
# New fasttrap (available on Solaris 11):
# zonehrtoffset_t *get_zone_offset(void);
#
# C-level symbol: SOLARIS_GETZONEOFFSET_FASTTRAP
# Automake-level symbol: SOLARIS_GETZONEOFFSET_FASTTRAP
#
AC_MSG_CHECKING([for the new `get_zone_offset' fasttrap (Solaris-specific)])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <sys/trap.h>
]], [[
return !T_GETZONEOFFSET;
]])], [
solaris_getzoneoffset_fasttrap=yes
AC_MSG_RESULT([yes])
AC_DEFINE([SOLARIS_GETZONEOFFSET_FASTTRAP], 1,
[Define to 1 if you have the new `get_zone_offset' fasttrap.])
], [
solaris_getzoneoffset_fasttrap=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(SOLARIS_GETZONEOFFSET_FASTTRAP, test x$solaris_getzoneoffset_fasttrap = xyes)
# Solaris-specific check determining if the execve() syscall
# takes fourth argument (flags) or not.
#
# Old syscall (available on illumos):
# int execve(const char *fname, const char **argv, const char **envp);
#
# New syscall (available on Solaris):
# int execve(uintptr_t file, const char **argv, const char **envp, int flags);
#
# If the new syscall is present then it will fail with EINVAL (because flags
# are invalid); if the old syscall is available then it will fail with ENOENT
# (because the file could not be found).
#
# C-level symbol: SOLARIS_EXECVE_SYSCALL_TAKES_FLAGS
# Automake-level symbol: SOLARIS_EXECVE_SYSCALL_TAKES_FLAGS
#
AC_MSG_CHECKING([if the `execve' syscall accepts flags (Solaris-specific)])
AC_RUN_IFELSE([AC_LANG_PROGRAM([[
#include <sys/syscall.h>
#include <errno.h>
]], [[
errno = 0;
syscall(SYS_execve, "/no/existing/path", 0, 0, 0xdeadbeef, 0, 0);
return !(errno == EINVAL);
]])], [
solaris_execve_syscall_takes_flags=yes
AC_MSG_RESULT([yes])
AC_DEFINE([SOLARIS_EXECVE_SYSCALL_TAKES_FLAGS], 1,
[Define to 1 if you have the new `execve' syscall which accepts flags.])
], [
solaris_execve_syscall_takes_flags=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(SOLARIS_EXECVE_SYSCALL_TAKES_FLAGS,
test x$solaris_execve_syscall_takes_flags = xyes)
# Solaris-specific check determining version of the repository cache protocol.
# Every Solaris version uses a different one, ranging from 21 to current 25.
# The check is very ugly, though.
#
# C-level symbol: SOLARIS_REPCACHE_PROTOCOL_VERSION vv
# Automake-level symbol: none
#
AC_PATH_PROG(DIS_PATH, dis, false)
if test "x$DIS_PATH" = "xfalse"; then
AC_MSG_FAILURE([Object code disassembler (`dis') not found.])
fi
AC_CHECK_LIB(scf, scf_handle_bind, [], [
AC_MSG_WARN([Function `scf_handle_bind' was not found in `libscf'.])
AC_MSG_ERROR([Cannot determine version of the repository cache protocol.])
])
AC_MSG_CHECKING([for version of the repository cache protocol (Solaris-specific)])
if test "X$VGCONF_ARCH_PRI" = "Xamd64"; then
libscf=/usr/lib/64/libscf.so.1
else
libscf=/usr/lib/libscf.so.1
fi
if ! $DIS_PATH -F scf_handle_bind $libscf | grep -q 0x526570; then
AC_MSG_WARN([Function `scf_handle_bind' does not contain repository cache protocol version.])
AC_MSG_ERROR([Cannot determine version of the repository cache protocol.])
fi
hex=$( $DIS_PATH -F scf_handle_bind $libscf | sed -n 's/.*0x526570\(..\).*/\1/p' )
if test -z "$hex"; then
AC_MSG_WARN([Version of the repository cache protocol is empty?!])
AC_MSG_ERROR([Cannot determine version of the repository cache protocol.])
fi
version=$( printf "%d\n" 0x$hex )
AC_MSG_RESULT([$version])
AC_DEFINE_UNQUOTED([SOLARIS_REPCACHE_PROTOCOL_VERSION], [$version],
[Version number of the repository door cache protocol.])
# Solaris-specific check determining if "sysstat" segment reservation type
# is available.
#
# New "sysstat" segment reservation (available on Solaris 11.4):
# - program header type: PT_SUNW_SYSSTAT
# - auxiliary vector entry: AT_SUN_SYSSTAT_ADDR
#
# C-level symbol: SOLARIS_RESERVE_SYSSTAT_ADDR
# Automake-level symbol: SOLARIS_RESERVE_SYSSTAT_ADDR
#
AC_MSG_CHECKING([for the new `sysstat' segment reservation (Solaris-specific)])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <sys/auxv.h>
]], [[
return !AT_SUN_SYSSTAT_ADDR;
]])], [
solaris_reserve_sysstat_addr=yes
AC_MSG_RESULT([yes])
AC_DEFINE([SOLARIS_RESERVE_SYSSTAT_ADDR], 1,
[Define to 1 if you have the new `sysstat' segment reservation.])
], [
solaris_reserve_sysstat_addr=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(SOLARIS_RESERVE_SYSSTAT_ADDR, test x$solaris_reserve_sysstat_addr = xyes)
# Solaris-specific check determining if "sysstat_zone" segment reservation type
# is available.
#
# New "sysstat_zone" segment reservation (available on Solaris 11.4):
# - program header type: PT_SUNW_SYSSTAT_ZONE
# - auxiliary vector entry: AT_SUN_SYSSTAT_ZONE_ADDR
#
# C-level symbol: SOLARIS_RESERVE_SYSSTAT_ZONE_ADDR
# Automake-level symbol: SOLARIS_RESERVE_SYSSTAT_ZONE_ADDR
#
AC_MSG_CHECKING([for the new `sysstat_zone' segment reservation (Solaris-specific)])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <sys/auxv.h>
]], [[
return !AT_SUN_SYSSTAT_ZONE_ADDR;
]])], [
solaris_reserve_sysstat_zone_addr=yes
AC_MSG_RESULT([yes])
AC_DEFINE([SOLARIS_RESERVE_SYSSTAT_ZONE_ADDR], 1,
[Define to 1 if you have the new `sysstat_zone' segment reservation.])
], [
solaris_reserve_sysstat_zone_addr=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(SOLARIS_RESERVE_SYSSTAT_ZONE_ADDR, test x$solaris_reserve_sysstat_zone_addr = xyes)
# Solaris-specific check determining if the system_stats() syscall is available
# (on newer Solaris).
#
# C-level symbol: SOLARIS_SYSTEM_STATS_SYSCALL
# Automake-level symbol: SOLARIS_SYSTEM_STATS_SYSCALL
#
AC_MSG_CHECKING([for the `system_stats' syscall (Solaris-specific)])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <sys/syscall.h>
]], [[
return !SYS_system_stats;
]])], [
solaris_system_stats_syscall=yes
AC_MSG_RESULT([yes])
AC_DEFINE([SOLARIS_SYSTEM_STATS_SYSCALL], 1,
[Define to 1 if you have the `system_stats' syscall.])
], [
solaris_system_stats_syscall=no
AC_MSG_RESULT([no])
])
AM_CONDITIONAL(SOLARIS_SYSTEM_STATS_SYSCALL, test x$solaris_system_stats_syscall = xyes)
# Solaris-specific check determining if fpregset_t defines struct _fpchip_state
# (on newer illumos) or struct fpchip_state (Solaris, older illumos).
#
# C-level symbol: SOLARIS_FPCHIP_STATE_TAKES_UNDERSCORE
# Automake-level symbol: none
#
AC_CHECK_TYPE([struct _fpchip_state],
[solaris_fpchip_state_takes_underscore=yes],
[solaris_fpchip_state_takes_underscore=no],
[[#include <sys/regset.h>]])
if test "$solaris_fpchip_state_takes_underscore" = "yes"; then
AC_DEFINE(SOLARIS_FPCHIP_STATE_TAKES_UNDERSCORE, 1,
[Define to 1 if fpregset_t defines struct _fpchip_state])
fi
# Solaris-specific check determining if schedctl page shared between kernel
# and userspace program is executable (illumos, older Solaris) or not (newer
# Solaris).
#
# C-level symbol: SOLARIS_SCHEDCTL_PAGE_EXEC
# Automake-level symbol: none
#
AC_MSG_CHECKING([if schedctl page is executable (Solaris-specific)])
AC_RUN_IFELSE([AC_LANG_PROGRAM([[
#include <assert.h>
#include <fcntl.h>
#include <procfs.h>
#include <schedctl.h>
#include <stdio.h>
#include <unistd.h>
]], [[
schedctl_t *scp = schedctl_init();
if (scp == NULL)
return 1;
int fd = open("/proc/self/map", O_RDONLY);
assert(fd >= 0);
prmap_t map;
ssize_t rd;
while ((rd = read(fd, &map, sizeof(map))) == sizeof(map)) {
if (map.pr_vaddr == ((uintptr_t) scp & PAGEMASK)) {
fprintf(stderr, "%#lx [%zu] %s\n", map.pr_vaddr, map.pr_size,
(map.pr_mflags & MA_EXEC) ? "x" : "no-x");
return (map.pr_mflags & MA_EXEC);
}
}
return 1;
]])], [
solaris_schedctl_page_exec=no
AC_MSG_RESULT([no])
], [
solaris_schedctl_page_exec=yes
AC_MSG_RESULT([yes])
AC_DEFINE([SOLARIS_SCHEDCTL_PAGE_EXEC], 1,
[Define to 1 if you have the schedctl page executable.])
])
# Solaris-specific check determining if PT_SUNWDTRACE program header provides
# scratch space for DTrace fasttrap provider (illumos, older Solaris) or just
# an initial thread pointer for libc (newer Solaris).
#
# C-level symbol: SOLARIS_PT_SUNDWTRACE_THRP
# Automake-level symbol: none
#
AC_MSG_CHECKING([if PT_SUNWDTRACE serves for initial thread pointer (Solaris-specific)])
AC_RUN_IFELSE([AC_LANG_PROGRAM([[
#include <sys/fasttrap_isa.h>
]], [[
return !FT_SCRATCHSIZE;
]])], [
solaris_pt_sunwdtrace_thrp=yes
AC_MSG_RESULT([yes])
AC_DEFINE([SOLARIS_PT_SUNDWTRACE_THRP], 1,
[Define to 1 if PT_SUNWDTRACE program header provides just an initial thread pointer for libc.])
], [
solaris_pt_sunwdtrace_thrp=no
AC_MSG_RESULT([no])
])
else
AM_CONDITIONAL(SOLARIS_SUN_STUDIO_AS, false)
AM_CONDITIONAL(SOLARIS_XPG_SYMBOLS_PRESENT, false)
AM_CONDITIONAL(SOLARIS_PROC_CMDLINE, false)
AM_CONDITIONAL(SOLARIS_OLD_SYSCALLS, false)
AM_CONDITIONAL(SOLARIS_LWP_SIGQUEUE_SYSCALL, false)
AM_CONDITIONAL(SOLARIS_LWP_SIGQUEUE_SYSCALL_TAKES_PID, false)
AM_CONDITIONAL(SOLARIS_LWP_NAME_SYSCALL, false)
AM_CONDITIONAL(SOLARIS_GETRANDOM_SYSCALL, false)
AM_CONDITIONAL(SOLARIS_ZONE_DEFUNCT, false)
AM_CONDITIONAL(SOLARIS_AUDITON_STAT, false)
AM_CONDITIONAL(SOLARIS_SHM_NEW, false)
AM_CONDITIONAL(SOLARIS_PRXREGSET_T, false)
AM_CONDITIONAL(SOLARIS_FREALPATHAT_SYSCALL, false)
AM_CONDITIONAL(SOLARIS_UUIDSYS_SYSCALL, false)
AM_CONDITIONAL(SOLARIS_TNDB_GET_TNIP, false)
AM_CONDITIONAL(SOLARIS_TSOL_CLEARANCE, false)
AM_CONDITIONAL(SOLARIS_PSET_GET_NAME, false)
AM_CONDITIONAL(SOLARIS_UTIMESYS_SYSCALL, false)
AM_CONDITIONAL(SOLARIS_UTIMENSAT_SYSCALL, false)
AM_CONDITIONAL(SOLARIS_SPAWN_SYSCALL, false)
AM_CONDITIONAL(SOLARIS_MODCTL_MODNVL, false)
AM_CONDITIONAL(SOLARIS_NSCD_DOOR_SYSTEM_VOLATILE, false)
AM_CONDITIONAL(SOLARIS_GETHRT_FASTTRAP, false)
AM_CONDITIONAL(SOLARIS_GETZONEOFFSET_FASTTRAP, false)
AM_CONDITIONAL(SOLARIS_EXECVE_SYSCALL_TAKES_FLAGS, false)
AM_CONDITIONAL(SOLARIS_RESERVE_SYSSTAT_ADDR, false)
AM_CONDITIONAL(SOLARIS_RESERVE_SYSSTAT_ZONE_ADDR, false)
AM_CONDITIONAL(SOLARIS_SYSTEM_STATS_SYSCALL, false)
fi # test "$VGCONF_OS" = "solaris"
#----------------------------------------------------------------------------
# FreeBSD-specific checks.
#----------------------------------------------------------------------------
# Rather than having a large number of feature test as above with Solaris
# these tests are per-version. This may not be entirely relialable for
# FreeBSD development branches (XX.Y-CURRENT) or pre-release branches
# (XX.Y-STABLE) but it should work for XX-Y-RELEASE
if test "$VGCONF_OS" = "freebsd" ; then
AM_CONDITIONAL(FREEBSD_VERS_13_PLUS, test $freebsd_vers -ge $freebsd_13_0)
else
AM_CONDITIONAL(FREEBSD_VERS_13_PLUS, false)
fi # test "$VGCONF_OS" = "freebsd"
#----------------------------------------------------------------------------
# Checks for C header files.
#----------------------------------------------------------------------------
AC_CHECK_HEADERS([ \
asm/unistd.h \
endian.h \
mqueue.h \
sys/endian.h \
sys/epoll.h \
sys/eventfd.h \
sys/klog.h \
sys/poll.h \
sys/prctl.h \
sys/signal.h \
sys/signalfd.h \
sys/syscall.h \
sys/sysnvl.h \
sys/time.h \
sys/types.h \
])
# Verify whether the <linux/futex.h> header is usable.
AC_MSG_CHECKING([if <linux/futex.h> is usable])
save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -D__user="
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <linux/futex.h>
]], [[
return FUTEX_WAIT;
]])], [
ac_have_usable_linux_futex_h=yes
AC_DEFINE([HAVE_USABLE_LINUX_FUTEX_H], 1,
[Define to 1 if you have a usable <linux/futex.h> header file.])
AC_MSG_RESULT([yes])
], [
ac_have_usable_linux_futex_h=no
AC_MSG_RESULT([no])
])
CFLAGS="$save_CFLAGS"
#----------------------------------------------------------------------------
# Checks for typedefs, structures, and compiler characteristics.
#----------------------------------------------------------------------------
AC_TYPE_UID_T
AC_TYPE_OFF_T
AC_TYPE_SIZE_T
AC_CHECK_HEADERS_ONCE([sys/time.h])
AC_CHECK_TYPE([struct statx], [
AC_DEFINE([HAVE_STRUCT_STATX_IN_SYS_STAT_H], 1,
[Define to 1 if <sys/stat.h> declares struct statx.])
], [], [
#define _GNU_SOURCE
#include <sys/stat.h>
])
#----------------------------------------------------------------------------
# Checks for library functions.
#----------------------------------------------------------------------------
AC_FUNC_MEMCMP
AC_FUNC_MMAP
AC_CHECK_LIB([pthread], [pthread_create])
AC_CHECK_LIB([rt], [clock_gettime])
AC_CHECK_FUNCS([ \
clock_gettime\
copy_file_range \
epoll_create \
epoll_pwait \
klogctl \
mallinfo \
memchr \
memfd_create \
memset \
mkdir \
mremap \
ppoll \
preadv \
preadv2 \
process_vm_readv \
process_vm_writev \
pthread_barrier_init \
pthread_condattr_setclock \
pthread_mutex_timedlock \
pthread_rwlock_timedrdlock \
pthread_rwlock_timedwrlock \
pthread_setname_np \
pthread_spin_lock \
pthread_yield \
pwritev \
pwritev2 \
rawmemchr \
readlinkat \
semtimedop \
setcontext \
signalfd \
sigwaitinfo \
strchr \
strdup \
strpbrk \
strrchr \
strstr \
swapcontext \
syscall \
utimensat \
])
# AC_CHECK_LIB adds any library found to the variable LIBS, and links these
# libraries with any shared object and/or executable. This is NOT what we
# want for e.g. vgpreload_core-x86-linux.so
LIBS=""
AM_CONDITIONAL([HAVE_PTHREAD_BARRIER],
[test x$ac_cv_func_pthread_barrier_init = xyes])
AM_CONDITIONAL([HAVE_PTHREAD_MUTEX_TIMEDLOCK],
[test x$ac_cv_func_pthread_mutex_timedlock = xyes])
AM_CONDITIONAL([HAVE_PTHREAD_SPINLOCK],
[test x$ac_cv_func_pthread_spin_lock = xyes])
AM_CONDITIONAL([HAVE_PTHREAD_SETNAME_NP],
[test x$ac_cv_func_pthread_setname_np = xyes])
AM_CONDITIONAL([HAVE_COPY_FILE_RANGE],
[test x$ac_cv_func_copy_file_range = xyes])
AM_CONDITIONAL([HAVE_PREADV_PWRITEV],
[test x$ac_cv_func_preadv = xyes && test x$ac_cv_func_pwritev = xyes])
AM_CONDITIONAL([HAVE_PREADV2_PWRITEV2],
[test x$ac_cv_func_preadv2 = xyes && test x$ac_cv_func_pwritev2 = xyes])
AM_CONDITIONAL([HAVE_SETCONTEXT], [test x$ac_cv_func_setcontext = xyes])
AM_CONDITIONAL([HAVE_SWAPCONTEXT], [test x$ac_cv_func_swapcontext = xyes])
AM_CONDITIONAL([HAVE_MEMFD_CREATE],
[test x$ac_cv_func_memfd_create = xyes])
if test x$VGCONF_PLATFORM_PRI_CAPS = xMIPS32_LINUX \
-o x$VGCONF_PLATFORM_PRI_CAPS = xMIPS64_LINUX \
-o x$VGCONF_PLATFORM_PRI_CAPS = xNANOMIPS_LINUX; then
AC_DEFINE([DISABLE_PTHREAD_SPINLOCK_INTERCEPT], 1,
[Disable intercept pthread_spin_lock() on MIPS32, MIPS64 and nanoMIPS.])
fi
#----------------------------------------------------------------------------
# MPI checks
#----------------------------------------------------------------------------
# Do we have a useable MPI setup on the primary and/or secondary targets?
# On Linux, by default, assumes mpicc and -m32/-m64
# Note: this is a kludge in that it assumes the specified mpicc
# understands -m32/-m64 regardless of what is specified using
# --with-mpicc=.
AC_PATH_PROG([MPI_CC], [mpicc], [mpicc],
[$PATH:/usr/lib/openmpi/bin:/usr/lib64/openmpi/bin])
mflag_primary=
if test x$VGCONF_PLATFORM_PRI_CAPS = xX86_LINUX \
-o x$VGCONF_PLATFORM_PRI_CAPS = xX86_FREEBSD \
-o x$VGCONF_PLATFORM_PRI_CAPS = xPPC32_LINUX \
-o x$VGCONF_PLATFORM_PRI_CAPS = xARM_LINUX \
-o x$VGCONF_PLATFORM_PRI_CAPS = xMIPS32_LINUX \
-o x$VGCONF_PLATFORM_PRI_CAPS = xNANOMIPS_LINUX \
-o x$VGCONF_PLATFORM_PRI_CAPS = xX86_SOLARIS ; then
mflag_primary=$FLAG_M32
elif test x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_LINUX \
-o x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_FREEBSD \
-o x$VGCONF_PLATFORM_PRI_CAPS = xPPC64_LINUX \
-o x$VGCONF_PLATFORM_PRI_CAPS = xARM64_LINUX \
-o x$VGCONF_PLATFORM_PRI_CAPS = xMIPS64_LINUX \
-o x$VGCONF_PLATFORM_PRI_CAPS = xS390X_LINUX ; then
mflag_primary=$FLAG_M64
elif test x$VGCONF_PLATFORM_PRI_CAPS = xX86_DARWIN ; then
mflag_primary="$FLAG_M32 -arch i386"
elif test x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_DARWIN ; then
mflag_primary="$FLAG_M64 -arch x86_64"
fi
mflag_secondary=
if test x$VGCONF_PLATFORM_SEC_CAPS = xX86_LINUX \
-o x$VGCONF_PLATFORM_SEC_CAPS = xPPC32_LINUX \
-o x$VGCONF_PLATFORM_SEC_CAPS = xX86_SOLARIS \
-o x$VGCONF_PLATFORM_SEC_CAPS = xMIPS32_LINUX \
-o x$VGCONF_PLATFORM_SEC_CAPS = xX86_FREEBSD ; then
mflag_secondary=$FLAG_M32
elif test x$VGCONF_PLATFORM_SEC_CAPS = xX86_DARWIN ; then
mflag_secondary="$FLAG_M32 -arch i386"
fi
AC_ARG_WITH(mpicc,
[ --with-mpicc= Specify name of MPI2-ised C compiler],
MPI_CC=$withval
)
AC_SUBST(MPI_CC)
## We AM_COND_IF here instead of automake "if" in mpi/Makefile.am so that we can
## use these values in the check for a functioning mpicc.
##
## We leave the MPI_FLAG_M3264_ logic in mpi/Makefile.am and assume that
## mflag_primary/mflag_secondary are sufficient approximations of that behavior
AM_COND_IF([VGCONF_OS_IS_LINUX],
[CFLAGS_MPI="-g -O -fno-omit-frame-pointer -Wall -fpic"
LDFLAGS_MPI="-fpic -shared"])
AM_COND_IF([VGCONF_OS_IS_FREEBSD],
[CFLAGS_MPI="-g -O -fno-omit-frame-pointer -Wall -fpic"
LDFLAGS_MPI="-fpic -shared"])
AM_COND_IF([VGCONF_OS_IS_DARWIN],
[CFLAGS_MPI="-g -O -fno-omit-frame-pointer -Wall -dynamic"
LDFLAGS_MPI="-dynamic -dynamiclib -all_load"])
AM_COND_IF([VGCONF_OS_IS_SOLARIS],
[CFLAGS_MPI="-g -O -fno-omit-frame-pointer -Wall -fpic"
LDFLAGS_MPI="-fpic -shared"])
AC_SUBST([CFLAGS_MPI])
AC_SUBST([LDFLAGS_MPI])
## See if MPI_CC works for the primary target
##
AC_MSG_CHECKING([primary target for usable MPI2-compliant C compiler and mpi.h])
saved_CC=$CC
saved_CFLAGS=$CFLAGS
CC=$MPI_CC
CFLAGS="$CFLAGS_MPI $mflag_primary"
saved_LDFLAGS="$LDFLAGS"
LDFLAGS="$LDFLAGS_MPI $mflag_primary"
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#include <mpi.h>
#include <stdio.h>
]], [[
int ni, na, nd, comb;
int r = MPI_Init(NULL,NULL);
r |= MPI_Type_get_envelope( MPI_INT, &ni, &na, &nd, &comb );
r |= MPI_Finalize();
return r;
]])], [
ac_have_mpi2_pri=yes
AC_MSG_RESULT([yes, $MPI_CC])
], [
ac_have_mpi2_pri=no
AC_MSG_RESULT([no])
])
CC=$saved_CC
CFLAGS=$saved_CFLAGS
LDFLAGS="$saved_LDFLAGS"
AM_CONDITIONAL(BUILD_MPIWRAP_PRI, test x$ac_have_mpi2_pri = xyes)
## See if MPI_CC works for the secondary target. Complication: what if
## there is no secondary target? We need this to then fail.
## Kludge this by making MPI_CC something which will surely fail in
## such a case.
##
AC_MSG_CHECKING([secondary target for usable MPI2-compliant C compiler and mpi.h])
saved_CC=$CC
saved_CFLAGS=$CFLAGS
saved_LDFLAGS="$LDFLAGS"
LDFLAGS="$LDFLAGS_MPI $mflag_secondary"
if test x$VGCONF_PLATFORM_SEC_CAPS = x ; then
CC="$MPI_CC this will surely fail"
else
CC=$MPI_CC
fi
CFLAGS="$CFLAGS_MPI $mflag_secondary"
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#include <mpi.h>
#include <stdio.h>
]], [[
int ni, na, nd, comb;
int r = MPI_Init(NULL,NULL);
r |= MPI_Type_get_envelope( MPI_INT, &ni, &na, &nd, &comb );
r |= MPI_Finalize();
return r;
]])], [
ac_have_mpi2_sec=yes
AC_MSG_RESULT([yes, $MPI_CC])
], [
ac_have_mpi2_sec=no
AC_MSG_RESULT([no])
])
CC=$saved_CC
CFLAGS=$saved_CFLAGS
LDFLAGS="$saved_LDFLAGS"
AM_CONDITIONAL(BUILD_MPIWRAP_SEC, test x$ac_have_mpi2_sec = xyes)
#----------------------------------------------------------------------------
# Other library checks
#----------------------------------------------------------------------------
# There now follow some tests for Boost, and OpenMP. These
# tests are present because Drd has some regression tests that use
# these packages. All regression test programs all compiled only
# for the primary target. And so it is important that the configure
# checks that follow, use the correct -m32 or -m64 flag for the
# primary target (called $mflag_primary). Otherwise, we can end up
# in a situation (eg) where, on amd64-linux, the test for Boost checks
# for usable 64-bit Boost facilities, but because we are doing a 32-bit
# only build (meaning, the primary target is x86-linux), the build
# of the regtest programs that use Boost fails, because they are
# build as 32-bit (IN THIS EXAMPLE).
#
# Hence: ALWAYS USE $mflag_primary FOR CONFIGURE TESTS FOR FACILITIES
# NEEDED BY THE REGRESSION TEST PROGRAMS.
# Check whether the boost library 1.35 or later has been installed.
# The Boost.Threads library has undergone a major rewrite in version 1.35.0.
AC_MSG_CHECKING([for boost])
AC_LANG(C++)
safe_CXXFLAGS=$CXXFLAGS
CXXFLAGS="$mflag_primary"
safe_LIBS="$LIBS"
LIBS="-lboost_thread-mt -lboost_system-mt $LIBS"
AC_LINK_IFELSE([AC_LANG_SOURCE([
#include <boost/thread.hpp>
static void thread_func(void)
{ }
int main(int argc, char** argv)
{
boost::thread t(thread_func);
return 0;
}
])],
[
ac_have_boost_1_35=yes
AC_SUBST([BOOST_CFLAGS], [])
AC_SUBST([BOOST_LIBS], ["-lboost_thread-mt -lboost_system-mt"])
AC_MSG_RESULT([yes])
], [
ac_have_boost_1_35=no
AC_MSG_RESULT([no])
])
LIBS="$safe_LIBS"
CXXFLAGS=$safe_CXXFLAGS
AC_LANG(C)
AM_CONDITIONAL([HAVE_BOOST_1_35], [test x$ac_have_boost_1_35 = xyes])
# does this compiler support -fopenmp, does it have the include file
# <omp.h> and does it have libgomp ?
AC_MSG_CHECKING([for OpenMP])
safe_CFLAGS=$CFLAGS
CFLAGS="-fopenmp $mflag_primary -Werror"
AC_LINK_IFELSE([AC_LANG_SOURCE([
#include <omp.h>
int main(int argc, char** argv)
{
omp_set_dynamic(0);
return 0;
}
])],
[
ac_have_openmp=yes
AC_MSG_RESULT([yes])
], [
ac_have_openmp=no
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
AM_CONDITIONAL([HAVE_OPENMP], [test x$ac_have_openmp = xyes])
# Check for __builtin_popcount
AC_MSG_CHECKING([for __builtin_popcount()])
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
]], [[
__builtin_popcount(2);
return 0;
]])], [
AC_MSG_RESULT([yes])
AC_DEFINE([HAVE_BUILTIN_POPCOUT], 1,
[Define to 1 if compiler provides __builtin_popcount().])
], [
AC_MSG_RESULT([no])
])
# Check for __builtin_clz
AC_MSG_CHECKING([for __builtin_clz()])
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
]], [[
__builtin_clz(2);
return 0;
]])], [
AC_MSG_RESULT([yes])
AC_DEFINE([HAVE_BUILTIN_CLZ], 1,
[Define to 1 if compiler provides __builtin_clz().])
], [
AC_MSG_RESULT([no])
])
# Check for __builtin_ctz
AC_MSG_CHECKING([for __builtin_ctz()])
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
]], [[
__builtin_ctz(2);
return 0;
]])], [
AC_MSG_RESULT([yes])
AC_DEFINE([HAVE_BUILTIN_CTZ], 1,
[Define to 1 if compiler provides __builtin_ctz().])
], [
AC_MSG_RESULT([no])
])
# does this compiler have built-in functions for atomic memory access for the
# primary target ?
AC_MSG_CHECKING([if gcc supports __sync_add_and_fetch for the primary target])
safe_CFLAGS=$CFLAGS
CFLAGS="$mflag_primary"
AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[
int variable = 1;
return (__sync_bool_compare_and_swap(&variable, 1, 2)
&& __sync_add_and_fetch(&variable, 1) ? 1 : 0)
]])], [
ac_have_builtin_atomic_primary=yes
AC_MSG_RESULT([yes])
AC_DEFINE(HAVE_BUILTIN_ATOMIC, 1, [Define to 1 if gcc supports __sync_bool_compare_and_swap() and __sync_add_and_fetch() for the primary target])
], [
ac_have_builtin_atomic_primary=no
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
AM_CONDITIONAL([HAVE_BUILTIN_ATOMIC],
[test x$ac_have_builtin_atomic_primary = xyes])
# does this compiler have built-in functions for atomic memory access for the
# secondary target ?
if test x$VGCONF_PLATFORM_SEC_CAPS != x; then
AC_MSG_CHECKING([if gcc supports __sync_add_and_fetch for the secondary target])
safe_CFLAGS=$CFLAGS
CFLAGS="$mflag_secondary"
AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[
int variable = 1;
return (__sync_add_and_fetch(&variable, 1) ? 1 : 0)
]])], [
ac_have_builtin_atomic_secondary=yes
AC_MSG_RESULT([yes])
], [
ac_have_builtin_atomic_secondary=no
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS
fi
AM_CONDITIONAL([HAVE_BUILTIN_ATOMIC_SECONDARY],
[test x$ac_have_builtin_atomic_secondary = xyes])
# does this compiler have built-in functions for atomic memory access on
# 64-bit integers for all targets ?
AC_MSG_CHECKING([if gcc supports __sync_add_and_fetch on uint64_t for all targets])
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#include <stdint.h>
]], [[
uint64_t variable = 1;
return __sync_add_and_fetch(&variable, 1)
]])], [
ac_have_builtin_atomic64_primary=yes
], [
ac_have_builtin_atomic64_primary=no
])
if test x$VGCONF_PLATFORM_SEC_CAPS != x; then
safe_CFLAGS=$CFLAGS
CFLAGS="$mflag_secondary"
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#include <stdint.h>
]], [[
uint64_t variable = 1;
return __sync_add_and_fetch(&variable, 1)
]])], [
ac_have_builtin_atomic64_secondary=yes
], [
ac_have_builtin_atomic64_secondary=no
])
CFLAGS=$safe_CFLAGS
fi
if test x$ac_have_builtin_atomic64_primary = xyes && \
test x$VGCONF_PLATFORM_SEC_CAPS = x \
-o x$ac_have_builtin_atomic64_secondary = xyes; then
AC_MSG_RESULT([yes])
ac_have_builtin_atomic64=yes
else
AC_MSG_RESULT([no])
ac_have_builtin_atomic64=no
fi
AM_CONDITIONAL([HAVE_BUILTIN_ATOMIC64],
[test x$ac_have_builtin_atomic64 = xyes])
# does g++ have built-in functions for atomic memory access ?
AC_MSG_CHECKING([if g++ supports __sync_add_and_fetch])
safe_CXXFLAGS=$CXXFLAGS
CXXFLAGS="$mflag_primary"
AC_LANG_PUSH(C++)
AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[
int variable = 1;
return (__sync_bool_compare_and_swap(&variable, 1, 2)
&& __sync_add_and_fetch(&variable, 1) ? 1 : 0)
]])], [
ac_have_builtin_atomic_cxx=yes
AC_MSG_RESULT([yes])
AC_DEFINE(HAVE_BUILTIN_ATOMIC_CXX, 1, [Define to 1 if g++ supports __sync_bool_compare_and_swap() and __sync_add_and_fetch()])
], [
ac_have_builtin_atomic_cxx=no
AC_MSG_RESULT([no])
])
AC_LANG_POP(C++)
CXXFLAGS=$safe_CXXFLAGS
AM_CONDITIONAL([HAVE_BUILTIN_ATOMIC_CXX], [test x$ac_have_builtin_atomic_cxx = xyes])
if test x$ac_have_usable_linux_futex_h = xyes \
-a x$ac_have_builtin_atomic_primary = xyes; then
ac_enable_linux_ticket_lock_primary=yes
fi
AM_CONDITIONAL([ENABLE_LINUX_TICKET_LOCK_PRIMARY],
[test x$ac_enable_linux_ticket_lock_primary = xyes])
if test x$VGCONF_PLATFORM_SEC_CAPS != x \
-a x$ac_have_usable_linux_futex_h = xyes \
-a x$ac_have_builtin_atomic_secondary = xyes; then
ac_enable_linux_ticket_lock_secondary=yes
fi
AM_CONDITIONAL([ENABLE_LINUX_TICKET_LOCK_SECONDARY],
[test x$ac_enable_linux_ticket_lock_secondary = xyes])
# does libstdc++ support annotating shared pointers ?
AC_MSG_CHECKING([if libstdc++ supports annotating shared pointers])
safe_CXXFLAGS=$CXXFLAGS
CXXFLAGS="-std=c++0x"
AC_LANG_PUSH(C++)
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#include <memory>
]], [[
std::shared_ptr<int> p
]])], [
ac_have_shared_ptr=yes
], [
ac_have_shared_ptr=no
])
if test x$ac_have_shared_ptr = xyes; then
# If compilation of the program below fails because of a syntax error
# triggered by substituting one of the annotation macros then that
# means that libstdc++ supports these macros.
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#define _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(a) (a)----
#define _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(a) (a)----
#include <memory>
]], [[
std::shared_ptr<int> p
]])], [
ac_have_shared_pointer_annotation=no
AC_MSG_RESULT([no])
], [
ac_have_shared_pointer_annotation=yes
AC_MSG_RESULT([yes])
AC_DEFINE(HAVE_SHARED_POINTER_ANNOTATION, 1,
[Define to 1 if libstd++ supports annotating shared pointers])
])
else
ac_have_shared_pointer_annotation=no
AC_MSG_RESULT([no])
fi
AC_LANG_POP(C++)
CXXFLAGS=$safe_CXXFLAGS
AM_CONDITIONAL([HAVE_SHARED_POINTER_ANNOTATION],
[test x$ac_have_shared_pointer_annotation = xyes])
#----------------------------------------------------------------------------
# Ok. We're done checking.
#----------------------------------------------------------------------------
# Nb: VEX/Makefile is generated from Makefile.vex.in.
AC_CONFIG_FILES([
Makefile
VEX/Makefile:Makefile.vex.in
valgrind.spec
valgrind.pc
glibc-2.X.supp
glibc-2.X-helgrind.supp
glibc-2.X-drd.supp
include/valgrind.h
docs/Makefile
docs/xml/vg-entities.xml
tests/Makefile
tests/vg_regtest
perf/Makefile
perf/vg_perf
gdbserver_tests/Makefile
gdbserver_tests/solaris/Makefile
include/Makefile
auxprogs/Makefile
mpi/Makefile
coregrind/Makefile
memcheck/Makefile
memcheck/tests/Makefile
memcheck/tests/common/Makefile
memcheck/tests/amd64/Makefile
memcheck/tests/x86/Makefile
memcheck/tests/linux/Makefile
memcheck/tests/linux/debuginfod-check.vgtest
memcheck/tests/darwin/Makefile
memcheck/tests/solaris/Makefile
memcheck/tests/freebsd/Makefile
memcheck/tests/amd64-linux/Makefile
memcheck/tests/arm64-linux/Makefile
memcheck/tests/x86-linux/Makefile
memcheck/tests/amd64-solaris/Makefile
memcheck/tests/x86-solaris/Makefile
memcheck/tests/amd64-freebsd/Makefile
memcheck/tests/x86-freebsd/Makefile
memcheck/tests/ppc32/Makefile
memcheck/tests/ppc64/Makefile
memcheck/tests/s390x/Makefile
memcheck/tests/mips32/Makefile
memcheck/tests/mips64/Makefile
memcheck/tests/vbit-test/Makefile
cachegrind/Makefile
cachegrind/tests/Makefile
cachegrind/tests/x86/Makefile
cachegrind/cg_annotate
cachegrind/cg_diff
callgrind/Makefile
callgrind/callgrind_annotate
callgrind/callgrind_control
callgrind/tests/Makefile
helgrind/Makefile
helgrind/tests/Makefile
drd/Makefile
drd/scripts/download-and-build-splash2
drd/tests/Makefile
massif/Makefile
massif/tests/Makefile
massif/ms_print
dhat/Makefile
dhat/tests/Makefile
lackey/Makefile
lackey/tests/Makefile
none/Makefile
none/tests/Makefile
none/tests/scripts/Makefile
none/tests/amd64/Makefile
none/tests/ppc32/Makefile
none/tests/ppc64/Makefile
none/tests/x86/Makefile
none/tests/arm/Makefile
none/tests/arm64/Makefile
none/tests/s390x/Makefile
none/tests/mips32/Makefile
none/tests/mips64/Makefile
none/tests/nanomips/Makefile
none/tests/linux/Makefile
none/tests/darwin/Makefile
none/tests/solaris/Makefile
none/tests/freebsd/Makefile
none/tests/amd64-linux/Makefile
none/tests/x86-linux/Makefile
none/tests/amd64-darwin/Makefile
none/tests/x86-darwin/Makefile
none/tests/amd64-solaris/Makefile
none/tests/x86-solaris/Makefile
none/tests/x86-freebsd/Makefile
exp-bbv/Makefile
exp-bbv/tests/Makefile
exp-bbv/tests/x86/Makefile
exp-bbv/tests/x86-linux/Makefile
exp-bbv/tests/amd64-linux/Makefile
exp-bbv/tests/ppc32-linux/Makefile
exp-bbv/tests/arm-linux/Makefile
shared/Makefile
solaris/Makefile
])
AC_CONFIG_FILES([coregrind/link_tool_exe_linux],
[chmod +x coregrind/link_tool_exe_linux])
AC_CONFIG_FILES([coregrind/link_tool_exe_freebsd],
[chmod +x coregrind/link_tool_exe_freebsd])
AC_CONFIG_FILES([coregrind/link_tool_exe_darwin],
[chmod +x coregrind/link_tool_exe_darwin])
AC_CONFIG_FILES([coregrind/link_tool_exe_solaris],
[chmod +x coregrind/link_tool_exe_solaris])
AC_CONFIG_FILES([tests/filter_stderr_basic],
[chmod +x tests/filter_stderr_basic])
AC_CONFIG_FILES([tests/filter_discards],
[chmod +x tests/filter_discards])
AC_CONFIG_FILES([memcheck/tests/filter_stderr],
[chmod +x memcheck/tests/filter_stderr])
AC_CONFIG_FILES([memcheck/tests/filter_dw4],
[chmod +x memcheck/tests/filter_dw4])
AC_CONFIG_FILES([memcheck/tests/filter_overlaperror],
[chmod +x memcheck/tests/filter_overlaperror])
AC_CONFIG_FILES([memcheck/tests/x86/filter_pushfpopf],
[chmod +x memcheck/tests/x86/filter_pushfpopf])
AC_CONFIG_FILES([gdbserver_tests/filter_gdb],
[chmod +x gdbserver_tests/filter_gdb])
AC_CONFIG_FILES([gdbserver_tests/filter_memcheck_monitor],
[chmod +x gdbserver_tests/filter_memcheck_monitor])
AC_CONFIG_FILES([gdbserver_tests/filter_stderr],
[chmod +x gdbserver_tests/filter_stderr])
AC_CONFIG_FILES([gdbserver_tests/filter_vgdb],
[chmod +x gdbserver_tests/filter_vgdb])
AC_CONFIG_FILES([drd/tests/filter_stderr],
[chmod +x drd/tests/filter_stderr])
AC_CONFIG_FILES([drd/tests/filter_error_count],
[chmod +x drd/tests/filter_error_count])
AC_CONFIG_FILES([drd/tests/filter_error_summary],
[chmod +x drd/tests/filter_error_summary])
AC_CONFIG_FILES([drd/tests/filter_stderr_and_thread_no_and_offset],
[chmod +x drd/tests/filter_stderr_and_thread_no_and_offset])
AC_CONFIG_FILES([drd/tests/filter_thread_no],
[chmod +x drd/tests/filter_thread_no])
AC_CONFIG_FILES([drd/tests/filter_xml_and_thread_no],
[chmod +x drd/tests/filter_xml_and_thread_no])
AC_CONFIG_FILES([helgrind/tests/filter_stderr],
[chmod +x helgrind/tests/filter_stderr])
AC_OUTPUT
cat<<EOF
Version: ${VERSION}
Maximum build arch: ${ARCH_MAX}
Primary build arch: ${VGCONF_ARCH_PRI}
Secondary build arch: ${VGCONF_ARCH_SEC}
Build OS: ${VGCONF_OS}
Link Time Optimisation: ${vg_cv_lto}
Primary build target: ${VGCONF_PLATFORM_PRI_CAPS}
Secondary build target: ${VGCONF_PLATFORM_SEC_CAPS}
Platform variant: ${VGCONF_PLATVARIANT}
Primary -DVGPV string: -DVGPV_${VGCONF_ARCH_PRI}_${VGCONF_OS}_${VGCONF_PLATVARIANT}=1
Default supp files: ${DEFAULT_SUPP}
EOF