
##------------------------------------------------------------##
# 
# 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.
AC_INIT([Valgrind],[3.11.0.SVN],[valgrind-users@lists.sourceforge.net])
AC_CONFIG_SRCDIR(coregrind/m_main.c)
AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE([foreign 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
# 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])

# 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


# 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.0*)
	AC_MSG_RESULT([ok (Apple LLVM version ${gcc_version})])
	;;
     icc-1[[3-9]].*)
	AC_MSG_RESULT([ok (ICC version ${gcc_version})])
	;;
     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 (${gcc_version})])
	AC_MSG_ERROR([please use gcc >= 3.0 or clang >= 2.9 or icc >= 13.0])
	;;
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 endianess 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
# Endianess.  The name PPC64 or ppc64 to 64-bit systems of either Endianess.
# 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) 
        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"
        ;;
     *) 
	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
             2.6.*|3.*) 
        	    AC_MSG_RESULT([2.6.x/3.x family (${kernel})])
        	    AC_DEFINE([KERNEL_2_6], 1, [Define to 1 if you're using Linux 2.6.x or Linux 3.x])
        	    ;;

             2.4.*) 
        	    AC_MSG_RESULT([2.4 family (${kernel})])
        	    AC_DEFINE([KERNEL_2_4], 1, [Define to 1 if you're using Linux 2.4.x])
        	    ;;

             *) 
        	    AC_MSG_RESULT([unsupported (${kernel})])
        	    AC_MSG_ERROR([Valgrind works on kernels 2.4, 2.6])
        	    ;;
        esac

        ;;

     *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_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="darwin9.supp ${DEFAULT_SUPP}"
		  DEFAULT_SUPP="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="darwin10.supp ${DEFAULT_SUPP}"
		  DEFAULT_SUPP="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="darwin11.supp ${DEFAULT_SUPP}"
		  DEFAULT_SUPP="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="darwin12.supp ${DEFAULT_SUPP}"
		  DEFAULT_SUPP="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="darwin13.supp ${DEFAULT_SUPP}"
		  DEFAULT_SUPP="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="darwin14.supp ${DEFAULT_SUPP}"
		  DEFAULT_SUPP="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 and 14.x (Mac OS X 10.6/7/8/9/10)])
		  ;;
	esac
        ;;

     *) 
	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)
        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;;
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="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-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="0x38000000"
           valt_load_address_pri_inner="0x28000000"
	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="0x38000000"
           valt_load_address_pri_inner="0x28000000"
	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="0x38000000"
           valt_load_address_pri_inner="0x28000000"
           valt_load_address_sec_norml="0x38000000"
           valt_load_address_sec_inner="0x28000000"
	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="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})])
	;;
     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="0x38000000"
           valt_load_address_pri_inner="0x28000000"
	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="0x38000000"
           valt_load_address_pri_inner="0x28000000"
	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="0x38000000"
           valt_load_address_pri_inner="0x28000000"
           valt_load_address_sec_norml="0x38000000"
           valt_load_address_sec_inner="0x28000000"
	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="0x38000000"
        valt_load_address_pri_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="0x138000000"
           valt_load_address_pri_inner="0x128000000"
	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="0x38000000"
           valt_load_address_pri_inner="0x28000000"
	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="0x138000000"
           valt_load_address_pri_inner="0x128000000"
           valt_load_address_sec_norml="0x38000000"
           valt_load_address_sec_inner="0x28000000"
	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="0x38000000"
	valt_load_address_pri_inner="0x28000000"
        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="0x38000000"
           valt_load_address_pri_inner="0x28000000"
        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="0x38000000"
           valt_load_address_pri_inner="0x28000000"
        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="0x38000000"
           valt_load_address_pri_inner="0x28000000"
           valt_load_address_sec_norml="0x38000000"
           valt_load_address_sec_inner="0x28000000"
        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_PLATFORM_PRI_CAPS="MIPS32_LINUX"
        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})])
        ;;
     mips64-linux)
        VGCONF_ARCH_PRI="mips64"
        VGCONF_PLATFORM_PRI_CAPS="MIPS64_LINUX"
        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})])
        ;;
    *)
        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_DARWIN \
                 -o x$VGCONF_PLATFORM_SEC_CAPS = xX86_DARWIN )
AM_CONDITIONAL(VGCONF_ARCHS_INCLUDE_AMD64, 
               test x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_LINUX \
                 -o x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_DARWIN )
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 )
AM_CONDITIONAL(VGCONF_ARCHS_INCLUDE_MIPS64,
               test x$VGCONF_PLATFORM_PRI_CAPS = xMIPS64_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)
AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_MIPS64_LINUX,
               test x$VGCONF_PLATFORM_PRI_CAPS = xMIPS64_LINUX)
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)


