Home | History | Annotate | Download | only in valgrind
      1 
      2 ##------------------------------------------------------------##
      3 # 
      4 # The multiple-architecture stuff in this file is pretty
      5 # cryptic.  Read docs/internals/multiple-architectures.txt
      6 # for at least a partial explanation of what is going on.
      7 #
      8 ##------------------------------------------------------------##
      9 
     10 # Process this file with autoconf to produce a configure script.
     11 AC_INIT([Valgrind],[3.12.0.SVN],[valgrind-users (a] lists.sourceforge.net])
     12 AC_CONFIG_SRCDIR(coregrind/m_main.c)
     13 AC_CONFIG_HEADERS([config.h])
     14 AM_INIT_AUTOMAKE([foreign subdir-objects])
     15 
     16 AM_MAINTAINER_MODE
     17 
     18 #----------------------------------------------------------------------------
     19 # Do NOT modify these flags here. Except in feature tests in which case
     20 # the original values must be properly restored.
     21 #----------------------------------------------------------------------------
     22 CFLAGS="$CFLAGS"
     23 CXXFLAGS="$CXXFLAGS"
     24 
     25 #----------------------------------------------------------------------------
     26 # Checks for various programs.
     27 #----------------------------------------------------------------------------
     28 
     29 AC_PROG_LN_S
     30 AC_PROG_CC
     31 AM_PROG_CC_C_O
     32 AC_PROG_CPP
     33 AC_PROG_CXX
     34 # AC_PROG_OBJC apparently causes problems on older Linux distros (eg. with
     35 # autoconf 2.59).  If we ever have any Objective-C code in the Valgrind code
     36 # base (eg. most likely as Darwin-specific tests) we'll need one of the
     37 # following:
     38 # - put AC_PROG_OBJC in a Darwin-specific part of this file
     39 # - Use AC_PROG_OBJC here and up the minimum autoconf version
     40 # - Use the following, which is apparently equivalent:
     41 #     m4_ifdef([AC_PROG_OBJC],
     42 #        [AC_PROG_OBJC],
     43 #        [AC_CHECK_TOOL([OBJC], [gcc])
     44 #         AC_SUBST([OBJC])
     45 #         AC_SUBST([OBJCFLAGS])
     46 #        ])
     47 AC_PROG_RANLIB
     48 # provide a very basic definition for AC_PROG_SED if it's not provided by
     49 # autoconf (as e.g. in autoconf 2.59).
     50 m4_ifndef([AC_PROG_SED],
     51           [AC_DEFUN([AC_PROG_SED],
     52                     [AC_ARG_VAR([SED])
     53                      AC_CHECK_PROGS([SED],[gsed sed])])])
     54 AC_PROG_SED
     55 
     56 # If no AR variable was specified, look up the name of the archiver. Otherwise
     57 # do not touch the AR variable.
     58 if test "x$AR" = "x"; then
     59   AC_PATH_PROGS([AR], [`echo $LD | $SED 's/ld$/ar/'` "ar"], [ar])
     60 fi
     61 AC_ARG_VAR([AR],[Archiver command])
     62 
     63 # Check for the compiler support
     64 if test "${GCC}" != "yes" ; then
     65    AC_MSG_ERROR([Valgrind relies on GCC to be compiled])
     66 fi
     67 
     68 # figure out where perl lives
     69 AC_PATH_PROG(PERL, perl)
     70 
     71 # figure out where gdb lives
     72 AC_PATH_PROG(GDB, gdb, "/no/gdb/was/found/at/configure/time")
     73 AC_DEFINE_UNQUOTED(GDB_PATH, "$GDB", [path to GDB])
     74 
     75 # some older automake's don't have it so try something on our own
     76 ifdef([AM_PROG_AS],[AM_PROG_AS],
     77 [
     78 AS="${CC}"
     79 AC_SUBST(AS)
     80 
     81 ASFLAGS=""
     82 AC_SUBST(ASFLAGS)
     83 ])
     84 
     85 
     86 # Check if 'diff' supports -u (universal diffs) and use it if possible.
     87 
     88 AC_MSG_CHECKING([for diff -u])
     89 AC_SUBST(DIFF)
     90 
     91 # Comparing two identical files results in 0.
     92 tmpfile="tmp-xxx-yyy-zzz"
     93 touch $tmpfile;
     94 if diff -u $tmpfile $tmpfile ; then
     95     AC_MSG_RESULT([yes])
     96     DIFF="diff -u"
     97 else
     98     AC_MSG_RESULT([no])
     99     DIFF="diff"
    100 fi
    101 rm $tmpfile
    102 
    103 
    104 # We don't want gcc < 3.0
    105 AC_MSG_CHECKING([for a supported version of gcc])
    106 
    107 # Obtain the compiler version.
    108 # 
    109 # A few examples of how the ${CC} --version output looks like:
    110 #
    111 # ######## gcc variants ########
    112 # Arch Linux: i686-pc-linux-gnu-gcc (GCC) 4.6.2
    113 # Debian Linux: gcc (Debian 4.3.2-1.1) 4.3.2
    114 # openSUSE: gcc (SUSE Linux) 4.5.1 20101208 [gcc-4_5-branch revision 167585]
    115 # Exherbo Linux: x86_64-pc-linux-gnu-gcc (Exherbo gcc-4.6.2) 4.6.2
    116 # MontaVista Linux for ARM: arm-none-linux-gnueabi-gcc (Sourcery G++ Lite 2009q1-203) 4.3.3
    117 # OS/X 10.6: i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5666) (dot 3)
    118 # 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)
    119 #
    120 # ######## clang variants ########
    121 # Clang: clang version 2.9 (tags/RELEASE_29/final)
    122 # Apple clang: Apple clang version 3.1 (tags/Apple/clang-318.0.58) (based on LLVM 3.1svn)
    123 # FreeBSD clang: FreeBSD clang version 3.1 (branches/release_31 156863) 20120523
    124 #
    125 # ######## Apple LLVM variants ########
    126 # Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)
    127 # Apple LLVM version 6.0 (clang-600.0.51) (based on LLVM 3.5svn)
    128 #
    129 [
    130 if test "x`${CC} --version | $SED -n -e 's/.*\Apple \(LLVM\) version.*clang.*/\1/p'`" = "xLLVM" ;
    131 then
    132     is_clang="applellvm"
    133     gcc_version=`${CC} --version | $SED -n -e 's/.*LLVM version \([0-9.]*\).*$/\1/p'`
    134 elif test "x`${CC} --version | $SED -n -e 's/.*\(clang\) version.*/\1/p'`" = "xclang" ;
    135 then
    136     is_clang="clang"
    137     # Don't use -dumpversion with clang: it will always produce "4.2.1".
    138     gcc_version=`${CC} --version | $SED -n -e 's/.*clang version \([0-9.]*\).*$/\1/p'`
    139 elif test "x`${CC} --version | $SED -n -e 's/icc.*\(ICC\).*/\1/p'`" = "xICC" ; 
    140 then
    141     is_clang="icc"
    142     gcc_version=`${CC} -dumpversion 2>/dev/null`
    143 else
    144     is_clang="notclang"
    145     gcc_version=`${CC} -dumpversion 2>/dev/null`
    146     if test "x$gcc_version" = x; then
    147 	gcc_version=`${CC} --version | $SED -n -e 's/[^ ]*gcc[^ ]* ([^)]*) \([0-9.]*\).*$/\1/p'`
    148     fi
    149 fi
    150 ]
    151 AM_CONDITIONAL(COMPILER_IS_CLANG, test $is_clang = clang -o $is_clang = applellvm)
    152 AM_CONDITIONAL(COMPILER_IS_ICC, test $is_clang = icc)
    153 
    154 # Note: m4 arguments are quoted with [ and ] so square brackets in shell
    155 # statements have to be quoted.
    156 case "${is_clang}-${gcc_version}" in
    157      applellvm-5.1|applellvm-6.*|applellvm-7.*)
    158 	AC_MSG_RESULT([ok (Apple LLVM version ${gcc_version})])
    159 	;;
    160      icc-1[[3-9]].*)
    161 	AC_MSG_RESULT([ok (ICC version ${gcc_version})])
    162 	;;
    163      notclang-[[3-9]].*|notclang-[[1-9][0-9]]*)
    164 	AC_MSG_RESULT([ok (${gcc_version})])
    165 	;;
    166      clang-2.9|clang-[[3-9]].*|clang-[[1-9][0-9]]*)
    167 	AC_MSG_RESULT([ok (clang-${gcc_version})])
    168 	;;
    169      *)
    170 	AC_MSG_RESULT([no (${gcc_version})])
    171 	AC_MSG_ERROR([please use gcc >= 3.0 or clang >= 2.9 or icc >= 13.0])
    172 	;;
    173 esac
    174 
    175 #----------------------------------------------------------------------------
    176 # Arch/OS/platform tests.
    177 #----------------------------------------------------------------------------
    178 # We create a number of arch/OS/platform-related variables.  We prefix them
    179 # all with "VGCONF_" which indicates that they are defined at
    180 # configure-time, and distinguishes them from the VGA_*/VGO_*/VGP_*
    181 # variables used when compiling C files.
    182 
    183 AC_CANONICAL_HOST
    184 
    185 AC_MSG_CHECKING([for a supported CPU])
    186 
    187 # ARCH_MAX reflects the most that this CPU can do: for example if it
    188 # is a 64-bit capable PowerPC, then it must be set to ppc64 and not ppc32.
    189 # Ditto for amd64.  It is used for more configuration below, but is not used
    190 # outside this file.
    191 #
    192 # Power PC returns powerpc for Big Endian.  This was not changed when Little
    193 # Endian support was added to the 64-bit architecture.  The 64-bit Little
    194 # Endian systems explicitly state le in the host_cpu.  For clarity in the
    195 # Valgrind code, the ARCH_MAX name will state LE or BE for the endianess of
    196 # the 64-bit system.  Big Endian is the only mode supported on 32-bit Power PC.
    197 # The abreviation PPC or ppc refers to 32-bit and 64-bit systems with either
    198 # Endianess.  The name PPC64 or ppc64 to 64-bit systems of either Endianess.
    199 # The names ppc64be or PPC64BE refer to only 64-bit systems that are Big
    200 # Endian.  Similarly, ppc64le or PPC64LE refer to only 64-bit systems that are
    201 # Little Endian.
    202 
    203 case "${host_cpu}" in
    204      i?86) 
    205 	AC_MSG_RESULT([ok (${host_cpu})])
    206         ARCH_MAX="x86"
    207         ;;
    208 
    209      x86_64) 
    210         AC_MSG_RESULT([ok (${host_cpu})])
    211         ARCH_MAX="amd64"
    212         ;;
    213 
    214      powerpc64)
    215      # this only referrs to 64-bit Big Endian
    216         AC_MSG_RESULT([ok (${host_cpu})])
    217         ARCH_MAX="ppc64be"
    218         ;;
    219 
    220      powerpc64le)
    221      # this only referrs to 64-bit Little Endian
    222         AC_MSG_RESULT([ok (${host_cpu})])
    223         ARCH_MAX="ppc64le"
    224         ;;
    225 
    226      powerpc)
    227         # On Linux this means only a 32-bit capable CPU.
    228         AC_MSG_RESULT([ok (${host_cpu})])
    229         ARCH_MAX="ppc32"
    230         ;;
    231 
    232      s390x)
    233         AC_MSG_RESULT([ok (${host_cpu})])
    234         ARCH_MAX="s390x"
    235         ;;
    236 
    237      armv7*)
    238 	AC_MSG_RESULT([ok (${host_cpu})])
    239 	ARCH_MAX="arm"
    240 	;;
    241 
    242      aarch64*)
    243        AC_MSG_RESULT([ok (${host_cpu})])
    244        ARCH_MAX="arm64"
    245        ;;
    246 
    247      mips)
    248         AC_MSG_RESULT([ok (${host_cpu})])
    249         ARCH_MAX="mips32"
    250         ;;
    251 
    252      mipsel)
    253         AC_MSG_RESULT([ok (${host_cpu})])
    254         ARCH_MAX="mips32"
    255         ;;
    256 
    257      mipsisa32r2)
    258         AC_MSG_RESULT([ok (${host_cpu})])
    259         ARCH_MAX="mips32"
    260         ;;
    261 
    262      mips64*)
    263         AC_MSG_RESULT([ok (${host_cpu})])
    264         ARCH_MAX="mips64"
    265         ;;
    266 
    267      mipsisa64*)
    268         AC_MSG_RESULT([ok (${host_cpu})])
    269         ARCH_MAX="mips64"
    270         ;;
    271 
    272      tilegx)
    273         AC_MSG_RESULT([ok (${host_cpu})])
    274         ARCH_MAX="tilegx"
    275         ;;
    276 
    277      *) 
    278 	AC_MSG_RESULT([no (${host_cpu})])
    279 	AC_MSG_ERROR([Unsupported host architecture. Sorry])
    280 	;;
    281 esac
    282 
    283 #----------------------------------------------------------------------------
    284 
    285 # Sometimes it's convenient to subvert the bi-arch build system and
    286 # just have a single build even though the underlying platform is
    287 # capable of both.  Hence handle --enable-only64bit and
    288 # --enable-only32bit.  Complain if both are issued :-)
    289 # [Actually, if either of these options are used, I think both get built,
    290 # but only one gets installed.  So if you use an in-place build, both can be
    291 # used. --njn]
    292 
    293 # Check if a 64-bit only build has been requested
    294 AC_CACHE_CHECK([for a 64-bit only build], vg_cv_only64bit,
    295    [AC_ARG_ENABLE(only64bit, 
    296       [  --enable-only64bit      do a 64-bit only build],
    297       [vg_cv_only64bit=$enableval],
    298       [vg_cv_only64bit=no])])
    299 
    300 # Check if a 32-bit only build has been requested
    301 AC_CACHE_CHECK([for a 32-bit only build], vg_cv_only32bit,
    302    [AC_ARG_ENABLE(only32bit, 
    303       [  --enable-only32bit      do a 32-bit only build],
    304       [vg_cv_only32bit=$enableval],
    305       [vg_cv_only32bit=no])])
    306 
    307 # Stay sane
    308 if test x$vg_cv_only64bit = xyes -a x$vg_cv_only32bit = xyes; then
    309    AC_MSG_ERROR(
    310       [Nonsensical: both --enable-only64bit and --enable-only32bit.])
    311 fi
    312 
    313 #----------------------------------------------------------------------------
    314 
    315 # VGCONF_OS is the primary build OS, eg. "linux".  It is passed in to
    316 # compilation of many C files via -VGO_$(VGCONF_OS) and
    317 # -VGP_$(VGCONF_ARCH_PRI)_$(VGCONF_OS).
    318 AC_MSG_CHECKING([for a supported OS])
    319 AC_SUBST(VGCONF_OS)
    320 
    321 DEFAULT_SUPP=""
    322 
    323 case "${host_os}" in
    324      *linux*)
    325 	AC_MSG_RESULT([ok (${host_os})])
    326         VGCONF_OS="linux"
    327 
    328         # Ok, this is linux. Check the kernel version
    329         AC_MSG_CHECKING([for the kernel version])
    330 
    331         kernel=`uname -r`
    332 
    333         case "${kernel}" in
    334              0.*|1.*|2.0.*|2.1.*|2.2.*|2.3.*|2.4.*|2.5.*) 
    335         	    AC_MSG_RESULT([unsupported (${kernel})])
    336         	    AC_MSG_ERROR([Valgrind needs a Linux kernel >= 2.6])
    337         	    ;;
    338 
    339              *)
    340         	    AC_MSG_RESULT([2.6 or later (${kernel})])
    341                     ;;
    342         esac
    343 
    344         ;;
    345 
    346      *darwin*)
    347         AC_MSG_RESULT([ok (${host_os})])
    348         VGCONF_OS="darwin"
    349         AC_DEFINE([DARWIN_10_5], 100500, [DARWIN_VERS value for Mac OS X 10.5])
    350         AC_DEFINE([DARWIN_10_6], 100600, [DARWIN_VERS value for Mac OS X 10.6])
    351         AC_DEFINE([DARWIN_10_7], 100700, [DARWIN_VERS value for Mac OS X 10.7])
    352         AC_DEFINE([DARWIN_10_8], 100800, [DARWIN_VERS value for Mac OS X 10.8])
    353         AC_DEFINE([DARWIN_10_9], 100900, [DARWIN_VERS value for Mac OS X 10.9])
    354         AC_DEFINE([DARWIN_10_10], 101000, [DARWIN_VERS value for Mac OS X 10.10])
    355         AC_DEFINE([DARWIN_10_11], 101100, [DARWIN_VERS value for Mac OS X 10.11])
    356 
    357 	AC_MSG_CHECKING([for the kernel version])
    358 	kernel=`uname -r`
    359 
    360         # Nb: for Darwin we set DEFAULT_SUPP here.  That's because Darwin
    361         # has only one relevant version, the OS version. The `uname` check
    362         # is a good way to get that version (i.e. "Darwin 9.6.0" is Mac OS
    363         # X 10.5.6, and "Darwin 10.x" is Mac OS X 10.6.x Snow Leopard,
    364         # and possibly "Darwin 11.x" is Mac OS X 10.7.x Lion), 
    365         # and we don't know of an macros similar to __GLIBC__ to get that info.
    366         #
    367         # XXX: `uname -r` won't do the right thing for cross-compiles, but
    368         # that's not a problem yet.
    369         #
    370         # jseward 21 Sept 2011: I seriously doubt whether V 3.7.0 will work
    371         # on OS X 10.5.x; I haven't tested yet, and only plan to test 3.7.0
    372         # on 10.6.8 and 10.7.1.  Although tempted to delete the configure
    373         # time support for 10.5 (the 9.* pattern just below), I'll leave it
    374         # in for now, just in case anybody wants to give it a try.  But I'm
    375         # assuming that 3.7.0 is a Snow Leopard and Lion-only release.
    376 	case "${kernel}" in
    377 	     9.*)
    378 		  AC_MSG_RESULT([Darwin 9.x (${kernel}) / Mac OS X 10.5 Leopard])
    379 		  AC_DEFINE([DARWIN_VERS], DARWIN_10_5, [Darwin / Mac OS X version])
    380 		  DEFAULT_SUPP="darwin9.supp ${DEFAULT_SUPP}"
    381 		  DEFAULT_SUPP="darwin9-drd.supp ${DEFAULT_SUPP}"
    382 		  ;;
    383 	     10.*)
    384 		  AC_MSG_RESULT([Darwin 10.x (${kernel}) / Mac OS X 10.6 Snow Leopard])
    385 		  AC_DEFINE([DARWIN_VERS], DARWIN_10_6, [Darwin / Mac OS X version])
    386 		  DEFAULT_SUPP="darwin10.supp ${DEFAULT_SUPP}"
    387 		  DEFAULT_SUPP="darwin10-drd.supp ${DEFAULT_SUPP}"
    388 		  ;;
    389 	     11.*)
    390 		  AC_MSG_RESULT([Darwin 11.x (${kernel}) / Mac OS X 10.7 Lion])
    391 		  AC_DEFINE([DARWIN_VERS], DARWIN_10_7, [Darwin / Mac OS X version])
    392 		  DEFAULT_SUPP="darwin11.supp ${DEFAULT_SUPP}"
    393 		  DEFAULT_SUPP="darwin10-drd.supp ${DEFAULT_SUPP}"
    394 		  ;;
    395 	     12.*)
    396 		  AC_MSG_RESULT([Darwin 12.x (${kernel}) / Mac OS X 10.8 Mountain Lion])
    397 		  AC_DEFINE([DARWIN_VERS], DARWIN_10_8, [Darwin / Mac OS X version])
    398 		  DEFAULT_SUPP="darwin12.supp ${DEFAULT_SUPP}"
    399 		  DEFAULT_SUPP="darwin10-drd.supp ${DEFAULT_SUPP}"
    400 		  ;;
    401 	     13.*)
    402 		  AC_MSG_RESULT([Darwin 13.x (${kernel}) / Mac OS X 10.9 Mavericks])
    403 		  AC_DEFINE([DARWIN_VERS], DARWIN_10_9, [Darwin / Mac OS X version])
    404 		  DEFAULT_SUPP="darwin13.supp ${DEFAULT_SUPP}"
    405 		  DEFAULT_SUPP="darwin10-drd.supp ${DEFAULT_SUPP}"
    406 		  ;;
    407 	     14.*)
    408 		  AC_MSG_RESULT([Darwin 14.x (${kernel}) / Mac OS X 10.10 Yosemite])
    409 		  AC_DEFINE([DARWIN_VERS], DARWIN_10_10, [Darwin / Mac OS X version])
    410 		  DEFAULT_SUPP="darwin14.supp ${DEFAULT_SUPP}"
    411 		  DEFAULT_SUPP="darwin10-drd.supp ${DEFAULT_SUPP}"
    412 		  ;;
    413 	     15.*)
    414 		  AC_MSG_RESULT([Darwin 15.x (${kernel}) / Mac OS X 10.11 El Capitan])
    415 		  AC_DEFINE([DARWIN_VERS], DARWIN_10_11, [Darwin / Mac OS X version])
    416 		  DEFAULT_SUPP="darwin15.supp ${DEFAULT_SUPP}"
    417 		  DEFAULT_SUPP="darwin10-drd.supp ${DEFAULT_SUPP}"
    418 		  ;;
    419              *) 
    420 		  AC_MSG_RESULT([unsupported (${kernel})])
    421 		  AC_MSG_ERROR([Valgrind works on Darwin 10.x, 11.x, 12.x, 13.x, 14.x and 15.x (Mac OS X 10.6/7/8/9/10/11)])
    422 		  ;;
    423 	esac
    424         ;;
    425 
    426      solaris2.11*)
    427         AC_MSG_RESULT([ok (${host_os})])
    428         VGCONF_OS="solaris"
    429         DEFAULT_SUPP="solaris11.supp ${DEFAULT_SUPP}"
    430         ;;
    431 
    432      solaris2.12*)
    433         AC_MSG_RESULT([ok (${host_os})])
    434         VGCONF_OS="solaris"
    435         DEFAULT_SUPP="solaris12.supp ${DEFAULT_SUPP}"
    436         ;;
    437 
    438      *) 
    439 	AC_MSG_RESULT([no (${host_os})])
    440 	AC_MSG_ERROR([Valgrind is operating system specific. Sorry.])
    441 	;;
    442 esac
    443 
    444 #----------------------------------------------------------------------------
    445 
    446 # If we are building on a 64 bit platform test to see if the system
    447 # supports building 32 bit programs and disable 32 bit support if it
    448 # does not support building 32 bit programs
    449 
    450 case "$ARCH_MAX-$VGCONF_OS" in
    451      amd64-linux|ppc64be-linux|arm64-linux|amd64-solaris)
    452         AC_MSG_CHECKING([for 32 bit build support])
    453         safe_CFLAGS=$CFLAGS
    454         CFLAGS="-m32"
    455         AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[
    456           return 0;
    457         ]])], [
    458         AC_MSG_RESULT([yes])
    459         ], [
    460         vg_cv_only64bit="yes"
    461         AC_MSG_RESULT([no])
    462         ])
    463         CFLAGS=$safe_CFLAGS;;
    464 esac
    465 
    466 if test x$vg_cv_only64bit = xyes -a x$vg_cv_only32bit = xyes; then
    467    AC_MSG_ERROR(
    468       [--enable-only32bit was specified but system does not support 32 bit builds])
    469 fi
    470 
    471 #----------------------------------------------------------------------------
    472 
    473 # VGCONF_ARCH_PRI is the arch for the primary build target, eg. "amd64".  By
    474 # default it's the same as ARCH_MAX.  But if, say, we do a build on an amd64
    475 # machine, but --enable-only32bit has been requested, then ARCH_MAX (see
    476 # above) will be "amd64" since that reflects the most that this cpu can do,
    477 # but VGCONF_ARCH_PRI will be downgraded to "x86", since that reflects the
    478 # arch corresponding to the primary build (VGCONF_PLATFORM_PRI_CAPS).  It is
    479 # passed in to compilation of many C files via -VGA_$(VGCONF_ARCH_PRI) and
    480 # -VGP_$(VGCONF_ARCH_PRI)_$(VGCONF_OS).
    481 AC_SUBST(VGCONF_ARCH_PRI)
    482 
    483 # VGCONF_ARCH_SEC is the arch for the secondary build target, eg. "x86".
    484 # It is passed in to compilation of many C files via -VGA_$(VGCONF_ARCH_SEC)
    485 # and -VGP_$(VGCONF_ARCH_SEC)_$(VGCONF_OS), if there is a secondary target.
    486 # It is empty if there is no secondary target.
    487 AC_SUBST(VGCONF_ARCH_SEC)
    488 
    489 # VGCONF_PLATFORM_PRI_CAPS is the primary build target, eg. "AMD64_LINUX".
    490 # The entire system, including regression and performance tests, will be
    491 # built for this target.  The "_CAPS" indicates that the name is in capital
    492 # letters, and it also uses '_' rather than '-' as a separator, because it's
    493 # used to create various Makefile variables, which are all in caps by
    494 # convention and cannot contain '-' characters.  This is in contrast to
    495 # VGCONF_ARCH_PRI and VGCONF_OS which are not in caps.
    496 AC_SUBST(VGCONF_PLATFORM_PRI_CAPS)
    497 
    498 # VGCONF_PLATFORM_SEC_CAPS is the secondary build target, if there is one.
    499 # Valgrind and tools will also be built for this target, but not the
    500 # regression or performance tests.
    501 #
    502 # By default, the primary arch is the same as the "max" arch, as commented
    503 # above (at the definition of ARCH_MAX).  We may choose to downgrade it in
    504 # the big case statement just below here, in the case where we're building
    505 # on a 64 bit machine but have been requested only to do a 32 bit build.
    506 AC_SUBST(VGCONF_PLATFORM_SEC_CAPS)
    507 
    508 AC_MSG_CHECKING([for a supported CPU/OS combination])
    509 
    510 # NB.  The load address for a given platform may be specified in more 
    511 # than one place, in some cases, depending on whether we're doing a biarch,
    512 # 32-bit only or 64-bit only build.  eg see case for amd64-linux below.
    513 # Be careful to give consistent values in all subcases.  Also, all four
    514 # valt_load_addres_{pri,sec}_{norml,inner} values must always be set,
    515 # even if it is to "0xUNSET".
    516 #
    517 case "$ARCH_MAX-$VGCONF_OS" in
    518      x86-linux)
    519         VGCONF_ARCH_PRI="x86"
    520         VGCONF_ARCH_SEC=""
    521 	VGCONF_PLATFORM_PRI_CAPS="X86_LINUX"
    522 	VGCONF_PLATFORM_SEC_CAPS=""
    523         valt_load_address_pri_norml="0x38000000"
    524         valt_load_address_pri_inner="0x28000000"
    525         valt_load_address_sec_norml="0xUNSET"
    526         valt_load_address_sec_inner="0xUNSET"
    527         AC_MSG_RESULT([ok (${ARCH_MAX}-${VGCONF_OS})])
    528 	;;
    529      amd64-linux)
    530         valt_load_address_sec_norml="0xUNSET"
    531         valt_load_address_sec_inner="0xUNSET"
    532 	if test x$vg_cv_only64bit = xyes; then
    533            VGCONF_ARCH_PRI="amd64"
    534            VGCONF_ARCH_SEC=""
    535 	   VGCONF_PLATFORM_PRI_CAPS="AMD64_LINUX"
    536 	   VGCONF_PLATFORM_SEC_CAPS=""
    537            valt_load_address_pri_norml="0x38000000"
    538            valt_load_address_pri_inner="0x28000000"
    539 	elif test x$vg_cv_only32bit = xyes; then
    540 	   VGCONF_ARCH_PRI="x86"
    541            VGCONF_ARCH_SEC=""
    542 	   VGCONF_PLATFORM_PRI_CAPS="X86_LINUX"
    543 	   VGCONF_PLATFORM_SEC_CAPS=""
    544            valt_load_address_pri_norml="0x38000000"
    545            valt_load_address_pri_inner="0x28000000"
    546 	else
    547            VGCONF_ARCH_PRI="amd64"
    548            VGCONF_ARCH_SEC="x86"
    549 	   VGCONF_PLATFORM_PRI_CAPS="AMD64_LINUX"
    550 	   VGCONF_PLATFORM_SEC_CAPS="X86_LINUX"
    551            valt_load_address_pri_norml="0x38000000"
    552            valt_load_address_pri_inner="0x28000000"
    553            valt_load_address_sec_norml="0x38000000"
    554            valt_load_address_sec_inner="0x28000000"
    555 	fi
    556         AC_MSG_RESULT([ok (${ARCH_MAX}-${VGCONF_OS})])
    557 	;;
    558      ppc32-linux)
    559         VGCONF_ARCH_PRI="ppc32"
    560         VGCONF_ARCH_SEC=""
    561 	VGCONF_PLATFORM_PRI_CAPS="PPC32_LINUX"
    562 	VGCONF_PLATFORM_SEC_CAPS=""
    563         valt_load_address_pri_norml="0x38000000"
    564         valt_load_address_pri_inner="0x28000000"
    565         valt_load_address_sec_norml="0xUNSET"
    566         valt_load_address_sec_inner="0xUNSET"
    567         AC_MSG_RESULT([ok (${ARCH_MAX}-${VGCONF_OS})])
    568 	;;
    569      ppc64be-linux)
    570         valt_load_address_sec_norml="0xUNSET"
    571         valt_load_address_sec_inner="0xUNSET"
    572 	if test x$vg_cv_only64bit = xyes; then
    573 	   VGCONF_ARCH_PRI="ppc64be"
    574            VGCONF_ARCH_SEC=""
    575 	   VGCONF_PLATFORM_PRI_CAPS="PPC64BE_LINUX"
    576 	   VGCONF_PLATFORM_SEC_CAPS=""
    577            valt_load_address_pri_norml="0x38000000"
    578            valt_load_address_pri_inner="0x28000000"
    579 	elif test x$vg_cv_only32bit = xyes; then
    580 	   VGCONF_ARCH_PRI="ppc32"
    581            VGCONF_ARCH_SEC=""
    582 	   VGCONF_PLATFORM_PRI_CAPS="PPC32_LINUX"
    583 	   VGCONF_PLATFORM_SEC_CAPS=""
    584            valt_load_address_pri_norml="0x38000000"
    585            valt_load_address_pri_inner="0x28000000"
    586 	else
    587 	   VGCONF_ARCH_PRI="ppc64be"
    588            VGCONF_ARCH_SEC="ppc32"
    589 	   VGCONF_PLATFORM_PRI_CAPS="PPC64BE_LINUX"
    590 	   VGCONF_PLATFORM_SEC_CAPS="PPC32_LINUX"
    591            valt_load_address_pri_norml="0x38000000"
    592            valt_load_address_pri_inner="0x28000000"
    593            valt_load_address_sec_norml="0x38000000"
    594            valt_load_address_sec_inner="0x28000000"
    595 	fi
    596         AC_MSG_RESULT([ok (${ARCH_MAX}-${VGCONF_OS})])
    597 	;;
    598      ppc64le-linux)
    599         # Little Endian is only supported on PPC64
    600         valt_load_address_sec_norml="0xUNSET"
    601         valt_load_address_sec_inner="0xUNSET"
    602         VGCONF_ARCH_PRI="ppc64le"
    603         VGCONF_ARCH_SEC=""
    604         VGCONF_PLATFORM_PRI_CAPS="PPC64LE_LINUX"
    605         VGCONF_PLATFORM_SEC_CAPS=""
    606         valt_load_address_pri_norml="0x38000000"
    607         valt_load_address_pri_inner="0x28000000"
    608         AC_MSG_RESULT([ok (${ARCH_MAX}-${VGCONF_OS})])
    609        ;;
    610      # Darwin gets identified as 32-bit even when it supports 64-bit.
    611      # (Not sure why, possibly because 'uname' returns "i386"?)  Just about
    612      # all Macs support both 32-bit and 64-bit, so we just build both.  If
    613      # someone has a really old 32-bit only machine they can (hopefully?)
    614      # build with --enable-only32bit.  See bug 243362.
    615      x86-darwin|amd64-darwin)
    616         ARCH_MAX="amd64"
    617         valt_load_address_sec_norml="0xUNSET"
    618         valt_load_address_sec_inner="0xUNSET"
    619 	if test x$vg_cv_only64bit = xyes; then
    620            VGCONF_ARCH_PRI="amd64"
    621            VGCONF_ARCH_SEC=""
    622 	   VGCONF_PLATFORM_PRI_CAPS="AMD64_DARWIN"
    623 	   VGCONF_PLATFORM_SEC_CAPS=""
    624            valt_load_address_pri_norml="0x138000000"
    625            valt_load_address_pri_inner="0x128000000"
    626 	elif test x$vg_cv_only32bit = xyes; then
    627            VGCONF_ARCH_PRI="x86"
    628            VGCONF_ARCH_SEC=""
    629 	   VGCONF_PLATFORM_PRI_CAPS="X86_DARWIN"
    630 	   VGCONF_PLATFORM_SEC_CAPS=""
    631 	   VGCONF_ARCH_PRI_CAPS="x86"
    632            valt_load_address_pri_norml="0x38000000"
    633            valt_load_address_pri_inner="0x28000000"
    634 	else
    635            VGCONF_ARCH_PRI="amd64"
    636            VGCONF_ARCH_SEC="x86"
    637 	   VGCONF_PLATFORM_PRI_CAPS="AMD64_DARWIN"
    638 	   VGCONF_PLATFORM_SEC_CAPS="X86_DARWIN"
    639            valt_load_address_pri_norml="0x138000000"
    640            valt_load_address_pri_inner="0x128000000"
    641            valt_load_address_sec_norml="0x38000000"
    642            valt_load_address_sec_inner="0x28000000"
    643 	fi
    644         AC_MSG_RESULT([ok (${ARCH_MAX}-${VGCONF_OS})])
    645 	;;
    646      arm-linux) 
    647 	VGCONF_ARCH_PRI="arm"
    648 	VGCONF_PLATFORM_PRI_CAPS="ARM_LINUX"
    649 	VGCONF_PLATFORM_SEC_CAPS=""
    650 	valt_load_address_pri_norml="0x38000000"
    651 	valt_load_address_pri_inner="0x28000000"
    652         valt_load_address_sec_norml="0xUNSET"
    653         valt_load_address_sec_inner="0xUNSET"
    654 	AC_MSG_RESULT([ok (${host_cpu}-${host_os})])
    655 	;;
    656      arm64-linux)
    657         valt_load_address_sec_norml="0xUNSET"
    658         valt_load_address_sec_inner="0xUNSET"
    659         if test x$vg_cv_only64bit = xyes; then
    660            VGCONF_ARCH_PRI="arm64"
    661            VGCONF_ARCH_SEC=""
    662            VGCONF_PLATFORM_PRI_CAPS="ARM64_LINUX"
    663            VGCONF_PLATFORM_SEC_CAPS=""
    664            valt_load_address_pri_norml="0x38000000"
    665            valt_load_address_pri_inner="0x28000000"
    666         elif test x$vg_cv_only32bit = xyes; then
    667            VGCONF_ARCH_PRI="arm"
    668            VGCONF_ARCH_SEC=""
    669            VGCONF_PLATFORM_PRI_CAPS="ARM_LINUX"
    670            VGCONF_PLATFORM_SEC_CAPS=""
    671            valt_load_address_pri_norml="0x38000000"
    672            valt_load_address_pri_inner="0x28000000"
    673         else
    674            VGCONF_ARCH_PRI="arm64"
    675            VGCONF_ARCH_SEC="arm"
    676            VGCONF_PLATFORM_PRI_CAPS="ARM64_LINUX"
    677            VGCONF_PLATFORM_SEC_CAPS="ARM_LINUX"
    678            valt_load_address_pri_norml="0x38000000"
    679            valt_load_address_pri_inner="0x28000000"
    680            valt_load_address_sec_norml="0x38000000"
    681            valt_load_address_sec_inner="0x28000000"
    682         fi
    683         AC_MSG_RESULT([ok (${ARCH_MAX}-${VGCONF_OS})])
    684         ;;
    685      s390x-linux)
    686         VGCONF_ARCH_PRI="s390x"
    687         VGCONF_ARCH_SEC=""
    688         VGCONF_PLATFORM_PRI_CAPS="S390X_LINUX"
    689         VGCONF_PLATFORM_SEC_CAPS=""
    690         # To improve branch prediction hit rate we want to have
    691         # the generated code close to valgrind (host) code
    692         valt_load_address_pri_norml="0x800000000"
    693         valt_load_address_pri_inner="0x810000000"
    694         valt_load_address_sec_norml="0xUNSET"
    695         valt_load_address_sec_inner="0xUNSET"
    696         AC_MSG_RESULT([ok (${ARCH_MAX}-${VGCONF_OS})])
    697         ;;
    698      mips32-linux) 
    699         VGCONF_ARCH_PRI="mips32"
    700         VGCONF_PLATFORM_PRI_CAPS="MIPS32_LINUX"
    701         VGCONF_PLATFORM_SEC_CAPS=""
    702         valt_load_address_pri_norml="0x38000000"
    703         valt_load_address_pri_inner="0x28000000"
    704         valt_load_address_sec_norml="0xUNSET"
    705         valt_load_address_sec_inner="0xUNSET"
    706         AC_MSG_RESULT([ok (${ARCH_MAX}-${VGCONF_OS})])
    707         ;;
    708      mips64-linux)
    709         VGCONF_ARCH_PRI="mips64"
    710         VGCONF_PLATFORM_PRI_CAPS="MIPS64_LINUX"
    711         VGCONF_PLATFORM_SEC_CAPS=""
    712         valt_load_address_pri_norml="0x38000000"
    713         valt_load_address_pri_inner="0x28000000"
    714         valt_load_address_sec_norml="0xUNSET"
    715         valt_load_address_sec_inner="0xUNSET"
    716         AC_MSG_RESULT([ok (${ARCH_MAX}-${VGCONF_OS})])
    717         ;;
    718      tilegx-linux)
    719         VGCONF_ARCH_PRI="tilegx"
    720         VGCONF_ARCH_SEC=""
    721         VGCONF_PLATFORM_PRI_CAPS="TILEGX_LINUX"
    722         VGCONF_PLATFORM_SEC_CAPS=""
    723         valt_load_address_pri_norml="0x38000000"
    724         valt_load_address_pri_inner="0x28000000"
    725         valt_load_address_sec_norml="0xUNSET"
    726         valt_load_address_sec_inner="0xUNSET"
    727         AC_MSG_RESULT([ok (${ARCH_MAX}-${VGCONF_OS})])
    728         ;;
    729      x86-solaris)
    730         VGCONF_ARCH_PRI="x86"
    731         VGCONF_ARCH_SEC=""
    732         VGCONF_PLATFORM_PRI_CAPS="X86_SOLARIS"
    733         VGCONF_PLATFORM_SEC_CAPS=""
    734         valt_load_address_pri_norml="0x38000000"
    735         valt_load_address_pri_inner="0x28000000"
    736         valt_load_address_sec_norml="0xUNSET"
    737         valt_load_address_sec_inner="0xUNSET"
    738         AC_MSG_RESULT([ok (${ARCH_MAX}-${VGCONF_OS})])
    739         ;;
    740      amd64-solaris)
    741         valt_load_address_sec_norml="0xUNSET"
    742         valt_load_address_sec_inner="0xUNSET"
    743         if test x$vg_cv_only64bit = xyes; then
    744            VGCONF_ARCH_PRI="amd64"
    745            VGCONF_ARCH_SEC=""
    746            VGCONF_PLATFORM_PRI_CAPS="AMD64_SOLARIS"
    747            VGCONF_PLATFORM_SEC_CAPS=""
    748            valt_load_address_pri_norml="0x38000000"
    749            valt_load_address_pri_inner="0x28000000"
    750         elif test x$vg_cv_only32bit = xyes; then
    751            VGCONF_ARCH_PRI="x86"
    752            VGCONF_ARCH_SEC=""
    753            VGCONF_PLATFORM_PRI_CAPS="X86_SOLARIS"
    754            VGCONF_PLATFORM_SEC_CAPS=""
    755            valt_load_address_pri_norml="0x38000000"
    756            valt_load_address_pri_inner="0x28000000"
    757         else
    758            VGCONF_ARCH_PRI="amd64"
    759            VGCONF_ARCH_SEC="x86"
    760            VGCONF_PLATFORM_PRI_CAPS="AMD64_SOLARIS"
    761            VGCONF_PLATFORM_SEC_CAPS="X86_SOLARIS"
    762            valt_load_address_pri_norml="0x38000000"
    763            valt_load_address_pri_inner="0x28000000"
    764            valt_load_address_sec_norml="0x38000000"
    765            valt_load_address_sec_inner="0x28000000"
    766         fi
    767         AC_MSG_RESULT([ok (${ARCH_MAX}-${VGCONF_OS})])
    768         ;;
    769     *)
    770         VGCONF_ARCH_PRI="unknown"
    771         VGCONF_ARCH_SEC="unknown"
    772 	VGCONF_PLATFORM_PRI_CAPS="UNKNOWN"
    773 	VGCONF_PLATFORM_SEC_CAPS="UNKNOWN"
    774         valt_load_address_pri_norml="0xUNSET"
    775         valt_load_address_pri_inner="0xUNSET"
    776         valt_load_address_sec_norml="0xUNSET"
    777         valt_load_address_sec_inner="0xUNSET"
    778         AC_MSG_RESULT([no (${ARCH_MAX}-${VGCONF_OS})])
    779         AC_MSG_ERROR([Valgrind is platform specific. Sorry. Please consider doing a port.])
    780         ;;
    781 esac
    782 
    783 #----------------------------------------------------------------------------
    784 
    785 # Set up VGCONF_ARCHS_INCLUDE_<arch>.  Either one or two of these become
    786 # defined.
    787 AM_CONDITIONAL(VGCONF_ARCHS_INCLUDE_X86,   
    788                test x$VGCONF_PLATFORM_PRI_CAPS = xX86_LINUX \
    789                  -o x$VGCONF_PLATFORM_SEC_CAPS = xX86_LINUX \
    790                  -o x$VGCONF_PLATFORM_PRI_CAPS = xX86_DARWIN \
    791                  -o x$VGCONF_PLATFORM_SEC_CAPS = xX86_DARWIN \
    792                  -o x$VGCONF_PLATFORM_PRI_CAPS = xX86_SOLARIS \
    793                  -o x$VGCONF_PLATFORM_SEC_CAPS = xX86_SOLARIS )
    794 AM_CONDITIONAL(VGCONF_ARCHS_INCLUDE_AMD64, 
    795                test x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_LINUX \
    796                  -o x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_DARWIN \
    797                  -o x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_SOLARIS )
    798 AM_CONDITIONAL(VGCONF_ARCHS_INCLUDE_PPC32, 
    799                test x$VGCONF_PLATFORM_PRI_CAPS = xPPC32_LINUX \ 
    800                  -o x$VGCONF_PLATFORM_SEC_CAPS = xPPC32_LINUX )
    801 AM_CONDITIONAL(VGCONF_ARCHS_INCLUDE_PPC64, 
    802                test x$VGCONF_PLATFORM_PRI_CAPS = xPPC64BE_LINUX \
    803                  -o x$VGCONF_PLATFORM_PRI_CAPS = xPPC64LE_LINUX )
    804 AM_CONDITIONAL(VGCONF_ARCHS_INCLUDE_ARM,   
    805                test x$VGCONF_PLATFORM_PRI_CAPS = xARM_LINUX \
    806                  -o x$VGCONF_PLATFORM_SEC_CAPS = xARM_LINUX )
    807 AM_CONDITIONAL(VGCONF_ARCHS_INCLUDE_ARM64, 
    808                test x$VGCONF_PLATFORM_PRI_CAPS = xARM64_LINUX )
    809 AM_CONDITIONAL(VGCONF_ARCHS_INCLUDE_S390X,
    810                test x$VGCONF_PLATFORM_PRI_CAPS = xS390X_LINUX )
    811 AM_CONDITIONAL(VGCONF_ARCHS_INCLUDE_MIPS32,
    812                test x$VGCONF_PLATFORM_PRI_CAPS = xMIPS32_LINUX )
    813 AM_CONDITIONAL(VGCONF_ARCHS_INCLUDE_MIPS64,
    814                test x$VGCONF_PLATFORM_PRI_CAPS = xMIPS64_LINUX ) 
    815 AM_CONDITIONAL(VGCONF_ARCHS_INCLUDE_TILEGX,
    816                test x$VGCONF_PLATFORM_PRI_CAPS = xTILEGX_LINUX )
    817 
    818 # Set up VGCONF_PLATFORMS_INCLUDE_<platform>.  Either one or two of these
    819 # become defined.
    820 AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_X86_LINUX,   
    821                test x$VGCONF_PLATFORM_PRI_CAPS = xX86_LINUX \
    822                  -o x$VGCONF_PLATFORM_SEC_CAPS = xX86_LINUX)
    823 AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_AMD64_LINUX, 
    824                test x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_LINUX)
    825 AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_PPC32_LINUX, 
    826                test x$VGCONF_PLATFORM_PRI_CAPS = xPPC32_LINUX \ 
    827                  -o x$VGCONF_PLATFORM_SEC_CAPS = xPPC32_LINUX)
    828 AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_PPC64BE_LINUX,
    829                test x$VGCONF_PLATFORM_PRI_CAPS = xPPC64BE_LINUX)
    830 AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_PPC64LE_LINUX,
    831                test x$VGCONF_PLATFORM_PRI_CAPS = xPPC64LE_LINUX)
    832 AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_ARM_LINUX, 
    833                test x$VGCONF_PLATFORM_PRI_CAPS = xARM_LINUX \
    834                  -o x$VGCONF_PLATFORM_SEC_CAPS = xARM_LINUX)
    835 AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_ARM64_LINUX, 
    836                test x$VGCONF_PLATFORM_PRI_CAPS = xARM64_LINUX)
    837 AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_S390X_LINUX,
    838                test x$VGCONF_PLATFORM_PRI_CAPS = xS390X_LINUX \
    839                  -o x$VGCONF_PLATFORM_SEC_CAPS = xS390X_LINUX)
    840 AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_MIPS32_LINUX,
    841                test x$VGCONF_PLATFORM_PRI_CAPS = xMIPS32_LINUX)
    842 AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_MIPS64_LINUX,
    843                test x$VGCONF_PLATFORM_PRI_CAPS = xMIPS64_LINUX)
    844 AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_TILEGX_LINUX,
    845                test x$VGCONF_PLATFORM_PRI_CAPS = xTILEGX_LINUX)
    846 AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_X86_DARWIN,   
    847                test x$VGCONF_PLATFORM_PRI_CAPS = xX86_DARWIN \
    848                  -o x$VGCONF_PLATFORM_SEC_CAPS = xX86_DARWIN)
    849 AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_AMD64_DARWIN, 
    850                test x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_DARWIN)
    851 AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_X86_SOLARIS,
    852                test x$VGCONF_PLATFORM_PRI_CAPS = xX86_SOLARIS \
    853                  -o x$VGCONF_PLATFORM_SEC_CAPS = xX86_SOLARIS)
    854 AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_AMD64_SOLARIS,
    855                test x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_SOLARIS)
    856 
    857 
    858 # Similarly, set up VGCONF_OS_IS_<os>.  Exactly one of these becomes defined.
    859 # Relies on the assumption that the primary and secondary targets are 
    860 # for the same OS, so therefore only necessary to test the primary.
    861 AM_CONDITIONAL(VGCONF_OS_IS_LINUX,
    862                test x$VGCONF_PLATFORM_PRI_CAPS = xX86_LINUX \
    863                  -o x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_LINUX \
    864                  -o x$VGCONF_PLATFORM_PRI_CAPS = xPPC32_LINUX \
    865                  -o x$VGCONF_PLATFORM_PRI_CAPS = xPPC64BE_LINUX \
    866                  -o x$VGCONF_PLATFORM_PRI_CAPS = xPPC64LE_LINUX \
    867                  -o x$VGCONF_PLATFORM_PRI_CAPS = xARM_LINUX \
    868                  -o x$VGCONF_PLATFORM_PRI_CAPS = xARM64_LINUX \
    869                  -o x$VGCONF_PLATFORM_PRI_CAPS = xS390X_LINUX \
    870                  -o x$VGCONF_PLATFORM_PRI_CAPS = xMIPS32_LINUX \
    871                  -o x$VGCONF_PLATFORM_PRI_CAPS = xMIPS64_LINUX \
    872                  -o x$VGCONF_PLATFORM_PRI_CAPS = xTILEGX_LINUX)
    873 AM_CONDITIONAL(VGCONF_OS_IS_DARWIN,
    874                test x$VGCONF_PLATFORM_PRI_CAPS = xX86_DARWIN \
    875                  -o x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_DARWIN)
    876 AM_CONDITIONAL(VGCONF_OS_IS_SOLARIS,
    877                test x$VGCONF_PLATFORM_PRI_CAPS = xX86_SOLARIS \
    878                  -o x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_SOLARIS)
    879 
    880 
    881 # Sometimes, in the Makefile.am files, it's useful to know whether or not
    882 # there is a secondary target.
    883 AM_CONDITIONAL(VGCONF_HAVE_PLATFORM_SEC,
    884                test x$VGCONF_PLATFORM_SEC_CAPS != x)
    885 
    886 dnl automake-1.10 does not have AM_COND_IF (added in 1.11), so we supply a
    887 dnl fallback definition
    888 dnl The macro is courtesy of Dave Hart:
    889 dnl   https://lists.gnu.org/archive/html/automake/2010-12/msg00045.html
    890 m4_ifndef([AM_COND_IF], [AC_DEFUN([AM_COND_IF], [
    891 if test -z "$$1_TRUE"; then :
    892   m4_n([$2])[]dnl
    893 m4_ifval([$3],
    894 [else
    895   $3
    896 ])dnl
    897 fi[]dnl
    898 ])])
    899 
    900 #----------------------------------------------------------------------------
    901 # Inner Valgrind?
    902 #----------------------------------------------------------------------------
    903 
    904 # Check if this should be built as an inner Valgrind, to be run within
    905 # another Valgrind.  Choose the load address accordingly.
    906 AC_SUBST(VALT_LOAD_ADDRESS_PRI)
    907 AC_SUBST(VALT_LOAD_ADDRESS_SEC)
    908 AC_CACHE_CHECK([for use as an inner Valgrind], vg_cv_inner,
    909    [AC_ARG_ENABLE(inner, 
    910       [  --enable-inner          enables self-hosting],
    911       [vg_cv_inner=$enableval],
    912       [vg_cv_inner=no])])
    913 if test "$vg_cv_inner" = yes; then
    914     AC_DEFINE([ENABLE_INNER], 1, [configured to run as an inner Valgrind])
    915     VALT_LOAD_ADDRESS_PRI=$valt_load_address_pri_inner
    916     VALT_LOAD_ADDRESS_SEC=$valt_load_address_sec_inner
    917 else
    918     VALT_LOAD_ADDRESS_PRI=$valt_load_address_pri_norml
    919     VALT_LOAD_ADDRESS_SEC=$valt_load_address_sec_norml
    920 fi
    921 
    922 #----------------------------------------------------------------------------
    923 # Undefined behaviour sanitiser
    924 #----------------------------------------------------------------------------
    925 # Check whether we should build with the undefined beahviour sanitiser.
    926 
    927 AC_CACHE_CHECK([for using the undefined behaviour sanitiser], vg_cv_ubsan,
    928    [AC_ARG_ENABLE(ubsan, 
    929       [  --enable-ubsan          enables the undefined behaviour sanitiser],
    930       [vg_cv_ubsan=$enableval],
    931       [vg_cv_ubsan=no])])
    932 
    933 #----------------------------------------------------------------------------
    934 # Define MIPS_PAGE_SHIFT (--with-pagesize)
    935 #----------------------------------------------------------------------------
    936 AC_ARG_WITH(pagesize,
    937    [  --with-pagesize=        override detected page size (4, 16 or 64)],
    938    [psize=$withval],
    939    [psize=0]
    940 )
    941  
    942 if test "$psize" = "0"; then
    943     psizer=`getconf PAGESIZE`
    944     psize=$((${psizer}/1024))
    945 fi
    946 
    947 if test "$psize" = "4"; then
    948     AC_DEFINE([MIPS_PAGE_SHIFT], 12, [configured page size 4k])
    949 elif test "$psize" = "16"; then
    950     AC_DEFINE([MIPS_PAGE_SHIFT], 14, [configured page size 16k])
    951 elif test "$psize" = "64"; then
    952     AC_DEFINE([MIPS_PAGE_SHIFT], 16, [configured page size 64k])
    953 else
    954    AC_DEFINE([MIPS_PAGE_SHIFT], 12, [configured default page size 4k])
    955 fi
    956 AC_MSG_RESULT([checking for Pagesize... ${psize}k])
    957 
    958 
    959 #----------------------------------------------------------------------------
    960 # Extra fine-tuning of installation directories
    961 #----------------------------------------------------------------------------
    962 AC_ARG_WITH(tmpdir,
    963    [  --with-tmpdir=PATH      Specify path for temporary files],
    964    tmpdir="$withval",
    965    tmpdir="/tmp")
    966 AC_DEFINE_UNQUOTED(VG_TMPDIR, "$tmpdir", [Temporary files directory])
    967 AC_SUBST(VG_TMPDIR, [$tmpdir])
    968 
    969 
    970 #----------------------------------------------------------------------------
    971 # Libc and suppressions
    972 #----------------------------------------------------------------------------
    973 # This variable will collect the suppression files to be used.
    974 AC_SUBST(DEFAULT_SUPP)
    975 
    976 AC_CHECK_HEADER([features.h])
    977 
    978 if test x$ac_cv_header_features_h = xyes; then
    979   rm -f conftest.$ac_ext
    980   cat <<_ACEOF >conftest.$ac_ext
    981 #include <features.h>
    982 #if defined(__GNU_LIBRARY__) && defined(__GLIBC__) && defined(__GLIBC_MINOR__)
    983 glibc version is: __GLIBC__ __GLIBC_MINOR__
    984 #endif
    985 _ACEOF
    986   GLIBC_VERSION="`$CPP -P conftest.$ac_ext | $SED -n 's/^glibc version is: //p' | $SED 's/ /./g'`"
    987 fi
    988 
    989 # not really a version check
    990 AC_EGREP_CPP([DARWIN_LIBC], [
    991 #include <sys/cdefs.h>
    992 #if defined(__DARWIN_VERS_1050)
    993   DARWIN_LIBC
    994 #endif
    995 ],
    996 GLIBC_VERSION="darwin")
    997 
    998 # not really a version check
    999 AC_EGREP_CPP([BIONIC_LIBC], [
   1000 #if defined(__ANDROID__)
   1001   BIONIC_LIBC
   1002 #endif
   1003 ],
   1004 GLIBC_VERSION="bionic")
   1005 
   1006 # there is only one version of libc on Solaris
   1007 if test x$VGCONF_PLATFORM_PRI_CAPS = xX86_SOLARIS \
   1008      -o x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_SOLARIS; then
   1009     GLIBC_VERSION="solaris"
   1010 fi
   1011 
   1012 
   1013 AC_MSG_CHECKING([the glibc version])
   1014 
   1015 case "${GLIBC_VERSION}" in
   1016      2.2)
   1017 	AC_MSG_RESULT(${GLIBC_VERSION} family)
   1018 	DEFAULT_SUPP="glibc-2.2.supp ${DEFAULT_SUPP}"
   1019 	DEFAULT_SUPP="glibc-2.2-LinuxThreads-helgrind.supp ${DEFAULT_SUPP}"
   1020 	DEFAULT_SUPP="glibc-2.X-drd.supp ${DEFAULT_SUPP}"
   1021 	;;
   1022      2.[[3-6]])
   1023 	AC_MSG_RESULT(${GLIBC_VERSION} family)
   1024 	DEFAULT_SUPP="glibc-${GLIBC_VERSION}.supp ${DEFAULT_SUPP}"
   1025 	DEFAULT_SUPP="glibc-2.34567-NPTL-helgrind.supp ${DEFAULT_SUPP}"
   1026 	DEFAULT_SUPP="glibc-2.X-drd.supp ${DEFAULT_SUPP}"
   1027 	;;
   1028      2.[[7-9]])
   1029 	AC_MSG_RESULT(${GLIBC_VERSION} family)
   1030 	DEFAULT_SUPP="glibc-2.X.supp ${DEFAULT_SUPP}"
   1031 	DEFAULT_SUPP="glibc-2.34567-NPTL-helgrind.supp ${DEFAULT_SUPP}"
   1032 	DEFAULT_SUPP="glibc-2.X-drd.supp ${DEFAULT_SUPP}"
   1033 	;;
   1034      2.10|2.11)
   1035 	AC_MSG_RESULT(${GLIBC_VERSION} family)
   1036 	AC_DEFINE([GLIBC_MANDATORY_STRLEN_REDIRECT], 1,
   1037 		  [Define to 1 if strlen() has been optimized heavily (amd64 glibc >= 2.10)])
   1038 	DEFAULT_SUPP="glibc-2.X.supp ${DEFAULT_SUPP}"
   1039 	DEFAULT_SUPP="glibc-2.34567-NPTL-helgrind.supp ${DEFAULT_SUPP}"
   1040 	DEFAULT_SUPP="glibc-2.X-drd.supp ${DEFAULT_SUPP}"
   1041 	;;
   1042      2.*)
   1043 	AC_MSG_RESULT(${GLIBC_VERSION} family)
   1044 	AC_DEFINE([GLIBC_MANDATORY_STRLEN_REDIRECT], 1,
   1045 		  [Define to 1 if strlen() has been optimized heavily (amd64 glibc >= 2.10)])
   1046 	AC_DEFINE([GLIBC_MANDATORY_INDEX_AND_STRLEN_REDIRECT], 1,
   1047 		  [Define to 1 if index() and strlen() have been optimized heavily (x86 glibc >= 2.12)])
   1048 	DEFAULT_SUPP="glibc-2.X.supp ${DEFAULT_SUPP}"
   1049 	DEFAULT_SUPP="glibc-2.34567-NPTL-helgrind.supp ${DEFAULT_SUPP}"
   1050 	DEFAULT_SUPP="glibc-2.X-drd.supp ${DEFAULT_SUPP}"
   1051 	;;
   1052      darwin)
   1053 	AC_MSG_RESULT(Darwin)
   1054 	AC_DEFINE([DARWIN_LIBC], 1, [Define to 1 if you're using Darwin])
   1055 	# DEFAULT_SUPP set by kernel version check above.
   1056 	;;
   1057      bionic)
   1058 	AC_MSG_RESULT(Bionic)
   1059 	AC_DEFINE([BIONIC_LIBC], 1, [Define to 1 if you're using Bionic])
   1060 	DEFAULT_SUPP="bionic.supp ${DEFAULT_SUPP}"
   1061 	;;
   1062      solaris)
   1063 	AC_MSG_RESULT(Solaris)
   1064 	# DEFAULT_SUPP set in host_os switch-case above.
   1065 	# No other suppression file is used.
   1066 	;;
   1067      2.0|2.1|*)
   1068 	AC_MSG_RESULT([unsupported version ${GLIBC_VERSION}])
   1069 	AC_MSG_ERROR([Valgrind requires glibc version 2.2 or later,])
   1070 	AC_MSG_ERROR([Darwin libc, Bionic libc or Solaris libc])
   1071 	;;
   1072 esac
   1073 
   1074 AC_SUBST(GLIBC_VERSION)
   1075 
   1076 
   1077 if test "$VGCONF_OS" != "solaris"; then
   1078     # Add default suppressions for the X client libraries.  Make no
   1079     # attempt to detect whether such libraries are installed on the
   1080     # build machine (or even if any X facilities are present); just
   1081     # add the suppressions antidisirregardless.
   1082     DEFAULT_SUPP="xfree-4.supp ${DEFAULT_SUPP}"
   1083     DEFAULT_SUPP="xfree-3.supp ${DEFAULT_SUPP}"
   1084 
   1085     # Add glibc and X11 suppressions for exp-sgcheck
   1086     DEFAULT_SUPP="exp-sgcheck.supp ${DEFAULT_SUPP}"
   1087 fi
   1088 
   1089 
   1090 #----------------------------------------------------------------------------
   1091 # Platform variants?
   1092 #----------------------------------------------------------------------------
   1093 
   1094 # Normally the PLAT = (ARCH, OS) characterisation of the platform is enough.
   1095 # But there are times where we need a bit more control.  The motivating
   1096 # and currently only case is Android: this is almost identical to
   1097 # {x86,arm,mips}-linux, but not quite.  So this introduces the concept of
   1098 # platform variant tags, which get passed in the compile as
   1099 # -DVGPV_<arch>_<os>_<variant> along with the main -DVGP_<arch>_<os> definition.
   1100 #
   1101 # In almost all cases, the <variant> bit is "vanilla".  But for Android
   1102 # it is "android" instead.
   1103 #
   1104 # Consequently (eg), plain arm-linux would build with
   1105 #
   1106 #   -DVGP_arm_linux -DVGPV_arm_linux_vanilla
   1107 #
   1108 # whilst an Android build would have
   1109 #
   1110 #   -DVGP_arm_linux -DVGPV_arm_linux_android
   1111 #
   1112 # Same for x86. The setup of the platform variant is pushed relatively far
   1113 # down this file in order that we can inspect any of the variables set above.
   1114 
   1115 # In the normal case ..
   1116 VGCONF_PLATVARIANT="vanilla"
   1117 
   1118 # Android ?
   1119 if test "$GLIBC_VERSION" = "bionic";
   1120 then
   1121    VGCONF_PLATVARIANT="android"
   1122 fi
   1123 
   1124 AC_SUBST(VGCONF_PLATVARIANT)
   1125 
   1126 
   1127 # FIXME: do we also want to define automake variables
   1128 # VGCONF_PLATVARIANT_IS_<WHATEVER>, where WHATEVER is (currently)
   1129 # VANILLA or ANDROID ?  This would be in the style of VGCONF_ARCHS_INCLUDE,
   1130 # VGCONF_PLATFORMS_INCLUDE and VGCONF_OS_IS above?  Could easily enough
   1131 # do that.  Problem is that we can't do and-ing in Makefile.am's, but
   1132 # that's what we'd need to do to use this, since what we'd want to write
   1133 # is something like
   1134 #
   1135 # VGCONF_PLATFORMS_INCLUDE_ARM_LINUX && VGCONF_PLATVARIANT_IS_ANDROID
   1136 #
   1137 # Hmm.  Can't think of a nice clean solution to this.
   1138 
   1139 AM_CONDITIONAL(VGCONF_PLATVARIANT_IS_VANILLA,
   1140                test x$VGCONF_PLATVARIANT = xvanilla)
   1141 AM_CONDITIONAL(VGCONF_PLATVARIANT_IS_ANDROID,
   1142                test x$VGCONF_PLATVARIANT = xandroid)
   1143 
   1144 
   1145 #----------------------------------------------------------------------------
   1146 # Checking for various library functions and other definitions
   1147 #----------------------------------------------------------------------------
   1148 
   1149 # Check for AT_FDCWD
   1150 
   1151 AC_MSG_CHECKING([for AT_FDCWD])
   1152 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
   1153 #define _GNU_SOURCE
   1154 #include <fcntl.h>
   1155 #include <unistd.h>
   1156 ]], [[
   1157   int a = AT_FDCWD;
   1158 ]])], [
   1159 ac_have_at_fdcwd=yes
   1160 AC_MSG_RESULT([yes])
   1161 ], [
   1162 ac_have_at_fdcwd=no
   1163 AC_MSG_RESULT([no])
   1164 ])
   1165 
   1166 AM_CONDITIONAL([HAVE_AT_FDCWD], [test x$ac_have_at_fdcwd = xyes])
   1167 
   1168 # Check for stpncpy function definition in string.h
   1169 # This explicitly checks with _GNU_SOURCE defined since that is also
   1170 # used in the test case (some systems might define it without anyway
   1171 # since stpncpy is part of The Open Group Base Specifications Issue 7
   1172 # IEEE Std 1003.1-2008.
   1173 AC_MSG_CHECKING([for stpncpy])
   1174 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
   1175 #define _GNU_SOURCE
   1176 #include <string.h>
   1177 ]], [[
   1178   char *d;
   1179   char *s;
   1180   size_t n = 0;
   1181   char *r = stpncpy(d, s, n);
   1182 ]])], [
   1183 ac_have_gnu_stpncpy=yes
   1184 AC_MSG_RESULT([yes])
   1185 ], [
   1186 ac_have_gnu_stpncpy=no
   1187 AC_MSG_RESULT([no])
   1188 ])
   1189 
   1190 AM_CONDITIONAL([HAVE_GNU_STPNCPY], [test x$ac_have_gnu_stpncpy = xyes])
   1191 
   1192 # Check for PTRACE_GETREGS
   1193 
   1194 AC_MSG_CHECKING([for PTRACE_GETREGS])
   1195 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
   1196 #include <stdlib.h>
   1197 #include <stddef.h>
   1198 #include <sys/ptrace.h>
   1199 #include <sys/user.h>
   1200 ]], [[
   1201   void *p;
   1202   long res = ptrace (PTRACE_GETREGS, 0, p, p);
   1203 ]])], [
   1204 AC_MSG_RESULT([yes])
   1205 AC_DEFINE([HAVE_PTRACE_GETREGS], 1,
   1206           [Define to 1 if you have the `PTRACE_GETREGS' ptrace request.])
   1207 ], [
   1208 AC_MSG_RESULT([no])
   1209 ])
   1210 
   1211 
   1212 # Check for CLOCK_MONOTONIC
   1213 
   1214 AC_MSG_CHECKING([for CLOCK_MONOTONIC])
   1215 
   1216 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
   1217 #include <time.h>
   1218 ]], [[
   1219   struct timespec t;
   1220   clock_gettime(CLOCK_MONOTONIC, &t);
   1221   return 0;
   1222 ]])], [
   1223 AC_MSG_RESULT([yes])
   1224 AC_DEFINE([HAVE_CLOCK_MONOTONIC], 1,
   1225           [Define to 1 if you have the `CLOCK_MONOTONIC' constant.])
   1226 ], [
   1227 AC_MSG_RESULT([no])
   1228 ])
   1229 
   1230 
   1231 # Check for PTHREAD_RWLOCK_T
   1232 
   1233 AC_MSG_CHECKING([for pthread_rwlock_t])
   1234 
   1235 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
   1236 #define _GNU_SOURCE
   1237 #include <pthread.h>
   1238 ]], [[
   1239   pthread_rwlock_t rwl;
   1240 ]])], [
   1241 AC_MSG_RESULT([yes])
   1242 AC_DEFINE([HAVE_PTHREAD_RWLOCK_T], 1,
   1243           [Define to 1 if you have the `pthread_rwlock_t' type.])
   1244 ], [
   1245 AC_MSG_RESULT([no])
   1246 ])
   1247 
   1248 
   1249 # Check for PTHREAD_MUTEX_ADAPTIVE_NP
   1250 
   1251 AC_MSG_CHECKING([for PTHREAD_MUTEX_ADAPTIVE_NP])
   1252 
   1253 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
   1254 #define _GNU_SOURCE
   1255 #include <pthread.h>
   1256 ]], [[
   1257   return (PTHREAD_MUTEX_ADAPTIVE_NP);
   1258 ]])], [
   1259 AC_MSG_RESULT([yes])
   1260 AC_DEFINE([HAVE_PTHREAD_MUTEX_ADAPTIVE_NP], 1,
   1261           [Define to 1 if you have the `PTHREAD_MUTEX_ADAPTIVE_NP' constant.])
   1262 ], [
   1263 AC_MSG_RESULT([no])
   1264 ])
   1265 
   1266 
   1267 # Check for PTHREAD_MUTEX_ERRORCHECK_NP
   1268 
   1269 AC_MSG_CHECKING([for PTHREAD_MUTEX_ERRORCHECK_NP])
   1270 
   1271 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
   1272 #define _GNU_SOURCE
   1273 #include <pthread.h>
   1274 ]], [[
   1275   return (PTHREAD_MUTEX_ERRORCHECK_NP);
   1276 ]])], [
   1277 AC_MSG_RESULT([yes])
   1278 AC_DEFINE([HAVE_PTHREAD_MUTEX_ERRORCHECK_NP], 1,
   1279           [Define to 1 if you have the `PTHREAD_MUTEX_ERRORCHECK_NP' constant.])
   1280 ], [
   1281 AC_MSG_RESULT([no])
   1282 ])
   1283 
   1284 
   1285 # Check for PTHREAD_MUTEX_RECURSIVE_NP
   1286 
   1287 AC_MSG_CHECKING([for PTHREAD_MUTEX_RECURSIVE_NP])
   1288 
   1289 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
   1290 #define _GNU_SOURCE
   1291 #include <pthread.h>
   1292 ]], [[
   1293   return (PTHREAD_MUTEX_RECURSIVE_NP);
   1294 ]])], [
   1295 AC_MSG_RESULT([yes])
   1296 AC_DEFINE([HAVE_PTHREAD_MUTEX_RECURSIVE_NP], 1,
   1297           [Define to 1 if you have the `PTHREAD_MUTEX_RECURSIVE_NP' constant.])
   1298 ], [
   1299 AC_MSG_RESULT([no])
   1300 ])
   1301 
   1302 
   1303 # Check for PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
   1304 
   1305 AC_MSG_CHECKING([for PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP])
   1306 
   1307 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
   1308 #define _GNU_SOURCE
   1309 #include <pthread.h>
   1310 ]], [[
   1311   pthread_mutex_t m = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
   1312   return 0;
   1313 ]])], [
   1314 AC_MSG_RESULT([yes])
   1315 AC_DEFINE([HAVE_PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP], 1,
   1316           [Define to 1 if you have the `PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP' constant.])
   1317 ], [
   1318 AC_MSG_RESULT([no])
   1319 ])
   1320 
   1321 
   1322 # Check whether pthread_mutex_t has a member called __m_kind.
   1323 
   1324 AC_CHECK_MEMBER([pthread_mutex_t.__m_kind],
   1325 	        [AC_DEFINE([HAVE_PTHREAD_MUTEX_T__M_KIND],
   1326 		           1,                                   
   1327 			   [Define to 1 if pthread_mutex_t has a member called __m_kind.])
   1328                 ],
   1329 		[],
   1330 		[#include <pthread.h>])
   1331 
   1332 
   1333 # Check whether pthread_mutex_t has a member called __data.__kind.
   1334 
   1335 AC_CHECK_MEMBER([pthread_mutex_t.__data.__kind],
   1336                 [AC_DEFINE([HAVE_PTHREAD_MUTEX_T__DATA__KIND],
   1337 		          1,
   1338 			  [Define to 1 if pthread_mutex_t has a member __data.__kind.])
   1339                 ],
   1340 		[],
   1341 		[#include <pthread.h>])
   1342 
   1343 # Convenience function.  Set flags based on the existing HWCAP entries.
   1344 # The AT_HWCAP entries are generated by glibc, and are based on
   1345 # functions supported by the hardware/system/libc.
   1346 # Subsequent support for whether the capability will actually be utilized
   1347 # will also be checked against the compiler capabilities.
   1348 # called as
   1349 #      AC_HWCAP_CONTAINS_FLAG[hwcap_string_to_match],[VARIABLE_TO_SET]
   1350 AC_DEFUN([AC_HWCAP_CONTAINS_FLAG],[
   1351   AUXV_CHECK_FOR=$1
   1352   AC_MSG_CHECKING([if AT_HWCAP contains the $AUXV_CHECK_FOR indicator])
   1353   if LD_SHOW_AUXV=1 `which true` | grep ^AT_HWCAP | grep -q -w ${AUXV_CHECK_FOR}
   1354   then
   1355     AC_MSG_RESULT([yes])
   1356     AC_SUBST([$2],[yes])
   1357   else
   1358     AC_MSG_RESULT([no])
   1359     AC_SUBST([$2],[])
   1360   fi
   1361 ])
   1362 
   1363 # gather hardware capabilities. (hardware/kernel/libc)
   1364 AC_HWCAP_CONTAINS_FLAG([altivec],[HWCAP_HAS_ALTIVEC])
   1365 AC_HWCAP_CONTAINS_FLAG([vsx],[HWCAP_HAS_VSX])
   1366 AC_HWCAP_CONTAINS_FLAG([dfp],[HWCAP_HAS_DFP])
   1367 AC_HWCAP_CONTAINS_FLAG([arch_2_05],[HWCAP_HAS_ISA_2_05])
   1368 AC_HWCAP_CONTAINS_FLAG([arch_2_06],[HWCAP_HAS_ISA_2_06])
   1369 AC_HWCAP_CONTAINS_FLAG([arch_2_07],[HWCAP_HAS_ISA_2_07])
   1370 AC_HWCAP_CONTAINS_FLAG([htm],[HWCAP_HAS_HTM])
   1371 
   1372 # ISA Levels
   1373 AM_CONDITIONAL(HAS_ISA_2_05, [test x$HWCAP_HAS_ISA_2_05 = xyes])
   1374 AM_CONDITIONAL(HAS_ISA_2_06, [test x$HWCAP_HAS_ISA_2_06 = xyes])
   1375 # compiler support for isa 2.07 level instructions
   1376 AC_MSG_CHECKING([that assembler knows ISA 2.07 instructions ])
   1377 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
   1378 ]], [[
   1379   __asm__ __volatile__("mtvsrd 1,2 ");
   1380 ]])], [
   1381 ac_asm_have_isa_2_07=yes
   1382 AC_MSG_RESULT([yes])
   1383 ], [
   1384 ac_asm_have_isa_2_07=no
   1385 AC_MSG_RESULT([no])
   1386 ])
   1387 AM_CONDITIONAL(HAS_ISA_2_07, [test x$ac_asm_have_isa_2_07 = xyes \
   1388                                -a x$HWCAP_HAS_ISA_2_07 = xyes])
   1389 
   1390 # altivec (vsx) support.
   1391 # does this compiler support -maltivec and does it have the include file
   1392 # <altivec.h> ?
   1393 AC_MSG_CHECKING([for Altivec support in the compiler ])
   1394 safe_CFLAGS=$CFLAGS
   1395 CFLAGS="-maltivec -Werror"
   1396 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
   1397 #include <altivec.h>
   1398 ]], [[
   1399   vector unsigned int v;
   1400 ]])], [
   1401 ac_have_altivec=yes
   1402 AC_MSG_RESULT([yes])
   1403 AC_DEFINE([HAS_ALTIVEC], 1,
   1404           [Define to 1 if gcc/as can do Altivec.])
   1405 ], [
   1406 ac_have_altivec=no
   1407 AC_MSG_RESULT([no])
   1408 ])
   1409 CFLAGS=$safe_CFLAGS
   1410 AM_CONDITIONAL([HAS_ALTIVEC], [test x$ac_have_altivec = xyes \
   1411                                  -a x$HWCAP_HAS_ALTIVEC = xyes])
   1412 
   1413 # Check that both: the compiler supports -mvsx and that the assembler
   1414 # understands VSX instructions.  If either of those doesn't work,
   1415 # conclude that we can't do VSX.
   1416 AC_MSG_CHECKING([for VSX compiler flag support])
   1417 safe_CFLAGS=$CFLAGS
   1418 CFLAGS="-mvsx -Werror"
   1419 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
   1420 ]], [[
   1421 ]])], [
   1422 ac_compiler_supports_vsx_flag=yes
   1423 AC_MSG_RESULT([yes])
   1424 ], [
   1425 ac_compiler_supports_vsx_flag=no
   1426 AC_MSG_RESULT([no])
   1427 ])
   1428 CFLAGS=$safe_CFLAGS
   1429 
   1430 AC_MSG_CHECKING([for VSX support in the assembler ])
   1431 safe_CFLAGS=$CFLAGS
   1432 CFLAGS="-mvsx -Werror"
   1433 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
   1434 #include <altivec.h>
   1435 ]], [[
   1436   vector unsigned int v;
   1437   __asm__ __volatile__("xsmaddadp 32, 32, 33" ::: "memory","cc");
   1438 ]])], [
   1439 ac_compiler_supports_vsx=yes
   1440 AC_MSG_RESULT([yes])
   1441 ], [
   1442 ac_compiler_supports_vsx=no
   1443 AC_MSG_RESULT([no])
   1444 ])
   1445 CFLAGS=$safe_CFLAGS
   1446 AM_CONDITIONAL([HAS_VSX], [test x$ac_compiler_supports_vsx_flag = xyes \
   1447                              -a x$ac_compiler_supports_vsx = xyes \
   1448                              -a x$HWCAP_HAS_VSX = xyes ])
   1449 
   1450 # DFP (Decimal Float)
   1451 AC_MSG_CHECKING([that assembler knows DFP])
   1452 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
   1453 ]], [[
   1454   __asm__ __volatile__("dadd 1, 2, 3");
   1455   __asm__ __volatile__("dcffix 1, 2");
   1456 ]])], [
   1457 ac_asm_have_dfp=yes
   1458 AC_MSG_RESULT([yes])
   1459 ], [
   1460 ac_asm_have_dfp=no
   1461 AC_MSG_RESULT([no])
   1462 ])
   1463 AC_MSG_CHECKING([that compiler knows -mhard-dfp switch])
   1464 safe_CFLAGS=$CFLAGS
   1465 CFLAGS="-mhard-dfp -Werror"
   1466 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
   1467 ]], [[
   1468   __asm__ __volatile__("dadd 1, 2, 3");
   1469   __asm__ __volatile__("dcffix 1, 2");
   1470 ]])], [
   1471 ac_compiler_have_dfp=yes
   1472 AC_MSG_RESULT([yes])
   1473 ], [
   1474 ac_compiler_have_dfp=no
   1475 AC_MSG_RESULT([no])
   1476 ])
   1477 CFLAGS=$safe_CFLAGS
   1478 AM_CONDITIONAL(HAS_DFP, test x$ac_asm_have_dfp = xyes \
   1479                           -a x$ac_compiler_have_dfp = xyes \
   1480                           -a x$HWCAP_HAS_DFP = xyes )
   1481 
   1482 AC_MSG_CHECKING([that compiler knows DFP datatypes])
   1483 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
   1484 ]], [[
   1485   _Decimal64 x = 0.0DD;
   1486 ]])], [
   1487 ac_compiler_have_dfp_type=yes
   1488 AC_MSG_RESULT([yes])
   1489 ], [
   1490 ac_compiler_have_dfp_type=no
   1491 AC_MSG_RESULT([no])
   1492 ])
   1493 AM_CONDITIONAL(BUILD_DFP_TESTS, test x$ac_compiler_have_dfp_type = xyes \
   1494                                   -a xHWCAP_$HAS_DFP = xyes )
   1495 
   1496 
   1497 # HTM (Hardware Transactional Memory)
   1498 AC_MSG_CHECKING([if compiler accepts the -mhtm flag])
   1499 safe_CFLAGS=$CFLAGS
   1500 CFLAGS="-mhtm -Werror"
   1501 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
   1502 ]], [[
   1503   return 0;
   1504 ]])], [
   1505 AC_MSG_RESULT([yes])
   1506 ac_compiler_supports_htm=yes
   1507 ], [
   1508 AC_MSG_RESULT([no])
   1509 ac_compiler_supports_htm=no
   1510 ])
   1511 CFLAGS=$safe_CFLAGS
   1512 
   1513 AC_MSG_CHECKING([if compiler can find the htm builtins])
   1514 safe_CFLAGS=$CFLAGS
   1515 CFLAGS="-mhtm -Werror"
   1516  AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
   1517  ]], [[
   1518    if (__builtin_tbegin (0))
   1519       __builtin_tend (0);
   1520  ]])], [
   1521  AC_MSG_RESULT([yes])
   1522 ac_compiler_sees_htm_builtins=yes
   1523  ], [
   1524  AC_MSG_RESULT([no])
   1525 ac_compiler_sees_htm_builtins=no
   1526  ])
   1527 CFLAGS=$safe_CFLAGS
   1528 
   1529 AM_CONDITIONAL(SUPPORTS_HTM, test x$ac_compiler_supports_htm = xyes \
   1530                                -a x$ac_compiler_sees_htm_builtins = xyes \
   1531                                -a x$HWCAP_HAS_HTM = xyes )
   1532 
   1533 # Check for pthread_create (a] GLIBC2.0
   1534 AC_MSG_CHECKING([for pthread_create (a] GLIBC2.0()])
   1535 
   1536 safe_CFLAGS=$CFLAGS
   1537 CFLAGS="-lpthread -Werror"
   1538 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
   1539 extern int pthread_create_glibc_2_0(void*, const void*,
   1540                                     void *(*)(void*), void*);
   1541 __asm__(".symver pthread_create_glibc_2_0, pthread_create (a] GLIBC_2.0");
   1542 ]], [[
   1543 #ifdef __powerpc__
   1544 /*
   1545  * Apparently on PowerPC linking this program succeeds and generates an
   1546  * executable with the undefined symbol pthread_create (a] GLIBC_2.0.
   1547  */
   1548 #error This test does not work properly on PowerPC.
   1549 #else
   1550   pthread_create_glibc_2_0(0, 0, 0, 0);
   1551 #endif
   1552   return 0;
   1553 ]])], [
   1554 ac_have_pthread_create_glibc_2_0=yes
   1555 AC_MSG_RESULT([yes])
   1556 AC_DEFINE([HAVE_PTHREAD_CREATE_GLIBC_2_0], 1,
   1557           [Define to 1 if you have the `pthread_create (a] glibc2.0' function.])
   1558 ], [
   1559 ac_have_pthread_create_glibc_2_0=no
   1560 AC_MSG_RESULT([no])
   1561 ])
   1562 CFLAGS=$safe_CFLAGS
   1563 
   1564 AM_CONDITIONAL(HAVE_PTHREAD_CREATE_GLIBC_2_0,
   1565 	       test x$ac_have_pthread_create_glibc_2_0 = xyes)
   1566 
   1567 
   1568 # Check for dlinfo RTLD_DI_TLS_MODID
   1569 AC_MSG_CHECKING([for dlinfo RTLD_DI_TLS_MODID])
   1570 
   1571 safe_LIBS="$LIBS"
   1572 LIBS="-ldl"
   1573 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
   1574 #ifndef _GNU_SOURCE
   1575 #define _GNU_SOURCE
   1576 #endif
   1577 #include <link.h>
   1578 #include <dlfcn.h>
   1579 ]], [[
   1580   size_t sizes[10000];
   1581   size_t modid_offset;
   1582   (void) dlinfo ((void*)sizes, RTLD_DI_TLS_MODID, &modid_offset);
   1583   return 0;
   1584 ]])], [
   1585 ac_have_dlinfo_rtld_di_tls_modid=yes
   1586 AC_MSG_RESULT([yes])
   1587 AC_DEFINE([HAVE_DLINFO_RTLD_DI_TLS_MODID], 1,
   1588           [Define to 1 if you have a dlinfo that can do RTLD_DI_TLS_MODID.])
   1589 ], [
   1590 ac_have_dlinfo_rtld_di_tls_modid=no
   1591 AC_MSG_RESULT([no])
   1592 ])
   1593 LIBS=$safe_LIBS
   1594 
   1595 AM_CONDITIONAL(HAVE_DLINFO_RTLD_DI_TLS_MODID,
   1596 	       test x$ac_have_dlinfo_rtld_di_tls_modid = xyes)
   1597 
   1598 
   1599 # Check for eventfd_t, eventfd() and eventfd_read()
   1600 AC_MSG_CHECKING([for eventfd()])
   1601 
   1602 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
   1603 #include <sys/eventfd.h>
   1604 ]], [[
   1605   eventfd_t ev;
   1606   int fd;
   1607 
   1608   fd = eventfd(5, 0);
   1609   eventfd_read(fd, &ev);
   1610   return 0;
   1611 ]])], [
   1612 AC_MSG_RESULT([yes])
   1613 AC_DEFINE([HAVE_EVENTFD], 1,
   1614           [Define to 1 if you have the `eventfd' function.])
   1615 AC_DEFINE([HAVE_EVENTFD_READ], 1,
   1616           [Define to 1 if you have the `eventfd_read' function.])
   1617 ], [
   1618 AC_MSG_RESULT([no])
   1619 ])
   1620 
   1621 # Check whether compiler can process #include <thread> without errors
   1622 # clang 3.3 cannot process <thread> from e.g.
   1623 # gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
   1624 
   1625 AC_MSG_CHECKING([that C++ compiler can include <thread> header file])
   1626 AC_LANG(C++)
   1627 safe_CXXFLAGS=$CXXFLAGS
   1628 CXXFLAGS=-std=c++0x
   1629 
   1630 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
   1631 #include <thread> 
   1632 ])],
   1633 [
   1634 ac_cxx_can_include_thread_header=yes
   1635 AC_MSG_RESULT([yes])
   1636 ], [
   1637 ac_cxx_can_include_thread_header=no
   1638 AC_MSG_RESULT([no])
   1639 ])
   1640 CXXFLAGS=$safe_CXXFLAGS
   1641 AC_LANG(C)
   1642 
   1643 AM_CONDITIONAL(CXX_CAN_INCLUDE_THREAD_HEADER, test x$ac_cxx_can_include_thread_header = xyes)
   1644 
   1645 
   1646 # On aarch64 before glibc 2.20 we would get the kernel user_pt_regs instead
   1647 # of the user_regs_struct from sys/user.h. They are structurally the same
   1648 # but we get either one or the other.
   1649 
   1650 AC_CHECK_TYPE([struct user_regs_struct],
   1651               [sys_user_has_user_regs=yes], [sys_user_has_user_regs=no],
   1652               [[#include <sys/ptrace.h>]
   1653                [#include <sys/time.h>]
   1654                [#include <sys/user.h>]])
   1655 if test "$sys_user_has_user_regs" = "yes"; then
   1656   AC_DEFINE(HAVE_SYS_USER_REGS, 1,
   1657             [Define to 1 if <sys/user.h> defines struct user_regs_struct])
   1658 fi
   1659 
   1660 
   1661 #----------------------------------------------------------------------------
   1662 # Checking for supported compiler flags.
   1663 #----------------------------------------------------------------------------
   1664 
   1665 # does this compiler support -m32 ?
   1666 AC_MSG_CHECKING([if gcc accepts -m32])
   1667 
   1668 safe_CFLAGS=$CFLAGS
   1669 CFLAGS="-m32 -Werror"
   1670 
   1671 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
   1672   return 0;
   1673 ]])], [
   1674 FLAG_M32="-m32"
   1675 AC_MSG_RESULT([yes])
   1676 ], [
   1677 FLAG_M32=""
   1678 AC_MSG_RESULT([no])
   1679 ])
   1680 CFLAGS=$safe_CFLAGS
   1681 
   1682 AC_SUBST(FLAG_M32)
   1683 
   1684 
   1685 # does this compiler support -m64 ?
   1686 AC_MSG_CHECKING([if gcc accepts -m64])
   1687 
   1688 safe_CFLAGS=$CFLAGS
   1689 CFLAGS="-m64 -Werror"
   1690 
   1691 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
   1692   return 0;
   1693 ]])], [
   1694 FLAG_M64="-m64"
   1695 AC_MSG_RESULT([yes])
   1696 ], [
   1697 FLAG_M64=""
   1698 AC_MSG_RESULT([no])
   1699 ])
   1700 CFLAGS=$safe_CFLAGS
   1701 
   1702 AC_SUBST(FLAG_M64)
   1703 
   1704 
   1705 # does this compiler support -march=mips32 (mips32 default) ?
   1706 AC_MSG_CHECKING([if gcc accepts -march=mips32])
   1707 
   1708 safe_CFLAGS=$CFLAGS
   1709 CFLAGS="$CFLAGS -march=mips32 -Werror"
   1710 
   1711 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
   1712   return 0;
   1713 ]])], [
   1714 FLAG_MIPS32="-march=mips32"
   1715 AC_MSG_RESULT([yes])
   1716 ], [
   1717 FLAG_MIPS32=""
   1718 AC_MSG_RESULT([no])
   1719 ])
   1720 CFLAGS=$safe_CFLAGS
   1721 
   1722 AC_SUBST(FLAG_MIPS32)
   1723 
   1724 
   1725 # does this compiler support -march=mips64 (mips64 default) ?
   1726 AC_MSG_CHECKING([if gcc accepts -march=mips64])
   1727 
   1728 safe_CFLAGS=$CFLAGS
   1729 CFLAGS="$CFLAGS -march=mips64 -Werror"
   1730 
   1731 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
   1732   return 0;
   1733 ]])], [
   1734 FLAG_MIPS64="-march=mips64"
   1735 AC_MSG_RESULT([yes])
   1736 ], [
   1737 FLAG_MIPS64=""
   1738 AC_MSG_RESULT([no])
   1739 ])
   1740 CFLAGS=$safe_CFLAGS
   1741 
   1742 AC_SUBST(FLAG_MIPS64)
   1743 
   1744 
   1745 # does this compiler support -march=octeon (Cavium OCTEON I Specific) ?
   1746 AC_MSG_CHECKING([if gcc accepts -march=octeon])
   1747 
   1748 safe_CFLAGS=$CFLAGS
   1749 CFLAGS="$CFLAGS -march=octeon -Werror"
   1750 
   1751 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
   1752   return 0;
   1753 ]])], [
   1754 FLAG_OCTEON="-march=octeon"
   1755 AC_MSG_RESULT([yes])
   1756 ], [
   1757 FLAG_OCTEON=""
   1758 AC_MSG_RESULT([no])
   1759 ])
   1760 CFLAGS=$safe_CFLAGS
   1761 
   1762 AC_SUBST(FLAG_OCTEON)
   1763 
   1764 
   1765 # does this compiler support -march=octeon2 (Cavium OCTEON II Specific) ?
   1766 AC_MSG_CHECKING([if gcc accepts -march=octeon2])
   1767 
   1768 safe_CFLAGS=$CFLAGS
   1769 CFLAGS="$CFLAGS -march=octeon2 -Werror"
   1770 
   1771 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
   1772   return 0;
   1773 ]])], [
   1774 FLAG_OCTEON2="-march=octeon2"
   1775 AC_MSG_RESULT([yes])
   1776 ], [
   1777 FLAG_OCTEON2=""
   1778 AC_MSG_RESULT([no])
   1779 ])
   1780 CFLAGS=$safe_CFLAGS
   1781 
   1782 AC_SUBST(FLAG_OCTEON2)
   1783 
   1784 
   1785 # does this compiler support -mmmx ?
   1786 AC_MSG_CHECKING([if gcc accepts -mmmx])
   1787 
   1788 safe_CFLAGS=$CFLAGS
   1789 CFLAGS="-mmmx -Werror"
   1790 
   1791 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
   1792   return 0;
   1793 ]])], [
   1794 FLAG_MMMX="-mmmx"
   1795 AC_MSG_RESULT([yes])
   1796 ], [
   1797 FLAG_MMMX=""
   1798 AC_MSG_RESULT([no])
   1799 ])
   1800 CFLAGS=$safe_CFLAGS
   1801 
   1802 AC_SUBST(FLAG_MMMX)
   1803 
   1804 
   1805 # does this compiler support -msse ?
   1806 AC_MSG_CHECKING([if gcc accepts -msse])
   1807 
   1808 safe_CFLAGS=$CFLAGS
   1809 CFLAGS="-msse -Werror"
   1810 
   1811 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
   1812   return 0;
   1813 ]])], [
   1814 FLAG_MSSE="-msse"
   1815 AC_MSG_RESULT([yes])
   1816 ], [
   1817 FLAG_MSSE=""
   1818 AC_MSG_RESULT([no])
   1819 ])
   1820 CFLAGS=$safe_CFLAGS
   1821 
   1822 AC_SUBST(FLAG_MSSE)
   1823 
   1824 
   1825 # does this compiler support -mpreferred-stack-boundary=2 when
   1826 # generating code for a 32-bit target?  Note that we only care about
   1827 # this when generating code for (32-bit) x86, so if the compiler
   1828 # doesn't recognise -m32 it's no big deal.  We'll just get code for
   1829 # the Memcheck and other helper functions, that is a bit slower than
   1830 # it could be, on x86; and no difference at all on any other platform.
   1831 AC_MSG_CHECKING([if gcc accepts -mpreferred-stack-boundary=2 -m32])
   1832 
   1833 safe_CFLAGS=$CFLAGS
   1834 CFLAGS="-mpreferred-stack-boundary=2 -m32 -Werror"
   1835 
   1836 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
   1837   return 0;
   1838 ]])], [
   1839 PREFERRED_STACK_BOUNDARY_2="-mpreferred-stack-boundary=2"
   1840 AC_MSG_RESULT([yes])
   1841 ], [
   1842 PREFERRED_STACK_BOUNDARY_2=""
   1843 AC_MSG_RESULT([no])
   1844 ])
   1845 CFLAGS=$safe_CFLAGS
   1846 
   1847 AC_SUBST(PREFERRED_STACK_BOUNDARY_2)
   1848 
   1849 
   1850 # does this compiler support -mlong-double-128 ?
   1851 AC_MSG_CHECKING([if gcc accepts -mlong-double-128])
   1852 safe_CFLAGS=$CFLAGS
   1853 CFLAGS="-mlong-double-128 -Werror"
   1854 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
   1855   return 0;
   1856 ]])], [
   1857 ac_compiler_supports_mlong_double_128=yes
   1858 AC_MSG_RESULT([yes])
   1859 ], [
   1860 ac_compiler_supports_mlong_double_128=no
   1861 AC_MSG_RESULT([no])
   1862 ])
   1863 CFLAGS=$safe_CFLAGS
   1864 AM_CONDITIONAL(HAS_MLONG_DOUBLE_128, test x$ac_compiler_supports_mlong_double_128 = xyes)
   1865 FLAG_MLONG_DOUBLE_128="-mlong-double-128"
   1866 AC_SUBST(FLAG_MLONG_DOUBLE_128)
   1867 
   1868 
   1869 # Convenience function to check whether GCC supports a particular
   1870 # warning option. Takes two arguments,
   1871 # first the warning flag name to check (without -W), then the
   1872 # substitution name to set with -Wno-warning-flag if the flag exists,
   1873 # or the empty string if the compiler doesn't accept the flag. Note
   1874 # that checking is done against the warning flag itself, but the
   1875 # substitution is then done to cancel the warning flag.
   1876 AC_DEFUN([AC_GCC_WARNING_SUBST_NO],[
   1877   AC_MSG_CHECKING([if gcc accepts -W$1])
   1878   safe_CFLAGS=$CFLAGS
   1879   CFLAGS="-W$1 -Werror"
   1880   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[;]])], [
   1881   AC_SUBST([$2], [-Wno-$1])
   1882   AC_MSG_RESULT([yes])], [
   1883   AC_SUBST([$2], [])
   1884   AC_MSG_RESULT([no])])
   1885   CFLAGS=$safe_CFLAGS
   1886 ])
   1887 
   1888 # Convenience function. Like AC_GCC_WARNING_SUBST_NO, except it substitutes
   1889 # -W$1  (instead of -Wno-$1).
   1890 AC_DEFUN([AC_GCC_WARNING_SUBST],[
   1891   AC_MSG_CHECKING([if gcc accepts -W$1])
   1892   safe_CFLAGS=$CFLAGS
   1893   CFLAGS="-W$1 -Werror"
   1894   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[;]])], [
   1895   AC_SUBST([$2], [-W$1])
   1896   AC_MSG_RESULT([yes])], [
   1897   AC_SUBST([$2], [])
   1898   AC_MSG_RESULT([no])])
   1899   CFLAGS=$safe_CFLAGS
   1900 ])
   1901 
   1902 AC_GCC_WARNING_SUBST_NO([memset-transposed-args], [FLAG_W_NO_MEMSET_TRANSPOSED_ARGS])
   1903 AC_GCC_WARNING_SUBST_NO([nonnull], [FLAG_W_NO_NONNULL])
   1904 AC_GCC_WARNING_SUBST_NO([overflow], [FLAG_W_NO_OVERFLOW])
   1905 AC_GCC_WARNING_SUBST_NO([pointer-sign], [FLAG_W_NO_POINTER_SIGN])
   1906 AC_GCC_WARNING_SUBST_NO([uninitialized], [FLAG_W_NO_UNINITIALIZED])
   1907 AC_GCC_WARNING_SUBST_NO([unused-function], [FLAG_W_NO_UNUSED_FUNCTION])
   1908 AC_GCC_WARNING_SUBST_NO([static-local-in-inline], [FLAG_W_NO_STATIC_LOCAL_IN_INLINE])
   1909 AC_GCC_WARNING_SUBST_NO([mismatched-new-delete], [FLAG_W_NO_MISMATCHED_NEW_DELETE])
   1910 AC_GCC_WARNING_SUBST_NO([infinite-recursion], [FLAG_W_NO_INFINITE_RECURSION])
   1911 AC_GCC_WARNING_SUBST([write-strings], [FLAG_W_WRITE_STRINGS])
   1912 AC_GCC_WARNING_SUBST([empty-body], [FLAG_W_EMPTY_BODY])
   1913 AC_GCC_WARNING_SUBST([format], [FLAG_W_FORMAT])
   1914 # Disabled for now until all platforms are clean
   1915 format_checking_enabled=no
   1916 #format_checking_enabled=yes
   1917 if test "$format_checking_enabled" = "yes"; then
   1918    AC_GCC_WARNING_SUBST([format-signedness], [FLAG_W_FORMAT_SIGNEDNESS])
   1919 else
   1920    dumy_assignment_to_avoid_syntax_errors=1
   1921    AC_SUBST([FLAG_W_FORMAT_SIGNEDNESS], [])
   1922 fi
   1923 AC_GCC_WARNING_SUBST([cast-qual], [FLAG_W_CAST_QUAL])
   1924 AC_GCC_WARNING_SUBST([old-style-declaration], [FLAG_W_OLD_STYLE_DECLARATION])
   1925 AC_GCC_WARNING_SUBST([ignored-qualifiers], [FLAG_W_IGNORED_QUALIFIERS])
   1926 AC_GCC_WARNING_SUBST([missing-parameter-type], [FLAG_W_MISSING_PARAMETER_TYPE])
   1927 
   1928 # Does this compiler support -Wformat-security ?
   1929 # Special handling is needed, because certain GCC versions require -Wformat
   1930 # being present if -Wformat-security is given. Otherwise a warning is issued.
   1931 # However, AC_GCC_WARNING_SUBST will stick in -Werror (see r15323 for rationale).
   1932 # And with that the warning will be turned into an error with the result
   1933 # that -Wformat-security is believed to be unsupported when in fact it is.
   1934 AC_MSG_CHECKING([if gcc accepts -Wformat-security])
   1935 safe_CFLAGS=$CFLAGS
   1936 CFLAGS="-Wformat -Wformat-security -Werror"
   1937 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[;]])], [
   1938 AC_SUBST([FLAG_W_FORMAT_SECURITY], [-Wformat-security])
   1939 AC_MSG_RESULT([yes])], [
   1940 AC_SUBST([FLAG_W_FORMAT_SECURITY], [])
   1941 AC_MSG_RESULT([no])])
   1942 CFLAGS=$safe_CFLAGS
   1943 
   1944 # does this compiler support -Wextra or the older -W ?
   1945 
   1946 AC_MSG_CHECKING([if gcc accepts -Wextra or -W])
   1947 
   1948 safe_CFLAGS=$CFLAGS
   1949 CFLAGS="-Wextra -Werror"
   1950 
   1951 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ ]], [[
   1952   return 0;
   1953 ]])], [
   1954 AC_SUBST([FLAG_W_EXTRA], [-Wextra])
   1955 AC_MSG_RESULT([-Wextra])
   1956 ], [
   1957   CFLAGS="-W -Werror"
   1958   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ ]], [[
   1959     return 0;
   1960   ]])], [
   1961   AC_SUBST([FLAG_W_EXTRA], [-W])
   1962   AC_MSG_RESULT([-W])
   1963   ], [
   1964   AC_SUBST([FLAG_W_EXTRA], [])
   1965   AC_MSG_RESULT([not supported])
   1966   ])
   1967 ])
   1968 CFLAGS=$safe_CFLAGS
   1969 
   1970 # On ARM we do not want to pass -Wcast-align as that produces loads
   1971 # of warnings. GCC is just being conservative. See here:
   1972 # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65459#c4
   1973 if test "X$VGCONF_ARCH_PRI" = "Xarm"; then
   1974   AC_SUBST([FLAG_W_CAST_ALIGN], [""])
   1975 else
   1976   AC_SUBST([FLAG_W_CAST_ALIGN], [-Wcast-align])
   1977 fi
   1978 
   1979 # does this compiler support -fno-stack-protector ?
   1980 AC_MSG_CHECKING([if gcc accepts -fno-stack-protector])
   1981 
   1982 safe_CFLAGS=$CFLAGS
   1983 CFLAGS="-fno-stack-protector -Werror"
   1984 
   1985 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
   1986   return 0;
   1987 ]])], [
   1988 no_stack_protector=yes
   1989 FLAG_FNO_STACK_PROTECTOR="-fno-stack-protector"
   1990 AC_MSG_RESULT([yes])
   1991 ], [
   1992 no_stack_protector=no
   1993 FLAG_FNO_STACK_PROTECTOR=""
   1994 AC_MSG_RESULT([no])
   1995 ])
   1996 CFLAGS=$safe_CFLAGS
   1997 
   1998 AC_SUBST(FLAG_FNO_STACK_PROTECTOR)
   1999 
   2000 # Does GCC support disabling Identical Code Folding?
   2001 # We want to disabled Identical Code Folding for the
   2002 # tools preload shared objects to get better backraces.
   2003 # For GCC 5.1+ -fipa-icf is enabled by default at -O2.
   2004 # "The optimization reduces code size and may disturb
   2005 #  unwind stacks by replacing a function by equivalent
   2006 #  one with a different name."
   2007 AC_MSG_CHECKING([if gcc accepts -fno-ipa-icf])
   2008 
   2009 safe_CFLAGS=$CFLAGS
   2010 CFLAGS="-fno-ipa-icf -Werror"
   2011 
   2012 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
   2013   return 0;
   2014 ]])], [
   2015 no_ipa_icf=yes
   2016 FLAG_FNO_IPA_ICF="-fno-ipa-icf"
   2017 AC_MSG_RESULT([yes])
   2018 ], [
   2019 no_ipa_icf=no
   2020 FLAG_FNO_IPA_ICF=""
   2021 AC_MSG_RESULT([no])
   2022 ])
   2023 CFLAGS=$safe_CFLAGS
   2024 
   2025 AC_SUBST(FLAG_FNO_IPA_ICF)
   2026 
   2027 
   2028 # Does this compiler support -fsanitize=undefined. This is true for
   2029 # GCC 4.9 and newer. However, the undefined behaviour sanitiser in GCC 5.1
   2030 # also checks for alignment violations on memory accesses which the valgrind
   2031 # code base is sprinkled (if not littered) with. As those alignment issues
   2032 # don't pose a problem we want to suppress warnings about them.
   2033 # In GCC 5.1 this can be done by passing -fno-sanitize=alignment. Earlier
   2034 # GCCs do not support that.
   2035 #
   2036 # Only checked for if --enable-ubsan was given.
   2037 if test "x${vg_cv_ubsan}" = "xyes"; then
   2038 AC_MSG_CHECKING([if gcc accepts -fsanitize=undefined -fno-sanitize=alignment])
   2039 safe_CFLAGS=$CFLAGS
   2040 CFLAGS="-fsanitize=undefined -fno-sanitize=alignment -Werror"
   2041 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
   2042   return 0;
   2043 ]])], [
   2044 FLAG_FSANITIZE="-fsanitize=undefined -fno-sanitize=alignment"
   2045 LIB_UBSAN="-static-libubsan"
   2046 AC_MSG_RESULT([yes])
   2047 ], [
   2048 CFLAGS="-fsanitize=undefined -Werror"
   2049 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
   2050   return 0;
   2051 ]])], [
   2052 FLAG_FSANITIZE="-fsanitize=undefined"
   2053 LIB_UBSAN="-static-libubsan"
   2054 AC_MSG_RESULT([yes])
   2055 ], [
   2056 FLAG_FSANITIZE=""
   2057 LIB_UBSAN=""
   2058 AC_MSG_RESULT([no])
   2059 ])
   2060 ])
   2061 CFLAGS=$safe_CFLAGS
   2062 AC_SUBST(FLAG_FSANITIZE)
   2063 AC_SUBST(LIB_UBSAN)
   2064 fi
   2065 # does this compiler support --param inline-unit-growth=... ?
   2066 
   2067 AC_MSG_CHECKING([if gcc accepts --param inline-unit-growth])
   2068 
   2069 safe_CFLAGS=$CFLAGS
   2070 CFLAGS="--param inline-unit-growth=900 -Werror"
   2071 
   2072 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ ]], [[
   2073   return 0;
   2074 ]])], [
   2075 AC_SUBST([FLAG_UNLIMITED_INLINE_UNIT_GROWTH],
   2076          ["--param inline-unit-growth=900"])
   2077 AC_MSG_RESULT([yes])
   2078 ], [
   2079 AC_SUBST([FLAG_UNLIMITED_INLINE_UNIT_GROWTH], [""])
   2080 AC_MSG_RESULT([no])
   2081 ])
   2082 CFLAGS=$safe_CFLAGS
   2083 
   2084 
   2085 # does this compiler support -gdwarf-4 -fdebug-types-section ?
   2086 
   2087 AC_MSG_CHECKING([if gcc accepts -gdwarf-4 -fdebug-types-section])
   2088 
   2089 safe_CFLAGS=$CFLAGS
   2090 CFLAGS="-gdwarf-4 -fdebug-types-section -Werror"
   2091 
   2092 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ ]], [[
   2093   return 0;
   2094 ]])], [
   2095 ac_have_dwarf4=yes
   2096 AC_MSG_RESULT([yes])
   2097 ], [
   2098 ac_have_dwarf4=no
   2099 AC_MSG_RESULT([no])
   2100 ])
   2101 AM_CONDITIONAL(DWARF4, test x$ac_have_dwarf4 = xyes)
   2102 CFLAGS=$safe_CFLAGS
   2103 
   2104 
   2105 # does this compiler support nested functions ?
   2106 
   2107 AC_MSG_CHECKING([if gcc accepts nested functions])
   2108 
   2109 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
   2110   int foo() { return 1; }
   2111   return foo();
   2112 ]])], [
   2113 ac_have_nested_functions=yes
   2114 AC_MSG_RESULT([yes])
   2115 ], [
   2116 ac_have_nested_functions=no
   2117 AC_MSG_RESULT([no])
   2118 ])
   2119 AM_CONDITIONAL([HAVE_NESTED_FUNCTIONS], [test x$ac_have_nested_functions = xyes])
   2120 
   2121 
   2122 # does this compiler support the 'p' constraint in ASM statements ?
   2123 
   2124 AC_MSG_CHECKING([if gcc accepts the 'p' constraint in asm statements])
   2125 
   2126 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
   2127    char *p;
   2128    __asm__ __volatile__ ("movdqa (%0),%%xmm6\n" : "=p" (p));
   2129 ]])], [
   2130 ac_have_asm_constraint_p=yes
   2131 AC_MSG_RESULT([yes])
   2132 ], [
   2133 ac_have_asm_constraint_p=no
   2134 AC_MSG_RESULT([no])
   2135 ])
   2136 AM_CONDITIONAL([HAVE_ASM_CONSTRAINT_P], [test x$ac_have_asm_constraint_p = xyes])
   2137 
   2138 
   2139 # We want to use use the -Ttext-segment option to the linker.
   2140 # GNU (bfd) ld supports this directly. Newer GNU gold linkers
   2141 # support it as an alias of -Ttext. Sadly GNU (bfd) ld's -Ttext
   2142 # semantics are NOT what we want (GNU gold -Ttext is fine).
   2143 #
   2144 # For GNU (bfd) ld -Ttext-segment chooses the base at which ELF headers
   2145 # will reside. -Ttext aligns just the .text section start (but not any
   2146 # other section).
   2147 #
   2148 # So test for -Ttext-segment which is supported by all bfd ld versions
   2149 # and use that if it exists. If it doesn't exist it must be an older
   2150 # version of gold and we can fall back to using -Ttext which has the
   2151 # right semantics.
   2152 
   2153 AC_MSG_CHECKING([if the linker accepts -Wl,-Ttext-segment])
   2154 
   2155 safe_CFLAGS=$CFLAGS
   2156 CFLAGS="-static -nodefaultlibs -nostartfiles -Wl,-Ttext-segment=$valt_load_address_pri_norml -Werror"
   2157 
   2158 AC_LINK_IFELSE(
   2159 [AC_LANG_SOURCE([int _start () { return 0; }])],
   2160 [
   2161   linker_using_t_text="no"
   2162   AC_SUBST([FLAG_T_TEXT], ["-Ttext-segment"])
   2163   AC_MSG_RESULT([yes])
   2164 ], [
   2165   linker_using_t_text="yes"
   2166   AC_SUBST([FLAG_T_TEXT], ["-Ttext"])
   2167   AC_MSG_RESULT([no])
   2168 ])
   2169 CFLAGS=$safe_CFLAGS
   2170 
   2171 # If the linker only supports -Ttext (not -Ttext-segment) then we will
   2172 # have to strip any build-id ELF NOTEs from the staticly linked tools.
   2173 # Otherwise the build-id NOTE might end up at the default load address.
   2174 # (Pedantically if the linker is gold then -Ttext is fine, but newer
   2175 # gold versions also support -Ttext-segment. So just assume that unless
   2176 # we can use -Ttext-segment we need to strip the build-id NOTEs.
   2177 if test "x${linker_using_t_text}" = "xyes"; then
   2178 AC_MSG_NOTICE([ld -Ttext used, need to strip build-id NOTEs.])
   2179 # does the linker support -Wl,--build-id=none ?  Note, it's
   2180 # important that we test indirectly via whichever C compiler
   2181 # is selected, rather than testing /usr/bin/ld or whatever
   2182 # directly.
   2183 AC_MSG_CHECKING([if the linker accepts -Wl,--build-id=none])
   2184 safe_CFLAGS=$CFLAGS
   2185 CFLAGS="-Wl,--build-id=none -Werror"
   2186 
   2187 AC_LINK_IFELSE(
   2188 [AC_LANG_PROGRAM([ ], [return 0;])],
   2189 [
   2190   AC_SUBST([FLAG_NO_BUILD_ID], ["-Wl,--build-id=none"])
   2191   AC_MSG_RESULT([yes])
   2192 ], [
   2193   AC_SUBST([FLAG_NO_BUILD_ID], [""])
   2194   AC_MSG_RESULT([no])
   2195 ])
   2196 else
   2197 AC_MSG_NOTICE([ld -Ttext-segment used, no need to strip build-id NOTEs.])
   2198 AC_SUBST([FLAG_NO_BUILD_ID], [""])
   2199 fi
   2200 CFLAGS=$safe_CFLAGS
   2201 
   2202 # does the ppc assembler support "mtocrf" et al?
   2203 AC_MSG_CHECKING([if ppc32/64 as supports mtocrf/mfocrf])
   2204 
   2205 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
   2206 __asm__ __volatile__("mtocrf 4,0");
   2207 __asm__ __volatile__("mfocrf 0,4");
   2208 ]])], [
   2209 ac_have_as_ppc_mftocrf=yes
   2210 AC_MSG_RESULT([yes])
   2211 ], [
   2212 ac_have_as_ppc_mftocrf=no
   2213 AC_MSG_RESULT([no])
   2214 ])
   2215 if test x$ac_have_as_ppc_mftocrf = xyes ; then
   2216   AC_DEFINE(HAVE_AS_PPC_MFTOCRF, 1, [Define to 1 if as supports mtocrf/mfocrf.])
   2217 fi
   2218 
   2219 
   2220 # does the ppc assembler support "lfdp" and other phased out floating point insns?
   2221 AC_MSG_CHECKING([if ppc32/64 asm supports phased out floating point instructions])
   2222 
   2223 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
   2224   do { typedef struct {
   2225       double hi;
   2226       double lo;
   2227      } dbl_pair_t;
   2228      dbl_pair_t dbl_pair[3];
   2229      __asm__ volatile ("lfdp 10, %0"::"m" (dbl_pair[0]));
   2230    } while (0)
   2231 ]])], [
   2232 ac_have_as_ppc_fpPO=yes
   2233 AC_MSG_RESULT([yes])
   2234 ], [
   2235 ac_have_as_ppc_fpPO=no
   2236 AC_MSG_RESULT([no])
   2237 ])
   2238 if test x$ac_have_as_ppc_fpPO = xyes ; then
   2239   AC_DEFINE(HAVE_AS_PPC_FPPO, 1, [Define to 1 if as supports floating point phased out category.])
   2240 fi
   2241 
   2242 
   2243 # does the amd64 assembler understand "fxsave64" and "fxrstor64"?
   2244 AC_MSG_CHECKING([if amd64 assembler supports fxsave64/fxrstor64])
   2245 
   2246 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
   2247 void* p;
   2248 asm __volatile__("fxsave64 (%0)" : : "r" (p) : "memory" );
   2249 asm __volatile__("fxrstor64 (%0)" : : "r" (p) : "memory" );
   2250 ]])], [
   2251 ac_have_as_amd64_fxsave64=yes
   2252 AC_MSG_RESULT([yes])
   2253 ], [
   2254 ac_have_as_amd64_fxsave64=no
   2255 AC_MSG_RESULT([no])
   2256 ])
   2257 if test x$ac_have_as_amd64_fxsave64 = xyes ; then
   2258   AC_DEFINE(HAVE_AS_AMD64_FXSAVE64, 1, [Define to 1 if as supports fxsave64/fxrstor64.])
   2259 fi
   2260 
   2261 # does the x86/amd64 assembler understand SSE3 instructions?
   2262 # Note, this doesn't generate a C-level symbol.  It generates a
   2263 # automake-level symbol (BUILD_SSE3_TESTS), used in test Makefile.am's
   2264 AC_MSG_CHECKING([if x86/amd64 assembler speaks SSE3])
   2265 
   2266 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
   2267   do { long long int x; 
   2268      __asm__ __volatile__("fisttpq (%0)" : :"r"(&x) ); } 
   2269   while (0)
   2270 ]])], [
   2271 ac_have_as_sse3=yes
   2272 AC_MSG_RESULT([yes])
   2273 ], [
   2274 ac_have_as_sse3=no
   2275 AC_MSG_RESULT([no])
   2276 ])
   2277 
   2278 AM_CONDITIONAL(BUILD_SSE3_TESTS, test x$ac_have_as_sse3 = xyes)
   2279 
   2280 
   2281 # Ditto for SSSE3 instructions (note extra S)
   2282 # Note, this doesn't generate a C-level symbol.  It generates a
   2283 # automake-level symbol (BUILD_SSSE3_TESTS), used in test Makefile.am's
   2284 AC_MSG_CHECKING([if x86/amd64 assembler speaks SSSE3])
   2285 
   2286 save_CFLAGS="$CFLAGS"
   2287 CFLAGS="$CFLAGS -msse -Werror"
   2288 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
   2289   do { long long int x; 
   2290    __asm__ __volatile__(
   2291       "pabsb (%0),%%xmm7" : : "r"(&x) : "xmm7" ); }
   2292   while (0)
   2293 ]])], [
   2294 ac_have_as_ssse3=yes
   2295 AC_MSG_RESULT([yes])
   2296 ], [
   2297 ac_have_as_ssse3=no
   2298 AC_MSG_RESULT([no])
   2299 ])
   2300 CFLAGS="$save_CFLAGS"
   2301 
   2302 AM_CONDITIONAL(BUILD_SSSE3_TESTS, test x$ac_have_as_ssse3 = xyes)
   2303 
   2304 
   2305 # does the x86/amd64 assembler understand the PCLMULQDQ instruction?
   2306 # Note, this doesn't generate a C-level symbol.  It generates a
   2307 # automake-level symbol (BUILD_PCLMULQDQ_TESTS), used in test Makefile.am's
   2308 AC_MSG_CHECKING([if x86/amd64 assembler supports 'pclmulqdq'])
   2309 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
   2310   do {
   2311    __asm__ __volatile__(
   2312       "pclmulqdq \$17,%%xmm6,%%xmm7" : : : "xmm6", "xmm7" ); }
   2313   while (0)
   2314 ]])], [
   2315 ac_have_as_pclmulqdq=yes
   2316 AC_MSG_RESULT([yes])
   2317 ], [
   2318 ac_have_as_pclmulqdq=no
   2319 AC_MSG_RESULT([no])
   2320 ])
   2321 
   2322 AM_CONDITIONAL(BUILD_PCLMULQDQ_TESTS, test x$ac_have_as_pclmulqdq = xyes)
   2323 
   2324 
   2325 # does the x86/amd64 assembler understand the VPCLMULQDQ instruction?
   2326 # Note, this doesn't generate a C-level symbol.  It generates a
   2327 # automake-level symbol (BUILD_VPCLMULQDQ_TESTS), used in test Makefile.am's
   2328 AC_MSG_CHECKING([if x86/amd64 assembler supports 'vpclmulqdq'])
   2329 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
   2330   do {
   2331       /*
   2332        * Carry-less multiplication of xmm1 with xmm2 and store the result in
   2333        * xmm3. The immediate is used to determine which quadwords of xmm1 and
   2334        * xmm2 should be used.
   2335        */
   2336    __asm__ __volatile__(
   2337       "vpclmulqdq \$0,%%xmm1,%%xmm2,%%xmm3" : : : );
   2338   } while (0)
   2339 ]])], [
   2340 ac_have_as_vpclmulqdq=yes
   2341 AC_MSG_RESULT([yes])
   2342 ], [
   2343 ac_have_as_vpclmulqdq=no
   2344 AC_MSG_RESULT([no])
   2345 ])
   2346 
   2347 AM_CONDITIONAL(BUILD_VPCLMULQDQ_TESTS, test x$ac_have_as_vpclmulqdq = xyes)
   2348 
   2349 
   2350 # does the x86/amd64 assembler understand the LZCNT instruction?
   2351 # Note, this doesn't generate a C-level symbol.  It generates a
   2352 # automake-level symbol (BUILD_LZCNT_TESTS), used in test Makefile.am's
   2353 AC_MSG_CHECKING([if x86/amd64 assembler supports 'lzcnt'])
   2354 
   2355 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
   2356   do { 		 
   2357       __asm__ __volatile__("lzcnt %%rax,%%rax" : : : "rax");
   2358   } while (0)
   2359 ]])], [
   2360   ac_have_as_lzcnt=yes
   2361   AC_MSG_RESULT([yes])
   2362 ], [
   2363   ac_have_as_lzcnt=no
   2364   AC_MSG_RESULT([no])
   2365 ])
   2366 
   2367 AM_CONDITIONAL([BUILD_LZCNT_TESTS], [test x$ac_have_as_lzcnt = xyes])
   2368 
   2369 
   2370 # does the x86/amd64 assembler understand the LOOPNEL instruction?
   2371 # Note, this doesn't generate a C-level symbol.  It generates a
   2372 # automake-level symbol (BUILD_LOOPNEL_TESTS), used in test Makefile.am's
   2373 AC_MSG_CHECKING([if x86/amd64 assembler supports 'loopnel'])
   2374 
   2375 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
   2376   do { 		 
   2377       __asm__ __volatile__("1:  loopnel 1b\n");
   2378   } while (0)
   2379 ]])], [
   2380   ac_have_as_loopnel=yes
   2381   AC_MSG_RESULT([yes])
   2382 ], [
   2383   ac_have_as_loopnel=no
   2384   AC_MSG_RESULT([no])
   2385 ])
   2386 
   2387 AM_CONDITIONAL([BUILD_LOOPNEL_TESTS], [test x$ac_have_as_loopnel = xyes])
   2388 
   2389 
   2390 # does the x86/amd64 assembler understand ADDR32 ?
   2391 # Note, this doesn't generate a C-level symbol.  It generates a
   2392 # automake-level symbol (BUILD_ADDR32_TESTS), used in test Makefile.am's
   2393 AC_MSG_CHECKING([if x86/amd64 assembler supports 'addr32'])
   2394 
   2395 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
   2396   do { 		 
   2397       asm volatile ("addr32 rep movsb");
   2398   } while (0)
   2399 ]])], [
   2400   ac_have_as_addr32=yes
   2401   AC_MSG_RESULT([yes])
   2402 ], [
   2403   ac_have_as_addr32=no
   2404   AC_MSG_RESULT([no])
   2405 ])
   2406 
   2407 AM_CONDITIONAL([BUILD_ADDR32_TESTS], [test x$ac_have_as_addr32 = xyes])
   2408 
   2409 
   2410 # does the x86/amd64 assembler understand SSE 4.2 instructions?
   2411 # Note, this doesn't generate a C-level symbol.  It generates a
   2412 # automake-level symbol (BUILD_SSE42_TESTS), used in test Makefile.am's
   2413 AC_MSG_CHECKING([if x86/amd64 assembler speaks SSE4.2])
   2414 
   2415 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
   2416   do { long long int x; 
   2417    __asm__ __volatile__(
   2418       "crc32q %%r15,%%r15" : : : "r15" );
   2419    __asm__ __volatile__(
   2420       "pblendvb (%%rcx), %%xmm11" : : : "memory", "xmm11"); 
   2421    __asm__ __volatile__(
   2422       "aesdec %%xmm2, %%xmm1" : : : "xmm2", "xmm1"); }
   2423   while (0)
   2424 ]])], [
   2425 ac_have_as_sse42=yes
   2426 AC_MSG_RESULT([yes])
   2427 ], [
   2428 ac_have_as_sse42=no
   2429 AC_MSG_RESULT([no])
   2430 ])
   2431 
   2432 AM_CONDITIONAL(BUILD_SSE42_TESTS, test x$ac_have_as_sse42 = xyes)
   2433 
   2434 
   2435 # does the x86/amd64 assembler understand AVX instructions?
   2436 # Note, this doesn't generate a C-level symbol.  It generates a
   2437 # automake-level symbol (BUILD_AVX_TESTS), used in test Makefile.am's
   2438 AC_MSG_CHECKING([if x86/amd64 assembler speaks AVX])
   2439 
   2440 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
   2441   do { long long int x; 
   2442    __asm__ __volatile__(
   2443       "vmovupd (%%rsp), %%ymm7" : : : "xmm7" );
   2444    __asm__ __volatile__(
   2445       "vaddpd %%ymm6,%%ymm7,%%ymm8" : : : "xmm6","xmm7","xmm8"); }
   2446   while (0)
   2447 ]])], [
   2448 ac_have_as_avx=yes
   2449 AC_MSG_RESULT([yes])
   2450 ], [
   2451 ac_have_as_avx=no
   2452 AC_MSG_RESULT([no])
   2453 ])
   2454 
   2455 AM_CONDITIONAL(BUILD_AVX_TESTS, test x$ac_have_as_avx = xyes)
   2456 
   2457 
   2458 # does the x86/amd64 assembler understand AVX2 instructions?
   2459 # Note, this doesn't generate a C-level symbol.  It generates a
   2460 # automake-level symbol (BUILD_AVX2_TESTS), used in test Makefile.am's
   2461 AC_MSG_CHECKING([if x86/amd64 assembler speaks AVX2])
   2462 
   2463 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
   2464   do { long long int x; 
   2465    __asm__ __volatile__(
   2466       "vpsravd (%%rsp), %%ymm8, %%ymm7" : : : "xmm7", "xmm8" );
   2467    __asm__ __volatile__(
   2468       "vpaddb %%ymm6,%%ymm7,%%ymm8" : : : "xmm6","xmm7","xmm8"); }
   2469   while (0)
   2470 ]])], [
   2471 ac_have_as_avx2=yes
   2472 AC_MSG_RESULT([yes])
   2473 ], [
   2474 ac_have_as_avx2=no
   2475 AC_MSG_RESULT([no])
   2476 ])
   2477 
   2478 AM_CONDITIONAL(BUILD_AVX2_TESTS, test x$ac_have_as_avx2 = xyes)
   2479 
   2480 
   2481 # does the x86/amd64 assembler understand TSX instructions and
   2482 # the XACQUIRE/XRELEASE prefixes?
   2483 # Note, this doesn't generate a C-level symbol.  It generates a
   2484 # automake-level symbol (BUILD_TSX_TESTS), used in test Makefile.am's
   2485 AC_MSG_CHECKING([if x86/amd64 assembler speaks TSX])
   2486 
   2487 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
   2488   do {
   2489    __asm__ __volatile__(
   2490       "       xbegin Lfoo  \n\t"
   2491       "Lfoo:  xend         \n\t"
   2492       "       xacquire lock incq 0(%rsp)     \n\t"
   2493       "       xrelease lock incq 0(%rsp)     \n"
   2494    );
   2495   } while (0)
   2496 ]])], [
   2497 ac_have_as_tsx=yes
   2498 AC_MSG_RESULT([yes])
   2499 ], [
   2500 ac_have_as_tsx=no
   2501 AC_MSG_RESULT([no])
   2502 ])
   2503 
   2504 AM_CONDITIONAL(BUILD_TSX_TESTS, test x$ac_have_as_tsx = xyes)
   2505 
   2506 
   2507 # does the x86/amd64 assembler understand BMI1 and BMI2 instructions?
   2508 # Note, this doesn't generate a C-level symbol.  It generates a
   2509 # automake-level symbol (BUILD_BMI_TESTS), used in test Makefile.am's
   2510 AC_MSG_CHECKING([if x86/amd64 assembler speaks BMI1 and BMI2])
   2511 
   2512 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
   2513   do { unsigned int h, l;
   2514    __asm__ __volatile__( "mulx %rax,%rcx,%r8" );
   2515    __asm__ __volatile__(
   2516       "andn %2, %1, %0" : "=r" (h) : "r" (0x1234567), "r" (0x7654321) );
   2517    __asm__ __volatile__(
   2518       "movl %2, %%edx; mulx %3, %1, %0" : "=r" (h), "=r" (l) : "g" (0x1234567), "rm" (0x7654321) : "edx" ); }
   2519   while (0)
   2520 ]])], [
   2521 ac_have_as_bmi=yes
   2522 AC_MSG_RESULT([yes])
   2523 ], [
   2524 ac_have_as_bmi=no
   2525 AC_MSG_RESULT([no])
   2526 ])
   2527 
   2528 AM_CONDITIONAL(BUILD_BMI_TESTS, test x$ac_have_as_bmi = xyes)
   2529 
   2530 
   2531 # does the x86/amd64 assembler understand FMA instructions?
   2532 # Note, this doesn't generate a C-level symbol.  It generates a
   2533 # automake-level symbol (BUILD_FMA_TESTS), used in test Makefile.am's
   2534 AC_MSG_CHECKING([if x86/amd64 assembler speaks FMA])
   2535 
   2536 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
   2537   do { unsigned int h, l;
   2538    __asm__ __volatile__(
   2539       "vfmadd132ps (%%rsp), %%ymm8, %%ymm7" : : : "xmm7", "xmm8" );
   2540    __asm__ __volatile__(
   2541       "vfnmsub231sd (%%rsp), %%xmm8, %%xmm7" : : : "xmm7", "xmm8" );
   2542    __asm__ __volatile__(
   2543       "vfmsubadd213pd (%%rsp), %%xmm8, %%xmm7" : : : "xmm7", "xmm8" ); }
   2544   while (0)
   2545 ]])], [
   2546 ac_have_as_fma=yes
   2547 AC_MSG_RESULT([yes])
   2548 ], [
   2549 ac_have_as_fma=no
   2550 AC_MSG_RESULT([no])
   2551 ])
   2552 
   2553 AM_CONDITIONAL(BUILD_FMA_TESTS, test x$ac_have_as_fma = xyes)
   2554 
   2555 
   2556 # does the amd64 assembler understand MPX instructions?
   2557 # Note, this doesn't generate a C-level symbol.  It generates a
   2558 # automake-level symbol (BUILD_MPX_TESTS), used in test Makefile.am's
   2559 AC_MSG_CHECKING([if amd64 assembler knows the MPX instructions])
   2560 
   2561 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
   2562   do {
   2563     asm ("bndmov %bnd0,(%rsp)");
   2564     asm ("bndldx 3(%rbx,%rdx), %bnd2");
   2565     asm ("bnd call foo\n"
   2566           bnd jmp  end\n"
   2567           foo: bnd ret\n"
   2568           end: nop");
   2569   } while (0)
   2570 ]])], [
   2571 ac_have_as_mpx=yes
   2572 AC_MSG_RESULT([yes])
   2573 ], [
   2574 ac_have_as_mpx=no
   2575 AC_MSG_RESULT([no])
   2576 ])
   2577 
   2578 AM_CONDITIONAL(BUILD_MPX_TESTS, test x$ac_have_as_mpx = xyes)
   2579 
   2580 
   2581 # Does the C compiler support the "ifunc" attribute
   2582 # Note, this doesn't generate a C-level symbol.  It generates a
   2583 # automake-level symbol (BUILD_IFUNC_TESTS), used in test Makefile.am's
   2584 # does the x86/amd64 assembler understand MOVBE?
   2585 # Note, this doesn't generate a C-level symbol.  It generates a
   2586 # automake-level symbol (BUILD_MOVBE_TESTS), used in test Makefile.am's
   2587 AC_MSG_CHECKING([if x86/amd64 assembler knows the MOVBE insn])
   2588 
   2589 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
   2590   do { long long int x; 
   2591    __asm__ __volatile__(
   2592       "movbe (%%rsp), %%r15" : : : "memory", "r15" ); }
   2593   while (0)
   2594 ]])], [
   2595 ac_have_as_movbe=yes
   2596 AC_MSG_RESULT([yes])
   2597 ], [
   2598 ac_have_as_movbe=no
   2599 AC_MSG_RESULT([no])
   2600 ])
   2601 
   2602 AM_CONDITIONAL(BUILD_MOVBE_TESTS, test x$ac_have_as_movbe = xyes)
   2603 
   2604 
   2605 # Does the C compiler support the "ifunc" attribute
   2606 # Note, this doesn't generate a C-level symbol.  It generates a
   2607 # automake-level symbol (BUILD_IFUNC_TESTS), used in test Makefile.am's
   2608 AC_MSG_CHECKING([if gcc supports the ifunc attribute])
   2609 
   2610 AC_LINK_IFELSE([AC_LANG_SOURCE([[
   2611 static void mytest(void) {}
   2612 
   2613 static void (*resolve_test(void))(void)
   2614 {
   2615     return (void (*)(void))&mytest;
   2616 }
   2617 
   2618 void test(void) __attribute__((ifunc("resolve_test")));
   2619 
   2620 int main()
   2621 {
   2622     test();
   2623     return 0;
   2624 }
   2625 ]])], [
   2626 ac_have_ifunc_attr=yes
   2627 AC_MSG_RESULT([yes])
   2628 ], [
   2629 ac_have_ifunc_attr=no
   2630 AC_MSG_RESULT([no])
   2631 ])
   2632 
   2633 AM_CONDITIONAL(BUILD_IFUNC_TESTS, test x$ac_have_ifunc_attr = xyes)
   2634 
   2635 
   2636 # XXX JRS 2010 Oct 13: what is this for?  For sure, we don't need this
   2637 # when building the tool executables.  I think we should get rid of it.
   2638 #
   2639 # Check for TLS support in the compiler and linker
   2640 AC_LINK_IFELSE([AC_LANG_PROGRAM([[static __thread int foo;]],
   2641                                 [[return foo;]])],
   2642                                [vg_cv_linktime_tls=yes],
   2643                                [vg_cv_linktime_tls=no])
   2644 # Native compilation: check whether running a program using TLS succeeds.
   2645 # Linking only is not sufficient -- e.g. on Red Hat 7.3 linking TLS programs
   2646 # succeeds but running programs using TLS fails.
   2647 # Cross-compiling: check whether linking a program using TLS succeeds.
   2648 AC_CACHE_CHECK([for TLS support], vg_cv_tls,
   2649 	       [AC_ARG_ENABLE(tls, [  --enable-tls            platform supports TLS],
   2650 		[vg_cv_tls=$enableval],
   2651                	[AC_RUN_IFELSE([AC_LANG_PROGRAM([[static __thread int foo;]],
   2652                                                 [[return foo;]])],
   2653                                [vg_cv_tls=yes],
   2654                                [vg_cv_tls=no],
   2655                                [vg_cv_tls=$vg_cv_linktime_tls])])])
   2656 
   2657 if test "$vg_cv_tls" = yes -a $is_clang != applellvm; then
   2658 AC_DEFINE([HAVE_TLS], 1, [can use __thread to define thread-local variables])
   2659 fi
   2660 
   2661 
   2662 #----------------------------------------------------------------------------
   2663 # Solaris-specific checks.
   2664 #----------------------------------------------------------------------------
   2665 
   2666 if test "$VGCONF_OS" = "solaris" ; then
   2667 # Solaris-specific check determining if the Sun Studio Assembler is used to
   2668 # build Valgrind.  The test checks if the x86/amd64 assembler understands the
   2669 # cmovl.l instruction, if yes then it's Sun Assembler.
   2670 #
   2671 # C-level symbol: none
   2672 # Automake-level symbol: SOLARIS_SUN_STUDIO_AS
   2673 #
   2674 AC_MSG_CHECKING([if x86/amd64 assembler speaks cmovl.l (Solaris-specific)])
   2675 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
   2676 ]], [[
   2677   __asm__ __volatile__("cmovl.l %edx, %eax");
   2678 ]])], [
   2679 solaris_have_sun_studio_as=yes
   2680 AC_MSG_RESULT([yes])
   2681 ], [
   2682 solaris_have_sun_studio_as=no
   2683 AC_MSG_RESULT([no])
   2684 ])
   2685 AM_CONDITIONAL(SOLARIS_SUN_STUDIO_AS, test x$solaris_have_sun_studio_as = xyes)
   2686 
   2687 # Solaris-specific check determining if symbols __xpg4 and __xpg6
   2688 # are present in linked elfs when gcc is invoked with -std=gnu99.
   2689 # See solaris/vgpreload-solaris.mapfile for details.
   2690 # gcc on Solaris instructs linker to include these symbols,
   2691 # gcc on illumos does not.
   2692 #
   2693 # C-level symbol: none
   2694 # Automake-level symbol: SOLARIS_XPG_SYMBOLS_PRESENT
   2695 #
   2696 save_CFLAGS="$CFLAGS"
   2697 CFLAGS="$CFLAGS -std=gnu99"
   2698 AC_MSG_CHECKING([if xpg symbols are present with -std=gnu99 (Solaris-specific)])
   2699 AC_RUN_IFELSE([AC_LANG_SOURCE([[
   2700 #include <limits.h>
   2701 #include <stdio.h>
   2702 #include <stdlib.h>
   2703 
   2704 int main(int argc, const char *argv[]) {
   2705     char command[PATH_MAX + 50];
   2706     snprintf(command, sizeof(command), "nm %s | egrep '__xpg[4,6]'", argv[0]);
   2707 
   2708     FILE *output = popen(command, "r");
   2709     if (output == NULL) return -1;
   2710 
   2711     char buf[100];
   2712     if (fgets(buf, sizeof(buf), output) != NULL) {
   2713         pclose(output);
   2714         return 0;
   2715     } else {
   2716         pclose(output);
   2717         return 1;
   2718     }
   2719 }
   2720 ]])], [
   2721 solaris_xpg_symbols_present=yes
   2722 AC_MSG_RESULT([yes])
   2723 ], [
   2724 solaris_xpg_symbols_present=no
   2725 AC_MSG_RESULT([no])
   2726 ])
   2727 AM_CONDITIONAL(SOLARIS_XPG_SYMBOLS_PRESENT, test x$solaris_xpg_symbols_present = xyes)
   2728 CFLAGS="$save_CFLAGS"
   2729 
   2730 
   2731 # Solaris-specific check determining if /proc/self/cmdline
   2732 # or /proc/<pid>/cmdline is supported.
   2733 #
   2734 # C-level symbol: SOLARIS_PROC_CMDLINE
   2735 # Automake-level symbol: SOLARIS_PROC_CMDLINE
   2736 #
   2737 AC_CHECK_FILE([/proc/self/cmdline],
   2738 [
   2739 solaris_proc_cmdline=yes
   2740 AC_DEFINE([SOLARIS_PROC_CMDLINE], 1,
   2741           [Define to 1 if you have /proc/self/cmdline.])
   2742 ], [
   2743 solaris_proc_cmdline=no
   2744 ])
   2745 AM_CONDITIONAL(SOLARIS_PROC_CMDLINE, test x$solaris_proc_cmdline = xyes)
   2746 
   2747 
   2748 # Solaris-specific check determining default platform for the Valgrind launcher.
   2749 # Used in case the launcher cannot select platform by looking at the client
   2750 # image (for example because the executable is a shell script).
   2751 #
   2752 # C-level symbol: SOLARIS_LAUNCHER_DEFAULT_PLATFORM
   2753 # Automake-level symbol: none
   2754 #
   2755 AC_MSG_CHECKING([for default platform of Valgrind launcher (Solaris-specific)])
   2756 # Get the ELF class of /bin/sh first.
   2757 if ! test -f /bin/sh; then
   2758   AC_MSG_ERROR([Shell interpreter `/bin/sh' not found.])
   2759 fi
   2760 elf_class=$( /usr/bin/file /bin/sh | sed -n 's/.*ELF \(..\)-bit.*/\1/p' )
   2761 case "$elf_class" in
   2762   64)
   2763     default_arch="$VGCONF_ARCH_PRI";
   2764     ;;
   2765   32)
   2766     if test "x$VGCONF_ARCH_SEC" != "x"; then
   2767       default_arch="$VGCONF_ARCH_SEC"
   2768     else
   2769       default_arch="$VGCONF_ARCH_PRI";
   2770     fi
   2771     ;;
   2772   *)
   2773     AC_MSG_ERROR([Cannot determine ELF class of `/bin/sh'.])
   2774     ;;
   2775 esac
   2776 default_platform="$default_arch-$VGCONF_OS"
   2777 AC_MSG_RESULT([$default_platform])
   2778 AC_DEFINE_UNQUOTED([SOLARIS_LAUNCHER_DEFAULT_PLATFORM], ["$default_platform"],
   2779                    [Default platform for Valgrind launcher.])
   2780 
   2781 
   2782 # Solaris-specific check determining if the old syscalls are available.
   2783 #
   2784 # C-level symbol: SOLARIS_OLD_SYSCALLS
   2785 # Automake-level symbol: SOLARIS_OLD_SYSCALLS
   2786 #
   2787 AC_MSG_CHECKING([for the old Solaris syscalls (Solaris-specific)])
   2788 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
   2789 #include <sys/syscall.h>
   2790 ]], [[
   2791   return !SYS_open;
   2792 ]])], [
   2793 solaris_old_syscalls=yes
   2794 AC_MSG_RESULT([yes])
   2795 AC_DEFINE([SOLARIS_OLD_SYSCALLS], 1,
   2796           [Define to 1 if you have the old Solaris syscalls.])
   2797 ], [
   2798 solaris_old_syscalls=no
   2799 AC_MSG_RESULT([no])
   2800 ])
   2801 AM_CONDITIONAL(SOLARIS_OLD_SYSCALLS, test x$solaris_old_syscalls = xyes)
   2802 
   2803 
   2804 # Solaris-specific check determining if the new accept() syscall is available.
   2805 #
   2806 # Old syscall:
   2807 # int accept(int sock, struct sockaddr *name, socklen_t *namelenp,
   2808 #            int version);
   2809 #
   2810 # New syscall (available on illumos):
   2811 # int accept(int sock, struct sockaddr *name, socklen_t *namelenp,
   2812 #            int version, int flags);
   2813 #
   2814 # If the old syscall is present then the following syscall will fail with
   2815 # ENOTSOCK (because file descriptor 0 is not a socket), if the new syscall is
   2816 # available then it will fail with EINVAL (because the flags parameter is
   2817 # invalid).
   2818 #
   2819 # C-level symbol: SOLARIS_NEW_ACCEPT_SYSCALL
   2820 # Automake-level symbol: none
   2821 #
   2822 AC_MSG_CHECKING([for the new `accept' syscall (Solaris-specific)])
   2823 AC_RUN_IFELSE([AC_LANG_PROGRAM([[
   2824 #include <sys/syscall.h>
   2825 #include <errno.h>
   2826 ]], [[
   2827   errno = 0;
   2828   syscall(SYS_accept, 0, 0, 0, 0, -1);
   2829   return !(errno == EINVAL);
   2830 ]])], [
   2831 AC_MSG_RESULT([yes])
   2832 AC_DEFINE([SOLARIS_NEW_ACCEPT_SYSCALL], 1,
   2833           [Define to 1 if you have the new `accept' syscall.])
   2834 ], [
   2835 AC_MSG_RESULT([no])
   2836 ])
   2837 
   2838 
   2839 # Solaris-specific check determining if the new illumos pipe() syscall is
   2840 # available.
   2841 #
   2842 # Old syscall:
   2843 # longlong_t pipe();
   2844 #
   2845 # New syscall (available on illumos):
   2846 # int pipe(intptr_t arg, int flags);
   2847 #
   2848 # If the old syscall is present then the following call will succeed, if the
   2849 # new syscall is available then it will fail with EFAULT (because address 0
   2850 # cannot be accessed).
   2851 #
   2852 # C-level symbol: SOLARIS_NEW_PIPE_SYSCALL
   2853 # Automake-level symbol: none
   2854 #
   2855 AC_MSG_CHECKING([for the new `pipe' syscall (Solaris-specific)])
   2856 AC_RUN_IFELSE([AC_LANG_PROGRAM([[
   2857 #include <sys/syscall.h>
   2858 #include <errno.h>
   2859 ]], [[
   2860   errno = 0;
   2861   syscall(SYS_pipe, 0, 0);
   2862   return !(errno == EFAULT);
   2863 ]])], [
   2864 AC_MSG_RESULT([yes])
   2865 AC_DEFINE([SOLARIS_NEW_PIPE_SYSCALL], 1,
   2866           [Define to 1 if you have the new `pipe' syscall.])
   2867 ], [
   2868 AC_MSG_RESULT([no])
   2869 ])
   2870 
   2871 
   2872 # Solaris-specific check determining if the new lwp_sigqueue() syscall is
   2873 # available.
   2874 #
   2875 # Old syscall:
   2876 # int lwp_kill(id_t lwpid, int sig);
   2877 #
   2878 # New syscall (available on Solaris 11):
   2879 # int lwp_sigqueue(id_t lwpid, int sig, void *value,
   2880 #                  int si_code, timespec_t *timeout);
   2881 #
   2882 # C-level symbol: SOLARIS_LWP_SIGQUEUE_SYSCALL
   2883 # Automake-level symbol: SOLARIS_LWP_SIGQUEUE_SYSCALL
   2884 #
   2885 AC_MSG_CHECKING([for the new `lwp_sigqueue' syscall (Solaris-specific)])
   2886 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
   2887 #include <sys/syscall.h> 
   2888 ]], [[
   2889   return !SYS_lwp_sigqueue;
   2890 ]])], [
   2891 solaris_lwp_sigqueue_syscall=yes
   2892 AC_MSG_RESULT([yes])
   2893 AC_DEFINE([SOLARIS_LWP_SIGQUEUE_SYSCALL], 1,
   2894           [Define to 1 if you have the new `lwp_sigqueue' syscall.])
   2895 ], [
   2896 solaris_lwp_sigqueue_syscall=no
   2897 AC_MSG_RESULT([no])
   2898 ])
   2899 AM_CONDITIONAL(SOLARIS_LWP_SIGQUEUE_SYSCALL, test x$solaris_lwp_sigqueue_syscall = xyes)
   2900 
   2901 
   2902 # Solaris-specific check determining if the lwp_sigqueue() syscall
   2903 # takes both pid and thread id arguments or just thread id.
   2904 #
   2905 # Old syscall (available on Solaris 11.x):
   2906 # int lwp_sigqueue(id_t lwpid, int sig, void *value,
   2907 #                  int si_code, timespec_t *timeout);
   2908 #
   2909 # New syscall (available on Solaris 12):
   2910 # int lwp_sigqueue(pid_t pid, id_t lwpid, int sig, void *value,
   2911 #                  int si_code, timespec_t *timeout);
   2912 #
   2913 # If the old syscall is present then the following syscall will fail with
   2914 # EINVAL (because signal is out of range); if the new syscall is available
   2915 # then it will fail with ESRCH (because it would not find such thread in the
   2916 # current process).
   2917 #
   2918 # C-level symbol: SOLARIS_LWP_SIGQUEUE_SYSCALL_TAKES_PID
   2919 # Automake-level symbol: SOLARIS_LWP_SIGQUEUE_SYSCALL_TAKES_PID
   2920 #
   2921 AM_COND_IF(SOLARIS_LWP_SIGQUEUE_SYSCALL,
   2922 AC_MSG_CHECKING([if the `lwp_sigqueue' syscall accepts pid (Solaris-specific)])
   2923 AC_RUN_IFELSE([AC_LANG_PROGRAM([[
   2924 #include <sys/syscall.h>
   2925 #include <errno.h>
   2926 ]], [[
   2927   errno = 0;
   2928   syscall(SYS_lwp_sigqueue, 0, 101, 0, 0, 0, 0);
   2929   return !(errno == ESRCH);
   2930 ]])], [
   2931 solaris_lwp_sigqueue_syscall_takes_pid=yes
   2932 AC_MSG_RESULT([yes])
   2933 AC_DEFINE([SOLARIS_LWP_SIGQUEUE_SYSCALL_TAKES_PID], 1,
   2934           [Define to 1 if you have the new `lwp_sigqueue' syscall which accepts pid.])
   2935 ], [
   2936 solaris_lwp_sigqueue_syscall_takes_pid=no
   2937 AC_MSG_RESULT([no])
   2938 ])
   2939 AM_CONDITIONAL(SOLARIS_LWP_SIGQUEUE_SYSCALL_TAKES_PID,
   2940                test x$solaris_lwp_sigqueue_syscall_takes_pid = xyes)
   2941 ,
   2942 AM_CONDITIONAL(SOLARIS_LWP_SIGQUEUE_SYSCALL_TAKES_PID, test x = y)
   2943 )
   2944 
   2945 
   2946 # Solaris-specific check determining if the new lwp_name() syscall is
   2947 # available.
   2948 #
   2949 # New syscall (available on Solaris 11):
   2950 # int lwp_name(int opcode, id_t lwpid, char *name, size_t len);
   2951 #
   2952 # C-level symbol: SOLARIS_LWP_NAME_SYSCALL
   2953 # Automake-level symbol: SOLARIS_LWP_NAME_SYSCALL
   2954 #
   2955 AC_MSG_CHECKING([for the new `lwp_name' syscall (Solaris-specific)])
   2956 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
   2957 #include <sys/syscall.h>
   2958 ]], [[
   2959   return !SYS_lwp_name;
   2960 ]])], [
   2961 solaris_lwp_name_syscall=yes
   2962 AC_MSG_RESULT([yes])
   2963 AC_DEFINE([SOLARIS_LWP_NAME_SYSCALL], 1,
   2964           [Define to 1 if you have the new `lwp_name' syscall.])
   2965 ], [
   2966 solaris_lwp_name_syscall=no
   2967 AC_MSG_RESULT([no])
   2968 ])
   2969 AM_CONDITIONAL(SOLARIS_LWP_NAME_SYSCALL, test x$solaris_lwp_name_syscall = xyes)
   2970 
   2971 
   2972 # Solaris-specific check determining if the new zone() syscall subcodes
   2973 # ZONE_LIST_DEFUNCT and ZONE_GETATTR_DEFUNCT are available.  These subcodes
   2974 # were added in Solaris 11 but are missing on illumos.
   2975 #
   2976 # C-level symbol: SOLARIS_ZONE_DEFUNCT
   2977 # Automake-level symbol: SOLARIS_ZONE_DEFUNCT
   2978 #
   2979 AC_MSG_CHECKING([for ZONE_LIST_DEFUNCT and ZONE_GETATTR_DEFUNCT (Solaris-specific)])
   2980 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
   2981 #include <sys/zone.h>
   2982 ]], [[
   2983   return !(ZONE_LIST_DEFUNCT && ZONE_GETATTR_DEFUNCT);
   2984 ]])], [
   2985 solaris_zone_defunct=yes
   2986 AC_MSG_RESULT([yes])
   2987 AC_DEFINE([SOLARIS_ZONE_DEFUNCT], 1,
   2988           [Define to 1 if you have the `ZONE_LIST_DEFUNCT' and `ZONE_GETATTR_DEFUNC' constants.])
   2989 ], [
   2990 solaris_zone_defunct=no
   2991 AC_MSG_RESULT([no])
   2992 ])
   2993 AM_CONDITIONAL(SOLARIS_ZONE_DEFUNCT, test x$solaris_zone_defunct = xyes)
   2994 
   2995 
   2996 # Solaris-specific check determining if the new shmsys() syscall subcodes
   2997 # IPC_XSTAT64, SHMADV, SHM_ADV_GET, SHM_ADV_SET and SHMGET_OSM are available.
   2998 # These subcodes were added in Solaris 11 but are missing on illumos.
   2999 #
   3000 # C-level symbol: SOLARIS_SHM_NEW
   3001 # Automake-level symbol: SOLARIS_SHM_NEW
   3002 #
   3003 AC_MSG_CHECKING([for SHMADV, SHM_ADV_GET, SHM_ADV_SET and SHMGET_OSM (Solaris-specific)])
   3004 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
   3005 #include <sys/ipc_impl.h>
   3006 #include <sys/shm.h>
   3007 #include <sys/shm_impl.h>
   3008 ]], [[
   3009   return !(IPC_XSTAT64 && SHMADV && SHM_ADV_GET && SHM_ADV_SET && SHMGET_OSM);
   3010 ]])], [
   3011 solaris_shm_new=yes
   3012 AC_MSG_RESULT([yes])
   3013 AC_DEFINE([SOLARIS_SHM_NEW], 1,
   3014           [Define to 1 if you have the `IPC_XSTAT64', `SHMADV', `SHM_ADV_GET', `SHM_ADV_SET' and `SHMGET_OSM' constants.])
   3015 ], [
   3016 solaris_shm_new=no
   3017 AC_MSG_RESULT([no])
   3018 ])
   3019 AM_CONDITIONAL(SOLARIS_SHM_NEW, test x$solaris_shm_new = xyes)
   3020 
   3021 
   3022 # Solaris-specific check determining if prxregset_t is available.  Illumos
   3023 # currently does not define it on the x86 platform.
   3024 #
   3025 # C-level symbol: SOLARIS_PRXREGSET_T
   3026 # Automake-level symbol: SOLARIS_PRXREGSET_T
   3027 #
   3028 AC_MSG_CHECKING([for the `prxregset_t' type (Solaris-specific)])
   3029 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
   3030 #include <sys/procfs_isa.h>
   3031 ]], [[
   3032   return !sizeof(prxregset_t);
   3033 ]])], [
   3034 solaris_prxregset_t=yes
   3035 AC_MSG_RESULT([yes])
   3036 AC_DEFINE([SOLARIS_PRXREGSET_T], 1,
   3037           [Define to 1 if you have the `prxregset_t' type.])
   3038 ], [
   3039 solaris_prxregset_t=no
   3040 AC_MSG_RESULT([no])
   3041 ])
   3042 AM_CONDITIONAL(SOLARIS_PRXREGSET_T, test x$solaris_prxregset_t = xyes)
   3043 
   3044 
   3045 # Solaris-specific check determining if the new frealpathat() syscall is
   3046 # available.
   3047 #
   3048 # New syscall (available on Solaris 11.1):
   3049 # int frealpathat(int fd, char *path, char *buf, size_t buflen);
   3050 #
   3051 # C-level symbol: SOLARIS_FREALPATHAT_SYSCALL
   3052 # Automake-level symbol: SOLARIS_FREALPATHAT_SYSCALL
   3053 #
   3054 AC_MSG_CHECKING([for the new `frealpathat' syscall (Solaris-specific)])
   3055 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
   3056 #include <sys/syscall.h>
   3057 ]], [[
   3058   return !SYS_frealpathat;
   3059 ]])], [
   3060 solaris_frealpathat_syscall=yes
   3061 AC_MSG_RESULT([yes])
   3062 AC_DEFINE([SOLARIS_FREALPATHAT_SYSCALL], 1,
   3063           [Define to 1 if you have the new `frealpathat' syscall.])
   3064 ], [
   3065 solaris_frealpathat_syscall=no
   3066 AC_MSG_RESULT([no])
   3067 ])
   3068 AM_CONDITIONAL(SOLARIS_FREALPATHAT_SYSCALL, test x$solaris_frealpathat_syscall = xyes)
   3069 
   3070 
   3071 # Solaris-specific check determining if the new uuidsys() syscall is
   3072 # available.
   3073 #
   3074 # New syscall (available on newer Solaris):
   3075 # int uuidsys(struct uuid *uuid);
   3076 #
   3077 # C-level symbol: SOLARIS_UUIDSYS_SYSCALL
   3078 # Automake-level symbol: SOLARIS_UUIDSYS_SYSCALL
   3079 #
   3080 AC_MSG_CHECKING([for the new `uuidsys' syscall (Solaris-specific)])
   3081 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
   3082 #include <sys/syscall.h>
   3083 ]], [[
   3084   return !SYS_uuidsys;
   3085 ]])], [
   3086 solaris_uuidsys_syscall=yes
   3087 AC_MSG_RESULT([yes])
   3088 AC_DEFINE([SOLARIS_UUIDSYS_SYSCALL], 1,
   3089           [Define to 1 if you have the new `uuidsys' syscall.])
   3090 ], [
   3091 solaris_uuidsys_syscall=no
   3092 AC_MSG_RESULT([no])
   3093 ])
   3094 AM_CONDITIONAL(SOLARIS_UUIDSYS_SYSCALL, test x$solaris_uuidsys_syscall = xyes)
   3095 
   3096 
   3097 # Solaris-specific check determining if the new labelsys() syscall subcode
   3098 # TNDB_GET_TNIP is available.  This subcode was added in Solaris 11 but is
   3099 # missing on illumos.
   3100 #
   3101 # C-level symbol: SOLARIS_TNDB_GET_TNIP
   3102 # Automake-level symbol: SOLARIS_TNDB_GET_TNIP
   3103 #
   3104 AC_MSG_CHECKING([for TNDB_GET_TNIP (Solaris-specific)])
   3105 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
   3106 #include <sys/tsol/tndb.h>
   3107 ]], [[
   3108   return !TNDB_GET_TNIP;
   3109 ]])], [
   3110 solaris_tndb_get_tnip=yes
   3111 AC_MSG_RESULT([yes])
   3112 AC_DEFINE([SOLARIS_TNDB_GET_TNIP], 1,
   3113           [Define to 1 if you have the `TNDB_GET_TNIP' constant.])
   3114 ], [
   3115 solaris_tndb_get_tnip=no
   3116 AC_MSG_RESULT([no])
   3117 ])
   3118 AM_CONDITIONAL(SOLARIS_TNDB_GET_TNIP, test x$solaris_tndb_get_tnip = xyes)
   3119 
   3120 
   3121 # Solaris-specific check determining if the new labelsys() syscall opcodes
   3122 # TSOL_GETCLEARANCE and TSOL_SETCLEARANCE are available. These opcodes were
   3123 # added in Solaris 11 but are missing on illumos.
   3124 #
   3125 # C-level symbol: SOLARIS_TSOL_CLEARANCE
   3126 # Automake-level symbol: SOLARIS_TSOL_CLEARANCE
   3127 #
   3128 AC_MSG_CHECKING([for TSOL_GETCLEARANCE and TSOL_SETCLEARANCE (Solaris-specific)])
   3129 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
   3130 #include <sys/tsol/tsyscall.h>
   3131 ]], [[
   3132   return !(TSOL_GETCLEARANCE && TSOL_SETCLEARANCE);
   3133 ]])], [
   3134 solaris_tsol_clearance=yes
   3135 AC_MSG_RESULT([yes])
   3136 AC_DEFINE([SOLARIS_TSOL_CLEARANCE], 1,
   3137           [Define to 1 if you have the `TSOL_GETCLEARANCE' and `TSOL_SETCLEARANCE' constants.])
   3138 ], [
   3139 solaris_tsol_clearance=no
   3140 AC_MSG_RESULT([no])
   3141 ])
   3142 AM_CONDITIONAL(SOLARIS_TSOL_CLEARANCE, test x$solaris_tsol_clearance = xyes)
   3143 
   3144 
   3145 # Solaris-specific check determining if the new pset() syscall subcode
   3146 # PSET_GET_NAME is available. This subcode was added in Solaris 12 but
   3147 # is missing on illumos and Solaris 11.
   3148 #
   3149 # C-level symbol: SOLARIS_PSET_GET_NAME
   3150 # Automake-level symbol: SOLARIS_PSET_GET_NAME
   3151 #
   3152 AC_MSG_CHECKING([for PSET_GET_NAME (Solaris-specific)])
   3153 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
   3154 #include <sys/pset.h>
   3155 ]], [[
   3156   return !(PSET_GET_NAME);
   3157 ]])], [
   3158 solaris_pset_get_name=yes
   3159 AC_MSG_RESULT([yes])
   3160 AC_DEFINE([SOLARIS_PSET_GET_NAME], 1,
   3161           [Define to 1 if you have the `PSET_GET_NAME' constants.])
   3162 ], [
   3163 solaris_pset_get_name=no
   3164 AC_MSG_RESULT([no])
   3165 ])
   3166 AM_CONDITIONAL(SOLARIS_PSET_GET_NAME, test x$solaris_pset_get_name = xyes)
   3167 
   3168 
   3169 # Solaris-specific check determining if the utimesys() syscall is
   3170 # available (on illumos and older Solaris).
   3171 #
   3172 # C-level symbol: SOLARIS_UTIMESYS_SYSCALL
   3173 # Automake-level symbol: SOLARIS_UTIMESYS_SYSCALL
   3174 #
   3175 AC_MSG_CHECKING([for the `utimesys' syscall (Solaris-specific)])
   3176 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
   3177 #include <sys/syscall.h>
   3178 ]], [[
   3179   return !SYS_utimesys;
   3180 ]])], [
   3181 solaris_utimesys_syscall=yes
   3182 AC_MSG_RESULT([yes])
   3183 AC_DEFINE([SOLARIS_UTIMESYS_SYSCALL], 1,
   3184           [Define to 1 if you have the `utimesys' syscall.])
   3185 ], [
   3186 solaris_utimesys_syscall=no
   3187 AC_MSG_RESULT([no])
   3188 ])
   3189 AM_CONDITIONAL(SOLARIS_UTIMESYS_SYSCALL, test x$solaris_utimesys_syscall = xyes)
   3190 
   3191 
   3192 # Solaris-specific check determining if the utimensat() syscall is
   3193 # available (on newer Solaris).
   3194 #
   3195 # C-level symbol: SOLARIS_UTIMENSAT_SYSCALL
   3196 # Automake-level symbol: SOLARIS_UTIMENSAT_SYSCALL
   3197 #
   3198 AC_MSG_CHECKING([for the `utimensat' syscall (Solaris-specific)])
   3199 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
   3200 #include <sys/syscall.h>
   3201 ]], [[
   3202   return !SYS_utimensat;
   3203 ]])], [
   3204 solaris_utimensat_syscall=yes
   3205 AC_MSG_RESULT([yes])
   3206 AC_DEFINE([SOLARIS_UTIMENSAT_SYSCALL], 1,
   3207           [Define to 1 if you have the `utimensat' syscall.])
   3208 ], [
   3209 solaris_utimensat_syscall=no
   3210 AC_MSG_RESULT([no])
   3211 ])
   3212 AM_CONDITIONAL(SOLARIS_UTIMENSAT_SYSCALL, test x$solaris_utimensat_syscall = xyes)
   3213 
   3214 
   3215 # Solaris-specific check determining if the spawn() syscall is available
   3216 # (on newer Solaris).
   3217 #
   3218 # C-level symbol: SOLARIS_SPAWN_SYSCALL
   3219 # Automake-level symbol: SOLARIS_SPAWN_SYSCALL
   3220 #
   3221 AC_MSG_CHECKING([for the `spawn' syscall (Solaris-specific)])
   3222 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
   3223 #include <sys/syscall.h>
   3224 ]], [[
   3225   return !SYS_spawn;
   3226 ]])], [
   3227 solaris_spawn_syscall=yes
   3228 AC_MSG_RESULT([yes])
   3229 AC_DEFINE([SOLARIS_SPAWN_SYSCALL], 1,
   3230           [Define to 1 if you have the `spawn' syscall.])
   3231 ], [
   3232 solaris_spawn_syscall=no
   3233 AC_MSG_RESULT([no])
   3234 ])
   3235 AM_CONDITIONAL(SOLARIS_SPAWN_SYSCALL, test x$solaris_spawn_syscall = xyes)
   3236 
   3237 
   3238 # Solaris-specific check determining whether nscd (name switch cache daemon)
   3239 # attaches its door at /system/volatile/name_service_door (Solaris)
   3240 # or at /var/run/name_service_door (illumos).
   3241 #
   3242 # Note that /var/run is a symlink to /system/volatile on Solaris
   3243 # but not vice versa on illumos.
   3244 #
   3245 # C-level symbol: SOLARIS_NSCD_DOOR_SYSTEM_VOLATILE
   3246 # Automake-level symbol: SOLARIS_NSCD_DOOR_SYSTEM_VOLATILE
   3247 #
   3248 AC_MSG_CHECKING([for nscd door location (Solaris-specific)])
   3249 if test -e /system/volatile/name_service_door; then
   3250     solaris_nscd_door_system_volatile=yes
   3251     AC_MSG_RESULT([/system/volatile/name_service_door])
   3252     AC_DEFINE([SOLARIS_NSCD_DOOR_SYSTEM_VOLATILE], 1,
   3253               [Define to 1 if nscd attaches to /system/volatile/name_service_door.])
   3254 else
   3255     solaris_nscd_door_system_volatile=no
   3256     AC_MSG_RESULT([/var/run/name_service_door])
   3257 fi
   3258 AM_CONDITIONAL(SOLARIS_NSCD_DOOR_SYSTEM_VOLATILE, test x$solaris_nscd_door_system_volatile = xyes)
   3259 
   3260 
   3261 # Solaris-specific check determining if the new gethrt() fasttrap is available.
   3262 #
   3263 # New fasttrap (available on Solaris 11):
   3264 # hrt_t *gethrt(void);
   3265 #
   3266 # C-level symbol: SOLARIS_GETHRT_FASTTRAP
   3267 # Automake-level symbol: SOLARIS_GETHRT_FASTTRAP
   3268 #
   3269 AC_MSG_CHECKING([for the new `gethrt' fasttrap (Solaris-specific)])
   3270 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
   3271 #include <sys/trap.h>
   3272 ]], [[
   3273   return !T_GETHRT;
   3274 ]])], [
   3275 solaris_gethrt_fasttrap=yes
   3276 AC_MSG_RESULT([yes])
   3277 AC_DEFINE([SOLARIS_GETHRT_FASTTRAP], 1,
   3278           [Define to 1 if you have the new `gethrt' fasttrap.])
   3279 ], [
   3280 solaris_gethrt_fasttrap=no
   3281 AC_MSG_RESULT([no])
   3282 ])
   3283 AM_CONDITIONAL(SOLARIS_GETHRT_FASTTRAP, test x$solaris_gethrt_fasttrap = xyes)
   3284 
   3285 
   3286 # Solaris-specific check determining if the new get_zone_offset() fasttrap
   3287 # is available.
   3288 #
   3289 # New fasttrap (available on Solaris 11):
   3290 # zonehrtoffset_t *get_zone_offset(void);
   3291 #
   3292 # C-level symbol: SOLARIS_GETZONEOFFSET_FASTTRAP
   3293 # Automake-level symbol: SOLARIS_GETZONEOFFSET_FASTTRAP
   3294 #
   3295 AC_MSG_CHECKING([for the new `get_zone_offset' fasttrap (Solaris-specific)])
   3296 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
   3297 #include <sys/trap.h>
   3298 ]], [[
   3299   return !T_GETZONEOFFSET;
   3300 ]])], [
   3301 solaris_getzoneoffset_fasttrap=yes
   3302 AC_MSG_RESULT([yes])
   3303 AC_DEFINE([SOLARIS_GETZONEOFFSET_FASTTRAP], 1,
   3304           [Define to 1 if you have the new `get_zone_offset' fasttrap.])
   3305 ], [
   3306 solaris_getzoneoffset_fasttrap=no
   3307 AC_MSG_RESULT([no])
   3308 ])
   3309 AM_CONDITIONAL(SOLARIS_GETZONEOFFSET_FASTTRAP, test x$solaris_getzoneoffset_fasttrap = xyes)
   3310 
   3311 
   3312 # Solaris-specific check determining if the execve() syscall
   3313 # takes fourth argument (flags) or not.
   3314 #
   3315 # Old syscall (available on illumos):
   3316 # int execve(const char *fname, const char **argv, const char **envp);
   3317 #
   3318 # New syscall (available on Solaris):
   3319 # int execve(uintptr_t file, const char **argv, const char **envp, int flags);
   3320 #
   3321 # If the new syscall is present then it will fail with EINVAL (because flags
   3322 # are invalid); if the old syscall is available then it will fail with ENOENT
   3323 # (because the file could not be found).
   3324 #
   3325 # C-level symbol: SOLARIS_EXECVE_SYSCALL_TAKES_FLAGS
   3326 # Automake-level symbol: SOLARIS_EXECVE_SYSCALL_TAKES_FLAGS
   3327 #
   3328 AC_MSG_CHECKING([if the `execve' syscall accepts flags (Solaris-specific)])
   3329 AC_RUN_IFELSE([AC_LANG_PROGRAM([[
   3330 #include <sys/syscall.h>
   3331 #include <errno.h>
   3332 ]], [[
   3333   errno = 0;
   3334   syscall(SYS_execve, "/no/existing/path", 0, 0, 0xdeadbeef, 0, 0);
   3335   return !(errno == EINVAL);
   3336 ]])], [
   3337 solaris_execve_syscall_takes_flags=yes
   3338 AC_MSG_RESULT([yes])
   3339 AC_DEFINE([SOLARIS_EXECVE_SYSCALL_TAKES_FLAGS], 1,
   3340           [Define to 1 if you have the new `execve' syscall which accepts flags.])
   3341 ], [
   3342 solaris_execve_syscall_takes_flags=no
   3343 AC_MSG_RESULT([no])
   3344 ])
   3345 AM_CONDITIONAL(SOLARIS_EXECVE_SYSCALL_TAKES_FLAGS,
   3346                test x$solaris_execve_syscall_takes_flags = xyes)
   3347 
   3348 
   3349 # Solaris-specific check determining version of the repository cache protocol.
   3350 # Every Solaris version uses a different one, ranging from 21 to current 25.
   3351 # The check is very ugly, though.
   3352 #
   3353 # C-level symbol: SOLARIS_REPCACHE_PROTOCOL_VERSION vv
   3354 # Automake-level symbol: none
   3355 #
   3356 AC_PATH_PROG(DIS_PATH, dis, false)
   3357 if test "x$DIS_PATH" = "xfalse"; then
   3358   AC_MSG_FAILURE([Object code disassembler (`dis') not found.])
   3359 fi
   3360 AC_CHECK_LIB(scf, scf_handle_bind, [], [
   3361   AC_MSG_WARN([Function `scf_handle_bind' was not found in `libscf'.])
   3362   AC_MSG_ERROR([Cannot determine version of the repository cache protocol.])
   3363 ])
   3364 
   3365 AC_MSG_CHECKING([for version of the repository cache protocol (Solaris-specific)])
   3366 if test "X$VGCONF_ARCH_PRI" = "Xamd64"; then
   3367   libscf=/usr/lib/64/libscf.so.1
   3368 else
   3369   libscf=/usr/lib/libscf.so.1
   3370 fi
   3371 if ! $DIS_PATH -F scf_handle_bind $libscf  | grep -q 0x526570; then
   3372   AC_MSG_WARN([Function `scf_handle_bind' does not contain repository cache protocol version.])
   3373   AC_MSG_ERROR([Cannot determine version of the repository cache protocol.])
   3374 fi
   3375 hex=$( $DIS_PATH -F scf_handle_bind $libscf  | sed -n 's/.*0x526570\(..\).*/\1/p' )
   3376 if test -z "$hex"; then
   3377   AC_MSG_WARN([Version of the repository cache protocol is empty?!])
   3378   AC_MSG_ERROR([Cannot determine version of the repository cache protocol.])
   3379 fi
   3380 version=$( printf "%d\n" 0x$hex )
   3381 AC_MSG_RESULT([$version])
   3382 AC_DEFINE_UNQUOTED([SOLARIS_REPCACHE_PROTOCOL_VERSION], [$version],
   3383                    [Version number of the repository door cache protocol.])
   3384 
   3385 
   3386 # Solaris-specific check determining if "sysstat" segment reservation type
   3387 # is available.
   3388 #
   3389 # New "sysstat" segment reservation (available on Solaris 12):
   3390 # - program header type:    PT_SUNW_SYSSTAT
   3391 # - auxiliary vector entry: AT_SUN_SYSSTAT_ADDR
   3392 #
   3393 # C-level symbol: SOLARIS_RESERVE_SYSSTAT_ADDR
   3394 # Automake-level symbol: SOLARIS_RESERVE_SYSSTAT_ADDR
   3395 #
   3396 AC_MSG_CHECKING([for the new `sysstat' segment reservation (Solaris-specific)])
   3397 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
   3398 #include <sys/auxv.h>
   3399 ]], [[
   3400   return !AT_SUN_SYSSTAT_ADDR;
   3401 ]])], [
   3402 solaris_reserve_sysstat_addr=yes
   3403 AC_MSG_RESULT([yes])
   3404 AC_DEFINE([SOLARIS_RESERVE_SYSSTAT_ADDR], 1,
   3405           [Define to 1 if you have the new `sysstat' segment reservation.])
   3406 ], [
   3407 solaris_reserve_sysstat_addr=no
   3408 AC_MSG_RESULT([no])
   3409 ])
   3410 AM_CONDITIONAL(SOLARIS_RESERVE_SYSSTAT_ADDR, test x$solaris_reserve_sysstat_addr = xyes)
   3411 
   3412 
   3413 # Solaris-specific check determining if "sysstat_zone" segment reservation type
   3414 # is available.
   3415 #
   3416 # New "sysstat_zone" segment reservation (available on Solaris 12):
   3417 # - program header type:    PT_SUNW_SYSSTAT_ZONE
   3418 # - auxiliary vector entry: AT_SUN_SYSSTAT_ZONE_ADDR
   3419 #
   3420 # C-level symbol: SOLARIS_RESERVE_SYSSTAT_ZONE_ADDR
   3421 # Automake-level symbol: SOLARIS_RESERVE_SYSSTAT_ZONE_ADDR
   3422 #
   3423 AC_MSG_CHECKING([for the new `sysstat_zone' segment reservation (Solaris-specific)])
   3424 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
   3425 #include <sys/auxv.h>
   3426 ]], [[
   3427   return !AT_SUN_SYSSTAT_ZONE_ADDR;
   3428 ]])], [
   3429 solaris_reserve_sysstat_zone_addr=yes
   3430 AC_MSG_RESULT([yes])
   3431 AC_DEFINE([SOLARIS_RESERVE_SYSSTAT_ZONE_ADDR], 1,
   3432           [Define to 1 if you have the new `sysstat_zone' segment reservation.])
   3433 ], [
   3434 solaris_reserve_sysstat_zone_addr=no
   3435 AC_MSG_RESULT([no])
   3436 ])
   3437 AM_CONDITIONAL(SOLARIS_RESERVE_SYSSTAT_ZONE_ADDR, test x$solaris_reserve_sysstat_zone_addr = xyes)
   3438 
   3439 
   3440 # Solaris-specific check determining if the system_stats() syscall is available
   3441 # (on newer Solaris).
   3442 #
   3443 # C-level symbol: SOLARIS_SYSTEM_STATS_SYSCALL
   3444 # Automake-level symbol: SOLARIS_SYSTEM_STATS_SYSCALL
   3445 #
   3446 AC_MSG_CHECKING([for the `system_stats' syscall (Solaris-specific)])
   3447 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
   3448 #include <sys/syscall.h>
   3449 ]], [[
   3450   return !SYS_system_stats;
   3451 ]])], [
   3452 solaris_system_stats_syscall=yes
   3453 AC_MSG_RESULT([yes])
   3454 AC_DEFINE([SOLARIS_SYSTEM_STATS_SYSCALL], 1,
   3455           [Define to 1 if you have the `system_stats' syscall.])
   3456 ], [
   3457 solaris_system_stats_syscall=no
   3458 AC_MSG_RESULT([no])
   3459 ])
   3460 AM_CONDITIONAL(SOLARIS_SYSTEM_STATS_SYSCALL, test x$solaris_system_stats_syscall = xyes)
   3461 
   3462 else
   3463 AM_CONDITIONAL(SOLARIS_SUN_STUDIO_AS, false)
   3464 AM_CONDITIONAL(SOLARIS_XPG_SYMBOLS_PRESENT, false)
   3465 AM_CONDITIONAL(SOLARIS_PROC_CMDLINE, false)
   3466 AM_CONDITIONAL(SOLARIS_OLD_SYSCALLS, false)
   3467 AM_CONDITIONAL(SOLARIS_LWP_SIGQUEUE_SYSCALL, false)
   3468 AM_CONDITIONAL(SOLARIS_LWP_SIGQUEUE_SYSCALL_TAKES_PID, false)
   3469 AM_CONDITIONAL(SOLARIS_LWP_NAME_SYSCALL, false)
   3470 AM_CONDITIONAL(SOLARIS_ZONE_DEFUNCT, false)
   3471 AM_CONDITIONAL(SOLARIS_SHM_NEW, false)
   3472 AM_CONDITIONAL(SOLARIS_PRXREGSET_T, false)
   3473 AM_CONDITIONAL(SOLARIS_FREALPATHAT_SYSCALL, false)
   3474 AM_CONDITIONAL(SOLARIS_UUIDSYS_SYSCALL, false)
   3475 AM_CONDITIONAL(SOLARIS_TNDB_GET_TNIP, false)
   3476 AM_CONDITIONAL(SOLARIS_TSOL_CLEARANCE, false)
   3477 AM_CONDITIONAL(SOLARIS_PSET_GET_NAME, false)
   3478 AM_CONDITIONAL(SOLARIS_UTIMESYS_SYSCALL, false)
   3479 AM_CONDITIONAL(SOLARIS_UTIMENSAT_SYSCALL, false)
   3480 AM_CONDITIONAL(SOLARIS_SPAWN_SYSCALL, false)
   3481 AM_CONDITIONAL(SOLARIS_NSCD_DOOR_SYSTEM_VOLATILE, false)
   3482 AM_CONDITIONAL(SOLARIS_GETHRT_FASTTRAP, false)
   3483 AM_CONDITIONAL(SOLARIS_GETZONEOFFSET_FASTTRAP, false)
   3484 AM_CONDITIONAL(SOLARIS_EXECVE_SYSCALL_TAKES_FLAGS, false)
   3485 AM_CONDITIONAL(SOLARIS_RESERVE_SYSSTAT_ADDR, false)
   3486 AM_CONDITIONAL(SOLARIS_RESERVE_SYSSTAT_ZONE_ADDR, false)
   3487 AM_CONDITIONAL(SOLARIS_SYSTEM_STATS_SYSCALL, false)
   3488 fi # test "$VGCONF_OS" = "solaris"
   3489 
   3490 
   3491 #----------------------------------------------------------------------------
   3492 # Checks for C header files.
   3493 #----------------------------------------------------------------------------
   3494 
   3495 AC_HEADER_STDC
   3496 AC_CHECK_HEADERS([       \
   3497         asm/unistd.h     \
   3498         endian.h         \
   3499         mqueue.h         \
   3500         sys/endian.h     \
   3501         sys/epoll.h      \
   3502         sys/eventfd.h    \
   3503         sys/klog.h       \
   3504         sys/poll.h       \
   3505         sys/prctl.h      \
   3506         sys/signal.h     \
   3507         sys/signalfd.h   \
   3508         sys/syscall.h    \
   3509         sys/time.h       \
   3510         sys/types.h      \
   3511         ])
   3512 
   3513 # Verify whether the <linux/futex.h> header is usable.
   3514 AC_MSG_CHECKING([if <linux/futex.h> is usable])
   3515 
   3516 save_CFLAGS="$CFLAGS"
   3517 CFLAGS="$CFLAGS -D__user="
   3518 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
   3519 #include <linux/futex.h>
   3520 ]], [[
   3521   return FUTEX_WAIT;
   3522 ]])], [
   3523 ac_have_usable_linux_futex_h=yes
   3524 AC_DEFINE([HAVE_USABLE_LINUX_FUTEX_H], 1,
   3525           [Define to 1 if you have a usable <linux/futex.h> header file.])
   3526 AC_MSG_RESULT([yes])
   3527 ], [
   3528 ac_have_usable_linux_futex_h=no
   3529 AC_MSG_RESULT([no])
   3530 ])
   3531 CFLAGS="$save_CFLAGS"
   3532 
   3533 
   3534 #----------------------------------------------------------------------------
   3535 # Checks for typedefs, structures, and compiler characteristics.
   3536 #----------------------------------------------------------------------------
   3537 AC_TYPE_UID_T
   3538 AC_TYPE_OFF_T
   3539 AC_TYPE_SIZE_T
   3540 AC_HEADER_TIME
   3541 
   3542 
   3543 #----------------------------------------------------------------------------
   3544 # Checks for library functions.
   3545 #----------------------------------------------------------------------------
   3546 AC_FUNC_MEMCMP
   3547 AC_FUNC_MMAP
   3548 
   3549 AC_CHECK_LIB([pthread], [pthread_create])
   3550 AC_CHECK_LIB([rt], [clock_gettime])
   3551 
   3552 AC_CHECK_FUNCS([     \
   3553         clock_gettime\
   3554         epoll_create \
   3555         epoll_pwait  \
   3556         klogctl      \
   3557         mallinfo     \
   3558         memchr       \
   3559         memset       \
   3560         mkdir        \
   3561         mremap       \
   3562         ppoll        \
   3563         pthread_barrier_init       \
   3564         pthread_condattr_setclock  \
   3565         pthread_mutex_timedlock    \
   3566         pthread_rwlock_timedrdlock \
   3567         pthread_rwlock_timedwrlock \
   3568         pthread_spin_lock          \
   3569         pthread_yield              \
   3570         pthread_setname_np         \
   3571         readlinkat   \
   3572         semtimedop   \
   3573         signalfd     \
   3574         sigwaitinfo  \
   3575         strchr       \
   3576         strdup       \
   3577         strpbrk      \
   3578         strrchr      \
   3579         strstr       \
   3580         syscall      \
   3581         utimensat    \
   3582         process_vm_readv  \
   3583         process_vm_writev \
   3584         ])
   3585 
   3586 # AC_CHECK_LIB adds any library found to the variable LIBS, and links these
   3587 # libraries with any shared object and/or executable. This is NOT what we
   3588 # want for e.g. vgpreload_core-x86-linux.so
   3589 LIBS=""
   3590 
   3591 AM_CONDITIONAL([HAVE_PTHREAD_BARRIER],
   3592                [test x$ac_cv_func_pthread_barrier_init = xyes])
   3593 AM_CONDITIONAL([HAVE_PTHREAD_MUTEX_TIMEDLOCK],
   3594                [test x$ac_cv_func_pthread_mutex_timedlock = xyes])
   3595 AM_CONDITIONAL([HAVE_PTHREAD_SPINLOCK],
   3596                [test x$ac_cv_func_pthread_spin_lock = xyes])
   3597 AM_CONDITIONAL([HAVE_PTHREAD_SETNAME_NP],
   3598                [test x$ac_cv_func_pthread_setname_np = xyes])
   3599 
   3600 if test x$VGCONF_PLATFORM_PRI_CAPS = xMIPS32_LINUX \
   3601      -o x$VGCONF_PLATFORM_PRI_CAPS = xMIPS64_LINUX ; then
   3602   AC_DEFINE([DISABLE_PTHREAD_SPINLOCK_INTERCEPT], 1,
   3603             [Disable intercept pthread_spin_lock() on MIPS32 and MIPS64.])
   3604 fi
   3605 
   3606 #----------------------------------------------------------------------------
   3607 # MPI checks
   3608 #----------------------------------------------------------------------------
   3609 # Do we have a useable MPI setup on the primary and/or secondary targets?
   3610 # On Linux, by default, assumes mpicc and -m32/-m64
   3611 # Note: this is a kludge in that it assumes the specified mpicc 
   3612 # understands -m32/-m64 regardless of what is specified using
   3613 # --with-mpicc=.
   3614 AC_PATH_PROG([MPI_CC], [mpicc], [mpicc],
   3615              [$PATH:/usr/lib/openmpi/bin:/usr/lib64/openmpi/bin])
   3616 
   3617 mflag_primary=
   3618 if test x$VGCONF_PLATFORM_PRI_CAPS = xX86_LINUX \
   3619      -o x$VGCONF_PLATFORM_PRI_CAPS = xPPC32_LINUX \
   3620      -o x$VGCONF_PLATFORM_PRI_CAPS = xARM_LINUX \
   3621      -o x$VGCONF_PLATFORM_PRI_CAPS = xMIPS32_LINUX \
   3622      -o x$VGCONF_PLATFORM_PRI_CAPS = xMIPS64_LINUX \
   3623      -o x$VGCONF_PLATFORM_PRI_CAPS = xX86_SOLARIS ; then
   3624   mflag_primary=$FLAG_M32
   3625 elif test x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_LINUX \
   3626        -o x$VGCONF_PLATFORM_PRI_CAPS = xPPC64_LINUX \
   3627        -o x$VGCONF_PLATFORM_PRI_CAPS = xARM64_LINUX \
   3628        -o x$VGCONF_PLATFORM_PRI_CAPS = xS390X_LINUX ; then
   3629   mflag_primary=$FLAG_M64
   3630 elif test x$VGCONF_PLATFORM_PRI_CAPS = xX86_DARWIN ; then
   3631   mflag_primary="$FLAG_M32 -arch i386"
   3632 elif test x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_DARWIN ; then
   3633   mflag_primary="$FLAG_M64 -arch x86_64"
   3634 fi
   3635 
   3636 mflag_secondary=
   3637 if test x$VGCONF_PLATFORM_SEC_CAPS = xX86_LINUX \
   3638      -o x$VGCONF_PLATFORM_SEC_CAPS = xPPC32_LINUX \
   3639      -o x$VGCONF_PLATFORM_SEC_CAPS = xX86_SOLARIS ; then
   3640   mflag_secondary=$FLAG_M32
   3641 elif test x$VGCONF_PLATFORM_SEC_CAPS = xX86_DARWIN ; then
   3642   mflag_secondary="$FLAG_M32 -arch i386"
   3643 fi
   3644 
   3645 
   3646 AC_ARG_WITH(mpicc,
   3647    [  --with-mpicc=           Specify name of MPI2-ised C compiler],
   3648    MPI_CC=$withval
   3649 )
   3650 AC_SUBST(MPI_CC)
   3651 
   3652 ## We AM_COND_IF here instead of automake "if" in mpi/Makefile.am so that we can
   3653 ## use these values in the check for a functioning mpicc.
   3654 ##
   3655 ## We leave the MPI_FLAG_M3264_ logic in mpi/Makefile.am and assume that
   3656 ## mflag_primary/mflag_secondary are sufficient approximations of that behavior
   3657 AM_COND_IF([VGCONF_OS_IS_LINUX],
   3658            [CFLAGS_MPI="-g -O -fno-omit-frame-pointer -Wall -fpic"
   3659             LDFLAGS_MPI="-fpic -shared"])
   3660 AM_COND_IF([VGCONF_OS_IS_DARWIN],
   3661            [CFLAGS_MPI="-g -O -fno-omit-frame-pointer -Wall -dynamic"
   3662             LDFLAGS_MPI="-dynamic -dynamiclib -all_load"])
   3663 AM_COND_IF([VGCONF_OS_IS_SOLARIS],
   3664            [CFLAGS_MPI="-g -O -fno-omit-frame-pointer -Wall -fpic"
   3665             LDFLAGS_MPI="-fpic -shared"])
   3666 
   3667 AC_SUBST([CFLAGS_MPI])
   3668 AC_SUBST([LDFLAGS_MPI])
   3669 
   3670 
   3671 ## See if MPI_CC works for the primary target
   3672 ##
   3673 AC_MSG_CHECKING([primary target for usable MPI2-compliant C compiler and mpi.h])
   3674 saved_CC=$CC
   3675 saved_CFLAGS=$CFLAGS
   3676 CC=$MPI_CC
   3677 CFLAGS="$CFLAGS_MPI $mflag_primary"
   3678 saved_LDFLAGS="$LDFLAGS"
   3679 LDFLAGS="$LDFLAGS_MPI $mflag_primary"
   3680 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
   3681 #include <mpi.h>
   3682 #include <stdio.h>
   3683 ]], [[
   3684   int ni, na, nd, comb;
   3685   int r = MPI_Init(NULL,NULL);
   3686   r |= MPI_Type_get_envelope( MPI_INT, &ni, &na, &nd, &comb );
   3687   r |= MPI_Finalize();
   3688   return r; 
   3689 ]])], [
   3690 ac_have_mpi2_pri=yes
   3691 AC_MSG_RESULT([yes, $MPI_CC])
   3692 ], [
   3693 ac_have_mpi2_pri=no
   3694 AC_MSG_RESULT([no])
   3695 ])
   3696 CC=$saved_CC
   3697 CFLAGS=$saved_CFLAGS
   3698 LDFLAGS="$saved_LDFLAGS"
   3699 AM_CONDITIONAL(BUILD_MPIWRAP_PRI, test x$ac_have_mpi2_pri = xyes)
   3700 
   3701 ## See if MPI_CC works for the secondary target.  Complication: what if
   3702 ## there is no secondary target?  We need this to then fail.
   3703 ## Kludge this by making MPI_CC something which will surely fail in
   3704 ## such a case.
   3705 ##
   3706 AC_MSG_CHECKING([secondary target for usable MPI2-compliant C compiler and mpi.h])
   3707 saved_CC=$CC
   3708 saved_CFLAGS=$CFLAGS
   3709 saved_LDFLAGS="$LDFLAGS"
   3710 LDFLAGS="$LDFLAGS_MPI $mflag_secondary"
   3711 if test x$VGCONF_PLATFORM_SEC_CAPS = x ; then
   3712   CC="$MPI_CC this will surely fail"
   3713 else
   3714   CC=$MPI_CC
   3715 fi
   3716 CFLAGS="$CFLAGS_MPI $mflag_secondary"
   3717 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
   3718 #include <mpi.h>
   3719 #include <stdio.h>
   3720 ]], [[
   3721   int ni, na, nd, comb;
   3722   int r = MPI_Init(NULL,NULL);
   3723   r |= MPI_Type_get_envelope( MPI_INT, &ni, &na, &nd, &comb );
   3724   r |= MPI_Finalize();
   3725   return r; 
   3726 ]])], [
   3727 ac_have_mpi2_sec=yes
   3728 AC_MSG_RESULT([yes, $MPI_CC])
   3729 ], [
   3730 ac_have_mpi2_sec=no
   3731 AC_MSG_RESULT([no])
   3732 ])
   3733 CC=$saved_CC
   3734 CFLAGS=$saved_CFLAGS
   3735 LDFLAGS="$saved_LDFLAGS"
   3736 AM_CONDITIONAL(BUILD_MPIWRAP_SEC, test x$ac_have_mpi2_sec = xyes)
   3737 
   3738 
   3739 #----------------------------------------------------------------------------
   3740 # Other library checks
   3741 #----------------------------------------------------------------------------
   3742 # There now follow some tests for Boost, and OpenMP.  These
   3743 # tests are present because Drd has some regression tests that use
   3744 # these packages.  All regression test programs all compiled only
   3745 # for the primary target.  And so it is important that the configure
   3746 # checks that follow, use the correct -m32 or -m64 flag for the
   3747 # primary target (called $mflag_primary).  Otherwise, we can end up
   3748 # in a situation (eg) where, on amd64-linux, the test for Boost checks
   3749 # for usable 64-bit Boost facilities, but because we are doing a 32-bit
   3750 # only build (meaning, the primary target is x86-linux), the build
   3751 # of the regtest programs that use Boost fails, because they are 
   3752 # build as 32-bit (IN THIS EXAMPLE).
   3753 #
   3754 # Hence: ALWAYS USE $mflag_primary FOR CONFIGURE TESTS FOR FACILITIES
   3755 # NEEDED BY THE REGRESSION TEST PROGRAMS.
   3756 
   3757 
   3758 # Check whether the boost library 1.35 or later has been installed.
   3759 # The Boost.Threads library has undergone a major rewrite in version 1.35.0.
   3760 
   3761 AC_MSG_CHECKING([for boost])
   3762 
   3763 AC_LANG(C++)
   3764 safe_CXXFLAGS=$CXXFLAGS
   3765 CXXFLAGS="$mflag_primary"
   3766 safe_LIBS="$LIBS"
   3767 LIBS="-lboost_thread-mt -lboost_system-mt $LIBS"
   3768 
   3769 AC_LINK_IFELSE([AC_LANG_SOURCE([
   3770 #include <boost/thread.hpp>
   3771 static void thread_func(void)
   3772 { }
   3773 int main(int argc, char** argv)
   3774 {
   3775   boost::thread t(thread_func);
   3776   return 0;
   3777 }
   3778 ])],
   3779 [
   3780 ac_have_boost_1_35=yes
   3781 AC_SUBST([BOOST_CFLAGS], [])
   3782 AC_SUBST([BOOST_LIBS], ["-lboost_thread-mt -lboost_system-mt"])
   3783 AC_MSG_RESULT([yes])
   3784 ], [
   3785 ac_have_boost_1_35=no
   3786 AC_MSG_RESULT([no])
   3787 ])
   3788 
   3789 LIBS="$safe_LIBS"
   3790 CXXFLAGS=$safe_CXXFLAGS
   3791 AC_LANG(C)
   3792 
   3793 AM_CONDITIONAL([HAVE_BOOST_1_35], [test x$ac_have_boost_1_35 = xyes])
   3794 
   3795 
   3796 # does this compiler support -fopenmp, does it have the include file
   3797 # <omp.h> and does it have libgomp ?
   3798 
   3799 AC_MSG_CHECKING([for OpenMP])
   3800 
   3801 safe_CFLAGS=$CFLAGS
   3802 CFLAGS="-fopenmp $mflag_primary -Werror"
   3803 
   3804 AC_LINK_IFELSE([AC_LANG_SOURCE([
   3805 #include <omp.h> 
   3806 int main(int argc, char** argv)
   3807 {
   3808   omp_set_dynamic(0);
   3809   return 0;
   3810 }
   3811 ])],
   3812 [
   3813 ac_have_openmp=yes
   3814 AC_MSG_RESULT([yes])
   3815 ], [
   3816 ac_have_openmp=no
   3817 AC_MSG_RESULT([no])
   3818 ])
   3819 CFLAGS=$safe_CFLAGS
   3820 
   3821 AM_CONDITIONAL([HAVE_OPENMP], [test x$ac_have_openmp = xyes])
   3822 
   3823 
   3824 # Check for __builtin_popcount
   3825 AC_MSG_CHECKING([for __builtin_popcount()])
   3826 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
   3827 ]], [[
   3828   __builtin_popcount(2);
   3829   return 0;
   3830 ]])], [
   3831 AC_MSG_RESULT([yes])
   3832 AC_DEFINE([HAVE_BUILTIN_POPCOUT], 1,
   3833           [Define to 1 if compiler provides __builtin_popcount().])
   3834 ], [
   3835 AC_MSG_RESULT([no])
   3836 ])
   3837 
   3838 # Check for __builtin_clz
   3839 AC_MSG_CHECKING([for __builtin_clz()])
   3840 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
   3841 ]], [[
   3842   __builtin_clz(2);
   3843   return 0;
   3844 ]])], [
   3845 AC_MSG_RESULT([yes])
   3846 AC_DEFINE([HAVE_BUILTIN_CLZ], 1,
   3847           [Define to 1 if compiler provides __builtin_clz().])
   3848 ], [
   3849 AC_MSG_RESULT([no])
   3850 ])
   3851 
   3852 # Check for __builtin_ctz
   3853 AC_MSG_CHECKING([for __builtin_ctz()])
   3854 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
   3855 ]], [[
   3856   __builtin_ctz(2);
   3857   return 0;
   3858 ]])], [
   3859 AC_MSG_RESULT([yes])
   3860 AC_DEFINE([HAVE_BUILTIN_CTZ], 1,
   3861           [Define to 1 if compiler provides __builtin_ctz().])
   3862 ], [
   3863 AC_MSG_RESULT([no])
   3864 ])
   3865 
   3866 # does this compiler have built-in functions for atomic memory access for the
   3867 # primary target ?
   3868 AC_MSG_CHECKING([if gcc supports __sync_add_and_fetch for the primary target])
   3869 
   3870 safe_CFLAGS=$CFLAGS
   3871 CFLAGS="$mflag_primary"
   3872 
   3873 AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[
   3874   int variable = 1;
   3875   return (__sync_bool_compare_and_swap(&variable, 1, 2)
   3876           && __sync_add_and_fetch(&variable, 1) ? 1 : 0)
   3877 ]])], [
   3878   ac_have_builtin_atomic_primary=yes
   3879   AC_MSG_RESULT([yes])
   3880   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])
   3881 ], [
   3882   ac_have_builtin_atomic_primary=no
   3883   AC_MSG_RESULT([no])
   3884 ])
   3885 
   3886 CFLAGS=$safe_CFLAGS
   3887 
   3888 AM_CONDITIONAL([HAVE_BUILTIN_ATOMIC],
   3889                [test x$ac_have_builtin_atomic_primary = xyes])
   3890 
   3891 
   3892 # does this compiler have built-in functions for atomic memory access for the
   3893 # secondary target ?
   3894 
   3895 if test x$VGCONF_PLATFORM_SEC_CAPS != x; then
   3896 
   3897 AC_MSG_CHECKING([if gcc supports __sync_add_and_fetch for the secondary target])
   3898 
   3899 safe_CFLAGS=$CFLAGS
   3900 CFLAGS="$mflag_secondary"
   3901 
   3902 AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[
   3903   int variable = 1;
   3904   return (__sync_add_and_fetch(&variable, 1) ? 1 : 0)
   3905 ]])], [
   3906   ac_have_builtin_atomic_secondary=yes
   3907   AC_MSG_RESULT([yes])
   3908 ], [
   3909   ac_have_builtin_atomic_secondary=no
   3910   AC_MSG_RESULT([no])
   3911 ])
   3912 
   3913 CFLAGS=$safe_CFLAGS
   3914 
   3915 fi
   3916 
   3917 AM_CONDITIONAL([HAVE_BUILTIN_ATOMIC_SECONDARY],
   3918                [test x$ac_have_builtin_atomic_secondary = xyes])
   3919 
   3920 # does this compiler have built-in functions for atomic memory access on
   3921 # 64-bit integers for all targets ?
   3922 
   3923 AC_MSG_CHECKING([if gcc supports __sync_add_and_fetch on uint64_t for all targets])
   3924 
   3925 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
   3926   #include <stdint.h>
   3927 ]], [[
   3928   uint64_t variable = 1;
   3929   return __sync_add_and_fetch(&variable, 1)
   3930 ]])], [
   3931   ac_have_builtin_atomic64_primary=yes
   3932 ], [
   3933   ac_have_builtin_atomic64_primary=no
   3934 ])
   3935 
   3936 if test x$VGCONF_PLATFORM_SEC_CAPS != x; then
   3937 
   3938 safe_CFLAGS=$CFLAGS
   3939 CFLAGS="$mflag_secondary"
   3940 
   3941 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
   3942   #include <stdint.h>
   3943 ]], [[
   3944   uint64_t variable = 1;
   3945   return __sync_add_and_fetch(&variable, 1)
   3946 ]])], [
   3947   ac_have_builtin_atomic64_secondary=yes
   3948 ], [
   3949   ac_have_builtin_atomic64_secondary=no
   3950 ])
   3951 
   3952 CFLAGS=$safe_CFLAGS
   3953 
   3954 fi
   3955 
   3956 if test x$ac_have_builtin_atomic64_primary = xyes && \
   3957    test x$VGCONF_PLATFORM_SEC_CAPS = x \
   3958      -o x$ac_have_builtin_atomic64_secondary = xyes; then
   3959   AC_MSG_RESULT([yes])
   3960   ac_have_builtin_atomic64=yes
   3961 else
   3962   AC_MSG_RESULT([no])
   3963   ac_have_builtin_atomic64=no
   3964 fi
   3965 
   3966 AM_CONDITIONAL([HAVE_BUILTIN_ATOMIC64],
   3967                [test x$ac_have_builtin_atomic64 = xyes])
   3968 
   3969 
   3970 # does g++ have built-in functions for atomic memory access ?
   3971 AC_MSG_CHECKING([if g++ supports __sync_add_and_fetch])
   3972 
   3973 safe_CXXFLAGS=$CXXFLAGS
   3974 CXXFLAGS="$mflag_primary"
   3975 
   3976 AC_LANG_PUSH(C++)
   3977 AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[
   3978   int variable = 1;
   3979   return (__sync_bool_compare_and_swap(&variable, 1, 2)
   3980           && __sync_add_and_fetch(&variable, 1) ? 1 : 0)
   3981 ]])], [
   3982   ac_have_builtin_atomic_cxx=yes
   3983   AC_MSG_RESULT([yes])
   3984   AC_DEFINE(HAVE_BUILTIN_ATOMIC_CXX, 1, [Define to 1 if g++ supports __sync_bool_compare_and_swap() and __sync_add_and_fetch()])
   3985 ], [
   3986   ac_have_builtin_atomic_cxx=no
   3987   AC_MSG_RESULT([no])
   3988 ])
   3989 AC_LANG_POP(C++)
   3990 
   3991 CXXFLAGS=$safe_CXXFLAGS
   3992 
   3993 AM_CONDITIONAL([HAVE_BUILTIN_ATOMIC_CXX], [test x$ac_have_builtin_atomic_cxx = xyes])
   3994 
   3995 
   3996 if test x$ac_have_usable_linux_futex_h = xyes \
   3997         -a x$ac_have_builtin_atomic_primary = xyes; then
   3998   ac_enable_linux_ticket_lock_primary=yes
   3999 fi
   4000 AM_CONDITIONAL([ENABLE_LINUX_TICKET_LOCK_PRIMARY],
   4001                [test x$ac_enable_linux_ticket_lock_primary = xyes])
   4002 
   4003 if test x$VGCONF_PLATFORM_SEC_CAPS != x \
   4004         -a x$ac_have_usable_linux_futex_h = xyes \
   4005         -a x$ac_have_builtin_atomic_secondary = xyes; then
   4006   ac_enable_linux_ticket_lock_secondary=yes
   4007 fi
   4008 AM_CONDITIONAL([ENABLE_LINUX_TICKET_LOCK_SECONDARY],
   4009                [test x$ac_enable_linux_ticket_lock_secondary = xyes])
   4010 
   4011 
   4012 # does libstdc++ support annotating shared pointers ?
   4013 AC_MSG_CHECKING([if libstdc++ supports annotating shared pointers])
   4014 
   4015 safe_CXXFLAGS=$CXXFLAGS
   4016 CXXFLAGS="-std=c++0x"
   4017 
   4018 AC_LANG_PUSH(C++)
   4019 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
   4020   #include <memory>
   4021 ]], [[
   4022   std::shared_ptr<int> p
   4023 ]])], [
   4024   ac_have_shared_ptr=yes
   4025 ], [
   4026   ac_have_shared_ptr=no
   4027 ])
   4028 if test x$ac_have_shared_ptr = xyes; then
   4029   # If compilation of the program below fails because of a syntax error
   4030   # triggered by substituting one of the annotation macros then that
   4031   # means that libstdc++ supports these macros.
   4032   AC_LINK_IFELSE([AC_LANG_PROGRAM([[
   4033     #define _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(a) (a)----
   4034     #define _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(a) (a)----
   4035     #include <memory>
   4036   ]], [[
   4037     std::shared_ptr<int> p
   4038   ]])], [
   4039     ac_have_shared_pointer_annotation=no
   4040     AC_MSG_RESULT([no])
   4041   ], [
   4042     ac_have_shared_pointer_annotation=yes
   4043     AC_MSG_RESULT([yes])
   4044     AC_DEFINE(HAVE_SHARED_POINTER_ANNOTATION, 1,
   4045               [Define to 1 if libstd++ supports annotating shared pointers])
   4046   ])
   4047 else
   4048   ac_have_shared_pointer_annotation=no
   4049   AC_MSG_RESULT([no])
   4050 fi
   4051 AC_LANG_POP(C++)
   4052 
   4053 CXXFLAGS=$safe_CXXFLAGS
   4054 
   4055 AM_CONDITIONAL([HAVE_SHARED_POINTER_ANNOTATION],
   4056                [test x$ac_have_shared_pointer_annotation = xyes])
   4057 
   4058 
   4059 #----------------------------------------------------------------------------
   4060 # Ok.  We're done checking.
   4061 #----------------------------------------------------------------------------
   4062 
   4063 # Nb: VEX/Makefile is generated from Makefile.vex.in.
   4064 AC_CONFIG_FILES([
   4065    Makefile 
   4066    VEX/Makefile:Makefile.vex.in
   4067    valgrind.spec
   4068    valgrind.pc
   4069    glibc-2.X.supp
   4070    docs/Makefile 
   4071    tests/Makefile 
   4072    tests/vg_regtest 
   4073    perf/Makefile 
   4074    perf/vg_perf
   4075    gdbserver_tests/Makefile
   4076    gdbserver_tests/solaris/Makefile
   4077    include/Makefile 
   4078    auxprogs/Makefile
   4079    mpi/Makefile
   4080    coregrind/Makefile 
   4081    memcheck/Makefile
   4082    memcheck/tests/Makefile
   4083    memcheck/tests/common/Makefile
   4084    memcheck/tests/amd64/Makefile
   4085    memcheck/tests/x86/Makefile
   4086    memcheck/tests/linux/Makefile
   4087    memcheck/tests/darwin/Makefile
   4088    memcheck/tests/solaris/Makefile
   4089    memcheck/tests/amd64-linux/Makefile
   4090    memcheck/tests/x86-linux/Makefile
   4091    memcheck/tests/amd64-solaris/Makefile
   4092    memcheck/tests/x86-solaris/Makefile
   4093    memcheck/tests/ppc32/Makefile
   4094    memcheck/tests/ppc64/Makefile
   4095    memcheck/tests/s390x/Makefile
   4096    memcheck/tests/vbit-test/Makefile
   4097    cachegrind/Makefile
   4098    cachegrind/tests/Makefile
   4099    cachegrind/tests/x86/Makefile
   4100    cachegrind/cg_annotate
   4101    cachegrind/cg_diff
   4102    callgrind/Makefile
   4103    callgrind/callgrind_annotate
   4104    callgrind/callgrind_control
   4105    callgrind/tests/Makefile
   4106    helgrind/Makefile
   4107    helgrind/tests/Makefile
   4108    massif/Makefile
   4109    massif/tests/Makefile
   4110    massif/ms_print
   4111    lackey/Makefile
   4112    lackey/tests/Makefile
   4113    none/Makefile
   4114    none/tests/Makefile
   4115    none/tests/scripts/Makefile
   4116    none/tests/amd64/Makefile
   4117    none/tests/ppc32/Makefile
   4118    none/tests/ppc64/Makefile
   4119    none/tests/x86/Makefile
   4120    none/tests/arm/Makefile
   4121    none/tests/arm64/Makefile
   4122    none/tests/s390x/Makefile
   4123    none/tests/mips32/Makefile
   4124    none/tests/mips64/Makefile
   4125    none/tests/tilegx/Makefile
   4126    none/tests/linux/Makefile
   4127    none/tests/darwin/Makefile
   4128    none/tests/solaris/Makefile
   4129    none/tests/amd64-linux/Makefile
   4130    none/tests/x86-linux/Makefile
   4131    none/tests/amd64-darwin/Makefile
   4132    none/tests/x86-darwin/Makefile
   4133    none/tests/amd64-solaris/Makefile
   4134    none/tests/x86-solaris/Makefile
   4135    exp-sgcheck/Makefile
   4136    exp-sgcheck/tests/Makefile
   4137    drd/Makefile
   4138    drd/scripts/download-and-build-splash2
   4139    drd/tests/Makefile
   4140    exp-bbv/Makefile
   4141    exp-bbv/tests/Makefile
   4142    exp-bbv/tests/x86/Makefile
   4143    exp-bbv/tests/x86-linux/Makefile
   4144    exp-bbv/tests/amd64-linux/Makefile
   4145    exp-bbv/tests/ppc32-linux/Makefile
   4146    exp-bbv/tests/arm-linux/Makefile
   4147    exp-dhat/Makefile
   4148    exp-dhat/tests/Makefile
   4149    shared/Makefile
   4150    solaris/Makefile
   4151 ])
   4152 AC_CONFIG_FILES([coregrind/link_tool_exe_linux],
   4153                 [chmod +x coregrind/link_tool_exe_linux])
   4154 AC_CONFIG_FILES([coregrind/link_tool_exe_darwin],
   4155                 [chmod +x coregrind/link_tool_exe_darwin])
   4156 AC_CONFIG_FILES([coregrind/link_tool_exe_solaris],
   4157                 [chmod +x coregrind/link_tool_exe_solaris])
   4158 AC_OUTPUT
   4159 
   4160 cat<<EOF
   4161 
   4162          Maximum build arch: ${ARCH_MAX}
   4163          Primary build arch: ${VGCONF_ARCH_PRI}
   4164        Secondary build arch: ${VGCONF_ARCH_SEC}
   4165                    Build OS: ${VGCONF_OS}
   4166        Primary build target: ${VGCONF_PLATFORM_PRI_CAPS}
   4167      Secondary build target: ${VGCONF_PLATFORM_SEC_CAPS}
   4168            Platform variant: ${VGCONF_PLATVARIANT}
   4169       Primary -DVGPV string: -DVGPV_${VGCONF_ARCH_PRI}_${VGCONF_OS}_${VGCONF_PLATVARIANT}=1
   4170          Default supp files: ${DEFAULT_SUPP}
   4171 
   4172 EOF
   4173