# 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)
AM_CONDITIONAL(VGCONF_OS_IS_DARWIN,
               test 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


#----------------------------------------------------------------------------
# Define MIPS_PAGE_SHIFT (--with-pagesize)
#----------------------------------------------------------------------------
AC_ARG_WITH(pagesize,
   [  --with-pagesize=        override detected page size (4, 16 or 64)],
   [psize=$withval],
   [psize=0]
)
 
if test "$psize" = "0"; then
    psizer=`getconf PAGESIZE`
    psize=$((${psizer}/1024))
fi

if test "$psize" = "4"; then
    AC_DEFINE([MIPS_PAGE_SHIFT], 12, [configured page size 4k])
elif test "$psize" = "16"; then
    AC_DEFINE([MIPS_PAGE_SHIFT], 14, [configured page size 16k])
elif test "$psize" = "64"; then
    AC_DEFINE([MIPS_PAGE_SHIFT], 16, [configured page size 64k])
else
   AC_DEFINE([MIPS_PAGE_SHIFT], 12, [configured default page size 4k])
fi
AC_MSG_RESULT([checking for Pagesize... ${psize}k])


#----------------------------------------------------------------------------
# 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])


#----------------------------------------------------------------------------
# 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")

# not really a version check
AC_EGREP_CPP([BIONIC_LIBC], [
#if defined(__ANDROID__)
  BIONIC_LIBC
#endif
],
GLIBC_VERSION="bionic")


AC_MSG_CHECKING([the glibc version])

case "${GLIBC_VERSION}" in
     2.2)
	AC_MSG_RESULT(${GLIBC_VERSION} family)
	DEFAULT_SUPP="glibc-2.2.supp ${DEFAULT_SUPP}"
	DEFAULT_SUPP="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="glibc-${GLIBC_VERSION}.supp ${DEFAULT_SUPP}"
	DEFAULT_SUPP="glibc-2.34567-NPTL-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.34567-NPTL-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.34567-NPTL-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.34567-NPTL-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.
	;;
     bionic)
	AC_MSG_RESULT(Bionic)
	AC_DEFINE([BIONIC_LIBC], 1, [Define to 1 if you're using Bionic])
	DEFAULT_SUPP="bionic.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])
	AC_MSG_ERROR([or Darwin or Bionic libc])
	;;
esac

AC_SUBST(GLIBC_VERSION)


# 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="xfree-4.supp ${DEFAULT_SUPP}"
DEFAULT_SUPP="xfree-3.supp ${DEFAULT_SUPP}"

# Add glibc and X11 suppressions for exp-sgcheck
DEFAULT_SUPP="exp-sgcheck.supp ${DEFAULT_SUPP}"


#----------------------------------------------------------------------------
# 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 <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 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 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>])


# does this compiler support -maltivec and does it have the include file
# <altivec.h> ?

AC_MSG_CHECKING([for Altivec])

safe_CFLAGS=$CFLAGS
CFLAGS="-maltivec"

AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <altivec.h>
]], [[
  vector unsigned int v;
]])], [
ac_have_altivec=yes
AC_MSG_RESULT([yes])
AC_DEFINE([HAS_ALTIVEC], 1,
          [Define to 1 if gcc/as can do Altivec.])
], [
ac_have_altivec=no
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS

AM_CONDITIONAL([HAS_ALTIVEC], [test x$ac_have_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.  NOTE: basically this is a kludge
# in that it conflates two things that should be separate -- whether
# the compiler understands the flag vs whether the assembler 
# understands the opcodes.  This really ought to be cleaned up
# and done properly, like it is for x86/x86_64.

AC_MSG_CHECKING([for VSX])

safe_CFLAGS=$CFLAGS
CFLAGS="-mvsx"

AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <altivec.h>
]], [[
  vector unsigned int v;
  __asm__ __volatile__("xsmaddadp 32, 32, 33" ::: "memory","cc");
]])], [
ac_have_vsx=yes
AC_MSG_RESULT([yes])
], [
ac_have_vsx=no
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS

AM_CONDITIONAL(HAS_VSX, test x$ac_have_vsx = xyes)


AC_MSG_CHECKING([that assembler knows DFP])

AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
]], [[
  __asm__ __volatile__("dadd 1, 2, 3");
  __asm__ __volatile__("dcffix 1, 2");
]])], [
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"
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
]], [[
  __asm__ __volatile__("dadd 1, 2, 3");
  __asm__ __volatile__("dcffix 1, 2");
]])], [
ac_gcc_have_dfp=yes
AC_MSG_RESULT([yes])
], [
ac_gcc_have_dfp=no
AC_MSG_RESULT([no])
])

CFLAGS=$safe_CFLAGS

AM_CONDITIONAL(HAS_DFP, test x$ac_asm_have_dfp = xyes -a x$ac_gcc_have_dfp = xyes)


AC_MSG_CHECKING([that compiler knows DFP datatypes])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
]], [[
  _Decimal64 x = 0.0DD;
]])], [
ac_gcc_have_dfp_type=yes
AC_MSG_RESULT([yes])
], [
ac_gcc_have_dfp_type=no
AC_MSG_RESULT([no])
])

AM_CONDITIONAL(BUILD_DFP_TESTS, test x$ac_gcc_have_dfp_type = xyes)

# isa 2.07 checking
AC_MSG_CHECKING([that assembler knows ISA 2.07 ])

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)

# Check for pthread_create@GLIBC2.0
AC_MSG_CHECKING([for pthread_create@GLIBC2.0()])

safe_CFLAGS=$CFLAGS
CFLAGS="-lpthread"
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)


# 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


#----------------------------------------------------------------------------
# Checking for supported compiler flags.
#----------------------------------------------------------------------------

# does this compiler support -m32 ?
AC_MSG_CHECKING([if gcc accepts -m32])

safe_CFLAGS=$CFLAGS
CFLAGS="-m32"

AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
  return 0;
]])], [
FLAG_M32="-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"

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)


# does this compiler support -march=mips32 (mips32 default) ?
AC_MSG_CHECKING([if gcc accepts -march=mips32])

safe_CFLAGS=$CFLAGS
CFLAGS="$CFLAGS -march=mips32"

AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
  return 0;
]])], [
FLAG_MIPS32="-march=mips32"
AC_MSG_RESULT([yes])
], [
FLAG_MIPS32=""
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS

AC_SUBST(FLAG_MIPS32)


# does this compiler support -march=mips64 (mips64 default) ?
AC_MSG_CHECKING([if gcc accepts -march=mips64])

safe_CFLAGS=$CFLAGS
CFLAGS="$CFLAGS -march=mips64"

AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
  return 0;
]])], [
FLAG_MIPS64="-march=mips64"
AC_MSG_RESULT([yes])
], [
FLAG_MIPS64=""
AC_MSG_RESULT([no])
])
CFLAGS=$safe_CFLAGS

AC_SUBST(FLAG_MIPS64)


# does this compiler support -march=octeon (Cavium OCTEON I Specific) ?
AC_MSG_CHECKING([if gcc accepts -march=octeon])

safe_CFLAGS=$CFLAGS
CFLAGS="$CFLAGS -march=octeon"

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 -march=octeon2"

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)


# does this compiler support -mmmx ?
AC_MSG_CHECKING([if gcc accepts -mmmx])

safe_CFLAGS=$CFLAGS
CFLAGS="-mmmx"

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"

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"

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)


# 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 conditional name to set if that
# warning flag is supported.
AC_DEFUN([AC_GCC_WARNING_COND],[
  AC_MSG_CHECKING([if gcc accepts -W$1])
  safe_CFLAGS=$CFLAGS
  CFLAGS="-W$1"
  AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[;]])], [
  has_warning_flag=yes
  AC_MSG_RESULT([yes])], [
  has_warning_flag=no
  AC_MSG_RESULT([no])])
  CFLAGS=$safe_CFLAGS
  AM_CONDITIONAL([$2], test x$has_warning_flag = xyes)
])

AC_GCC_WARNING_COND([pointer-sign], [HAS_POINTER_SIGN_WARNING])

# Convenience function to check whether GCC supports a particular
# warning option. Similar to AC_GCC_WARNING_COND, but does a
# substitution instead of setting an conditional. 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"
  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"
  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([empty-body], [FLAG_W_NO_EMPTY_BODY])
AC_GCC_WARNING_SUBST_NO([format-zero-length], [FLAG_W_NO_FORMAT_ZERO_LENGTH])
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([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([write-strings], [FLAG_W_WRITE_STRINGS])
AC_GCC_WARNING_SUBST([format], [FLAG_W_FORMAT])
AC_GCC_WARNING_SUBST([format-security], [FLAG_W_FORMAT_SECURITY])
AC_GCC_WARNING_SUBST([cast-qual], [FLAG_W_CAST_QUAL])


# does this compiler support -Wextra or the older -W ?

AC_MSG_CHECKING([if gcc accepts -Wextra or -W])

safe_CFLAGS=$CFLAGS
CFLAGS="-Wextra"

AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ ]], [[
  return 0;
]])], [
AC_SUBST([FLAG_W_EXTRA], [-Wextra])
AC_MSG_RESULT([-Wextra])
], [
  CFLAGS="-W"
  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

# does this compiler support -fno-stack-protector ?
AC_MSG_CHECKING([if gcc accepts -fno-stack-protector])

safe_CFLAGS=$CFLAGS
CFLAGS="-fno-stack-protector"

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 --param inline-unit-growth=... ?

AC_MSG_CHECKING([if gcc accepts --param inline-unit-growth])

safe_CFLAGS=$CFLAGS
CFLAGS="--param inline-unit-growth=900"

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"

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 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])


# 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).
#
# So test 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.

AC_MSG_CHECKING([if the linker accepts -Wl,-Ttext-segment])

safe_CFLAGS=$CFLAGS
CFLAGS="-static -nodefaultlibs -nostartfiles -Wl,-Ttext-segment=$valt_load_address_pri_norml"

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) then we will
# have to strip any build-id ELF NOTEs from the staticly 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"

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 -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 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"
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 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");
  } 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 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
# 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)


# 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; then
AC_DEFINE([HAVE_TLS], 1, [can use __thread to define thread-local variables])
fi


#----------------------------------------------------------------------------
# Checks for C header files.
#----------------------------------------------------------------------------

AC_HEADER_STDC
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/signal.h     \
        sys/signalfd.h   \
        sys/syscall.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_HEADER_TIME


#----------------------------------------------------------------------------
# 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\
        epoll_create \
        epoll_pwait  \
        klogctl      \
        mallinfo     \
        memchr       \
        memset       \
        mkdir        \
        mremap       \
        ppoll        \
        pthread_barrier_init       \
        pthread_condattr_setclock  \
        pthread_mutex_timedlock    \
        pthread_rwlock_timedrdlock \
        pthread_rwlock_timedwrlock \
        pthread_spin_lock          \
        pthread_yield              \
        pthread_setname_np         \
        readlinkat   \
        semtimedop   \
        signalfd     \
        sigwaitinfo  \
        strchr       \
        strdup       \
        strpbrk      \
        strrchr      \
        strstr       \
        syscall      \
        utimensat    \
        process_vm_readv  \
        process_vm_writev \
        ])

# 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])

if test x$VGCONF_PLATFORM_PRI_CAPS = xMIPS32_LINUX \
     -o x$VGCONF_PLATFORM_PRI_CAPS = xMIPS64_LINUX ; then
  AC_DEFINE([DISABLE_PTHREAD_SPINLOCK_INTERCEPT], 1,
            [Disable intercept pthread_spin_lock() on MIPS32 and MIPS64.])
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 = xPPC32_LINUX \
     -o x$VGCONF_PLATFORM_PRI_CAPS = xARM_LINUX \
     -o x$VGCONF_PLATFORM_PRI_CAPS = xMIPS32_LINUX \
     -o x$VGCONF_PLATFORM_PRI_CAPS = xMIPS64_LINUX ; then
  mflag_primary=$FLAG_M32
elif test x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_LINUX \
       -o x$VGCONF_PLATFORM_PRI_CAPS = xPPC64_LINUX \
       -o x$VGCONF_PLATFORM_PRI_CAPS = xARM64_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 ; 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_DARWIN],
           [CFLAGS_MPI="-g -O -fno-omit-frame-pointer -Wall -dynamic"
            LDFLAGS_MPI="-dynamic -dynamiclib -all_load"])

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"

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
   docs/Makefile 
   tests/Makefile 
   tests/vg_regtest 
   perf/Makefile 
   perf/vg_perf
   gdbserver_tests/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/darwin/Makefile
   memcheck/tests/amd64-linux/Makefile
   memcheck/tests/x86-linux/Makefile
   memcheck/tests/ppc32/Makefile
   memcheck/tests/ppc64/Makefile
   memcheck/tests/s390x/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
   massif/Makefile
   massif/tests/Makefile
   massif/ms_print
   lackey/Makefile
   lackey/tests/Makefile
   none/Makefile
   none/tests/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/linux/Makefile
   none/tests/darwin/Makefile
   none/tests/x86-linux/Makefile
   exp-sgcheck/Makefile
   exp-sgcheck/tests/Makefile
   drd/Makefile
   drd/scripts/download-and-build-splash2
   drd/tests/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
   exp-dhat/Makefile
   exp-dhat/tests/Makefile
   shared/Makefile
])
AC_CONFIG_FILES([coregrind/link_tool_exe_linux],
                [chmod +x coregrind/link_tool_exe_linux])
AC_CONFIG_FILES([coregrind/link_tool_exe_darwin],
                [chmod +x coregrind/link_tool_exe_darwin])
AC_OUTPUT

cat<<EOF

         Maximum build arch: ${ARCH_MAX}
         Primary build arch: ${VGCONF_ARCH_PRI}
       Secondary build arch: ${VGCONF_ARCH_SEC}
                   Build OS: ${VGCONF_OS}
       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
