Revise -mdisable-fpregs option and add new -msoft-mult option
[official-gcc.git] / libstdc++-v3 / acinclude.m4
blob90ecc4a87a2531cf8cb6c96afd34cac1251d4155
1 dnl
2 dnl GLIBCXX_CONDITIONAL (NAME, SHELL-TEST)
3 dnl
4 dnl Exactly like AM_CONDITIONAL, but delays evaluation of the test until the
5 dnl end of configure.  This lets tested variables be reassigned, and the
6 dnl conditional will depend on the final state of the variable.  For a simple
7 dnl example of why this is needed, see GLIBCXX_ENABLE_HOSTED.
8 dnl
9 m4_define([_m4_divert(glibcxx_diversion)], 8000)dnl
10 AC_DEFUN([GLIBCXX_CONDITIONAL], [dnl
11   m4_divert_text([glibcxx_diversion],dnl
12    AM_CONDITIONAL([$1],[$2])
13   )dnl
14 ])dnl
15 AC_DEFUN([GLIBCXX_EVALUATE_CONDITIONALS], [m4_undivert([glibcxx_diversion])])dnl
18 dnl
19 dnl Check to see what architecture and operating system we are compiling
20 dnl for.  Also, if architecture- or OS-specific flags are required for
21 dnl compilation, pick them up here.
22 dnl
23 AC_DEFUN([GLIBCXX_CHECK_HOST], [
24   . $glibcxx_srcdir/configure.host
25   AC_MSG_NOTICE([CPU config directory is $cpu_include_dir])
26   AC_MSG_NOTICE([OS config directory is $os_include_dir])
29 dnl
30 dnl Initialize the rest of the library configury.  At this point we have
31 dnl variables like $host.
32 dnl
33 dnl Sets:
34 dnl  SUBDIRS
35 dnl Substs:
36 dnl  glibcxx_builddir     (absolute path)
37 dnl  glibcxx_srcdir       (absolute path)
38 dnl  toplevel_builddir    (absolute path)
39 dnl  toplevel_srcdir      (absolute path)
40 dnl  with_cross_host
41 dnl  with_newlib
42 dnl  with_target_subdir
43 dnl plus
44 dnl  - the variables in GLIBCXX_CHECK_HOST / configure.host
45 dnl  - default settings for all AM_CONFITIONAL test variables
46 dnl  - lots of tools, like CC and CXX
47 dnl
48 AC_DEFUN([GLIBCXX_CONFIGURE], [
49   # Keep these sync'd with the list in Makefile.am.  The first provides an
50   # expandable list at autoconf time; the second provides an expandable list
51   # (i.e., shell variable) at configure time.
52   m4_define([glibcxx_SUBDIRS],[include libsupc++ src src/c++98 src/c++11 src/c++17 src/c++20 src/filesystem doc po testsuite python])
53   SUBDIRS='glibcxx_SUBDIRS'
55   # These need to be absolute paths, yet at the same time need to
56   # canonicalize only relative paths, because then amd will not unmount
57   # drives. Thus the use of PWDCMD: set it to 'pawd' or 'amq -w' if using amd.
58   glibcxx_builddir=`${PWDCMD-pwd}`
59   case $srcdir in
60     [\\/$]* | ?:[\\/]*) glibcxx_srcdir=${srcdir} ;;
61     *) glibcxx_srcdir=`cd "$srcdir" && ${PWDCMD-pwd} || echo "$srcdir"` ;;
62   esac
63   toplevel_builddir=${glibcxx_builddir}/..
64   toplevel_srcdir=${glibcxx_srcdir}/..
65   AC_SUBST(glibcxx_builddir)
66   AC_SUBST(glibcxx_srcdir)
67   AC_SUBST(toplevel_builddir)
68   AC_SUBST(toplevel_srcdir)
70   # We use these options to decide which functions to include.  They are
71   # set from the top level.
72   AC_ARG_WITH([target-subdir],
73     AC_HELP_STRING([--with-target-subdir=SUBDIR],
74                    [configuring in a subdirectory]))
76   AC_ARG_WITH([cross-host],
77     AC_HELP_STRING([--with-cross-host=HOST],
78                    [configuring with a cross compiler]))
80   AC_ARG_WITH([newlib],
81     AC_HELP_STRING([--with-newlib],
82                    [assume newlib as a system C library]))
84   # Will set LN_S to either 'ln -s', 'ln', or 'cp -p' (if linking isn't
85   # available).  Uncomment the next line to force a particular method.
86   AC_PROG_LN_S
87   #LN_S='cp -p'
89   AC_CHECK_TOOL(AS, as)
90   AC_CHECK_TOOL(AR, ar)
91   AC_CHECK_TOOL(RANLIB, ranlib, ranlib-not-found-in-path-error)
93   AM_MAINTAINER_MODE
95   # Set up safe default values for all subsequent AM_CONDITIONAL tests
96   # which are themselves conditionally expanded.
97   ## (Right now, this only matters for enable_wchar_t, but nothing prevents
98   ## other macros from doing the same.  This should be automated.)  -pme
100   # Check for C library flavor since GNU/Linux platforms use different
101   # configuration directories depending on the C library in use.
102   AC_EGREP_CPP([_using_uclibc], [
103   #include <stdio.h>
104   #if __UCLIBC__
105     _using_uclibc
106   #endif
107   ], uclibc=yes, uclibc=no)
109   AC_EGREP_CPP([_using_bionic], [
110   #include <stdio.h>
111   #if __BIONIC__
112     _using_bionic
113   #endif
114   ], bionic=yes, bionic=no)
116   # Find platform-specific directories containing configuration info.
117   # Also possibly modify flags used elsewhere, as needed by the platform.
118   GLIBCXX_CHECK_HOST
123 dnl Tests for newer compiler features, or features that are present in newer
124 dnl compiler versions but not older compiler versions still in use, should
125 dnl be placed here.
127 dnl Defines:
128 dnl  WERROR='-Werror' if requested and possible; g++'s that lack the
129 dnl   new inlining code or the new system_header pragma will die on -Werror.
130 dnl   Leave it out by default and use maint-mode to use it.
131 dnl  SECTION_FLAGS='-ffunction-sections -fdata-sections' if
132 dnl   compiler supports it and the user has not requested debug mode.
134 AC_DEFUN([GLIBCXX_CHECK_COMPILER_FEATURES], [
135   # All these tests are for C++; save the language and the compiler flags.
136   # The CXXFLAGS thing is suspicious, but based on similar bits previously
137   # found in GLIBCXX_CONFIGURE.
138   AC_LANG_SAVE
139   AC_LANG_CPLUSPLUS
140   ac_test_CXXFLAGS="${CXXFLAGS+set}"
141   ac_save_CXXFLAGS="$CXXFLAGS"
143   # Check for -ffunction-sections -fdata-sections
144   AC_MSG_CHECKING([for g++ that supports -ffunction-sections -fdata-sections])
145   CXXFLAGS='-g -Werror -ffunction-sections -fdata-sections'
146   AC_TRY_COMPILE([int foo; void bar() { };],, [ac_fdsections=yes], [ac_fdsections=no])
147   if test "$ac_test_CXXFLAGS" = set; then
148     CXXFLAGS="$ac_save_CXXFLAGS"
149   else
150     # this is the suspicious part
151     CXXFLAGS=''
152   fi
153   if test x"$ac_fdsections" = x"yes"; then
154     SECTION_FLAGS='-ffunction-sections -fdata-sections'
155   fi
156   AC_MSG_RESULT($ac_fdsections)
158   AC_LANG_RESTORE
159   AC_SUBST(SECTION_FLAGS)
164 dnl If GNU ld is in use, check to see if tricky linker opts can be used.  If
165 dnl the native linker is in use, all variables will be defined to something
166 dnl safe (like an empty string).
168 dnl Defines:
169 dnl  SECTION_LDFLAGS='-Wl,--gc-sections' if possible
170 dnl  OPT_LDFLAGS='-Wl,-O1' and '-z,relro' if possible
171 dnl  LD (as a side effect of testing)
172 dnl Sets:
173 dnl  with_gnu_ld
174 dnl  glibcxx_ld_is_gold (set to "no" or "yes")
175 dnl  glibcxx_gnu_ld_version (possibly)
177 dnl The last will be a single integer, e.g., version 1.23.45.0.67.89 will
178 dnl set glibcxx_gnu_ld_version to 12345.  Zeros cause problems.
180 AC_DEFUN([GLIBCXX_CHECK_LINKER_FEATURES], [
181   # If we're not using GNU ld, then there's no point in even trying these
182   # tests.  Check for that first.  We should have already tested for gld
183   # by now (in libtool), but require it now just to be safe...
184   test -z "$SECTION_LDFLAGS" && SECTION_LDFLAGS=''
185   test -z "$OPT_LDFLAGS" && OPT_LDFLAGS=''
186   AC_REQUIRE([AC_PROG_LD])
187   AC_REQUIRE([AC_PROG_AWK])
189   # The name set by libtool depends on the version of libtool.  Shame on us
190   # for depending on an impl detail, but c'est la vie.  Older versions used
191   # ac_cv_prog_gnu_ld, but now it's lt_cv_prog_gnu_ld, and is copied back on
192   # top of with_gnu_ld (which is also set by --with-gnu-ld, so that actually
193   # makes sense).  We'll test with_gnu_ld everywhere else, so if that isn't
194   # set (hence we're using an older libtool), then set it.
195   if test x${with_gnu_ld+set} != xset; then
196     if test x${ac_cv_prog_gnu_ld+set} != xset; then
197       # We got through "ac_require(ac_prog_ld)" and still not set?  Huh?
198       with_gnu_ld=no
199     else
200       with_gnu_ld=$ac_cv_prog_gnu_ld
201     fi
202   fi
204   # Start by getting the version number.  I think the libtool test already
205   # does some of this, but throws away the result.
206   glibcxx_ld_is_gold=no
207   if test x"$with_gnu_ld" = x"yes"; then
208     AC_MSG_CHECKING([for ld version])
209     changequote(,)
210     if $LD --version 2>/dev/null | grep 'GNU gold' >/dev/null 2>&1; then
211       glibcxx_ld_is_gold=yes
212     fi
213     ldver=`$LD --version 2>/dev/null |
214            sed -e 's/[. ][0-9]\{8\}$//;s/.* \([^ ]\{1,\}\)$/\1/; q'`
215     changequote([,])
216     glibcxx_gnu_ld_version=`echo $ldver | \
217            $AWK -F. '{ if (NF<3) [$]3=0; print ([$]1*100+[$]2)*100+[$]3 }'`
218     AC_MSG_RESULT($glibcxx_gnu_ld_version)
219   fi
221   # Set --gc-sections.
222   glibcxx_have_gc_sections=no
223   if test "$glibcxx_ld_is_gold" = "yes"; then
224     if $LD --help 2>/dev/null | grep gc-sections >/dev/null 2>&1; then
225       glibcxx_have_gc_sections=yes
226     fi
227   else
228     glibcxx_gcsections_min_ld=21602
229     if test x"$with_gnu_ld" = x"yes" &&
230         test $glibcxx_gnu_ld_version -gt $glibcxx_gcsections_min_ld ; then
231       glibcxx_have_gc_sections=yes
232     fi
233   fi
234   if test "$glibcxx_have_gc_sections" = "yes"; then
235     # Sufficiently young GNU ld it is!  Joy and bunny rabbits!
236     # NB: This flag only works reliably after 2.16.1. Configure tests
237     # for this are difficult, so hard wire a value that should work.
239     ac_test_CFLAGS="${CFLAGS+set}"
240     ac_save_CFLAGS="$CFLAGS"
241     CFLAGS='-Wl,--gc-sections'
243     # Check for -Wl,--gc-sections
244     AC_MSG_CHECKING([for ld that supports -Wl,--gc-sections])
245     AC_TRY_LINK([ int one(void) { return 1; }
246      int two(void) { return 2; }
247         ], [ two(); ] , [ac_gcsections=yes], [ac_gcsections=no])
248     if test "$ac_gcsections" = "yes"; then
249       rm -f conftest.c
250       touch conftest.c
251       if $CC -c conftest.c; then
252         if $LD --gc-sections -o conftest conftest.o 2>&1 | \
253            grep "Warning: gc-sections option ignored" > /dev/null; then
254           ac_gcsections=no
255         fi
256       fi
257       rm -f conftest.c conftest.o conftest
258     fi
259     if test "$ac_gcsections" = "yes"; then
260       SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS"
261     fi
262     AC_MSG_RESULT($ac_gcsections)
264     if test "$ac_test_CFLAGS" = set; then
265       CFLAGS="$ac_save_CFLAGS"
266     else
267       # this is the suspicious part
268       CFLAGS=''
269     fi
270   fi
272   # Set -z,relro.
273   # Note this is only for shared objects.
274   ac_ld_relro=no
275   if test x"$with_gnu_ld" = x"yes"; then
276     # cygwin and mingw uses PE, which has no ELF relro support,
277     # multi target ld may confuse configure machinery
278     case "$host" in
279     *-*-cygwin*)
280      ;;
281     *-*-mingw*)
282      ;;
283     *)
284       AC_MSG_CHECKING([for ld that supports -Wl,-z,relro])
285       cxx_z_relo=`$LD -v --help 2>/dev/null | grep "z relro"`
286       if test -n "$cxx_z_relo"; then
287         OPT_LDFLAGS="-Wl,-z,relro"
288         ac_ld_relro=yes
289       fi
290       AC_MSG_RESULT($ac_ld_relro)
291     esac
292   fi
294   # Set linker optimization flags.
295   if test x"$with_gnu_ld" = x"yes"; then
296     OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS"
297   fi
299   AC_SUBST(SECTION_LDFLAGS)
300   AC_SUBST(OPT_LDFLAGS)
305 dnl Check for headers for, and arguments to, the setrlimit() function.
306 dnl Used only in testsuite_hooks.h.  Called from GLIBCXX_CONFIGURE_TESTSUITE.
308 dnl Defines:
309 dnl  _GLIBCXX_RES_LIMITS if we can set artificial resource limits
310 dnl  various HAVE_LIMIT_* for individual limit names
312 AC_DEFUN([GLIBCXX_CHECK_SETRLIMIT_ancilliary], [
313   AC_MSG_CHECKING([for RLIMIT_$1])
314   AC_TRY_COMPILE(
315     [#include <unistd.h>
316      #include <sys/time.h>
317      #include <sys/resource.h>
318     ],
319     [ int f = RLIMIT_$1 ; ],
320     [glibcxx_mresult=1], [glibcxx_mresult=0])
321   AC_DEFINE_UNQUOTED(HAVE_LIMIT_$1, $glibcxx_mresult,
322                      [Only used in build directory testsuite_hooks.h.])
323   if test $glibcxx_mresult = 1 ; then res=yes ; else res=no ; fi
324   AC_MSG_RESULT($res)
327 AC_DEFUN([GLIBCXX_CHECK_SETRLIMIT], [
328   AC_LANG_SAVE
329   AC_LANG_CPLUSPLUS
330   setrlimit_have_headers=yes
331   AC_CHECK_HEADERS(unistd.h sys/time.h sys/resource.h,
332                    [],
333                    [setrlimit_have_headers=no])
334   # If don't have the headers, then we can't run the tests now, and we
335   # won't be seeing any of these during testsuite compilation.
336   if test $setrlimit_have_headers = yes; then
337     # Can't do these in a loop, else the resulting syntax is wrong.
338     GLIBCXX_CHECK_SETRLIMIT_ancilliary(DATA)
339     GLIBCXX_CHECK_SETRLIMIT_ancilliary(RSS)
340     GLIBCXX_CHECK_SETRLIMIT_ancilliary(VMEM)
341     GLIBCXX_CHECK_SETRLIMIT_ancilliary(AS)
342     GLIBCXX_CHECK_SETRLIMIT_ancilliary(FSIZE)
344     # Check for rlimit, setrlimit.
345     AC_CACHE_VAL(glibcxx_cv_setrlimit, [
346       AC_TRY_COMPILE(
347         [#include <unistd.h>
348          #include <sys/time.h>
349          #include <sys/resource.h>
350         ],
351         [struct rlimit r;
352          setrlimit(0, &r);],
353         [glibcxx_cv_setrlimit=yes], [glibcxx_cv_setrlimit=no])
354     ])
355   fi
357   AC_MSG_CHECKING([for testsuite resource limits support])
358   if test $setrlimit_have_headers = yes && test $glibcxx_cv_setrlimit = yes; then
359     ac_res_limits=yes
360     AC_DEFINE(_GLIBCXX_RES_LIMITS, 1,
361               [Define if using setrlimit to set resource limits during
362               "make check"])
363   else
364     ac_res_limits=no
365   fi
366   AC_LANG_RESTORE
367   AC_MSG_RESULT($ac_res_limits)
372 dnl Check whether S_ISREG (Posix) or S_IFREG is available in <sys/stat.h>.
373 dnl Define HAVE_S_ISREG / HAVE_S_IFREG appropriately.
375 AC_DEFUN([GLIBCXX_CHECK_S_ISREG_OR_S_IFREG], [
377   AC_LANG_SAVE
378   AC_LANG_CPLUSPLUS
379   ac_save_CXXFLAGS="$CXXFLAGS"
380   CXXFLAGS="$CXXFLAGS -fno-exceptions"
382   AC_MSG_CHECKING([for S_ISREG or S_IFREG])
383   AC_CACHE_VAL(glibcxx_cv_S_ISREG, [
384     GCC_TRY_COMPILE_OR_LINK(
385       [#include <sys/stat.h>],
386       [struct stat buffer;
387        fstat(0, &buffer);
388        S_ISREG(buffer.st_mode);],
389       [glibcxx_cv_S_ISREG=yes],
390       [glibcxx_cv_S_ISREG=no])
391   ])
392   AC_CACHE_VAL(glibcxx_cv_S_IFREG, [
393     GCC_TRY_COMPILE_OR_LINK(
394       [#include <sys/stat.h>],
395       [struct stat buffer;
396        fstat(0, &buffer);
397        S_IFREG & buffer.st_mode;],
398       [glibcxx_cv_S_IFREG=yes],
399       [glibcxx_cv_S_IFREG=no])
400   ])
401   res=no
402   if test $glibcxx_cv_S_ISREG = yes; then
403     AC_DEFINE(HAVE_S_ISREG, 1,
404               [Define if S_ISREG is available in <sys/stat.h>.])
405     res=S_ISREG
406   elif test $glibcxx_cv_S_IFREG = yes; then
407     AC_DEFINE(HAVE_S_IFREG, 1,
408               [Define if S_IFREG is available in <sys/stat.h>.])
409     res=S_IFREG
410   fi
411   AC_MSG_RESULT($res)
413   CXXFLAGS="$ac_save_CXXFLAGS"
414   AC_LANG_RESTORE
419 dnl Check whether poll is available in <poll.h>, and define HAVE_POLL.
421 AC_DEFUN([GLIBCXX_CHECK_POLL], [
423   AC_LANG_SAVE
424   AC_LANG_CPLUSPLUS
425   ac_save_CXXFLAGS="$CXXFLAGS"
426   CXXFLAGS="$CXXFLAGS -fno-exceptions"
428   AC_MSG_CHECKING([for poll])
429   AC_CACHE_VAL(glibcxx_cv_POLL, [
430     GCC_TRY_COMPILE_OR_LINK(
431       [#include <poll.h>],
432       [struct pollfd pfd[1];
433        pfd[0].events = POLLIN;
434        poll(pfd, 1, 0);],
435       [glibcxx_cv_POLL=yes],
436       [glibcxx_cv_POLL=no])
437   ])
438   if test $glibcxx_cv_POLL = yes; then
439     AC_DEFINE(HAVE_POLL, 1, [Define if poll is available in <poll.h>.])
440   fi
441   AC_MSG_RESULT($glibcxx_cv_POLL)
443   CXXFLAGS="$ac_save_CXXFLAGS"
444   AC_LANG_RESTORE
449 dnl Check whether writev is available in <sys/uio.h>, and define HAVE_WRITEV.
451 AC_DEFUN([GLIBCXX_CHECK_WRITEV], [
453   AC_LANG_SAVE
454   AC_LANG_CPLUSPLUS
455   ac_save_CXXFLAGS="$CXXFLAGS"
456   CXXFLAGS="$CXXFLAGS -fno-exceptions"
458   AC_MSG_CHECKING([for writev])
459   AC_CACHE_VAL(glibcxx_cv_WRITEV, [
460     GCC_TRY_COMPILE_OR_LINK(
461       [#include <sys/uio.h>],
462       [struct iovec iov[2];
463        writev(0, iov, 0);],
464       [glibcxx_cv_WRITEV=yes],
465       [glibcxx_cv_WRITEV=no])
466   ])
467   if test $glibcxx_cv_WRITEV = yes; then
468     AC_DEFINE(HAVE_WRITEV, 1, [Define if writev is available in <sys/uio.h>.])
469   fi
470   AC_MSG_RESULT($glibcxx_cv_WRITEV)
472   CXXFLAGS="$ac_save_CXXFLAGS"
473   AC_LANG_RESTORE
478 dnl Check whether LFS support is available.
480 AC_DEFUN([GLIBCXX_CHECK_LFS], [
481   AC_LANG_SAVE
482   AC_LANG_CPLUSPLUS
483   ac_save_CXXFLAGS="$CXXFLAGS"
484   CXXFLAGS="$CXXFLAGS -fno-exceptions"
485   AC_MSG_CHECKING([for LFS support])
486   AC_CACHE_VAL(glibcxx_cv_LFS, [
487     GCC_TRY_COMPILE_OR_LINK(
488       [#include <unistd.h>
489        #include <stdio.h>
490        #include <sys/stat.h>
491       ],
492       [FILE* fp;
493        fopen64("t", "w");
494        fseeko64(fp, 0, SEEK_CUR);
495        ftello64(fp);
496        lseek64(1, 0, SEEK_CUR);
497        struct stat64 buf;
498        fstat64(1, &buf);],
499       [glibcxx_cv_LFS=yes],
500       [glibcxx_cv_LFS=no])
501   ])
502   if test $glibcxx_cv_LFS = yes; then
503     AC_DEFINE(_GLIBCXX_USE_LFS, 1, [Define if LFS support is available.])
504   fi
505   AC_MSG_RESULT($glibcxx_cv_LFS)
506   CXXFLAGS="$ac_save_CXXFLAGS"
507   AC_LANG_RESTORE
512 dnl Check for whether a fully dynamic basic_string implementation should
513 dnl be turned on, that does not put empty objects in per-process static
514 dnl memory (mostly useful together with shared memory allocators, see PR
515 dnl libstdc++/16612 for details).
517 dnl --enable-fully-dynamic-string defines _GLIBCXX_FULLY_DYNAMIC_STRING to 1
518 dnl --disable-fully-dynamic-string defines _GLIBCXX_FULLY_DYNAMIC_STRING to 0
519 dnl otherwise undefined
520 dnl  +  Usage:  GLIBCXX_ENABLE_FULLY_DYNAMIC_STRING[(DEFAULT)]
521 dnl       Where DEFAULT is either `yes' or `no'.
523 AC_DEFUN([GLIBCXX_ENABLE_FULLY_DYNAMIC_STRING], [
524   GLIBCXX_ENABLE(fully-dynamic-string,$1,,[do not put empty strings in per-process static memory])
525   if test $enable_fully_dynamic_string = yes; then
526     enable_fully_dynamic_string_def=1
527   else
528     enable_fully_dynamic_string_def=0
529   fi
530   AC_DEFINE_UNQUOTED([_GLIBCXX_FULLY_DYNAMIC_STRING], [${enable_fully_dynamic_string_def}],
531               [Define to 1 if a fully dynamic basic_string is wanted, 0 to disable, undefined for platform defaults])
536 dnl Does any necessary configuration of the testsuite directory.  Generates
537 dnl the testsuite_hooks.h header.
539 dnl GLIBCXX_ENABLE_SYMVERS and GLIBCXX_IS_NATIVE must be done before this.
541 dnl Sets:
542 dnl  enable_abi_check
543 dnl  GLIBCXX_TEST_WCHAR_T
544 dnl  GLIBCXX_TEST_THREAD
545 dnl Substs:
546 dnl  baseline_dir
547 dnl  baseline_subdir_switch
549 AC_DEFUN([GLIBCXX_CONFIGURE_TESTSUITE], [
550   # Do checks for resource limit functions.
551   GLIBCXX_CHECK_SETRLIMIT
553   if $GLIBCXX_IS_NATIVE ; then
554     # Look for setenv, so that extended locale tests can be performed.
555     GLIBCXX_CHECK_STDLIB_DECL_AND_LINKAGE_3(setenv)
556   fi
558   if $GLIBCXX_IS_NATIVE && test $is_hosted = yes &&
559      test $enable_symvers != no; then
560     case "$host" in
561       *-*-cygwin*)
562         enable_abi_check=no ;;
563       *)
564         enable_abi_check=yes ;;
565     esac
566   else
567     # Only build this as native, since automake does not understand
568     # CXX_FOR_BUILD.
569     enable_abi_check=no
570   fi
572   # Export file names for ABI checking.
573   baseline_dir="$glibcxx_srcdir/config/abi/post/${abi_baseline_pair}"
574   AC_SUBST(baseline_dir)
575   baseline_subdir_switch="$abi_baseline_subdir_switch"
576   AC_SUBST(baseline_subdir_switch)
581 dnl Does any necessary configuration for docbook in the docs directory.
583 dnl XSLTPROC must be set before this
585 dnl Sets:
586 dnl  glibcxx_stylesheets
587 dnl Substs:
588 dnl  XSL_STYLE_DIR
590 AC_DEFUN([GLIBCXX_CONFIGURE_DOCBOOK], [
592 glibcxx_docbook_url=http://docbook.sourceforge.net/release/xsl-ns/current/
594 AC_MSG_CHECKING([for local stylesheet directory])
595 glibcxx_local_stylesheets=no
596 if test x${XMLCATALOG} = xyes && xsl_style_dir=`xmlcatalog "" $glibcxx_docbook_url 2>/dev/null`
597 then
598   XSL_STYLE_DIR=`echo $xsl_style_dir | sed -n 's;^file://;;p'`
599   glibcxx_local_stylesheets=yes
600 else
601   for dir in \
602     /usr/share/sgml/docbook/xsl-ns-stylesheets \
603     /usr/share/xml/docbook/stylesheet/docbook-xsl-ns \
604     /usr/share/xml/docbook/stylesheet/nwalsh5/current \
605     /usr/share/xml/docbook/stylesheet/nwalsh/current
606   do
607     if test -d $dir; then
608       glibcxx_local_stylesheets=yes
609       XSL_STYLE_DIR=$dir
610       break
611     fi
612   done
614 AC_MSG_RESULT($glibcxx_local_stylesheets)
616 if test x"$glibcxx_local_stylesheets" = x"yes"; then
617   AC_SUBST(XSL_STYLE_DIR)
618   AC_MSG_NOTICE($XSL_STYLE_DIR)
620   AC_MSG_CHECKING([for docbook stylesheets for documentation creation])
621   glibcxx_stylesheets=no
622   if test x${XMLCATALOG} = xno || xmlcatalog "" $glibcxx_docbook_url/xhtml/docbook.xsl >/dev/null 2>&1; then
623     if test x${XSLTPROC} = xyes && echo '<title/>' | xsltproc --noout --nonet --xinclude $glibcxx_docbook_url/xhtml/docbook.xsl - 2>/dev/null; then
624       glibcxx_stylesheets=yes
625     fi
626   fi
627   AC_MSG_RESULT($glibcxx_stylesheets)
629 else
630   glibcxx_stylesheets=no
633 # Check for epub3 dependencies.
634 AC_MSG_CHECKING([for epub3 stylesheets for documentation creation])
635 glibcxx_epub_stylesheets=no
636 if test x"$glibcxx_local_stylesheets" = x"yes"; then
637    if test -f "$XSL_STYLE_DIR/epub3/chunk.xsl"; then
638       glibcxx_epub_stylesheets=yes
639    fi
641 AC_MSG_RESULT($glibcxx_epub_stylesheets)
642 AM_CONDITIONAL(BUILD_EPUB, test x"$glibcxx_epub_stylesheets" = x"yes")
648 dnl Set up *_INCLUDES variables for all sundry Makefile.am's.
650 dnl Substs:
651 dnl  GLIBCXX_INCLUDES
652 dnl  TOPLEVEL_INCLUDES
654 AC_DEFUN([GLIBCXX_EXPORT_INCLUDES], [
655   # Used for every C++ compile we perform.
656   GLIBCXX_INCLUDES="\
657 -I$glibcxx_builddir/include/$host_alias \
658 -I$glibcxx_builddir/include \
659 -I$glibcxx_srcdir/libsupc++"
661   # For Canadian crosses, pick this up too.
662   if test $CANADIAN = yes; then
663     GLIBCXX_INCLUDES="$GLIBCXX_INCLUDES -I\${includedir}"
664   fi
666   # Stuff in the actual top level.  Currently only used by libsupc++ to
667   # get unwind* headers from the libgcc dir.
668   #TOPLEVEL_INCLUDES='-I$(toplevel_srcdir)/libgcc -I$(toplevel_srcdir)/include'
669   TOPLEVEL_INCLUDES='-I$(toplevel_srcdir)/libgcc'
671   # Now, export this to all the little Makefiles....
672   AC_SUBST(GLIBCXX_INCLUDES)
673   AC_SUBST(TOPLEVEL_INCLUDES)
678 dnl Set up *_FLAGS and *FLAGS variables for all sundry Makefile.am's.
679 dnl (SECTION_FLAGS is done under CHECK_COMPILER_FEATURES.)
681 dnl Substs:
682 dnl  OPTIMIZE_CXXFLAGS
683 dnl  WARN_FLAGS
685 AC_DEFUN([GLIBCXX_EXPORT_FLAGS], [
686   # Optimization flags that are probably a good idea for thrill-seekers. Just
687   # uncomment the lines below and make, everything else is ready to go...
688   # Alternatively OPTIMIZE_CXXFLAGS can be set in configure.host.
689   # OPTIMIZE_CXXFLAGS = -O3 -fstrict-aliasing -fvtable-gc
690   AC_SUBST(OPTIMIZE_CXXFLAGS)
692   WARN_FLAGS="-Wall -Wextra -Wwrite-strings -Wcast-qual -Wabi=2"
693   AC_SUBST(WARN_FLAGS)
698 dnl All installation directory information is determined here.
700 dnl Substs:
701 dnl  gxx_install_dir
702 dnl  glibcxx_prefixdir
703 dnl  glibcxx_toolexecdir
704 dnl  glibcxx_toolexeclibdir
706 dnl Assumes cross_compiling bits already done, and with_cross_host in
707 dnl particular.
709 dnl This logic must match gcc/configure.ac's setting of gcc_gxx_include_dir.
710 dnl config/gxx-include-dir.m4 must be kept consistant with this as well.
711 AC_DEFUN([GLIBCXX_EXPORT_INSTALL_INFO], [
712   glibcxx_toolexecdir=no
713   glibcxx_toolexeclibdir=no
714   glibcxx_prefixdir=$prefix
716   AC_MSG_CHECKING([for gxx-include-dir])
717   AC_ARG_WITH([gxx-include-dir],
718     AC_HELP_STRING([--with-gxx-include-dir=DIR],
719                    [installation directory for include files]),
720     [case "$withval" in
721       yes) AC_MSG_ERROR([Missing directory for --with-gxx-include-dir]) ;;
722       no)  gxx_include_dir=no ;;
723       *)   gxx_include_dir=$withval ;;
724      esac],
725     [gxx_include_dir=no])
726   AC_MSG_RESULT($gxx_include_dir)
728   AC_MSG_CHECKING([for --enable-version-specific-runtime-libs])
729   AC_ARG_ENABLE([version-specific-runtime-libs],
730     AC_HELP_STRING([--enable-version-specific-runtime-libs],
731                    [Specify that runtime libraries should be installed in a compiler-specific directory]),
732     [case "$enableval" in
733       yes) version_specific_libs=yes ;;
734       no)  version_specific_libs=no ;;
735       *)   AC_MSG_ERROR([Unknown argument to enable/disable version-specific libs]);;
736      esac],
737     [version_specific_libs=no])
738   AC_MSG_RESULT($version_specific_libs)
740   GCC_WITH_TOOLEXECLIBDIR
742   # Default case for install directory for include files.
743   if test $version_specific_libs = no && test $gxx_include_dir = no; then
744     gxx_include_dir='include/c++/${gcc_version}'
745     if test -n "$with_cross_host" &&
746        test x"$with_cross_host" != x"no"; then
747       gxx_include_dir='${prefix}/${target_alias}/'"$gxx_include_dir"
748     else
749       gxx_include_dir='${prefix}/'"$gxx_include_dir"
750     fi
751   fi
753   # Version-specific runtime libs processing.
754   if test $version_specific_libs = yes; then
755     # Need the gcc compiler version to know where to install libraries
756     # and header files if --enable-version-specific-runtime-libs option
757     # is selected.  FIXME: these variables are misnamed, there are
758     # no executables installed in _toolexecdir or _toolexeclibdir.
759     if test x"$gxx_include_dir" = x"no"; then
760       gxx_include_dir='${libdir}/gcc/${host_alias}/${gcc_version}/include/c++'
761     fi
762     glibcxx_toolexecdir='${libdir}/gcc/${host_alias}'
763     glibcxx_toolexeclibdir='${toolexecdir}/${gcc_version}$(MULTISUBDIR)'
764   fi
766   # Calculate glibcxx_toolexecdir, glibcxx_toolexeclibdir
767   # Install a library built with a cross compiler in tooldir, not libdir.
768   if test x"$glibcxx_toolexecdir" = x"no"; then
769     if test -n "$with_cross_host" &&
770        test x"$with_cross_host" != x"no"; then
771       glibcxx_toolexecdir='${exec_prefix}/${host_alias}'
772       case ${with_toolexeclibdir} in
773         no)
774           glibcxx_toolexeclibdir='${toolexecdir}/lib'
775           ;;
776         *)
777           glibcxx_toolexeclibdir=${with_toolexeclibdir}
778           ;;
779       esac
780     else
781       glibcxx_toolexecdir='${libdir}/gcc/${host_alias}'
782       glibcxx_toolexeclibdir='${libdir}'
783     fi
784     multi_os_directory=`$CXX -print-multi-os-directory`
785     case $multi_os_directory in
786       .) ;; # Avoid trailing /.
787       *) glibcxx_toolexeclibdir=$glibcxx_toolexeclibdir/$multi_os_directory ;;
788     esac
789   fi
791   AC_MSG_CHECKING([for install location])
792   AC_MSG_RESULT($gxx_include_dir)
794   AC_SUBST(glibcxx_prefixdir)
795   AC_SUBST(gxx_include_dir)
796   AC_SUBST(glibcxx_toolexecdir)
797   AC_SUBST(glibcxx_toolexeclibdir)
802 dnl GLIBCXX_ENABLE
803 dnl    (FEATURE, DEFAULT, HELP-ARG, HELP-STRING)
804 dnl    (FEATURE, DEFAULT, HELP-ARG, HELP-STRING, permit a|b|c)
805 dnl    (FEATURE, DEFAULT, HELP-ARG, HELP-STRING, SHELL-CODE-HANDLER)
807 dnl See manual/appendix_porting.html#appendix.porting.build_hacking for
808 dnl documentation.
810 m4_define([GLIBCXX_ENABLE],[dnl
811 m4_define([_g_switch],[--enable-$1])dnl
812 m4_define([_g_help],[AC_HELP_STRING([_g_switch$3],[$4 @<:@default=$2@:>@])])dnl
813  AC_ARG_ENABLE([$1],m4_dquote(_g_help),
814   m4_bmatch([$5],
815    [^permit ],
816      [[
817       case "$enableval" in
818        m4_bpatsubst([$5],[permit ])) ;;
819        *) AC_MSG_ERROR(Unknown argument to enable/disable $1) ;;
820           dnl Idea for future:  generate a URL pointing to
821           dnl "onlinedocs/configopts.html#whatever"
822       esac
823      ]],
824    [^$],
825      [[
826       case "$enableval" in
827        yes|no) ;;
828        *) AC_MSG_ERROR(Argument to enable/disable $1 must be yes or no) ;;
829       esac
830      ]],
831    [[$5]]),
832   [enable_]m4_bpatsubst([$1],-,_)[=][$2])
833 m4_undefine([_g_switch])dnl
834 m4_undefine([_g_help])dnl
839 dnl Check for ISO/IEC 9899:1999 "C99" support.
841 dnl --enable-c99 defines _GLIBCXX_USE_C99
842 dnl --disable-c99 leaves _GLIBCXX_USE_C99 undefined
843 dnl  +  Usage:  GLIBCXX_ENABLE_C99[(DEFAULT)]
844 dnl       Where DEFAULT is either `yes' or `no'.
845 dnl  +  If 'C99' stuff is not available, ignores DEFAULT and sets `no'.
847 AC_DEFUN([GLIBCXX_ENABLE_C99], [
848   GLIBCXX_ENABLE(c99,$1,,[turns on ISO/IEC 9899:1999 support])
850   if test x"$enable_c99" = x"yes"; then
851     AC_LANG_SAVE
852     AC_LANG_CPLUSPLUS
854     # Use -std=c++98 (instead of -std=gnu++98) because leaving __STRICT_ANSI__
855     # undefined may cause fake C99 facilities, like pre-standard snprintf,
856     # to be spuriously enabled.
857     ac_save_CXXFLAGS="$CXXFLAGS"
858     CXXFLAGS="$CXXFLAGS -std=c++98"
859     ac_save_LIBS="$LIBS"
860     ac_save_gcc_no_link="$gcc_no_link"
862     if test x$gcc_no_link != xyes; then
863       # Use -fno-exceptions to that the C driver can link these tests without
864       # hitting undefined references to personality routines.
865       CXXFLAGS="$CXXFLAGS -fno-exceptions"
866       AC_CHECK_LIB(m, sin, [LIBS="$LIBS -lm"], [
867         # Use the default compile-only tests in GCC_TRY_COMPILE_OR_LINK
868         gcc_no_link=yes
869       ])
870     fi
872     # Check for the existence of <math.h> functions used if C99 is enabled.
873     AC_MSG_CHECKING([for ISO C99 support in <math.h> for C++98])
874     AC_CACHE_VAL(glibcxx_cv_c99_math_cxx98, [
875       GCC_TRY_COMPILE_OR_LINK(
876         [#include <math.h>
877          volatile double d1, d2;
878          volatile int i;],
879         [i = fpclassify(d1);
880          i = isfinite(d1);
881          i = isinf(d1);
882          i = isnan(d1);
883          i = isnormal(d1);
884          i = signbit(d1);
885          i = isgreater(d1, d2);
886          i = isgreaterequal(d1, d2);
887          i = isless(d1, d2);
888          i = islessequal(d1, d2);
889          i = islessgreater(d1, d2);
890          i = islessgreater(d1, d2);
891          i = isunordered(d1, d2);
892         ], [glibcxx_cv_c99_math_cxx98=yes], [glibcxx_cv_c99_math_cxx98=no])
893     ])
894     AC_MSG_RESULT($glibcxx_cv_c99_math_cxx98)
895     if test x"$glibcxx_cv_c99_math_cxx98" = x"yes"; then
896       AC_DEFINE(_GLIBCXX98_USE_C99_MATH, 1,
897         [Define if C99 functions or macros in <math.h> should be imported
898         in <cmath> in namespace std for C++98.])
899     fi
901     # Check for the existence of <complex.h> complex math functions.
902     # This is necessary even though libstdc++ uses the builtin versions
903     # of these functions, because if the builtin cannot be used, a reference
904     # to the library function is emitted.
905     AC_CHECK_HEADERS(tgmath.h, ac_has_tgmath_h=yes, ac_has_tgmath_h=no)
906     AC_CHECK_HEADERS(complex.h, ac_has_complex_h=yes, ac_has_complex_h=no)
907     if test x"$ac_has_complex_h" = x"yes"; then
908       AC_MSG_CHECKING([for ISO C99 support in <complex.h> for C++98])
909       AC_CACHE_VAL(glibcxx_cv_c99_complex_cxx98, [
910         GCC_TRY_COMPILE_OR_LINK(
911           [#include <complex.h>
912            typedef __complex__ float float_type;
913            typedef __complex__ double double_type;
914            typedef __complex__ long double ld_type;
915            volatile float_type tmpf;
916            volatile double_type tmpd;
917            volatile ld_type tmpld;
918            volatile float f;
919            volatile double d;
920            volatile long double ld;],
921           [f = cabsf(tmpf);
922            f = cargf(tmpf);
923            tmpf = ccosf(tmpf);
924            tmpf = ccoshf(tmpf);
925            tmpf = cexpf(tmpf);
926            tmpf = clogf(tmpf);
927            tmpf = csinf(tmpf);
928            tmpf = csinhf(tmpf);
929            tmpf = csqrtf(tmpf);
930            tmpf = ctanf(tmpf);
931            tmpf = ctanhf(tmpf);
932            tmpf = cpowf(tmpf, tmpf);
933            tmpf = cprojf(tmpf);
934            d = cabs(tmpd);
935            d = carg(tmpd);
936            tmpd = ccos(tmpd);
937            tmpd = ccosh(tmpd);
938            tmpd = cexp(tmpd);
939            tmpd = clog(tmpd);
940            tmpd = csin(tmpd);
941            tmpd = csinh(tmpd);
942            tmpd = csqrt(tmpd);
943            tmpd = ctan(tmpd);
944            tmpd = ctanh(tmpd);
945            tmpd = cpow(tmpd, tmpd);
946            tmpd = cproj(tmpd);
947            ld = cabsl(tmpld);
948            ld = cargl(tmpld);
949            tmpld = ccosl(tmpld);
950            tmpld = ccoshl(tmpld);
951            tmpld = cexpl(tmpld);
952            tmpld = clogl(tmpld);
953            tmpld = csinl(tmpld);
954            tmpld = csinhl(tmpld);
955            tmpld = csqrtl(tmpld);
956            tmpld = ctanl(tmpld);
957            tmpld = ctanhl(tmpld);
958            tmpld = cpowl(tmpld, tmpld);
959            tmpld = cprojl(tmpld);
960           ], [glibcxx_cv_c99_complex_cxx98=yes], [glibcxx_cv_c99_complex_cxx98=no])
961       ])
962     fi
963     AC_MSG_RESULT($glibcxx_cv_c99_complex_cxx98)
964     if test x"$glibcxx_cv_c99_complex_cxx98" = x"yes"; then
965       AC_DEFINE(_GLIBCXX98_USE_C99_COMPLEX, 1,
966         [Define if C99 functions in <complex.h> should be used in
967         <complex> for C++98. Using compiler builtins for these functions
968         requires corresponding C99 library functions to be present.])
969     fi
971     # Check for the existence in <stdio.h> of vscanf, et. al.
972     AC_MSG_CHECKING([for ISO C99 support in <stdio.h> for C++98])
973     AC_CACHE_VAL(glibcxx_cv_c99_stdio_cxx98, [
974       GCC_TRY_COMPILE_OR_LINK(
975         [#include <stdio.h>
976          #include <stdarg.h>
977          void foo(char* fmt, ...)
978          {
979            va_list args; va_start(args, fmt);
980            vfscanf(stderr, "%i", args);
981            vscanf("%i", args);
982            vsnprintf(fmt, 0, "%i", args);
983            vsscanf(fmt, "%i", args);
984            snprintf(fmt, 0, "%i");
985          }], [],
986         [glibcxx_cv_c99_stdio_cxx98=yes], [glibcxx_cv_c99_stdio_cxx98=no])
987     ])
988     AC_MSG_RESULT($glibcxx_cv_c99_stdio_cxx98)
989     if test x"$glibcxx_cv_c99_stdio_cxx98" = x"yes"; then
990       AC_DEFINE(_GLIBCXX98_USE_C99_STDIO, 1,
991         [Define if C99 functions or macros in <stdio.h> should be imported
992         in <cstdio> in namespace std for C++98.])
993     fi
995     # Check for the existence in <stdlib.h> of lldiv_t, et. al.
996     AC_MSG_CHECKING([for ISO C99 support in <stdlib.h> for C++98])
997     AC_CACHE_VAL(glibcxx_cv_c99_stdlib_cxx98, [
998       GCC_TRY_COMPILE_OR_LINK(
999         [#include <stdlib.h>
1000          volatile float f;
1001          volatile long double ld;
1002          volatile unsigned long long ll;
1003          lldiv_t mydivt;],
1004         [char* tmp;
1005          f = strtof("gnu", &tmp);
1006          ld = strtold("gnu", &tmp);
1007          ll = strtoll("gnu", &tmp, 10);
1008          ll = strtoull("gnu", &tmp, 10);
1009          ll = llabs(10);
1010          mydivt = lldiv(10,1);
1011          ll = mydivt.quot;
1012          ll = mydivt.rem;
1013          ll = atoll("10");
1014          _Exit(0);
1015         ], [glibcxx_cv_c99_stdlib_cxx98=yes], [glibcxx_cv_c99_stdlib_cxx98=no])
1016     ])
1017     AC_MSG_RESULT($glibcxx_cv_c99_stdlib_cxx98)
1018     if test x"$glibcxx_cv_c99_stdlib_cxx98" = x"yes"; then
1019       AC_DEFINE(_GLIBCXX98_USE_C99_STDLIB, 1,
1020         [Define if C99 functions or macros in <stdlib.h> should be imported
1021         in <cstdlib> in namespace std for C++98.])
1022     fi
1024     # Check for the existence in <wchar.h> of wcstold, etc.
1025     if test x"$ac_has_wchar_h" = xyes &&
1026        test x"$ac_has_wctype_h" = xyes; then
1027       AC_MSG_CHECKING([for ISO C99 support in <wchar.h> for C++98])
1028       AC_CACHE_VAL(glibcxx_cv_c99_wchar_cxx98, [
1029         AC_TRY_COMPILE([#include <wchar.h>
1030           namespace test
1031           {
1032             using ::wcstold;
1033             using ::wcstoll;
1034             using ::wcstoull;
1035           }
1036         ], [], [glibcxx_cv_c99_wchar_cxx98=yes], [glibcxx_cv_c99_wchar_cxx98=no])
1037       ])
1039       # Checks for wide character functions that may not be present.
1040       # Injection of these is wrapped with guard macros.
1041       # NB: only put functions here, instead of immediately above, if
1042       # absolutely necessary.
1043       AC_TRY_COMPILE([#include <wchar.h>
1044         namespace test { using ::vfwscanf; }], [],
1045         [AC_DEFINE(HAVE_VFWSCANF, 1, [Defined if vfwscanf exists.])], [])
1047       AC_TRY_COMPILE([#include <wchar.h>
1048         namespace test { using ::vswscanf; }], [],
1049         [AC_DEFINE(HAVE_VSWSCANF, 1, [Defined if vswscanf exists.])], [])
1051       AC_TRY_COMPILE([#include <wchar.h>
1052         namespace test { using ::vwscanf; }], [],
1053         [AC_DEFINE(HAVE_VWSCANF, 1, [Defined if vwscanf exists.])], [])
1055       AC_TRY_COMPILE([#include <wchar.h>
1056         namespace test { using ::wcstof; }], [],
1057         [AC_DEFINE(HAVE_WCSTOF, 1, [Defined if wcstof exists.])], [])
1059       AC_TRY_COMPILE([#include <wctype.h>],
1060         [wint_t t; int i = iswblank(t);],
1061         [AC_DEFINE(HAVE_ISWBLANK, 1, [Defined if iswblank exists.])], [])
1063       AC_MSG_RESULT($glibcxx_cv_c99_wchar_cxx98)
1064       if test x"$glibcxx_cv_c99_wchar_cxx98" = x"yes"; then
1065         AC_DEFINE(_GLIBCXX98_USE_C99_WCHAR, 1,
1066           [Define if C99 functions or macros in <wchar.h> should be imported
1067           in <cwchar> in namespace std for C++98.])
1068       fi
1069     fi
1071     # Option parsed, now set things appropriately.
1072     if test x"$glibcxx_cv_c99_math_cxx98" = x"no" ||
1073        test x"$glibcxx_cv_c99_complex_cxx98" = x"no" ||
1074        test x"$glibcxx_cv_c99_stdio_cxx98" = x"no" ||
1075        test x"$glibcxx_cv_c99_stdlib_cxx98" = x"no" ||
1076        test x"$glibcxx_cv_c99_wchar_cxx98" = x"no"; then
1077       enable_c99=no;
1078     else
1079       AC_DEFINE(_GLIBCXX_USE_C99, 1,
1080         [Define if C99 functions or macros from <wchar.h>, <math.h>,
1081         <complex.h>, <stdio.h>, and <stdlib.h> can be used or exposed.])
1082     fi
1084     gcc_no_link="$ac_save_gcc_no_link"
1085     LIBS="$ac_save_LIBS"
1086     CXXFLAGS="$ac_save_CXXFLAGS"
1087     AC_LANG_RESTORE
1089     AC_LANG_SAVE
1090     AC_LANG_CPLUSPLUS
1092     # Use -std=c++11 and test again for C99 library feature in C++11 mode.
1093     # For the reasons given above we use -std=c++11 not -std=gnu++11.
1094     ac_save_CXXFLAGS="$CXXFLAGS"
1095     CXXFLAGS="$CXXFLAGS -std=c++11"
1096     ac_save_LIBS="$LIBS"
1097     ac_save_gcc_no_link="$gcc_no_link"
1099     if test x$gcc_no_link != xyes; then
1100       # Use -fno-exceptions to that the C driver can link these tests without
1101       # hitting undefined references to personality routines.
1102       CXXFLAGS="$CXXFLAGS -fno-exceptions"
1103       AC_CHECK_LIB(m, sin, [LIBS="$LIBS -lm"], [
1104         # Use the default compile-only tests in GCC_TRY_COMPILE_OR_LINK
1105         gcc_no_link=yes
1106       ])
1107     fi
1109     # Check for the existence of <math.h> functions used if C99 is enabled.
1110     AC_MSG_CHECKING([for ISO C99 support in <math.h> for C++11])
1111     AC_CACHE_VAL(glibcxx_cv_c99_math_cxx11, [
1112       GCC_TRY_COMPILE_OR_LINK(
1113         [#include <math.h>
1114          volatile double d1, d2;
1115          volatile int i;],
1116         [i = fpclassify(d1);
1117          i = isfinite(d1);
1118          i = isinf(d1);
1119          i = isnan(d1);
1120          i = isnormal(d1);
1121          i = signbit(d1);
1122          i = isgreater(d1, d2);
1123          i = isgreaterequal(d1, d2);
1124          i = isless(d1, d2);
1125          i = islessequal(d1, d2);
1126          i = islessgreater(d1, d2);
1127          i = islessgreater(d1, d2);
1128          i = isunordered(d1, d2);
1129         ], [glibcxx_cv_c99_math_cxx11=yes], [glibcxx_cv_c99_math_cxx11=no])
1130     ])
1131     AC_MSG_RESULT($glibcxx_cv_c99_math_cxx11)
1132     if test x"$glibcxx_cv_c99_math_cxx11" = x"yes"; then
1133       AC_DEFINE(_GLIBCXX11_USE_C99_MATH, 1,
1134         [Define if C99 functions or macros in <math.h> should be imported
1135         in <cmath> in namespace std for C++11.])
1136     fi
1138     # Check for the existence of <complex.h> complex math functions.
1139     # This is necessary even though libstdc++ uses the builtin versions
1140     # of these functions, because if the builtin cannot be used, a reference
1141     # to the library function is emitted.
1142     AC_CHECK_HEADERS(tgmath.h, ac_has_tgmath_h=yes, ac_has_tgmath_h=no)
1143     AC_CHECK_HEADERS(complex.h, ac_has_complex_h=yes, ac_has_complex_h=no)
1144     if test x"$ac_has_complex_h" = x"yes"; then
1145       AC_MSG_CHECKING([for ISO C99 support in <complex.h> for C++11])
1146       AC_CACHE_VAL(glibcxx_cv_c99_complex_cxx11, [
1147         GCC_TRY_COMPILE_OR_LINK(
1148           [#include <complex.h>
1149            typedef __complex__ float float_type;
1150            typedef __complex__ double double_type;
1151            typedef __complex__ long double ld_type;
1152            volatile float_type tmpf;
1153            volatile double_type tmpd;
1154            volatile ld_type tmpld;
1155            volatile float f;
1156            volatile double d;
1157            volatile long double ld;],
1158           [f = cabsf(tmpf);
1159            f = cargf(tmpf);
1160            tmpf = ccosf(tmpf);
1161            tmpf = ccoshf(tmpf);
1162            tmpf = cexpf(tmpf);
1163            tmpf = clogf(tmpf);
1164            tmpf = csinf(tmpf);
1165            tmpf = csinhf(tmpf);
1166            tmpf = csqrtf(tmpf);
1167            tmpf = ctanf(tmpf);
1168            tmpf = ctanhf(tmpf);
1169            tmpf = cpowf(tmpf, tmpf);
1170            tmpf = cprojf(tmpf);
1171            d = cabs(tmpd);
1172            d = carg(tmpd);
1173            tmpd = ccos(tmpd);
1174            tmpd = ccosh(tmpd);
1175            tmpd = cexp(tmpd);
1176            tmpd = clog(tmpd);
1177            tmpd = csin(tmpd);
1178            tmpd = csinh(tmpd);
1179            tmpd = csqrt(tmpd);
1180            tmpd = ctan(tmpd);
1181            tmpd = ctanh(tmpd);
1182            tmpd = cpow(tmpd, tmpd);
1183            tmpd = cproj(tmpd);
1184            ld = cabsl(tmpld);
1185            ld = cargl(tmpld);
1186            tmpld = ccosl(tmpld);
1187            tmpld = ccoshl(tmpld);
1188            tmpld = cexpl(tmpld);
1189            tmpld = clogl(tmpld);
1190            tmpld = csinl(tmpld);
1191            tmpld = csinhl(tmpld);
1192            tmpld = csqrtl(tmpld);
1193            tmpld = ctanl(tmpld);
1194            tmpld = ctanhl(tmpld);
1195            tmpld = cpowl(tmpld, tmpld);
1196            tmpld = cprojl(tmpld);
1197           ], [glibcxx_cv_c99_complex_cxx11=yes], [glibcxx_cv_c99_complex_cxx11=no])
1198       ])
1199     fi
1200     AC_MSG_RESULT($glibcxx_cv_c99_complex_cxx11)
1201     if test x"$glibcxx_cv_c99_complex_cxx11" = x"yes"; then
1202       AC_DEFINE(_GLIBCXX11_USE_C99_COMPLEX, 1,
1203         [Define if C99 functions in <complex.h> should be used in
1204         <complex> for C++11. Using compiler builtins for these functions
1205         requires corresponding C99 library functions to be present.])
1206     fi
1208     # Check for the existence in <stdio.h> of vscanf, et. al.
1209     AC_MSG_CHECKING([for ISO C99 support in <stdio.h> for C++11])
1210     AC_CACHE_VAL(glibcxx_cv_c99_stdio_cxx11, [
1211       GCC_TRY_COMPILE_OR_LINK(
1212         [#include <stdio.h>
1213          #include <stdarg.h>
1214          void foo(char* fmt, ...)
1215          {
1216            va_list args; va_start(args, fmt);
1217            vfscanf(stderr, "%i", args);
1218            vscanf("%i", args);
1219            vsnprintf(fmt, 0, "%i", args);
1220            vsscanf(fmt, "%i", args);
1221            snprintf(fmt, 0, "%i");
1222          }], [],
1223         [glibcxx_cv_c99_stdio_cxx11=yes], [glibcxx_cv_c99_stdio_cxx11=no])
1224     ])
1225     AC_MSG_RESULT($glibcxx_cv_c99_stdio_cxx11)
1226     if test x"$glibcxx_cv_c99_stdio_cxx11" = x"yes"; then
1227       AC_DEFINE(_GLIBCXX11_USE_C99_STDIO, 1,
1228         [Define if C99 functions or macros in <stdio.h> should be imported
1229         in <cstdio> in namespace std for C++11.])
1230     fi
1232     # Check for the existence in <stdlib.h> of lldiv_t, et. al.
1233     AC_MSG_CHECKING([for ISO C99 support in <stdlib.h> for C++11])
1234     AC_CACHE_VAL(glibcxx_cv_c99_stdlib_cxx11, [
1235       GCC_TRY_COMPILE_OR_LINK(
1236         [#include <stdlib.h>
1237          volatile float f;
1238          volatile long double ld;
1239          volatile unsigned long long ll;
1240          lldiv_t mydivt;],
1241         [char* tmp;
1242          f = strtof("gnu", &tmp);
1243          ld = strtold("gnu", &tmp);
1244          ll = strtoll("gnu", &tmp, 10);
1245          ll = strtoull("gnu", &tmp, 10);
1246          ll = llabs(10);
1247          mydivt = lldiv(10,1);
1248          ll = mydivt.quot;
1249          ll = mydivt.rem;
1250          ll = atoll("10");
1251          _Exit(0);
1252         ], [glibcxx_cv_c99_stdlib_cxx11=yes], [glibcxx_cv_c99_stdlib_cxx11=no])
1253     ])
1254     AC_MSG_RESULT($glibcxx_cv_c99_stdlib_cxx11)
1255     if test x"$glibcxx_cv_c99_stdlib_cxx11" = x"yes"; then
1256       AC_DEFINE(_GLIBCXX11_USE_C99_STDLIB, 1,
1257         [Define if C99 functions or macros in <stdlib.h> should be imported
1258         in <cstdlib> in namespace std for C++11.])
1259     fi
1261     # Check for the existence in <wchar.h> of wcstold, etc.
1262     if test x"$ac_has_wchar_h" = xyes &&
1263        test x"$ac_has_wctype_h" = xyes; then
1264       AC_MSG_CHECKING([for ISO C99 support in <wchar.h> for C++11])
1265       AC_CACHE_VAL(glibcxx_cv_c99_wchar_cxx11, [
1266         AC_TRY_COMPILE([#include <wchar.h>
1267           namespace test
1268           {
1269             using ::wcstold;
1270             using ::wcstoll;
1271             using ::wcstoull;
1272           }
1273         ], [], [glibcxx_cv_c99_wchar_cxx11=yes], [glibcxx_cv_c99_wchar_cxx11=no])
1274       ])
1276       # Checks for wide character functions that may not be present.
1277       # Injection of these is wrapped with guard macros.
1278       # NB: only put functions here, instead of immediately above, if
1279       # absolutely necessary.
1280       AC_TRY_COMPILE([#include <wchar.h>
1281         namespace test { using ::vfwscanf; }], [],
1282         [AC_DEFINE(HAVE_VFWSCANF, 1, [Defined if vfwscanf exists.])], [])
1284       AC_TRY_COMPILE([#include <wchar.h>
1285         namespace test { using ::vswscanf; }], [],
1286         [AC_DEFINE(HAVE_VSWSCANF, 1, [Defined if vswscanf exists.])], [])
1288       AC_TRY_COMPILE([#include <wchar.h>
1289         namespace test { using ::vwscanf; }], [],
1290         [AC_DEFINE(HAVE_VWSCANF, 1, [Defined if vwscanf exists.])], [])
1292       AC_TRY_COMPILE([#include <wchar.h>
1293         namespace test { using ::wcstof; }], [],
1294         [AC_DEFINE(HAVE_WCSTOF, 1, [Defined if wcstof exists.])], [])
1296       AC_TRY_COMPILE([#include <wctype.h>],
1297         [wint_t t; int i = iswblank(t);],
1298         [AC_DEFINE(HAVE_ISWBLANK, 1, [Defined if iswblank exists.])], [])
1300       AC_MSG_RESULT($glibcxx_cv_c99_wchar_cxx11)
1301       if test x"$glibcxx_cv_c99_wchar_cxx11" = x"yes"; then
1302         AC_DEFINE(_GLIBCXX11_USE_C99_WCHAR, 1,
1303           [Define if C99 functions or macros in <wchar.h> should be imported
1304           in <cwchar> in namespace std for C++11.])
1305       fi
1306     fi
1308     gcc_no_link="$ac_save_gcc_no_link"
1309     LIBS="$ac_save_LIBS"
1310     CXXFLAGS="$ac_save_CXXFLAGS"
1311     AC_LANG_RESTORE
1312   fi
1314   AC_MSG_CHECKING([for fully enabled ISO C99 support])
1315   AC_MSG_RESULT($enable_c99)
1320 dnl Check for clock_gettime, nanosleep and sched_yield, used in the
1321 dnl implementation of 20.11.7 [time.clock], and 30.3.2 [thread.thread.this]
1322 dnl in the C++11 standard.
1324 dnl --enable-libstdcxx-time
1325 dnl --enable-libstdcxx-time=yes
1326 dnl        checks for the availability of monotonic and realtime clocks,
1327 dnl        nanosleep and sched_yield in libc.
1328 dnl --enable-libstdcxx-time=rt
1329 dnl        also searches (and, if needed, links) librt.  Note that this is
1330 dnl        not always desirable because, in glibc 2.16 and earlier, for
1331 dnl        example, in turn it triggers the linking of libpthread too,
1332 dnl        which activates locking,
1333 dnl        a large overhead for single-thread programs.
1334 dnl --enable-libstdcxx-time=no
1335 dnl --disable-libstdcxx-time
1336 dnl        disables the checks completely
1338 dnl N.B. Darwin provides nanosleep but doesn't support the whole POSIX
1339 dnl Timers option, so doesn't define _POSIX_TIMERS. Because the test
1340 dnl below fails Darwin unconditionally defines _GLIBCXX_USE_NANOSLEEP in
1341 dnl os_defines.h and also defines _GLIBCXX_USE_SCHED_YIELD.
1343 AC_DEFUN([GLIBCXX_ENABLE_LIBSTDCXX_TIME], [
1345   GLIBCXX_ENABLE(libstdcxx-time,auto,[[[=KIND]]],
1346     [use KIND for check type],
1347     [permit yes|no|rt])
1349   AC_LANG_SAVE
1350   AC_LANG_CPLUSPLUS
1351   ac_save_CXXFLAGS="$CXXFLAGS"
1352   CXXFLAGS="$CXXFLAGS -fno-exceptions"
1353   ac_save_LIBS="$LIBS"
1355   ac_has_clock_monotonic=no
1356   ac_has_clock_realtime=no
1357   ac_has_nanosleep=no
1358   ac_has_sched_yield=no
1360   if test x"$enable_libstdcxx_time" = x"auto"; then
1362     case "${target_os}" in
1363       cygwin*)
1364         ac_has_nanosleep=yes
1365         ;;
1366       darwin*)
1367         ac_has_nanosleep=yes
1368         ac_has_sched_yield=yes
1369         ;;
1370       # VxWorks has nanosleep as soon as the kernel is configured with
1371       # INCLUDE_POSIX_TIMERS, which is normally/most-often the case.
1372       vxworks*)
1373         ac_has_nanosleep=yes
1374         ;;
1375       gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu)
1376         # Don't use link test for freestanding library, in case gcc_no_link=yes
1377         if test x"$is_hosted" = xyes; then
1378           # Versions of glibc before 2.17 needed -lrt for clock_gettime.
1379           AC_SEARCH_LIBS(clock_gettime, [rt])
1380           if test x"$ac_cv_search_clock_gettime" = x"none required"; then
1381             ac_has_clock_monotonic=yes
1382             ac_has_clock_realtime=yes
1383           fi
1384         fi
1385         ac_has_nanosleep=yes
1386         ac_has_sched_yield=yes
1387         ;;
1388       freebsd*|netbsd*|dragonfly*|rtems*)
1389         ac_has_clock_monotonic=yes
1390         ac_has_clock_realtime=yes
1391         ac_has_nanosleep=yes
1392         ac_has_sched_yield=yes
1393         ;;
1394       openbsd*)
1395         ac_has_clock_monotonic=yes
1396         ac_has_clock_realtime=yes
1397         ac_has_nanosleep=yes
1398         ;;
1399       solaris*)
1400         ac_has_clock_monotonic=yes
1401         ac_has_clock_realtime=yes
1402         ac_has_nanosleep=yes
1403         ac_has_sched_yield=yes
1404         ;;
1405       uclinux*)
1406         ac_has_nanosleep=yes
1407         ac_has_sched_yield=yes
1408     esac
1410   elif test x"$enable_libstdcxx_time" != x"no"; then
1412     if test x"$enable_libstdcxx_time" = x"rt"; then
1413       AC_SEARCH_LIBS(clock_gettime, [rt])
1414       AC_SEARCH_LIBS(nanosleep, [rt])
1415     else
1416       AC_CHECK_FUNC(clock_gettime)
1417       AC_CHECK_FUNC(nanosleep)
1418     fi
1420     case "$ac_cv_search_clock_gettime" in
1421       -l*) GLIBCXX_LIBS=$ac_cv_search_clock_gettime
1422       ;;
1423     esac
1424     case "$ac_cv_search_nanosleep" in
1425       -l*) GLIBCXX_LIBS="$GLIBCXX_LIBS $ac_cv_search_nanosleep"
1426       ;;
1427     esac
1429     AC_SEARCH_LIBS(sched_yield, [rt])
1431     case "$ac_cv_search_sched_yield" in
1432       -lrt*)
1433       if test x"$enable_libstdcxx_time" = x"rt"; then
1434         GLIBCXX_LIBS="$GLIBCXX_LIBS $ac_cv_search_sched_yield"
1435         ac_has_sched_yield=yes
1436       fi
1437       ;;
1438       *)
1439       ac_has_sched_yield=yes
1440       ;;
1441     esac
1443     AC_CHECK_HEADERS(unistd.h, ac_has_unistd_h=yes, ac_has_unistd_h=no)
1445     if test x"$ac_has_unistd_h" = x"yes"; then
1446       AC_MSG_CHECKING([for monotonic clock])
1447       AC_TRY_LINK(
1448         [#include <unistd.h>
1449          #include <time.h>
1450         ],
1451         [#if _POSIX_TIMERS > 0 && defined(_POSIX_MONOTONIC_CLOCK)
1452           timespec tp;
1453          #endif
1454           clock_gettime(CLOCK_MONOTONIC, &tp);
1455         ], [ac_has_clock_monotonic=yes], [ac_has_clock_monotonic=no])
1457       AC_MSG_RESULT($ac_has_clock_monotonic)
1459       AC_MSG_CHECKING([for realtime clock])
1460       AC_TRY_LINK(
1461         [#include <unistd.h>
1462          #include <time.h>
1463         ],
1464         [#if _POSIX_TIMERS > 0
1465           timespec tp;
1466          #endif
1467           clock_gettime(CLOCK_REALTIME, &tp);
1468         ], [ac_has_clock_realtime=yes], [ac_has_clock_realtime=no])
1470       AC_MSG_RESULT($ac_has_clock_realtime)
1472       AC_MSG_CHECKING([for nanosleep])
1473       AC_TRY_LINK(
1474         [#include <unistd.h>
1475          #include <time.h>
1476         ],
1477         [#if _POSIX_TIMERS > 0
1478           timespec tp;
1479          #endif
1480           nanosleep(&tp, 0);
1481         ], [ac_has_nanosleep=yes], [ac_has_nanosleep=no])
1483       AC_MSG_RESULT($ac_has_nanosleep)
1484     fi
1485   fi
1487   if test x"$ac_has_clock_monotonic" != x"yes"; then
1488     case ${target_os} in
1489       linux* | uclinux*)
1490         AC_MSG_CHECKING([for clock_gettime syscall])
1491         AC_TRY_COMPILE(
1492           [#include <unistd.h>
1493            #include <time.h>
1494            #include <sys/syscall.h>
1495           ],
1496           [#if _POSIX_TIMERS > 0 && defined(_POSIX_MONOTONIC_CLOCK)
1497             timespec tp;
1498            #endif
1499            syscall(SYS_clock_gettime, CLOCK_MONOTONIC, &tp);
1500            syscall(SYS_clock_gettime, CLOCK_REALTIME, &tp);
1501           ], [ac_has_clock_gettime_syscall=yes], [ac_has_clock_gettime_syscall=no])
1502         AC_MSG_RESULT($ac_has_clock_gettime_syscall)
1503         if test x"$ac_has_clock_gettime_syscall" = x"yes"; then
1504           AC_DEFINE(_GLIBCXX_USE_CLOCK_GETTIME_SYSCALL, 1,
1505           [Defined if clock_gettime syscall has monotonic and realtime clock support. ])
1506           ac_has_clock_monotonic=yes
1507           ac_has_clock_realtime=yes
1508           AC_MSG_CHECKING([for struct timespec that matches syscall])
1509           AC_TRY_COMPILE(
1510             [#include <time.h>
1511              #include <sys/syscall.h>
1512             ],
1513             [#ifdef SYS_clock_gettime64
1514              #if SYS_clock_gettime64 != SYS_clock_gettime
1515              // We need to use SYS_clock_gettime and libc appears to
1516              // also know about the SYS_clock_gettime64 syscall.
1517              // Check that userspace doesn't use time64 version of timespec.
1518              static_assert(sizeof(timespec::tv_sec) == sizeof(long),
1519                "struct timespec must be compatible with SYS_clock_gettime");
1520              #endif
1521              #endif
1522             ],
1523             [ac_timespec_matches_syscall=yes],
1524             [ac_timespec_matches_syscall=no])
1525           AC_MSG_RESULT($ac_timespec_matches_syscall)
1526           if test x"$ac_timespec_matches_syscall" = no; then
1527             AC_MSG_ERROR([struct timespec is not compatible with SYS_clock_gettime, please report a bug to http://gcc.gnu.org/bugzilla])
1528           fi
1529         fi;;
1530     esac
1531   fi
1533   if test x"$ac_has_clock_monotonic" = x"yes"; then
1534     AC_DEFINE(_GLIBCXX_USE_CLOCK_MONOTONIC, 1,
1535       [ Defined if clock_gettime has monotonic clock support. ])
1536   fi
1538   if test x"$ac_has_clock_realtime" = x"yes"; then
1539     AC_DEFINE(_GLIBCXX_USE_CLOCK_REALTIME, 1,
1540       [ Defined if clock_gettime has realtime clock support. ])
1541   fi
1543   if test x"$ac_has_sched_yield" = x"yes"; then
1544     AC_DEFINE(_GLIBCXX_USE_SCHED_YIELD, 1,
1545               [ Defined if sched_yield is available. ])
1546   fi
1548   if test x"$ac_has_nanosleep" = x"yes"; then
1549     AC_DEFINE(_GLIBCXX_USE_NANOSLEEP, 1,
1550       [ Defined if nanosleep is available. ])
1551   else
1552       AC_MSG_CHECKING([for sleep])
1553       AC_TRY_COMPILE([#include <unistd.h>],
1554                      [sleep(1)],
1555                      [ac_has_sleep=yes],[ac_has_sleep=no])
1556       if test x"$ac_has_sleep" = x"yes"; then
1557         AC_DEFINE(HAVE_SLEEP,1, [Defined if sleep exists.])
1558       fi
1559       AC_MSG_RESULT($ac_has_sleep)
1560       AC_MSG_CHECKING([for usleep])
1561       AC_TRY_COMPILE([#include <unistd.h>],
1562                      [sleep(1);
1563                       usleep(100);],
1564                      [ac_has_usleep=yes],[ac_has_usleep=no])
1565       if test x"$ac_has_usleep" = x"yes"; then
1566         AC_DEFINE(HAVE_USLEEP,1, [Defined if usleep exists.])
1567       fi
1568       AC_MSG_RESULT($ac_has_usleep)
1569   fi
1571   if test x"$ac_has_nanosleep$ac_has_sleep" = x"nono"; then
1572       ac_no_sleep=yes
1573       AC_MSG_CHECKING([for Sleep])
1574       AC_TRY_COMPILE([#include <windows.h>],
1575                      [Sleep(1)],
1576                      [ac_has_win32_sleep=yes],[ac_has_win32_sleep=no])
1577       if test x"$ac_has_win32_sleep" = x"yes"; then
1578         AC_DEFINE(HAVE_WIN32_SLEEP,1, [Defined if Sleep exists.])
1579         ac_no_sleep=no
1580       fi
1581       AC_MSG_RESULT($ac_has_win32_sleep)
1582   fi
1584   if test x"$ac_no_sleep" = x"yes"; then
1585     AC_DEFINE(NO_SLEEP,1, [Defined if no way to sleep is available.])
1586   fi
1588   AC_SUBST(GLIBCXX_LIBS)
1590   CXXFLAGS="$ac_save_CXXFLAGS"
1591   LIBS="$ac_save_LIBS"
1592   AC_LANG_RESTORE
1596 dnl Check for gettimeofday, used in the implementation of 20.11.7
1597 dnl [time.clock] in the C++11 standard.
1599 AC_DEFUN([GLIBCXX_CHECK_GETTIMEOFDAY], [
1601   AC_MSG_CHECKING([for gettimeofday])
1603   AC_LANG_SAVE
1604   AC_LANG_CPLUSPLUS
1605   ac_save_CXXFLAGS="$CXXFLAGS"
1606   CXXFLAGS="$CXXFLAGS -fno-exceptions"
1608   ac_has_gettimeofday=no;
1609   AC_CHECK_HEADERS(sys/time.h, ac_has_sys_time_h=yes, ac_has_sys_time_h=no)
1610   if test x"$ac_has_sys_time_h" = x"yes"; then
1611     AC_MSG_CHECKING([for gettimeofday])
1612     GCC_TRY_COMPILE_OR_LINK([#include <sys/time.h>],
1613       [timeval tv; gettimeofday(&tv, 0);],
1614       [ac_has_gettimeofday=yes], [ac_has_gettimeofday=no])
1616     AC_MSG_RESULT($ac_has_gettimeofday)
1617   fi
1619   if test x"$ac_has_gettimeofday" = x"yes"; then
1620     AC_DEFINE(_GLIBCXX_USE_GETTIMEOFDAY, 1,
1621       [ Defined if gettimeofday is available. ])
1622   fi
1624   CXXFLAGS="$ac_save_CXXFLAGS"
1625   AC_LANG_RESTORE
1629 dnl Check for ISO/IEC 9899:1999 "C99" support to ISO/IEC DTR 19768 "TR1"
1630 dnl facilities in Chapter 8, "C compatibility".
1632 AC_DEFUN([GLIBCXX_CHECK_C99_TR1], [
1634   AC_LANG_SAVE
1635   AC_LANG_CPLUSPLUS
1637   # Use -std=c++98 because the default (-std=gnu++98) leaves __STRICT_ANSI__
1638   # undefined and fake C99 facilities may be spuriously enabled.
1639   ac_save_CXXFLAGS="$CXXFLAGS"
1640   CXXFLAGS="$CXXFLAGS -std=c++98"
1642   # Check for the existence of <complex.h> complex math functions used
1643   # by tr1/complex.
1644   AC_CHECK_HEADERS(complex.h, ac_has_complex_h=yes, ac_has_complex_h=no)
1645   ac_c99_complex_tr1=no;
1646   if test x"$ac_has_complex_h" = x"yes"; then
1647     AC_MSG_CHECKING([for ISO C99 support to TR1 in <complex.h>])
1648     AC_TRY_COMPILE([#include <complex.h>],
1649                    [typedef __complex__ float float_type; float_type tmpf;
1650                     cacosf(tmpf);
1651                     casinf(tmpf);
1652                     catanf(tmpf);
1653                     cacoshf(tmpf);
1654                     casinhf(tmpf);
1655                     catanhf(tmpf);
1656                     typedef __complex__ double double_type; double_type tmpd;
1657                     cacos(tmpd);
1658                     casin(tmpd);
1659                     catan(tmpd);
1660                     cacosh(tmpd);
1661                     casinh(tmpd);
1662                     catanh(tmpd);
1663                     typedef __complex__ long double ld_type; ld_type tmpld;
1664                     cacosl(tmpld);
1665                     casinl(tmpld);
1666                     catanl(tmpld);
1667                     cacoshl(tmpld);
1668                     casinhl(tmpld);
1669                     catanhl(tmpld);
1670                    ],[ac_c99_complex_tr1=yes], [ac_c99_complex_tr1=no])
1671   fi
1672   AC_MSG_RESULT($ac_c99_complex_tr1)
1673   if test x"$ac_c99_complex_tr1" = x"yes"; then
1674     AC_DEFINE(_GLIBCXX_USE_C99_COMPLEX_TR1, 1,
1675               [Define if C99 functions in <complex.h> should be used in
1676               <tr1/complex>. Using compiler builtins for these functions
1677               requires corresponding C99 library functions to be present.])
1678   fi
1680   # Check for the existence of <ctype.h> functions.
1681   AC_MSG_CHECKING([for ISO C99 support to TR1 in <ctype.h>])
1682   AC_CACHE_VAL(glibcxx_cv_c99_ctype_tr1, [
1683   AC_TRY_COMPILE([#include <ctype.h>],
1684                  [int ch;
1685                   int ret;
1686                   ret = isblank(ch);
1687                  ],[glibcxx_cv_c99_ctype_tr1=yes],
1688                    [glibcxx_cv_c99_ctype_tr1=no])
1689   ])
1690   AC_MSG_RESULT($glibcxx_cv_c99_ctype_tr1)
1691   if test x"$glibcxx_cv_c99_ctype_tr1" = x"yes"; then
1692     AC_DEFINE(_GLIBCXX_USE_C99_CTYPE_TR1, 1,
1693               [Define if C99 functions in <ctype.h> should be imported in
1694               <tr1/cctype> in namespace std::tr1.])
1695   fi
1697   # Check for the existence of <fenv.h> functions.
1698   AC_CHECK_HEADERS(fenv.h, ac_has_fenv_h=yes, ac_has_fenv_h=no)
1699   ac_c99_fenv_tr1=no;
1700   if test x"$ac_has_fenv_h" = x"yes"; then
1701     AC_MSG_CHECKING([for ISO C99 support to TR1 in <fenv.h>])
1702     AC_TRY_COMPILE([#include <fenv.h>],
1703                    [int except, mode;
1704                     fexcept_t* pflag;
1705                     fenv_t* penv;
1706                     int ret;
1707                     ret = feclearexcept(except);
1708                     ret = fegetexceptflag(pflag, except);
1709                     ret = feraiseexcept(except);
1710                     ret = fesetexceptflag(pflag, except);
1711                     ret = fetestexcept(except);
1712                     ret = fegetround();
1713                     ret = fesetround(mode);
1714                     ret = fegetenv(penv);
1715                     ret = feholdexcept(penv);
1716                     ret = fesetenv(penv);
1717                     ret = feupdateenv(penv);
1718                    ],[ac_c99_fenv_tr1=yes], [ac_c99_fenv_tr1=no])
1719   fi
1720   AC_MSG_RESULT($ac_c99_fenv_tr1)
1721   if test x"$ac_c99_fenv_tr1" = x"yes"; then
1722     AC_DEFINE(_GLIBCXX_USE_C99_FENV_TR1, 1,
1723               [Define if C99 functions in <fenv.h> should be imported in
1724               <tr1/cfenv> in namespace std::tr1.])
1725   fi
1727   # Check for the existence of <stdint.h> types.
1728   AC_MSG_CHECKING([for ISO C99 support to TR1 in <stdint.h>])
1729   AC_CACHE_VAL(glibcxx_cv_c99_stdint_tr1, [
1730   AC_TRY_COMPILE([#define __STDC_LIMIT_MACROS
1731                   #define __STDC_CONSTANT_MACROS
1732                   #include <stdint.h>],
1733                  [typedef int8_t          my_int8_t;
1734                   my_int8_t               i8 = INT8_MIN;
1735                   i8 = INT8_MAX;
1736                   typedef int16_t         my_int16_t;
1737                   my_int16_t              i16 = INT16_MIN;
1738                   i16 = INT16_MAX;
1739                   typedef int32_t         my_int32_t;
1740                   my_int32_t              i32 = INT32_MIN;
1741                   i32 = INT32_MAX;
1742                   typedef int64_t         my_int64_t;
1743                   my_int64_t              i64 = INT64_MIN;
1744                   i64 = INT64_MAX;
1745                   typedef int_fast8_t     my_int_fast8_t;
1746                   my_int_fast8_t          if8 = INT_FAST8_MIN;
1747                   if8 = INT_FAST8_MAX;
1748                   typedef int_fast16_t    my_int_fast16_t;
1749                   my_int_fast16_t         if16 = INT_FAST16_MIN;
1750                   if16 = INT_FAST16_MAX;
1751                   typedef int_fast32_t    my_int_fast32_t;
1752                   my_int_fast32_t         if32 = INT_FAST32_MIN;
1753                   if32 = INT_FAST32_MAX;
1754                   typedef int_fast64_t    my_int_fast64_t;
1755                   my_int_fast64_t         if64 = INT_FAST64_MIN;
1756                   if64 = INT_FAST64_MAX;
1757                   typedef int_least8_t    my_int_least8_t;
1758                   my_int_least8_t         il8 = INT_LEAST8_MIN;
1759                   il8 = INT_LEAST8_MAX;
1760                   typedef int_least16_t   my_int_least16_t;
1761                   my_int_least16_t        il16 = INT_LEAST16_MIN;
1762                   il16 = INT_LEAST16_MAX;
1763                   typedef int_least32_t   my_int_least32_t;
1764                   my_int_least32_t        il32 = INT_LEAST32_MIN;
1765                   il32 = INT_LEAST32_MAX;
1766                   typedef int_least64_t   my_int_least64_t;
1767                   my_int_least64_t        il64 = INT_LEAST64_MIN;
1768                   il64 = INT_LEAST64_MAX;
1769                   typedef intmax_t        my_intmax_t;
1770                   my_intmax_t             im = INTMAX_MAX;
1771                   im = INTMAX_MIN;
1772                   typedef intptr_t        my_intptr_t;
1773                   my_intptr_t             ip = INTPTR_MAX;
1774                   ip = INTPTR_MIN;
1775                   typedef uint8_t         my_uint8_t;
1776                   my_uint8_t              ui8 = UINT8_MAX;
1777                   ui8 = UINT8_MAX;
1778                   typedef uint16_t        my_uint16_t;
1779                   my_uint16_t             ui16 = UINT16_MAX;
1780                   ui16 = UINT16_MAX;
1781                   typedef uint32_t        my_uint32_t;
1782                   my_uint32_t             ui32 = UINT32_MAX;
1783                   ui32 = UINT32_MAX;
1784                   typedef uint64_t        my_uint64_t;
1785                   my_uint64_t             ui64 = UINT64_MAX;
1786                   ui64 = UINT64_MAX;
1787                   typedef uint_fast8_t    my_uint_fast8_t;
1788                   my_uint_fast8_t         uif8 = UINT_FAST8_MAX;
1789                   uif8 = UINT_FAST8_MAX;
1790                   typedef uint_fast16_t   my_uint_fast16_t;
1791                   my_uint_fast16_t        uif16 = UINT_FAST16_MAX;
1792                   uif16 = UINT_FAST16_MAX;
1793                   typedef uint_fast32_t   my_uint_fast32_t;
1794                   my_uint_fast32_t        uif32 = UINT_FAST32_MAX;
1795                   uif32 = UINT_FAST32_MAX;
1796                   typedef uint_fast64_t   my_uint_fast64_t;
1797                   my_uint_fast64_t        uif64 = UINT_FAST64_MAX;
1798                   uif64 = UINT_FAST64_MAX;
1799                   typedef uint_least8_t   my_uint_least8_t;
1800                   my_uint_least8_t        uil8 = UINT_LEAST8_MAX;
1801                   uil8 = UINT_LEAST8_MAX;
1802                   typedef uint_least16_t  my_uint_least16_t;
1803                   my_uint_least16_t       uil16 = UINT_LEAST16_MAX;
1804                   uil16 = UINT_LEAST16_MAX;
1805                   typedef uint_least32_t  my_uint_least32_t;
1806                   my_uint_least32_t       uil32 = UINT_LEAST32_MAX;
1807                   uil32 = UINT_LEAST32_MAX;
1808                   typedef uint_least64_t  my_uint_least64_t;
1809                   my_uint_least64_t       uil64 = UINT_LEAST64_MAX;
1810                   uil64 = UINT_LEAST64_MAX;
1811                   typedef uintmax_t       my_uintmax_t;
1812                   my_uintmax_t            uim = UINTMAX_MAX;
1813                   uim = UINTMAX_MAX;
1814                   typedef uintptr_t       my_uintptr_t;
1815                   my_uintptr_t            uip = UINTPTR_MAX;
1816                   uip = UINTPTR_MAX;
1817                  ],[glibcxx_cv_c99_stdint_tr1=yes],
1818                    [glibcxx_cv_c99_stdint_tr1=no])
1819   ])
1820   AC_MSG_RESULT($glibcxx_cv_c99_stdint_tr1)
1821   if test x"$glibcxx_cv_c99_stdint_tr1" = x"yes"; then
1822     AC_DEFINE(_GLIBCXX_USE_C99_STDINT_TR1, 1,
1823               [Define if C99 types in <stdint.h> should be imported in
1824               <tr1/cstdint> in namespace std::tr1.])
1825   fi
1827   # Check for the existence of <math.h> functions.
1828   AC_MSG_CHECKING([for ISO C99 support to TR1 in <math.h>])
1829   AC_CACHE_VAL(glibcxx_cv_c99_math_tr1, [
1830   AC_TRY_COMPILE([#include <math.h>],
1831                  [typedef double_t  my_double_t;
1832                   typedef float_t   my_float_t;
1833                   acosh(0.0);
1834                   acoshf(0.0f);
1835                   acoshl(0.0l);
1836                   asinh(0.0);
1837                   asinhf(0.0f);
1838                   asinhl(0.0l);
1839                   atanh(0.0);
1840                   atanhf(0.0f);
1841                   atanhl(0.0l);
1842                   cbrt(0.0);
1843                   cbrtf(0.0f);
1844                   cbrtl(0.0l);
1845                   copysign(0.0, 0.0);
1846                   copysignf(0.0f, 0.0f);
1847                   copysignl(0.0l, 0.0l);
1848                   erf(0.0);
1849                   erff(0.0f);
1850                   erfl(0.0l);
1851                   erfc(0.0);
1852                   erfcf(0.0f);
1853                   erfcl(0.0l);
1854                   exp2(0.0);
1855                   exp2f(0.0f);
1856                   exp2l(0.0l);
1857                   expm1(0.0);
1858                   expm1f(0.0f);
1859                   expm1l(0.0l);
1860                   fdim(0.0, 0.0);
1861                   fdimf(0.0f, 0.0f);
1862                   fdiml(0.0l, 0.0l);
1863                   fma(0.0, 0.0, 0.0);
1864                   fmaf(0.0f, 0.0f, 0.0f);
1865                   fmal(0.0l, 0.0l, 0.0l);
1866                   fmax(0.0, 0.0);
1867                   fmaxf(0.0f, 0.0f);
1868                   fmaxl(0.0l, 0.0l);
1869                   fmin(0.0, 0.0);
1870                   fminf(0.0f, 0.0f);
1871                   fminl(0.0l, 0.0l);
1872                   hypot(0.0, 0.0);
1873                   hypotf(0.0f, 0.0f);
1874                   hypotl(0.0l, 0.0l);
1875                   ilogb(0.0);
1876                   ilogbf(0.0f);
1877                   ilogbl(0.0l);
1878                   lgamma(0.0);
1879                   lgammaf(0.0f);
1880                   lgammal(0.0l);
1881                   #ifndef __APPLE__ /* see below */
1882                   llrint(0.0);
1883                   llrintf(0.0f);
1884                   llrintl(0.0l);
1885                   llround(0.0);
1886                   llroundf(0.0f);
1887                   llroundl(0.0l);
1888                   #endif
1889                   log1p(0.0);
1890                   log1pf(0.0f);
1891                   log1pl(0.0l);
1892                   log2(0.0);
1893                   log2f(0.0f);
1894                   log2l(0.0l);
1895                   logb(0.0);
1896                   logbf(0.0f);
1897                   logbl(0.0l);
1898                   lrint(0.0);
1899                   lrintf(0.0f);
1900                   lrintl(0.0l);
1901                   lround(0.0);
1902                   lroundf(0.0f);
1903                   lroundl(0.0l);
1904                   nan(0);
1905                   nanf(0);
1906                   nanl(0);
1907                   nearbyint(0.0);
1908                   nearbyintf(0.0f);
1909                   nearbyintl(0.0l);
1910                   nextafter(0.0, 0.0);
1911                   nextafterf(0.0f, 0.0f);
1912                   nextafterl(0.0l, 0.0l);
1913                   nexttoward(0.0, 0.0);
1914                   nexttowardf(0.0f, 0.0f);
1915                   nexttowardl(0.0l, 0.0l);
1916                   remainder(0.0, 0.0);
1917                   remainderf(0.0f, 0.0f);
1918                   remainderl(0.0l, 0.0l);
1919                   remquo(0.0, 0.0, 0);
1920                   remquof(0.0f, 0.0f, 0);
1921                   remquol(0.0l, 0.0l, 0);
1922                   rint(0.0);
1923                   rintf(0.0f);
1924                   rintl(0.0l);
1925                   round(0.0);
1926                   roundf(0.0f);
1927                   roundl(0.0l);
1928                   scalbln(0.0, 0l);
1929                   scalblnf(0.0f, 0l);
1930                   scalblnl(0.0l, 0l);
1931                   scalbn(0.0, 0);
1932                   scalbnf(0.0f, 0);
1933                   scalbnl(0.0l, 0);
1934                   tgamma(0.0);
1935                   tgammaf(0.0f);
1936                   tgammal(0.0l);
1937                   trunc(0.0);
1938                   truncf(0.0f);
1939                   truncl(0.0l);
1940                  ],[glibcxx_cv_c99_math_tr1=yes], [glibcxx_cv_c99_math_tr1=no])
1941   ])
1942   AC_MSG_RESULT($glibcxx_cv_c99_math_tr1)
1943   if test x"$glibcxx_cv_c99_math_tr1" = x"yes"; then
1944     AC_DEFINE(_GLIBCXX_USE_C99_MATH_TR1, 1,
1945               [Define if C99 functions or macros in <math.h> should be imported
1946               in <tr1/cmath> in namespace std::tr1.])
1948     case "${target_os}" in
1949       darwin*)
1950         AC_MSG_CHECKING([for ISO C99 rounding functions in <math.h>])
1951         AC_CACHE_VAL(glibcxx_cv_c99_math_llround, [
1952           AC_TRY_COMPILE([#include <math.h>],
1953                  [llrint(0.0);
1954                   llrintf(0.0f);
1955                   llrintl(0.0l);
1956                   llround(0.0);
1957                   llroundf(0.0f);
1958                   llroundl(0.0l);
1959                  ],
1960                  [glibcxx_cv_c99_math_llround=yes],
1961                  [glibcxx_cv_c99_math_llround=no])
1962           ])
1963         AC_MSG_RESULT($glibcxx_cv_c99_math_llround)
1964         ;;
1965     esac
1966     if test x"$glibcxx_cv_c99_math_llround" = x"no"; then
1967       AC_DEFINE(_GLIBCXX_NO_C99_ROUNDING_FUNCS, 1,
1968                 [Define if C99 llrint and llround functions are missing from <math.h>.])
1969     fi
1970   fi
1972   # Check for the existence of <inttypes.h> functions (NB: doesn't make
1973   # sense if the glibcxx_cv_c99_stdint_tr1 check fails, per C99, 7.8/1).
1974   ac_c99_inttypes_tr1=no;
1975   if test x"$glibcxx_cv_c99_stdint_tr1" = x"yes"; then
1976     AC_MSG_CHECKING([for ISO C99 support to TR1 in <inttypes.h>])
1977     AC_TRY_COMPILE([#include <inttypes.h>],
1978                    [intmax_t i, numer, denom, base;
1979                     const char* s;
1980                     char** endptr;
1981                     intmax_t ret = imaxabs(i);
1982                     imaxdiv_t dret = imaxdiv(numer, denom);
1983                     ret = strtoimax(s, endptr, base);
1984                     uintmax_t uret = strtoumax(s, endptr, base);
1985                    ],[ac_c99_inttypes_tr1=yes], [ac_c99_inttypes_tr1=no])
1986   fi
1987   AC_MSG_RESULT($ac_c99_inttypes_tr1)
1988   if test x"$ac_c99_inttypes_tr1" = x"yes"; then
1989     AC_DEFINE(_GLIBCXX_USE_C99_INTTYPES_TR1, 1,
1990               [Define if C99 functions in <inttypes.h> should be imported in
1991               <tr1/cinttypes> in namespace std::tr1.])
1992   fi
1994   # Check for the existence of wchar_t <inttypes.h> functions (NB: doesn't
1995   # make sense if the glibcxx_cv_c99_stdint_tr1 check fails, per C99, 7.8/1).
1996   ac_c99_inttypes_wchar_t_tr1=no;
1997   if test x"$glibcxx_cv_c99_stdint_tr1" = x"yes"; then
1998     AC_MSG_CHECKING([for wchar_t ISO C99 support to TR1 in <inttypes.h>])
1999     AC_TRY_COMPILE([#include <inttypes.h>],
2000                    [intmax_t base;
2001                     const wchar_t* s;
2002                     wchar_t** endptr;
2003                     intmax_t ret = wcstoimax(s, endptr, base);
2004                     uintmax_t uret = wcstoumax(s, endptr, base);
2005                    ],[ac_c99_inttypes_wchar_t_tr1=yes],
2006                      [ac_c99_inttypes_wchar_t_tr1=no])
2007   fi
2008   AC_MSG_RESULT($ac_c99_inttypes_wchar_t_tr1)
2009   if test x"$ac_c99_inttypes_wchar_t_tr1" = x"yes"; then
2010     AC_DEFINE(_GLIBCXX_USE_C99_INTTYPES_WCHAR_T_TR1, 1,
2011               [Define if wchar_t C99 functions in <inttypes.h> should be
2012               imported in <tr1/cinttypes> in namespace std::tr1.])
2013   fi
2015   # Check for the existence of the <stdbool.h> header.
2016   AC_CHECK_HEADERS(stdbool.h)
2018   # Check for the existence of the <stdalign.h> header.
2019   AC_CHECK_HEADERS(stdalign.h)
2021   CXXFLAGS="$ac_save_CXXFLAGS"
2022   AC_LANG_RESTORE
2026 dnl Check for uchar.h and usability.
2028 AC_DEFUN([GLIBCXX_CHECK_UCHAR_H], [
2030   # Test uchar.h.
2031   AC_CHECK_HEADERS(uchar.h, ac_has_uchar_h=yes, ac_has_uchar_h=no)
2033   AC_LANG_SAVE
2034   AC_LANG_CPLUSPLUS
2035   ac_save_CXXFLAGS="$CXXFLAGS"
2036   CXXFLAGS="$CXXFLAGS -std=c++11"
2038   if test x"$ac_has_uchar_h" = x"yes"; then
2039     AC_MSG_CHECKING([for ISO C11 support for <uchar.h>])
2040     AC_TRY_COMPILE([#include <uchar.h>
2041                     #ifdef __STDC_UTF_16__
2042                     long i = __STDC_UTF_16__;
2043                     #endif
2044                     #ifdef __STDC_UTF_32__
2045                     long j = __STDC_UTF_32__;
2046                     #endif
2047                     namespace test
2048                     {
2049                       using ::c16rtomb;
2050                       using ::c32rtomb;
2051                       using ::mbrtoc16;
2052                       using ::mbrtoc32;
2053                     }
2054                    ],
2055                    [], [ac_c11_uchar_cxx11=yes], [ac_c11_uchar_cxx11=no])
2056   else
2057     ac_c11_uchar_cxx11=no
2058   fi
2059   AC_MSG_RESULT($ac_c11_uchar_cxx11)
2060   if test x"$ac_c11_uchar_cxx11" = x"yes"; then
2061     AC_DEFINE(_GLIBCXX_USE_C11_UCHAR_CXX11, 1,
2062               [Define if C11 functions in <uchar.h> should be imported into
2063               namespace std in <cuchar>.])
2064   fi
2066   CXXFLAGS="$ac_save_CXXFLAGS"
2067   AC_LANG_RESTORE
2072 dnl Check whether "/dev/random" and "/dev/urandom" are available for
2073 dnl class std::random_device from C++ 2011 [rand.device], and
2074 dnl random_device of "TR1" (Chapter 5.1, "Random number generation").
2076 AC_DEFUN([GLIBCXX_CHECK_DEV_RANDOM], [
2078   AC_MSG_CHECKING([for "/dev/random" and "/dev/urandom" for std::random_device])
2079   AC_CACHE_VAL(glibcxx_cv_dev_random, [
2080     if test -r /dev/random && test -r /dev/urandom; then
2081   ## For MSys environment the test above is detected as false-positive
2082   ## on mingw-targets.  So disable it explicitly for them.
2083       case ${target_os} in
2084         *mingw*) glibcxx_cv_dev_random=no ;;
2085         *) glibcxx_cv_dev_random=yes ;;
2086       esac
2087     else
2088       glibcxx_cv_dev_random=no;
2089     fi
2090   ])
2091   AC_MSG_RESULT($glibcxx_cv_dev_random)
2093   if test x"$glibcxx_cv_dev_random" = x"yes"; then
2094     AC_DEFINE(_GLIBCXX_USE_DEV_RANDOM, 1,
2095               [Define if /dev/random and /dev/urandom are available for
2096                std::random_device.])
2097     AC_DEFINE(_GLIBCXX_USE_RANDOM_TR1, 1,
2098               [Define if /dev/random and /dev/urandom are available for
2099                the random_device of TR1 (Chapter 5.1).])
2100   fi
2105 dnl Compute the EOF, SEEK_CUR, and SEEK_END integer constants.
2107 AC_DEFUN([GLIBCXX_COMPUTE_STDIO_INTEGER_CONSTANTS], [
2109   AC_CACHE_CHECK([for the value of EOF], glibcxx_cv_stdio_eof, [
2110   AC_COMPUTE_INT([glibcxx_cv_stdio_eof], [[EOF]],
2111                  [#include <stdio.h>],
2112                  [AC_MSG_ERROR([computing EOF failed])])
2113   ])
2114   AC_DEFINE_UNQUOTED(_GLIBCXX_STDIO_EOF, $glibcxx_cv_stdio_eof,
2115                      [Define to the value of the EOF integer constant.])
2117   AC_CACHE_CHECK([for the value of SEEK_CUR], glibcxx_cv_stdio_seek_cur, [
2118   AC_COMPUTE_INT([glibcxx_cv_stdio_seek_cur], [[SEEK_CUR]],
2119                  [#include <stdio.h>],
2120                  [AC_MSG_ERROR([computing SEEK_CUR failed])])
2121   ])
2122   AC_DEFINE_UNQUOTED(_GLIBCXX_STDIO_SEEK_CUR, $glibcxx_cv_stdio_seek_cur,
2123                      [Define to the value of the SEEK_CUR integer constant.])
2125   AC_CACHE_CHECK([for the value of SEEK_END], glibcxx_cv_stdio_seek_end, [
2126   AC_COMPUTE_INT([glibcxx_cv_stdio_seek_end], [[SEEK_END]],
2127                  [#include <stdio.h>],
2128                  [AC_MSG_ERROR([computing SEEK_END failed])])
2129   ])
2130   AC_DEFINE_UNQUOTED(_GLIBCXX_STDIO_SEEK_END, $glibcxx_cv_stdio_seek_end,
2131                      [Define to the value of the SEEK_END integer constant.])
2135 dnl Check whether required C++ overloads are present in <stdio.h>.
2137 AC_DEFUN([GLIBCXX_CHECK_STDIO_PROTO], [
2139   AC_LANG_SAVE
2140   AC_LANG_CPLUSPLUS
2141   # Use C++11 because a conforming <stdio.h> won't define gets for C++14,
2142   # and we don't need a declaration for C++14 anyway.
2143   ac_save_CXXFLAGS="$CXXFLAGS"
2144   CXXFLAGS="$CXXFLAGS -std=gnu++11"
2146   AC_MSG_CHECKING([for gets declaration])
2147   AC_CACHE_VAL(glibcxx_cv_gets, [
2148   AC_COMPILE_IFELSE([AC_LANG_SOURCE(
2149           [#include <stdio.h>
2150            namespace test
2151            {
2152               using ::gets;
2153            }
2154         ])],
2155         [glibcxx_cv_gets=yes],
2156         [glibcxx_cv_gets=no]
2157       )])
2159   if test $glibcxx_cv_gets = yes; then
2160     AC_DEFINE(HAVE_GETS, 1, [Define if gets is available in <stdio.h> before C++14.])
2161   fi
2162   AC_MSG_RESULT($glibcxx_cv_gets)
2164   CXXFLAGS="$ac_save_CXXFLAGS"
2165   AC_LANG_RESTORE
2169 dnl Check whether required C++11 overloads for floating point and integral
2170 dnl types are present in <math.h>.
2172 AC_DEFUN([GLIBCXX_CHECK_MATH11_PROTO], [
2174   AC_LANG_SAVE
2175   AC_LANG_CPLUSPLUS
2176   ac_save_CXXFLAGS="$CXXFLAGS"
2177   CXXFLAGS="$CXXFLAGS -std=c++11"
2179   case "$host" in
2180     *-*-solaris2.*)
2181       # Solaris 12 Build 86, Solaris 11.3 SRU 3.6, and Solaris 10 Patch
2182       # 11996[67]-02 introduced the C++11 <math.h> floating point overloads.
2183       AC_MSG_CHECKING([for C++11 <math.h> floating point overloads])
2184       AC_CACHE_VAL(glibcxx_cv_math11_fp_overload, [
2185         AC_COMPILE_IFELSE([AC_LANG_SOURCE(
2186           [#include <math.h>
2187            #undef isfinite
2188            namespace std {
2189              inline bool isfinite(float __x)
2190              { return __builtin_isfinite(__x); }
2191            }
2192         ])],
2193         [glibcxx_cv_math11_fp_overload=no],
2194         [glibcxx_cv_math11_fp_overload=yes]
2195       )])
2197       # autoheader cannot handle indented templates.
2198       AH_VERBATIM([__CORRECT_ISO_CPP11_MATH_H_PROTO_FP],
2199         [/* Define if all C++11 floating point overloads are available in <math.h>.  */
2200 #if __cplusplus >= 201103L
2201 #undef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
2202 #endif])
2204       if test $glibcxx_cv_math11_fp_overload = yes; then
2205         AC_DEFINE(__CORRECT_ISO_CPP11_MATH_H_PROTO_FP)
2206       fi
2207       AC_MSG_RESULT([$glibcxx_cv_math11_fp_overload])
2209       # Solaris 12 Build 90, Solaris 11.3 SRU 5.6, and Solaris 10 Patch
2210       # 11996[67]-02 introduced the C++11 <math.h> integral type overloads.
2211       AC_MSG_CHECKING([for C++11 <math.h> integral type overloads])
2212       AC_CACHE_VAL(glibcxx_cv_math11_int_overload, [
2213         AC_COMPILE_IFELSE([AC_LANG_SOURCE(
2214           [#include <math.h>
2215            namespace std {
2216              template<typename _Tp>
2217                struct __is_integer;
2218              template<>
2219                struct __is_integer<int>
2220                {
2221                  enum { __value = 1 };
2222                };
2223            }
2224            namespace __gnu_cxx {
2225              template<bool, typename>
2226                struct __enable_if;
2227              template<typename _Tp>
2228                struct __enable_if<true, _Tp>
2229                { typedef _Tp __type; };
2230            }
2231            namespace std {
2232              template<typename _Tp>
2233                constexpr typename __gnu_cxx::__enable_if
2234                          <__is_integer<_Tp>::__value, double>::__type
2235                log2(_Tp __x)
2236                { return __builtin_log2(__x); }
2237            }
2238            int
2239            main (void)
2240            {
2241              int i = 1000;
2242              return std::log2(i);
2243            }
2244         ])],
2245         [glibcxx_cv_math11_int_overload=no],
2246         [glibcxx_cv_math11_int_overload=yes]
2247       )])
2249       # autoheader cannot handle indented templates.
2250       AH_VERBATIM([__CORRECT_ISO_CPP11_MATH_H_PROTO_INT],
2251         [/* Define if all C++11 integral type overloads are available in <math.h>.  */
2252 #if __cplusplus >= 201103L
2253 #undef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
2254 #endif])
2256       if test $glibcxx_cv_math11_int_overload = yes; then
2257         AC_DEFINE(__CORRECT_ISO_CPP11_MATH_H_PROTO_INT)
2258       fi
2259       AC_MSG_RESULT([$glibcxx_cv_math11_int_overload])
2260       ;;
2261     *)
2262       # If <math.h> defines the obsolete isinf(double) and isnan(double)
2263       # functions (instead of or as well as the C99 generic macros) then we
2264       # can't define std::isinf(double) and std::isnan(double) in <cmath>
2265       # and must use the ones from <math.h> instead.
2266       AC_MSG_CHECKING([for obsolete isinf function in <math.h>])
2267         AC_CACHE_VAL(glibcxx_cv_obsolete_isinf, [
2268           AC_COMPILE_IFELSE([AC_LANG_SOURCE(
2269             [#define _GLIBCXX_INCLUDE_NEXT_C_HEADERS
2270              #include <math.h>
2271              #undef isinf
2272              namespace std {
2273                using ::isinf;
2274                bool isinf(float);
2275                bool isinf(long double);
2276              }
2277              using std::isinf;
2278              bool b = isinf(0.0);
2279           ])],
2280           [glibcxx_cv_obsolete_isinf=yes],
2281           [glibcxx_cv_obsolete_isinf=no]
2282         )])
2283       AC_MSG_RESULT([$glibcxx_cv_obsolete_isinf])
2284       if test $glibcxx_cv_obsolete_isinf = yes; then
2285         AC_DEFINE(HAVE_OBSOLETE_ISINF, 1,
2286                   [Define if <math.h> defines obsolete isinf function.])
2287       fi
2289       AC_MSG_CHECKING([for obsolete isnan function in <math.h>])
2290         AC_CACHE_VAL(glibcxx_cv_obsolete_isnan, [
2291           AC_COMPILE_IFELSE([AC_LANG_SOURCE(
2292             [#define _GLIBCXX_INCLUDE_NEXT_C_HEADERS
2293              #include <math.h>
2294              #undef isnan
2295              namespace std {
2296                using ::isnan;
2297                bool isnan(float);
2298                bool isnan(long double);
2299              }
2300              using std::isnan;
2301              bool b = isnan(0.0);
2302           ])],
2303           [glibcxx_cv_obsolete_isnan=yes],
2304           [glibcxx_cv_obsolete_isnan=no]
2305         )])
2306       AC_MSG_RESULT([$glibcxx_cv_obsolete_isnan])
2307       if test $glibcxx_cv_obsolete_isnan = yes; then
2308         AC_DEFINE(HAVE_OBSOLETE_ISNAN, 1,
2309                   [Define if <math.h> defines obsolete isnan function.])
2310       fi
2311       ;;
2312   esac
2314   CXXFLAGS="$ac_save_CXXFLAGS"
2315   AC_LANG_RESTORE
2319 dnl Check for what type of C headers to use.
2321 dnl --enable-cheaders= [does stuff].
2322 dnl --disable-cheaders [does not do anything, really].
2323 dnl  +  Usage:  GLIBCXX_ENABLE_CHEADERS[(DEFAULT)]
2324 dnl       Where DEFAULT is either 'c' or 'c_global' or 'c_std'.
2326 dnl To use the obsolete 'c_std' headers use --enable-cheaders-obsolete as
2327 dnl well as --enable-cheaders=c_std, otherwise configure will fail.
2329 AC_DEFUN([GLIBCXX_ENABLE_CHEADERS], [
2330   GLIBCXX_ENABLE(cheaders-obsolete,no,,
2331     [allow use of obsolete "C" headers for g++])
2332   GLIBCXX_ENABLE(cheaders,$1,[[[=KIND]]],
2333     [construct "C" headers for g++], [permit c|c_global|c_std])
2334   AC_MSG_NOTICE("C" header strategy set to $enable_cheaders)
2335   if test $enable_cheaders = c_std ; then
2336     AC_MSG_WARN([the --enable-cheaders=c_std configuration is obsolete, c_global should be used instead])
2337     AC_MSG_WARN([if you are unable to use c_global please report a bug or inform libstdc++@gcc.gnu.org])
2338     if test $enable_cheaders_obsolete != yes ; then
2339       AC_MSG_ERROR(use --enable-cheaders-obsolete to use c_std "C" headers)
2340     fi
2341   fi
2343   C_INCLUDE_DIR='${glibcxx_srcdir}/include/'$enable_cheaders
2345   # Allow overrides to configure.host here.
2346   if test $enable_cheaders = c_global; then
2347      c_compatibility=yes
2348   fi
2350   AC_SUBST(C_INCLUDE_DIR)
2351   GLIBCXX_CONDITIONAL(GLIBCXX_C_HEADERS_C, test $enable_cheaders = c)
2352   GLIBCXX_CONDITIONAL(GLIBCXX_C_HEADERS_C_STD, test $enable_cheaders = c_std)
2353   GLIBCXX_CONDITIONAL(GLIBCXX_C_HEADERS_C_GLOBAL, test $enable_cheaders = c_global)
2354   GLIBCXX_CONDITIONAL(GLIBCXX_C_HEADERS_COMPATIBILITY, test $c_compatibility = yes)
2359 dnl Check for which locale library to use.  The choice is mapped to
2360 dnl a subdirectory of config/locale.
2362 dnl Default is generic.
2364 AC_DEFUN([GLIBCXX_ENABLE_CLOCALE], [
2365   GLIBCXX_ENABLE(clocale,auto,[[[=MODEL]]],
2366     [use MODEL for target locale package],
2367     [permit generic|gnu|ieee_1003.1-2001|newlib|yes|no|auto])
2369   # Deal with gettext issues.  Default to not using it (=no) until we detect
2370   # support for it later.  Let the user turn it off via --e/d, but let that
2371   # default to on for easier handling.
2372   USE_NLS=no
2373   AC_ARG_ENABLE(nls,
2374     AC_HELP_STRING([--enable-nls],[use Native Language Support (default)]),
2375     [],
2376     [enable_nls=yes])
2378   # Either a known package, or "auto"
2379   if test $enable_clocale = no || test $enable_clocale = yes; then
2380      enable_clocale=auto
2381   fi
2382   enable_clocale_flag=$enable_clocale
2384   # Probe for locale model to use if none specified.
2385   # Default to "generic".
2386   if test $enable_clocale_flag = auto; then
2387     case ${target_os} in
2388       linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
2389         enable_clocale_flag=gnu
2390         ;;
2391       darwin*)
2392         enable_clocale_flag=darwin
2393         ;;
2394       vxworks*)
2395         enable_clocale_flag=vxworks
2396         ;;
2397       dragonfly* | freebsd*)
2398         enable_clocale_flag=dragonfly
2399         ;;
2400       openbsd*)
2401         enable_clocale_flag=newlib
2402         ;;
2403       *)
2404         if test x"$with_newlib" = x"yes"; then
2405           enable_clocale_flag=newlib
2406         else
2407           enable_clocale_flag=generic
2408         fi
2409         ;;
2410     esac
2411   fi
2413   # Sanity check model, and test for special functionality.
2414   if test $enable_clocale_flag = gnu; then
2415     AC_EGREP_CPP([_GLIBCXX_ok], [
2416     #include <features.h>
2417     #if (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3)) && !defined(__UCLIBC__)
2418       _GLIBCXX_ok
2419     #endif
2420     ], enable_clocale_flag=gnu, enable_clocale_flag=generic)
2422     # Set it to scream when it hurts.
2423     ac_save_CFLAGS="$CFLAGS"
2424     CFLAGS="-Wimplicit-function-declaration -Werror"
2426     # Use strxfrm_l if available.
2427     AC_TRY_COMPILE([#define _GNU_SOURCE 1
2428                     #include <string.h>
2429                     #include <locale.h>],
2430                     [char s[128]; __locale_t loc; strxfrm_l(s, "C", 5, loc);],
2431                     AC_DEFINE(HAVE_STRXFRM_L, 1,
2432                     [Define if strxfrm_l is available in <string.h>.]),)
2434     # Use strerror_l if available.
2435     AC_TRY_COMPILE([#define _GNU_SOURCE 1
2436                     #include <string.h>
2437                     #include <locale.h>],
2438                     [__locale_t loc; strerror_l(5, loc);],
2439                     AC_DEFINE(HAVE_STRERROR_L, 1,
2440                     [Define if strerror_l is available in <string.h>.]),)
2442     CFLAGS="$ac_save_CFLAGS"
2443   fi
2445   # Perhaps use strerror_r if available, and strerror_l isn't.
2446   ac_save_CFLAGS="$CFLAGS"
2447   CFLAGS="-Wimplicit-function-declaration -Werror"
2448   AC_TRY_COMPILE([#define _GNU_SOURCE 1
2449                   #include <string.h>
2450                   #include <locale.h>],
2451                   [char s[128]; strerror_r(5, s, 128);],
2452                   AC_DEFINE(HAVE_STRERROR_R, 1,
2453                   [Define if strerror_r is available in <string.h>.]),)
2454   CFLAGS="$ac_save_CFLAGS"
2456   # Set configure bits for specified locale package
2457   AC_MSG_CHECKING([for C locale to use])
2458   case ${enable_clocale_flag} in
2459     generic)
2460       AC_MSG_RESULT(generic)
2462       CLOCALE_H=config/locale/generic/c_locale.h
2463       CLOCALE_CC=config/locale/generic/c_locale.cc
2464       CCODECVT_CC=config/locale/generic/codecvt_members.cc
2465       CCOLLATE_CC=config/locale/generic/collate_members.cc
2466       CCTYPE_CC=config/locale/generic/ctype_members.cc
2467       CMESSAGES_H=config/locale/generic/messages_members.h
2468       CMESSAGES_CC=config/locale/generic/messages_members.cc
2469       CMONEY_CC=config/locale/generic/monetary_members.cc
2470       CNUMERIC_CC=config/locale/generic/numeric_members.cc
2471       CTIME_H=config/locale/generic/time_members.h
2472       CTIME_CC=config/locale/generic/time_members.cc
2473       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
2474       ;;
2475     darwin)
2476       AC_MSG_RESULT(darwin)
2478       CLOCALE_H=config/locale/generic/c_locale.h
2479       CLOCALE_CC=config/locale/generic/c_locale.cc
2480       CCODECVT_CC=config/locale/generic/codecvt_members.cc
2481       CCOLLATE_CC=config/locale/generic/collate_members.cc
2482       CCTYPE_CC=config/locale/darwin/ctype_members.cc
2483       CMESSAGES_H=config/locale/generic/messages_members.h
2484       CMESSAGES_CC=config/locale/generic/messages_members.cc
2485       CMONEY_CC=config/locale/generic/monetary_members.cc
2486       CNUMERIC_CC=config/locale/generic/numeric_members.cc
2487       CTIME_H=config/locale/generic/time_members.h
2488       CTIME_CC=config/locale/generic/time_members.cc
2489       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
2490       ;;
2491     vxworks)
2492       AC_MSG_RESULT(vxworks)
2494       CLOCALE_H=config/locale/generic/c_locale.h
2495       CLOCALE_CC=config/locale/generic/c_locale.cc
2496       CCODECVT_CC=config/locale/generic/codecvt_members.cc
2497       CCOLLATE_CC=config/locale/generic/collate_members.cc
2498       CCTYPE_CC=config/locale/vxworks/ctype_members.cc
2499       CMESSAGES_H=config/locale/generic/messages_members.h
2500       CMESSAGES_CC=config/locale/generic/messages_members.cc
2501       CMONEY_CC=config/locale/generic/monetary_members.cc
2502       CNUMERIC_CC=config/locale/generic/numeric_members.cc
2503       CTIME_H=config/locale/generic/time_members.h
2504       CTIME_CC=config/locale/generic/time_members.cc
2505       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
2506       ;;
2507     dragonfly)
2508       AC_MSG_RESULT(dragonfly or freebsd)
2510       CLOCALE_H=config/locale/dragonfly/c_locale.h
2511       CLOCALE_CC=config/locale/dragonfly/c_locale.cc
2512       CCODECVT_CC=config/locale/dragonfly/codecvt_members.cc
2513       CCOLLATE_CC=config/locale/dragonfly/collate_members.cc
2514       CCTYPE_CC=config/locale/dragonfly/ctype_members.cc
2515       CMESSAGES_H=config/locale/generic/messages_members.h
2516       CMESSAGES_CC=config/locale/generic/messages_members.cc
2517       CMONEY_CC=config/locale/dragonfly/monetary_members.cc
2518       CNUMERIC_CC=config/locale/dragonfly/numeric_members.cc
2519       CTIME_H=config/locale/dragonfly/time_members.h
2520       CTIME_CC=config/locale/dragonfly/time_members.cc
2521       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
2522       ;;
2524     gnu)
2525       AC_MSG_RESULT(gnu)
2527       # Declare intention to use gettext, and add support for specific
2528       # languages.
2529       # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT
2530       ALL_LINGUAS="de fr"
2532       # Don't call AM-GNU-GETTEXT here. Instead, assume glibc.
2533       AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no)
2534       if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then
2535         USE_NLS=yes
2536       fi
2537       # Export the build objects.
2538       for ling in $ALL_LINGUAS; do \
2539         glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \
2540         glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \
2541       done
2542       AC_SUBST(glibcxx_MOFILES)
2543       AC_SUBST(glibcxx_POFILES)
2545       CLOCALE_H=config/locale/gnu/c_locale.h
2546       CLOCALE_CC=config/locale/gnu/c_locale.cc
2547       CCODECVT_CC=config/locale/gnu/codecvt_members.cc
2548       CCOLLATE_CC=config/locale/gnu/collate_members.cc
2549       CCTYPE_CC=config/locale/gnu/ctype_members.cc
2550       CMESSAGES_H=config/locale/gnu/messages_members.h
2551       CMESSAGES_CC=config/locale/gnu/messages_members.cc
2552       CMONEY_CC=config/locale/gnu/monetary_members.cc
2553       CNUMERIC_CC=config/locale/gnu/numeric_members.cc
2554       CTIME_H=config/locale/gnu/time_members.h
2555       CTIME_CC=config/locale/gnu/time_members.cc
2556       CLOCALE_INTERNAL_H=config/locale/gnu/c++locale_internal.h
2557       ;;
2558     ieee_1003.1-2001)
2559       AC_MSG_RESULT(IEEE 1003.1)
2561       CLOCALE_H=config/locale/ieee_1003.1-2001/c_locale.h
2562       CLOCALE_CC=config/locale/ieee_1003.1-2001/c_locale.cc
2563       CCODECVT_CC=config/locale/generic/codecvt_members.cc
2564       CCOLLATE_CC=config/locale/generic/collate_members.cc
2565       CCTYPE_CC=config/locale/generic/ctype_members.cc
2566       CMESSAGES_H=config/locale/ieee_1003.1-2001/messages_members.h
2567       CMESSAGES_CC=config/locale/ieee_1003.1-2001/messages_members.cc
2568       CMONEY_CC=config/locale/generic/monetary_members.cc
2569       CNUMERIC_CC=config/locale/generic/numeric_members.cc
2570       CTIME_H=config/locale/generic/time_members.h
2571       CTIME_CC=config/locale/generic/time_members.cc
2572       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
2573       ;;
2574     newlib)
2575       AC_MSG_RESULT(newlib)
2577       CLOCALE_H=config/locale/generic/c_locale.h
2578       CLOCALE_CC=config/locale/generic/c_locale.cc
2579       CCODECVT_CC=config/locale/generic/codecvt_members.cc
2580       CCOLLATE_CC=config/locale/generic/collate_members.cc
2581       CCTYPE_CC=config/locale/newlib/ctype_members.cc
2582       CMESSAGES_H=config/locale/generic/messages_members.h
2583       CMESSAGES_CC=config/locale/generic/messages_members.cc
2584       CMONEY_CC=config/locale/generic/monetary_members.cc
2585       CNUMERIC_CC=config/locale/generic/numeric_members.cc
2586       CTIME_H=config/locale/generic/time_members.h
2587       CTIME_CC=config/locale/generic/time_members.cc
2588       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
2589       ;;
2590   esac
2592   # This is where the testsuite looks for locale catalogs, using the
2593   # -DLOCALEDIR define during testsuite compilation.
2594   glibcxx_localedir=${glibcxx_builddir}/po/share/locale
2595   AC_SUBST(glibcxx_localedir)
2597   # A standalone libintl (e.g., GNU libintl) may be in use.
2598   if test $USE_NLS = yes; then
2599     AC_CHECK_HEADERS([libintl.h], [], USE_NLS=no)
2600     AC_SEARCH_LIBS(gettext, intl, [], USE_NLS=no)
2601   fi
2602   if test $USE_NLS = yes; then
2603     AC_DEFINE(_GLIBCXX_USE_NLS, 1,
2604               [Define if NLS translations are to be used.])
2605   fi
2607   AC_SUBST(USE_NLS)
2608   AC_SUBST(CLOCALE_H)
2609   AC_SUBST(CMESSAGES_H)
2610   AC_SUBST(CCODECVT_CC)
2611   AC_SUBST(CCOLLATE_CC)
2612   AC_SUBST(CCTYPE_CC)
2613   AC_SUBST(CMESSAGES_CC)
2614   AC_SUBST(CMONEY_CC)
2615   AC_SUBST(CNUMERIC_CC)
2616   AC_SUBST(CTIME_H)
2617   AC_SUBST(CTIME_CC)
2618   AC_SUBST(CLOCALE_CC)
2619   AC_SUBST(CLOCALE_INTERNAL_H)
2624 dnl Check for which std::allocator base class to use.  The choice is
2625 dnl mapped from a subdirectory of include/ext.
2627 dnl Default is new.
2629 AC_DEFUN([GLIBCXX_ENABLE_ALLOCATOR], [
2630   AC_MSG_CHECKING([for std::allocator base class])
2631   GLIBCXX_ENABLE(libstdcxx-allocator,auto,[[[=KIND]]],
2632     [use KIND for target std::allocator base],
2633     [permit new|malloc|mt|bitmap|pool|yes|no|auto])
2635   # If they didn't use this option switch, or if they specified --enable
2636   # with no specific model, we'll have to look for one.  If they
2637   # specified --disable (???), do likewise.
2638   if test $enable_libstdcxx_allocator = no ||
2639      test $enable_libstdcxx_allocator = yes;
2640   then
2641      enable_libstdcxx_allocator=auto
2642   fi
2644   # Either a known package, or "auto". Auto implies the default choice
2645   # for a particular platform.
2646   enable_libstdcxx_allocator_flag=$enable_libstdcxx_allocator
2648   # Probe for host-specific support if no specific model is specified.
2649   # Default to "new".
2650   if test $enable_libstdcxx_allocator_flag = auto; then
2651     case ${target_os} in
2652       linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
2653         enable_libstdcxx_allocator_flag=new
2654         ;;
2655       *)
2656         enable_libstdcxx_allocator_flag=new
2657         ;;
2658     esac
2659   fi
2660   AC_MSG_RESULT($enable_libstdcxx_allocator_flag)
2663   # Set configure bits for specified locale package
2664   case ${enable_libstdcxx_allocator_flag} in
2665     bitmap)
2666       ALLOCATOR_H=config/allocator/bitmap_allocator_base.h
2667       ALLOCATOR_NAME=__gnu_cxx::bitmap_allocator
2668       ;;
2669     malloc)
2670       ALLOCATOR_H=config/allocator/malloc_allocator_base.h
2671       ALLOCATOR_NAME=__gnu_cxx::malloc_allocator
2672       ;;
2673     mt)
2674       ALLOCATOR_H=config/allocator/mt_allocator_base.h
2675       ALLOCATOR_NAME=__gnu_cxx::__mt_alloc
2676       ;;
2677     new)
2678       ALLOCATOR_H=config/allocator/new_allocator_base.h
2679       ALLOCATOR_NAME=__gnu_cxx::new_allocator
2680       ;;
2681     pool)
2682       ALLOCATOR_H=config/allocator/pool_allocator_base.h
2683       ALLOCATOR_NAME=__gnu_cxx::__pool_alloc
2684       ;;
2685   esac
2687   GLIBCXX_CONDITIONAL(ENABLE_ALLOCATOR_NEW,
2688                       test $enable_libstdcxx_allocator_flag = new)
2689   AC_SUBST(ALLOCATOR_H)
2690   AC_SUBST(ALLOCATOR_NAME)
2695 dnl Check for whether the Boost-derived checks should be turned on.
2697 dnl --enable-concept-checks turns them on.
2698 dnl --disable-concept-checks leaves them off.
2699 dnl  +  Usage:  GLIBCXX_ENABLE_CONCEPT_CHECKS[(DEFAULT)]
2700 dnl       Where DEFAULT is either `yes' or `no'.
2702 AC_DEFUN([GLIBCXX_ENABLE_CONCEPT_CHECKS], [
2703   GLIBCXX_ENABLE(concept-checks,$1,,[use Boost-derived template checks])
2704   if test $enable_concept_checks = yes; then
2705     AC_DEFINE(_GLIBCXX_CONCEPT_CHECKS, 1,
2706               [Define to use concept checking code from the boost libraries.])
2707   fi
2711 dnl Use extern templates.
2713 dnl --enable-extern-template defines _GLIBCXX_EXTERN_TEMPLATE to 1
2714 dnl --disable-extern-template defines _GLIBCXX_EXTERN_TEMPLATE to 0
2716 dnl  +  Usage:  GLIBCXX_ENABLE_TEMPLATE[(DEFAULT)]
2717 dnl       Where DEFAULT is `yes' or `no'.
2719 AC_DEFUN([GLIBCXX_ENABLE_EXTERN_TEMPLATE], [
2721   GLIBCXX_ENABLE(extern-template,$1,,[enable extern template])
2723   AC_MSG_CHECKING([for extern template support])
2724   AC_MSG_RESULT([$enable_extern_template])
2726   GLIBCXX_CONDITIONAL(ENABLE_EXTERN_TEMPLATE, test $enable_extern_template = yes)
2730 dnl Use vtable verification.
2732 dnl --enable-vtable-verify defines _GLIBCXX_VTABLE_VERIFY to 1
2733 dnl --disable-vtable-verify defines _GLIBCXX_VTABLE_VERIFY to 0
2735 dnl  +  Usage:  GLIBCXX_ENABLE_VTABLE_VERIFY[(DEFAULT)]
2736 dnl       Where DEFAULT is `yes' or `no'.
2738 AC_DEFUN([GLIBCXX_ENABLE_VTABLE_VERIFY], [
2740   GLIBCXX_ENABLE(vtable-verify,$1,,[enable vtable verify])
2742   AC_MSG_CHECKING([for vtable verify support])
2743   AC_MSG_RESULT([$enable_vtable_verify])
2745   vtv_cygmin=no
2746   if test $enable_vtable_verify = yes; then
2747     case ${target_os} in
2748       cygwin*|mingw32*)
2749         VTV_CXXFLAGS="-fvtable-verify=std -Wl,-lvtv,-u_vtable_map_vars_start,-u_vtable_map_vars_end"
2750         VTV_CXXLINKFLAGS="-L${toplevel_builddir}/libvtv/.libs -Wl,--rpath -Wl,${toplevel_builddir}/libvtv/.libs"
2751         vtv_cygmin=yes
2752         ;;
2753       darwin*)
2754         VTV_CXXFLAGS="-fvtable-verify=std -Wl,-u,_vtable_map_vars_start -Wl,-u,_vtable_map_vars_end"
2755         VTV_CXXLINKFLAGS="-L${toplevel_builddir}/libvtv/.libs -Wl,-rpath,${toplevel_builddir}/libvtv/.libs"
2756         ;;
2757       solaris2*)
2758         VTV_CXXFLAGS="-fvtable-verify=std -Wl,-u_vtable_map_vars_start,-u_vtable_map_vars_end"
2759         VTV_CXXLINKFLAGS="-L${toplevel_builddir}/libvtv/.libs -Wl,-R -Wl,${toplevel_builddir}/libvtv/.libs"
2760         ;;
2761       *)
2762         VTV_CXXFLAGS="-fvtable-verify=std -Wl,-u_vtable_map_vars_start,-u_vtable_map_vars_end"
2763         VTV_CXXLINKFLAGS="-L${toplevel_builddir}/libvtv/.libs -Wl,--rpath -Wl,${toplevel_builddir}/libvtv/.libs"
2764         ;;
2765     esac
2766     VTV_PCH_CXXFLAGS="-fvtable-verify=std"
2767   else
2768     VTV_CXXFLAGS=
2769     VTV_PCH_CXXFLAGS=
2770     VTV_CXXLINKFLAGS=
2771   fi
2773   AC_SUBST(VTV_CXXFLAGS)
2774   AC_SUBST(VTV_PCH_CXXFLAGS)
2775   AC_SUBST(VTV_CXXLINKFLAGS)
2776   AM_CONDITIONAL(VTV_CYGMIN, test x$vtv_cygmin = xyes)
2777   GLIBCXX_CONDITIONAL(ENABLE_VTABLE_VERIFY, test $enable_vtable_verify = yes)
2781 dnl Check for parallel mode pre-requisites, including OpenMP support.
2783 dnl  +  Usage:  GLIBCXX_ENABLE_PARALLEL
2785 AC_DEFUN([GLIBCXX_ENABLE_PARALLEL], [
2787   enable_parallel=no;
2789   # See if configured libgomp/omp.h exists. (libgomp may be in
2790   # noconfigdirs but not explicitly disabled.)
2791   if echo " ${TARGET_CONFIGDIRS} " | grep " libgomp " > /dev/null 2>&1 ; then
2792     enable_parallel=yes;
2793   else
2794     AC_MSG_NOTICE([target-libgomp not built])
2795   fi
2797   AC_MSG_CHECKING([for parallel mode support])
2798   AC_MSG_RESULT([$enable_parallel])
2803 dnl Check for which I/O library to use:  stdio and POSIX, or pure stdio.
2805 dnl Default is stdio_posix.
2807 AC_DEFUN([GLIBCXX_ENABLE_CSTDIO], [
2808   AC_MSG_CHECKING([for underlying I/O to use])
2809   GLIBCXX_ENABLE(cstdio,stdio,[[[=PACKAGE]]],
2810     [use target-specific I/O package], [permit stdio|stdio_posix|stdio_pure])
2812   # The only available I/O model is based on stdio, via basic_file_stdio.
2813   # The default "stdio" is actually "stdio + POSIX" because it uses fdopen(3)
2814   # to get a file descriptor and then uses read(3) and write(3) with it.
2815   # The "stdio_pure" model doesn't use fdopen and only uses FILE* for I/O.
2816   case ${enable_cstdio} in
2817     stdio*)
2818       CSTDIO_H=config/io/c_io_stdio.h
2819       BASIC_FILE_H=config/io/basic_file_stdio.h
2820       BASIC_FILE_CC=config/io/basic_file_stdio.cc
2821       AC_MSG_RESULT(stdio)
2823       if test "x$enable_cstdio" = "xstdio_pure" ; then
2824         AC_DEFINE(_GLIBCXX_USE_STDIO_PURE, 1,
2825                   [Define to restrict std::__basic_file<> to stdio APIs.])
2826       fi
2827       ;;
2828   esac
2830   AC_SUBST(CSTDIO_H)
2831   AC_SUBST(BASIC_FILE_H)
2832   AC_SUBST(BASIC_FILE_CC)
2837 dnl Check for "unusual" flags to pass to the compiler while building.
2839 dnl --enable-cxx-flags='-foo -bar -baz' is a general method for passing
2840 dnl     experimental flags such as -fpch, -fIMI, -Dfloat=char, etc.
2841 dnl --disable-cxx-flags passes nothing.
2842 dnl  +  See http://gcc.gnu.org/ml/libstdc++/2000-q2/msg00131.html
2843 dnl         http://gcc.gnu.org/ml/libstdc++/2000-q2/msg00284.html
2844 dnl         http://gcc.gnu.org/ml/libstdc++/2000-q1/msg00035.html
2845 dnl  +  Usage:  GLIBCXX_ENABLE_CXX_FLAGS(default flags)
2846 dnl       If "default flags" is an empty string, the effect is the same
2847 dnl       as --disable or --enable=no.
2849 AC_DEFUN([GLIBCXX_ENABLE_CXX_FLAGS], [dnl
2850   AC_MSG_CHECKING([for extra compiler flags for building])
2851   GLIBCXX_ENABLE(cxx-flags,$1,[=FLAGS],
2852     [pass compiler FLAGS when building library],
2853     [case "x$enable_cxx_flags" in
2854       xno | x)   enable_cxx_flags= ;;
2855       x-*)       ;;
2856       *)         AC_MSG_ERROR(_g_switch needs compiler flags as arguments) ;;
2857      esac])
2859   # Run through flags (either default or command-line) and set anything
2860   # extra (e.g., #defines) that must accompany particular g++ options.
2861   if test -n "$enable_cxx_flags"; then
2862     for f in $enable_cxx_flags; do
2863       case "$f" in
2864         -fhonor-std)  ;;
2865         -*)  ;;
2866         *)   # and we're trying to pass /what/ exactly?
2867              AC_MSG_ERROR([compiler flags start with a -]) ;;
2868       esac
2869     done
2870   fi
2872   EXTRA_CXX_FLAGS="$enable_cxx_flags"
2873   AC_MSG_RESULT($EXTRA_CXX_FLAGS)
2874   AC_SUBST(EXTRA_CXX_FLAGS)
2879 dnl Check to see if debugging libraries are to be built.
2881 dnl --enable-libstdcxx-debug
2882 dnl builds a separate set of debugging libraries in addition to the
2883 dnl normal (shared, static) libstdc++ binaries.
2885 dnl --disable-libstdcxx-debug
2886 dnl builds only one (non-debug) version of libstdc++.
2888 dnl --enable-libstdcxx-debug-flags=FLAGS
2889 dnl iff --enable-debug == yes, then use FLAGS to build the debug library.
2891 dnl  +  Usage:  GLIBCXX_ENABLE_DEBUG[(DEFAULT)]
2892 dnl       Where DEFAULT is either `yes' or `no'.
2894 AC_DEFUN([GLIBCXX_ENABLE_DEBUG], [
2895   AC_MSG_CHECKING([for additional debug build])
2896   skip_debug_build=
2897   GLIBCXX_ENABLE(libstdcxx-debug,$1,,[build extra debug library])
2898   if test x$enable_libstdcxx_debug = xyes; then
2899     if test -f $toplevel_builddir/../stage_final \
2900       && test -f $toplevel_builddir/../stage_current; then
2901       stage_final=`cat $toplevel_builddir/../stage_final`
2902       stage_current=`cat $toplevel_builddir/../stage_current`
2903       if test x$stage_current != x$stage_final ; then
2904         skip_debug_build=" (skipped for bootstrap stage $stage_current)"
2905         enable_libstdcxx_debug=no
2906       fi
2907     fi
2908   fi
2909   AC_MSG_RESULT($enable_libstdcxx_debug$skip_debug_build)
2910   GLIBCXX_CONDITIONAL(GLIBCXX_BUILD_DEBUG, test $enable_libstdcxx_debug = yes)
2915 dnl Check for explicit debug flags.
2917 dnl --enable-libstdcxx-debug-flags='-O1'
2918 dnl is a general method for passing flags to be used when
2919 dnl building debug libraries with --enable-libstdcxx-debug.
2921 dnl --disable-libstdcxx-debug-flags does nothing.
2922 dnl  +  Usage:  GLIBCXX_ENABLE_DEBUG_FLAGS(default flags)
2923 dnl       If "default flags" is an empty string, the effect is the same
2924 dnl       as --disable or --enable=no.
2926 AC_DEFUN([GLIBCXX_ENABLE_DEBUG_FLAGS], [
2927   GLIBCXX_ENABLE(libstdcxx-debug-flags,[$1],[=FLAGS],
2928     [pass compiler FLAGS when building debug library],
2929     [case "x$enable_libstdcxx_debug_flags" in
2930       xno | x)    enable_libstdcxx_debug_flags= ;;
2931       x-*)        ;;
2932       *)          AC_MSG_ERROR(_g_switch needs compiler flags as arguments) ;;
2933      esac])
2935   # Option parsed, now set things appropriately
2936   DEBUG_FLAGS="$enable_libstdcxx_debug_flags"
2937   AC_SUBST(DEBUG_FLAGS)
2939   AC_MSG_NOTICE([Debug build flags set to $DEBUG_FLAGS])
2944 dnl Check if the user only wants a freestanding library implementation.
2946 dnl --disable-hosted-libstdcxx will turn off most of the library build,
2947 dnl installing only the headers required by [17.4.1.3] and the language
2948 dnl support library.  More than that will be built (to keep the Makefiles
2949 dnl conveniently clean), but not installed.
2951 dnl Sets:
2952 dnl  is_hosted  (yes/no)
2954 dnl Defines:
2955 dnl  _GLIBCXX_HOSTED   (always defined, either to 1 or 0)
2957 AC_DEFUN([GLIBCXX_ENABLE_HOSTED], [
2958   AC_ARG_ENABLE([hosted-libstdcxx],
2959     AC_HELP_STRING([--disable-hosted-libstdcxx],
2960                    [only build freestanding C++ runtime support]),,
2961     [case "$host" in
2962         arm*-*-symbianelf*)
2963             enable_hosted_libstdcxx=no
2964             ;;
2965         *)
2966             enable_hosted_libstdcxx=yes
2967             ;;
2968      esac])
2969   if test "$enable_hosted_libstdcxx" = no; then
2970     AC_MSG_NOTICE([Only freestanding libraries will be built])
2971     is_hosted=no
2972     hosted_define=0
2973     enable_abi_check=no
2974     enable_libstdcxx_pch=no
2975   else
2976     is_hosted=yes
2977     hosted_define=1
2978   fi
2979   GLIBCXX_CONDITIONAL(GLIBCXX_HOSTED, test $is_hosted = yes)
2980   AC_DEFINE_UNQUOTED(_GLIBCXX_HOSTED, $hosted_define,
2981     [Define to 1 if a full hosted library is built, or 0 if freestanding.])
2986 dnl Check if the user wants a non-verbose library implementation.
2988 dnl --disable-libstdcxx-verbose will turn off descriptive messages to
2989 dnl standard error on termination.
2991 dnl Defines:
2992 dnl  _GLIBCXX_VERBOSE (always defined, either to 1 or 0)
2994 AC_DEFUN([GLIBCXX_ENABLE_VERBOSE], [
2995   AC_ARG_ENABLE([libstdcxx-verbose],
2996     AC_HELP_STRING([--disable-libstdcxx-verbose],
2997                    [disable termination messages to standard error]),,
2998                    [enable_libstdcxx_verbose=yes])
2999   if test x"$enable_libstdcxx_verbose" = xyes; then
3000     verbose_define=1
3001   else
3002     AC_MSG_NOTICE([verbose termination messages are disabled])
3003     verbose_define=0
3004   fi
3005   AC_DEFINE_UNQUOTED(_GLIBCXX_VERBOSE, $verbose_define,
3006     [Define to 1 if a verbose library is built, or 0 otherwise.])
3011 dnl Check for template specializations for the 'long long' type.
3012 dnl The result determines only whether 'long long' I/O is enabled; things
3013 dnl like numeric_limits<> specializations are always available.
3015 dnl --enable-long-long defines _GLIBCXX_USE_LONG_LONG
3016 dnl --disable-long-long leaves _GLIBCXX_USE_LONG_LONG undefined
3017 dnl  +  Usage:  GLIBCXX_ENABLE_LONG_LONG[(DEFAULT)]
3018 dnl       Where DEFAULT is either `yes' or `no'.
3020 AC_DEFUN([GLIBCXX_ENABLE_LONG_LONG], [
3021   GLIBCXX_ENABLE(long-long,$1,,[enable template specializations for 'long long'])
3022   if test $enable_long_long = yes; then
3023     AC_DEFINE(_GLIBCXX_USE_LONG_LONG, 1,
3024               [Define if code specialized for long long should be used.])
3025   fi
3026   AC_MSG_CHECKING([for enabled long long specializations])
3027   AC_MSG_RESULT([$enable_long_long])
3032 dnl Check for decimal floating point.
3033 dnl See:
3034 dnl http://gcc.gnu.org/onlinedocs/gcc/Decimal-Float.html#Decimal-Float
3036 dnl This checks to see if the host supports decimal floating point types.
3038 dnl Defines:
3039 dnl  _GLIBCXX_USE_DECIMAL_FLOAT
3041 AC_DEFUN([GLIBCXX_ENABLE_DECIMAL_FLOAT], [
3043   # Fake what AC_TRY_COMPILE does, without linking as this is
3044   # unnecessary for this test.
3046     cat > conftest.$ac_ext << EOF
3047 [#]line __oline__ "configure"
3048 int main()
3050   _Decimal32 d1;
3051   _Decimal64 d2;
3052   _Decimal128 d3;
3053   return 0;
3057     AC_MSG_CHECKING([for ISO/IEC TR 24733 ])
3058     if AC_TRY_EVAL(ac_compile); then
3059       AC_DEFINE(_GLIBCXX_USE_DECIMAL_FLOAT, 1,
3060       [Define if ISO/IEC TR 24733 decimal floating point types are supported on this host.])
3061       enable_dfp=yes
3062     else
3063       enable_dfp=no
3064     fi
3065     AC_MSG_RESULT($enable_dfp)
3066     rm -f conftest*
3070 dnl Check for GNU 128-bit floating point type.
3072 dnl Note: also checks that the type isn't a standard types.
3074 dnl Defines:
3075 dnl  ENABLE_FLOAT128
3077 AC_DEFUN([GLIBCXX_ENABLE_FLOAT128], [
3079   AC_LANG_SAVE
3080   AC_LANG_CPLUSPLUS
3082   # Fake what AC_TRY_COMPILE does, without linking as this is
3083   # unnecessary for this test.
3085   cat > conftest.$ac_ext << EOF
3086 [#]line __oline__ "configure"
3087 template<typename T1, typename T2>
3088   struct same
3089   { typedef T2 type; };
3091 template<typename T>
3092   struct same<T, T>;
3094 int main()
3096   typename same<double, __float128>::type      f1;
3097   typename same<long double, __float128>::type f2;
3101     AC_MSG_CHECKING([for __float128])
3102     if AC_TRY_EVAL(ac_compile); then
3103       enable_float128=yes
3104     else
3105       enable_float128=no
3106     fi
3107     AC_MSG_RESULT($enable_float128)
3108     GLIBCXX_CONDITIONAL(ENABLE_FLOAT128, test $enable_float128 = yes)
3109     rm -f conftest*
3111   AC_LANG_RESTORE
3115 dnl Check for template specializations for the 'wchar_t' type.
3117 dnl --enable-wchar_t defines _GLIBCXX_USE_WCHAR_T
3118 dnl --disable-wchar_t leaves _GLIBCXX_USE_WCHAR_T undefined
3119 dnl  +  Usage:  GLIBCXX_ENABLE_WCHAR_T[(DEFAULT)]
3120 dnl       Where DEFAULT is either `yes' or `no'.
3122 dnl Necessary support must also be present.
3124 AC_DEFUN([GLIBCXX_ENABLE_WCHAR_T], [
3125   GLIBCXX_ENABLE(wchar_t,$1,,[enable template specializations for 'wchar_t'])
3127   # Test wchar.h for mbstate_t, which is needed for char_traits and fpos.
3128   AC_CHECK_HEADERS(wchar.h, ac_has_wchar_h=yes, ac_has_wchar_h=no)
3129   AC_MSG_CHECKING([for mbstate_t])
3130   AC_TRY_COMPILE([#include <wchar.h>],
3131   [mbstate_t teststate;],
3132   have_mbstate_t=yes, have_mbstate_t=no)
3133   AC_MSG_RESULT($have_mbstate_t)
3134   if test x"$have_mbstate_t" = xyes; then
3135     AC_DEFINE(HAVE_MBSTATE_T,1,[Define if mbstate_t exists in wchar.h.])
3136   fi
3138   # Test it always, for use in GLIBCXX_ENABLE_C99, together with
3139   # ac_has_wchar_h.
3140   AC_CHECK_HEADERS(wctype.h, ac_has_wctype_h=yes, ac_has_wctype_h=no)
3142   if test x"$enable_wchar_t" = x"yes"; then
3144     AC_LANG_SAVE
3145     AC_LANG_CPLUSPLUS
3147     if test x"$ac_has_wchar_h" = xyes &&
3148        test x"$ac_has_wctype_h" = xyes; then
3149       AC_TRY_COMPILE([#include <wchar.h>
3150                       #include <stddef.h>
3151                       wint_t i;
3152                       long l = WEOF;
3153                       long j = WCHAR_MIN;
3154                       long k = WCHAR_MAX;
3155                       namespace test
3156                       {
3157                         using ::btowc;
3158                         using ::fgetwc;
3159                         using ::fgetws;
3160                         using ::fputwc;
3161                         using ::fputws;
3162                         using ::fwide;
3163                         using ::fwprintf;
3164                         using ::fwscanf;
3165                         using ::getwc;
3166                         using ::getwchar;
3167                         using ::mbrlen;
3168                         using ::mbrtowc;
3169                         using ::mbsinit;
3170                         using ::mbsrtowcs;
3171                         using ::putwc;
3172                         using ::putwchar;
3173                         using ::swprintf;
3174                         using ::swscanf;
3175                         using ::ungetwc;
3176                         using ::vfwprintf;
3177                         using ::vswprintf;
3178                         using ::vwprintf;
3179                         using ::wcrtomb;
3180                         using ::wcscat;
3181                         using ::wcschr;
3182                         using ::wcscmp;
3183                         using ::wcscoll;
3184                         using ::wcscpy;
3185                         using ::wcscspn;
3186                         using ::wcsftime;
3187                         using ::wcslen;
3188                         using ::wcsncat;
3189                         using ::wcsncmp;
3190                         using ::wcsncpy;
3191                         using ::wcspbrk;
3192                         using ::wcsrchr;
3193                         using ::wcsrtombs;
3194                         using ::wcsspn;
3195                         using ::wcsstr;
3196                         using ::wcstod;
3197                         using ::wcstok;
3198                         using ::wcstol;
3199                         using ::wcstoul;
3200                         using ::wcsxfrm;
3201                         using ::wctob;
3202                         using ::wmemchr;
3203                         using ::wmemcmp;
3204                         using ::wmemcpy;
3205                         using ::wmemmove;
3206                         using ::wmemset;
3207                         using ::wprintf;
3208                         using ::wscanf;
3209                       }
3210                      ],[],[], [enable_wchar_t=no])
3211     else
3212       enable_wchar_t=no
3213     fi
3215     AC_LANG_RESTORE
3216   fi
3218   if test x"$enable_wchar_t" = x"yes"; then
3219     AC_DEFINE(_GLIBCXX_USE_WCHAR_T, 1,
3220               [Define if code specialized for wchar_t should be used.])
3221   fi
3223   AC_MSG_CHECKING([for enabled wchar_t specializations])
3224   AC_MSG_RESULT([$enable_wchar_t])
3229 dnl Check to see if building and using a C++ precompiled header can be done.
3231 dnl --enable-libstdcxx-pch=yes
3232 dnl default, this shows intent to use stdc++.h.gch If it looks like it
3233 dnl may work, after some light-hearted attempts to puzzle out compiler
3234 dnl support, flip bits on in include/Makefile.am
3236 dnl --disable-libstdcxx-pch
3237 dnl turns off attempts to use or build stdc++.h.gch.
3239 dnl Substs:
3240 dnl  glibcxx_PCHFLAGS
3242 AC_DEFUN([GLIBCXX_ENABLE_PCH], [
3243   GLIBCXX_ENABLE(libstdcxx-pch,$1,,[build pre-compiled libstdc++ headers])
3244   if test $enable_libstdcxx_pch = yes; then
3245     AC_CACHE_CHECK([for compiler with PCH support],
3246       [glibcxx_cv_prog_CXX_pch],
3247       [ac_save_CXXFLAGS="$CXXFLAGS"
3248        CXXFLAGS="$CXXFLAGS -Werror -Winvalid-pch -Wno-deprecated"
3249        AC_LANG_SAVE
3250        AC_LANG_CPLUSPLUS
3251        echo '#include <math.h>' > conftest.h
3252        if $CXX $CXXFLAGS $CPPFLAGS -x c++-header conftest.h \
3253                           -o conftest.h.gch 1>&5 2>&1 &&
3254                 echo '#error "pch failed"' > conftest.h &&
3255           echo '#include "conftest.h"' > conftest.cc &&
3256                $CXX -c $CXXFLAGS $CPPFLAGS conftest.cc 1>&5 2>&1 ;
3257        then
3258          glibcxx_cv_prog_CXX_pch=yes
3259        else
3260          glibcxx_cv_prog_CXX_pch=no
3261        fi
3262        rm -f conftest*
3263        CXXFLAGS=$ac_save_CXXFLAGS
3264        AC_LANG_RESTORE
3265       ])
3266     enable_libstdcxx_pch=$glibcxx_cv_prog_CXX_pch
3267   fi
3269   AC_MSG_CHECKING([for enabled PCH])
3270   AC_MSG_RESULT([$enable_libstdcxx_pch])
3272   GLIBCXX_CONDITIONAL(GLIBCXX_BUILD_PCH, test $enable_libstdcxx_pch = yes)
3273   if test $enable_libstdcxx_pch = yes; then
3274     glibcxx_PCHFLAGS="-include bits/stdc++.h"
3275   else
3276     glibcxx_PCHFLAGS=""
3277   fi
3278   AC_SUBST(glibcxx_PCHFLAGS)
3283 dnl Check for atomic builtins.
3284 dnl See:
3285 dnl http://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html
3287 dnl This checks to see if the host supports the compiler-generated
3288 dnl builtins for atomic operations for various integral sizes. Note, this
3289 dnl is intended to be an all-or-nothing switch, so all the atomic operations
3290 dnl that are used should be checked.
3292 dnl Note:
3293 dnl libgomp and libgfortran use a link test, see CHECK_SYNC_FETCH_AND_ADD.
3295 AC_DEFUN([GLIBCXX_ENABLE_ATOMIC_BUILTINS], [
3296   AC_LANG_SAVE
3297   AC_LANG_CPLUSPLUS
3298   old_CXXFLAGS="$CXXFLAGS"
3300   # Do link tests if possible, instead asm tests, limited to some platforms
3301   # see discussion in PR target/40134, PR libstdc++/40133 and the thread
3302   # starting at http://gcc.gnu.org/ml/gcc-patches/2009-07/msg00322.html
3303   atomic_builtins_link_tests=no
3304   if test x$gcc_no_link != xyes; then
3305     # Can do link tests. Limit to some tested platforms
3306     case "$host" in
3307       *-*-linux* | *-*-uclinux* | *-*-kfreebsd*-gnu | *-*-gnu*)
3308         atomic_builtins_link_tests=yes
3309         ;;
3310     esac
3311   fi
3313   if test x$atomic_builtins_link_tests = xyes; then
3315   # Do link tests.
3317   CXXFLAGS="$CXXFLAGS -fno-exceptions"
3319   AC_MSG_CHECKING([for atomic builtins for bool])
3320   AC_CACHE_VAL(glibcxx_cv_atomic_bool, [
3321     AC_TRY_LINK(
3322       [ ],
3323       [typedef bool atomic_type;
3324        atomic_type c1;
3325        atomic_type c2;
3326        atomic_type c3(0);
3327        // N.B. __atomic_fetch_add is not supported for bool.
3328        __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
3329                                    __ATOMIC_RELAXED);
3330        __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
3331        __atomic_load_n(&c1, __ATOMIC_RELAXED);
3332       ],
3333       [glibcxx_cv_atomic_bool=yes],
3334       [glibcxx_cv_atomic_bool=no])
3335   ])
3336   AC_MSG_RESULT($glibcxx_cv_atomic_bool)
3338   AC_MSG_CHECKING([for atomic builtins for short])
3339   AC_CACHE_VAL(glibcxx_cv_atomic_short, [
3340     AC_TRY_LINK(
3341       [ ],
3342       [typedef short atomic_type;
3343        atomic_type c1;
3344        atomic_type c2;
3345        atomic_type c3(0);
3346        __atomic_fetch_add(&c1, c2, __ATOMIC_RELAXED);
3347        __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
3348                                    __ATOMIC_RELAXED);
3349        __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
3350        __atomic_load_n(&c1, __ATOMIC_RELAXED);
3351       ],
3352       [glibcxx_cv_atomic_short=yes],
3353       [glibcxx_cv_atomic_short=no])
3354   ])
3355   AC_MSG_RESULT($glibcxx_cv_atomic_short)
3357   AC_MSG_CHECKING([for atomic builtins for int])
3358   AC_CACHE_VAL(glibcxx_cv_atomic_int, [
3359     AC_TRY_LINK(
3360       [ ],
3361       [typedef int atomic_type;
3362        atomic_type c1;
3363        atomic_type c2;
3364        atomic_type c3(0);
3365        __atomic_fetch_add(&c1, c2, __ATOMIC_RELAXED);
3366        __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
3367                                    __ATOMIC_RELAXED);
3368        __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
3369        __atomic_load_n(&c1, __ATOMIC_RELAXED);
3370       ],
3371       [glibcxx_cv_atomic_int=yes],
3372       [glibcxx_cv_atomic_int=no])
3373   ])
3374   AC_MSG_RESULT($glibcxx_cv_atomic_int)
3376   AC_MSG_CHECKING([for atomic builtins for long long])
3377   AC_CACHE_VAL(glibcxx_cv_atomic_long_long, [
3378     AC_TRY_LINK(
3379       [ ],
3380       [typedef long long atomic_type;
3381        atomic_type c1;
3382        atomic_type c2;
3383        atomic_type c3(0);
3384        __atomic_fetch_add(&c1, c2, __ATOMIC_RELAXED);
3385        __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
3386                                    __ATOMIC_RELAXED);
3387        __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
3388        __atomic_load_n(&c1, __ATOMIC_RELAXED);
3389       ],
3390       [glibcxx_cv_atomic_long_long=yes],
3391       [glibcxx_cv_atomic_long_long=no])
3392   ])
3393   AC_MSG_RESULT($glibcxx_cv_atomic_long_long)
3395   else
3397   # Do asm tests.
3399   # Compile unoptimized.
3400   CXXFLAGS='-O0 -S'
3402   # Fake what AC_TRY_COMPILE does.
3404     cat > conftest.$ac_ext << EOF
3405 [#]line __oline__ "configure"
3406 int main()
3408   typedef bool atomic_type;
3409   atomic_type c1;
3410   atomic_type c2;
3411   atomic_type c3(0);
3412   // N.B. __atomic_fetch_add is not supported for bool.
3413   __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
3414                               __ATOMIC_RELAXED);
3415   __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
3416   __atomic_load_n(&c1, __ATOMIC_RELAXED);
3418   return 0;
3422     AC_MSG_CHECKING([for atomic builtins for bool])
3423     if AC_TRY_EVAL(ac_compile); then
3424       if grep __atomic_ conftest.s >/dev/null 2>&1 ; then
3425         glibcxx_cv_atomic_bool=no
3426       else
3427         glibcxx_cv_atomic_bool=yes
3428       fi
3429     fi
3430     AC_MSG_RESULT($glibcxx_cv_atomic_bool)
3431     rm -f conftest*
3433     cat > conftest.$ac_ext << EOF
3434 [#]line __oline__ "configure"
3435 int main()
3437   typedef short atomic_type;
3438   atomic_type c1;
3439   atomic_type c2;
3440   atomic_type c3(0);
3441   __atomic_fetch_add(&c1, c2, __ATOMIC_RELAXED);
3442   __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
3443                               __ATOMIC_RELAXED);
3444   __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
3445   __atomic_load_n(&c1, __ATOMIC_RELAXED);
3447   return 0;
3451     AC_MSG_CHECKING([for atomic builtins for short])
3452     if AC_TRY_EVAL(ac_compile); then
3453       if grep __atomic_ conftest.s >/dev/null 2>&1 ; then
3454         glibcxx_cv_atomic_short=no
3455       else
3456         glibcxx_cv_atomic_short=yes
3457       fi
3458     fi
3459     AC_MSG_RESULT($glibcxx_cv_atomic_short)
3460     rm -f conftest*
3462     cat > conftest.$ac_ext << EOF
3463 [#]line __oline__ "configure"
3464 int main()
3466   // NB: _Atomic_word not necessarily int.
3467   typedef int atomic_type;
3468   atomic_type c1;
3469   atomic_type c2;
3470   atomic_type c3(0);
3471   __atomic_fetch_add(&c1, c2, __ATOMIC_RELAXED);
3472   __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
3473                               __ATOMIC_RELAXED);
3474   __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
3475   __atomic_load_n(&c1, __ATOMIC_RELAXED);
3477   return 0;
3481     AC_MSG_CHECKING([for atomic builtins for int])
3482     if AC_TRY_EVAL(ac_compile); then
3483       if grep __atomic_ conftest.s >/dev/null 2>&1 ; then
3484         glibcxx_cv_atomic_int=no
3485       else
3486         glibcxx_cv_atomic_int=yes
3487       fi
3488     fi
3489     AC_MSG_RESULT($glibcxx_cv_atomic_int)
3490     rm -f conftest*
3492     cat > conftest.$ac_ext << EOF
3493 [#]line __oline__ "configure"
3494 int main()
3496   typedef long long atomic_type;
3497   atomic_type c1;
3498   atomic_type c2;
3499   atomic_type c3(0);
3500   __atomic_fetch_add(&c1, c2, __ATOMIC_RELAXED);
3501   __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
3502                               __ATOMIC_RELAXED);
3503   __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
3504   __atomic_load_n(&c1, __ATOMIC_RELAXED);
3506   return 0;
3510     AC_MSG_CHECKING([for atomic builtins for long long])
3511     if AC_TRY_EVAL(ac_compile); then
3512       if grep __atomic_ conftest.s >/dev/null 2>&1 ; then
3513         glibcxx_cv_atomic_long_long=no
3514       else
3515         glibcxx_cv_atomic_long_long=yes
3516       fi
3517     fi
3518     AC_MSG_RESULT($glibcxx_cv_atomic_long_long)
3519     rm -f conftest*
3521   fi
3523   CXXFLAGS="$old_CXXFLAGS"
3524   AC_LANG_RESTORE
3526   # Set atomicity_dir to builtins if all but the long long test above passes,
3527   # or if the builtins were already chosen (e.g. by configure.host).
3528   if { test "$glibcxx_cv_atomic_bool" = yes \
3529      && test "$glibcxx_cv_atomic_short" = yes \
3530      && test "$glibcxx_cv_atomic_int" = yes; } \
3531      || test "$atomicity_dir" = "cpu/generic/atomicity_builtins"; then
3532     AC_DEFINE(_GLIBCXX_ATOMIC_BUILTINS, 1,
3533     [Define if the compiler supports C++11 atomics.])
3534     atomicity_dir=cpu/generic/atomicity_builtins
3535   fi
3537   # If still generic, set to mutex.
3538   if test $atomicity_dir = "cpu/generic" ; then
3539     atomicity_dir=cpu/generic/atomicity_mutex
3540     AC_MSG_WARN([No native atomic operations are provided for this platform.])
3541       if test "x$target_thread_file" = xsingle; then
3542         AC_MSG_WARN([They cannot be faked when thread support is disabled.])
3543         AC_MSG_WARN([Thread-safety of certain classes is not guaranteed.])
3544       else
3545         AC_MSG_WARN([They will be faked using a mutex.])
3546         AC_MSG_WARN([Performance of certain classes will degrade as a result.])
3547       fi
3548   fi
3553 dnl Set default lock policy for synchronizing shared_ptr reference counting.
3555 dnl --with-libstdcxx-lock-policy=auto
3556 dnl     Use atomic operations for shared_ptr reference counting only if
3557 dnl     the default target supports atomic compare-and-swap.
3558 dnl --with-libstdcxx-lock-policy=atomic
3559 dnl     Use atomic operations for shared_ptr reference counting.
3560 dnl --with-libstdcxx-lock-policy=mutex
3561 dnl     Use a mutex to synchronize shared_ptr reference counting.
3563 dnl This controls the value of __gnu_cxx::__default_lock_policy, which
3564 dnl determines how shared_ptr reference counts are synchronized.
3565 dnl The option "atomic" means that atomic operations should be used,
3566 dnl "mutex" means that a mutex will be used. The default option, "auto",
3567 dnl will check if the target supports the compiler-generated builtins
3568 dnl for atomic compare-and-swap operations for 2-byte and 4-byte integers,
3569 dnl and will use "atomic" if supported, "mutex" otherwise.
3570 dnl This option is ignored if the thread model used by GCC is "single",
3571 dnl as no synchronization is used at all in that case.
3572 dnl This option affects the library ABI (except in the "single" thread model).
3574 dnl Defines _GLIBCXX_HAVE_ATOMIC_LOCK_POLICY to 1 if atomics should be used.
3576 AC_DEFUN([GLIBCXX_ENABLE_LOCK_POLICY], [
3578   AC_ARG_WITH([libstdcxx-lock-policy],
3579     AC_HELP_STRING([--with-libstdcxx-lock-policy={atomic,mutex,auto}],
3580       [synchronization policy for shared_ptr reference counting [default=auto]]),
3581               [libstdcxx_atomic_lock_policy=$withval],
3582               [libstdcxx_atomic_lock_policy=auto])
3584   case "$libstdcxx_atomic_lock_policy" in
3585     atomic|mutex|auto) ;;
3586     *) AC_MSG_ERROR([Invalid argument for --with-libstdcxx-lock-policy]) ;;
3587   esac
3588   AC_MSG_CHECKING([for lock policy for shared_ptr reference counts])
3590   if test x"$libstdcxx_atomic_lock_policy" = x"auto"; then
3591     AC_LANG_SAVE
3592     AC_LANG_CPLUSPLUS
3593     ac_save_CXXFLAGS="$CXXFLAGS"
3595     dnl Why do we care about 2-byte CAS on targets with 4-byte _Atomic_word?!
3596     AC_TRY_COMPILE([
3597     #if ! defined __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2
3598     # error "No 2-byte compare-and-swap"
3599     #elif ! defined __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4
3600     # error "No 4-byte compare-and-swap"
3601     #endif
3602     ],,
3603     [libstdcxx_atomic_lock_policy=atomic],
3604     [libstdcxx_atomic_lock_policy=mutex])
3605     AC_LANG_RESTORE
3606     CXXFLAGS="$ac_save_CXXFLAGS"
3607   fi
3609   if test x"$libstdcxx_atomic_lock_policy" = x"atomic"; then
3610     AC_MSG_RESULT(atomic)
3611     AC_DEFINE(HAVE_ATOMIC_LOCK_POLICY,1,
3612       [Defined if shared_ptr reference counting should use atomic operations.])
3613   else
3614     AC_MSG_RESULT(mutex)
3615   fi
3620 dnl Allow visibility attributes to be used on namespaces, objects, etc.
3622 dnl --enable-libstdcxx-visibility enables attempt to use visibility attributes.
3623 dnl --disable-libstdcxx-visibility turns off all use of visibility attributes.
3624 dnl  +  Usage:  GLIBCXX_ENABLE_LIBSTDCXX_VISIBILITY[(DEFAULT)]
3625 dnl       Where DEFAULT is 'yes'.
3627 AC_DEFUN([GLIBCXX_ENABLE_LIBSTDCXX_VISIBILITY], [
3628 GLIBCXX_ENABLE(libstdcxx-visibility,$1,,[enables visibility safe usage])
3630 if test x$enable_libstdcxx_visibility = xyes ; then
3631   dnl all hail libgfortran
3632   dnl Check whether the target supports hidden visibility.
3633   AC_CACHE_CHECK([whether the target supports hidden visibility],
3634                  glibcxx_cv_have_attribute_visibility, [
3635   save_CFLAGS="$CFLAGS"
3636   CFLAGS="$CFLAGS -Werror"
3637   AC_TRY_COMPILE([void __attribute__((visibility("hidden"))) foo(void) { }],
3638                  [], glibcxx_cv_have_attribute_visibility=yes,
3639                  glibcxx_cv_have_attribute_visibility=no)
3640   CFLAGS="$save_CFLAGS"])
3641   if test $glibcxx_cv_have_attribute_visibility = no; then
3642     enable_libstdcxx_visibility=no
3643   fi
3646 GLIBCXX_CONDITIONAL(ENABLE_VISIBILITY, test $enable_libstdcxx_visibility = yes)
3647 AC_MSG_NOTICE([visibility supported: $enable_libstdcxx_visibility])
3652 dnl Add version tags to symbols in shared library (or not), additionally
3653 dnl marking other symbols as private/local (or not).
3655 dnl Sets libtool_VERSION, and determines shared library SONAME.
3657 dnl  This depends on GLIBCXX CHECK_LINKER_FEATURES, but without it assumes no.
3659 dnl --enable-symvers=style adds a version script to the linker call when
3660 dnl       creating the shared library.  The choice of version script is
3661 dnl       controlled by 'style'.
3662 dnl --disable-symvers does not.
3664 dnl  +  Usage:  GLIBCXX_ENABLE_SYMVERS[(DEFAULT)]
3665 dnl       Where DEFAULT is either 'yes' or 'no'.  Passing `yes' tries to
3666 dnl       choose a default style based on linker characteristics.  Passing
3667 dnl       'no' disables versioning.
3669 AC_DEFUN([GLIBCXX_ENABLE_SYMVERS], [
3671 GLIBCXX_ENABLE(symvers,$1,[[[=STYLE]]],
3672   [enables symbol versioning of the shared library],
3673   [permit yes|no|gnu|gnu-versioned-namespace|darwin|darwin-export|sun])
3675 # If we never went through the GLIBCXX_CHECK_LINKER_FEATURES macro, then we
3676 # don't know enough about $LD to do tricks...
3677 AC_REQUIRE([GLIBCXX_CHECK_LINKER_FEATURES])
3678 # Sun style symbol versions needs GNU c++filt for make_sunver.pl to work
3679 # with extern "C++" in version scripts.
3680 AC_REQUIRE([GCC_PROG_GNU_CXXFILT])
3682 # Turn a 'yes' into a suitable default.
3683 if test x$enable_symvers = xyes ; then
3684   if test $enable_shared = no || test "x$LD" = x || test x$gcc_no_link = xyes; then
3685     enable_symvers=no
3686   else
3687     if test $with_gnu_ld = yes ; then
3688       case ${target_os} in
3689         hpux*)
3690           enable_symvers=no ;;
3691         *)
3692           enable_symvers=gnu ;;
3693       esac
3694     else
3695       case ${target_os} in
3696         darwin*)
3697           enable_symvers=darwin ;;
3698         # Sun symbol versioning exists since Solaris 2.5.
3699         solaris2.[[5-9]]* | solaris2.1[[0-9]]*)
3700           # make_sunver.pl needs GNU c++filt to support extern "C++" in
3701           # version scripts, so disable symbol versioning if none can be
3702           # found.
3703           if test -z "$ac_cv_path_CXXFILT"; then
3704             AC_MSG_WARN([=== You have requested Sun symbol versioning, but])
3705             AC_MSG_WARN([=== no GNU c++filt could  be found.])
3706             AC_MSG_WARN([=== Symbol versioning will be disabled.])
3707             enable_symvers=no
3708           else
3709             enable_symvers=sun
3710           fi
3711           ;;
3712         *)
3713           enable_symvers=no ;;
3714       esac
3715     fi
3716   fi
3719 # Check to see if 'darwin' or 'darwin-export' can win.
3720 if test x$enable_symvers = xdarwin-export ; then
3721     enable_symvers=darwin
3724 # Check if 'sun' was requested on non-Solaris 2 platforms.
3725 if test x$enable_symvers = xsun ; then
3726   case ${target_os} in
3727     solaris2*)
3728       # All fine.
3729       ;;
3730     *)
3731       # Unlikely to work.
3732       AC_MSG_WARN([=== You have requested Sun symbol versioning, but])
3733       AC_MSG_WARN([=== you are not targetting Solaris 2.])
3734       AC_MSG_WARN([=== Symbol versioning will be disabled.])
3735       enable_symvers=no
3736       ;;
3737   esac
3740 # Check to see if 'gnu' can win.
3741 if test $enable_symvers = gnu ||
3742   test $enable_symvers = gnu-versioned-namespace ||
3743   test $enable_symvers = sun; then
3744   # Check to see if libgcc_s exists, indicating that shared libgcc is possible.
3745   AC_MSG_CHECKING([for shared libgcc])
3746   ac_save_CFLAGS="$CFLAGS"
3747   CFLAGS=' -lgcc_s'
3748   AC_TRY_LINK(, [return 0;], glibcxx_shared_libgcc=yes, glibcxx_shared_libgcc=no)
3749   CFLAGS="$ac_save_CFLAGS"
3750   if test $glibcxx_shared_libgcc = no; then
3751     cat > conftest.c <<EOF
3752 int main (void) { return 0; }
3754 changequote(,)dnl
3755     glibcxx_libgcc_s_suffix=`${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS \
3756                              -shared -shared-libgcc -o conftest.so \
3757                              conftest.c -v 2>&1 >/dev/null \
3758                              | sed -n 's/^.* -lgcc_s\([^ ]*\) .*$/\1/p'`
3759 changequote([,])dnl
3760     rm -f conftest.c conftest.so
3761     if test x${glibcxx_libgcc_s_suffix+set} = xset; then
3762       CFLAGS=" -lgcc_s$glibcxx_libgcc_s_suffix"
3763       AC_TRY_LINK(, [return 0;], glibcxx_shared_libgcc=yes)
3764       CFLAGS="$ac_save_CFLAGS"
3765     fi
3766   fi
3767   AC_MSG_RESULT($glibcxx_shared_libgcc)
3769   # For GNU ld, we need at least this version.  The format is described in
3770   # GLIBCXX_CHECK_LINKER_FEATURES above.
3771   glibcxx_min_gnu_ld_version=21400
3773   # If no shared libgcc, can't win.
3774   if test $glibcxx_shared_libgcc != yes; then
3775       AC_MSG_WARN([=== You have requested GNU symbol versioning, but])
3776       AC_MSG_WARN([=== you are not building a shared libgcc_s.])
3777       AC_MSG_WARN([=== Symbol versioning will be disabled.])
3778       enable_symvers=no
3779   elif test $with_gnu_ld != yes && test $enable_symvers = sun; then
3780     : All interesting versions of Sun ld support sun style symbol versioning.
3781   elif test $with_gnu_ld != yes ; then
3782     # just fail for now
3783     AC_MSG_WARN([=== You have requested GNU symbol versioning, but])
3784     AC_MSG_WARN([=== you are not using the GNU linker.])
3785     AC_MSG_WARN([=== Symbol versioning will be disabled.])
3786     enable_symvers=no
3787   elif test $glibcxx_ld_is_gold = yes ; then
3788     : All versions of gold support symbol versioning.
3789   elif test $glibcxx_gnu_ld_version -lt $glibcxx_min_gnu_ld_version ; then
3790     # The right tools, the right setup, but too old.  Fallbacks?
3791     AC_MSG_WARN(=== Linker version $glibcxx_gnu_ld_version is too old for)
3792     AC_MSG_WARN(=== full symbol versioning support in this release of GCC.)
3793     AC_MSG_WARN(=== You would need to upgrade your binutils to version)
3794     AC_MSG_WARN(=== $glibcxx_min_gnu_ld_version or later and rebuild GCC.)
3795     AC_MSG_WARN([=== Symbol versioning will be disabled.])
3796     enable_symvers=no
3797   fi
3800 # For libtool versioning info, format is CURRENT:REVISION:AGE
3801 libtool_VERSION=6:29:0
3803 # Everything parsed; figure out what files and settings to use.
3804 case $enable_symvers in
3805   no)
3806     SYMVER_FILE=config/abi/pre/none.ver
3807     ;;
3808   gnu)
3809     SYMVER_FILE=config/abi/pre/gnu.ver
3810     AC_DEFINE(_GLIBCXX_SYMVER_GNU, 1,
3811               [Define to use GNU versioning in the shared library.])
3812     ;;
3813   gnu-versioned-namespace)
3814     libtool_VERSION=8:0:0
3815     SYMVER_FILE=config/abi/pre/gnu-versioned-namespace.ver
3816     AC_DEFINE(_GLIBCXX_SYMVER_GNU_NAMESPACE, 1,
3817               [Define to use GNU namespace versioning in the shared library.])
3818     ;;
3819   darwin)
3820     SYMVER_FILE=config/abi/pre/gnu.ver
3821     AC_DEFINE(_GLIBCXX_SYMVER_DARWIN, 1,
3822               [Define to use darwin versioning in the shared library.])
3823     ;;
3824   sun)
3825     SYMVER_FILE=config/abi/pre/gnu.ver
3826     AC_DEFINE(_GLIBCXX_SYMVER_SUN, 1,
3827               [Define to use Sun versioning in the shared library.])
3828     ;;
3829 esac
3831 if test x$enable_symvers != xno ; then
3832   AC_DEFINE(_GLIBCXX_SYMVER, 1,
3833          [Define to use symbol versioning in the shared library.])
3836 AC_CACHE_CHECK([whether the target supports .symver directive],
3837                glibcxx_cv_have_as_symver_directive, [
3838   AC_TRY_COMPILE([void foo (void); __asm (".symver foo, bar@SYMVER");],
3839                  [], glibcxx_cv_have_as_symver_directive=yes,
3840                  glibcxx_cv_have_as_symver_directive=no)])
3841 if test $glibcxx_cv_have_as_symver_directive = yes; then
3842   AC_DEFINE(HAVE_AS_SYMVER_DIRECTIVE, 1,
3843     [Define to 1 if the target assembler supports .symver directive.])
3846 AC_SUBST(SYMVER_FILE)
3847 AC_SUBST(port_specific_symbol_files)
3848 GLIBCXX_CONDITIONAL(ENABLE_SYMVERS, test $enable_symvers != no)
3849 GLIBCXX_CONDITIONAL(ENABLE_SYMVERS_GNU, test $enable_symvers = gnu)
3850 GLIBCXX_CONDITIONAL(ENABLE_SYMVERS_GNU_NAMESPACE, test $enable_symvers = gnu-versioned-namespace)
3851 GLIBCXX_CONDITIONAL(ENABLE_SYMVERS_DARWIN, test $enable_symvers = darwin)
3852 GLIBCXX_CONDITIONAL(ENABLE_SYMVERS_SUN, test $enable_symvers = sun)
3853 AC_MSG_NOTICE(versioning on shared library symbols is $enable_symvers)
3855 if test $enable_symvers != no ; then
3856    case ${target_os} in
3857      # The Solaris 2 runtime linker doesn't support the GNU extension of
3858      # binding the same symbol to different versions
3859      solaris2*)
3860        ;;
3861      # Other platforms with GNU symbol versioning (GNU/Linux, more?) do.
3862      *)
3863        AC_DEFINE(HAVE_SYMVER_SYMBOL_RENAMING_RUNTIME_SUPPORT, 1,
3864          [Define to 1 if the target runtime linker supports binding the same symbol to different versions.])
3865        ;;
3866     esac
3869 # Now, set up compatibility support, if any.
3870 # In addition, need this to deal with std::size_t mangling in
3871 # src/compatibility.cc.  In a perfect world, could use
3872 # typeid(std::size_t).name()[0] to do direct substitution.
3873 AC_MSG_CHECKING([for size_t as unsigned int])
3874 ac_save_CFLAGS="$CFLAGS"
3875 CFLAGS="-Werror"
3876 AC_TRY_COMPILE(, [__SIZE_TYPE__* stp; unsigned int* uip; stp = uip;],
3877                  [glibcxx_size_t_is_i=yes], [glibcxx_size_t_is_i=no])
3878 CFLAGS=$ac_save_CFLAGS
3879 if test "$glibcxx_size_t_is_i" = yes; then
3880   AC_DEFINE(_GLIBCXX_SIZE_T_IS_UINT, 1, [Define if size_t is unsigned int.])
3882 AC_MSG_RESULT([$glibcxx_size_t_is_i])
3884 AC_MSG_CHECKING([for ptrdiff_t as int])
3885 ac_save_CFLAGS="$CFLAGS"
3886 CFLAGS="-Werror"
3887 AC_TRY_COMPILE(, [__PTRDIFF_TYPE__* ptp; int* ip; ptp = ip;],
3888                  [glibcxx_ptrdiff_t_is_i=yes], [glibcxx_ptrdiff_t_is_i=no])
3889 CFLAGS=$ac_save_CFLAGS
3890 if test "$glibcxx_ptrdiff_t_is_i" = yes; then
3891   AC_DEFINE(_GLIBCXX_PTRDIFF_T_IS_INT, 1, [Define if ptrdiff_t is int.])
3893 AC_MSG_RESULT([$glibcxx_ptrdiff_t_is_i])
3898 dnl Setup to use the gcc gthr.h thread-specific memory and mutex model.
3899 dnl We must stage the required headers so that they will be installed
3900 dnl with the library (unlike libgcc, the STL implementation is provided
3901 dnl solely within headers).  Since we must not inject random user-space
3902 dnl macro names into user-provided C++ code, we first stage into <file>-in
3903 dnl and process to <file> with an output command.  The reason for a two-
3904 dnl stage process here is to correctly handle $srcdir!=$objdir without
3905 dnl having to write complex code (the sed commands to clean the macro
3906 dnl namespace are complex and fragile enough as it is).  We must also
3907 dnl add a relative path so that -I- is supported properly.
3909 dnl Substs:
3910 dnl  thread_header
3912 AC_DEFUN([GLIBCXX_ENABLE_THREADS], [
3913   AC_MSG_CHECKING([for thread model used by GCC])
3914   target_thread_file=`$CXX -v 2>&1 | sed -n 's/^Thread model: //p'`
3915   AC_MSG_RESULT([$target_thread_file])
3916   GCC_AC_THREAD_HEADER([$target_thread_file])
3921 dnl Check if gthread implementation defines the types and functions
3922 dnl required by the c++0x thread library.  Conforming gthread
3923 dnl implementations can define __GTHREADS_CXX0X to enable use with c++0x.
3925 dnl GLIBCXX_ENABLE_SYMVERS must be done before this.
3927 AC_DEFUN([GLIBCXX_CHECK_GTHREADS], [
3928   GLIBCXX_ENABLE(libstdcxx-threads,auto,,[enable C++11 threads support])
3930   if test x$enable_libstdcxx_threads = xauto ||
3931      test x$enable_libstdcxx_threads = xyes; then
3933   AC_LANG_SAVE
3934   AC_LANG_CPLUSPLUS
3936   ac_save_CXXFLAGS="$CXXFLAGS"
3937   CXXFLAGS="$CXXFLAGS -fno-exceptions \
3938         -I${toplevel_srcdir}/libgcc -I${toplevel_builddir}/libgcc"
3940   target_thread_file=`$CXX -v 2>&1 | sed -n 's/^Thread model: //p'`
3941   case $target_thread_file in
3942     posix)
3943       CXXFLAGS="$CXXFLAGS -DSUPPORTS_WEAK -DGTHREAD_USE_WEAK -D_PTHREADS"
3944   esac
3946   AC_MSG_CHECKING([whether it can be safely assumed that mutex_timedlock is available])
3948   AC_TRY_COMPILE([#include <unistd.h>],
3949     [
3950       // In case of POSIX threads check _POSIX_TIMEOUTS.
3951       #if (defined(_PTHREADS) \
3952           && (!defined(_POSIX_TIMEOUTS) || _POSIX_TIMEOUTS <= 0))
3953       #error
3954       #endif
3955     ], [ac_gthread_use_mutex_timedlock=1], [ac_gthread_use_mutex_timedlock=0])
3957   AC_DEFINE_UNQUOTED(_GTHREAD_USE_MUTEX_TIMEDLOCK, $ac_gthread_use_mutex_timedlock,
3958                      [Define to 1 if mutex_timedlock is available.])
3960   if test $ac_gthread_use_mutex_timedlock = 1 ; then res_mutex_timedlock=yes ;
3961   else res_mutex_timedlock=no ; fi
3962   AC_MSG_RESULT([$res_mutex_timedlock])
3964   AC_MSG_CHECKING([for gthreads library])
3966   AC_TRY_COMPILE([#include "gthr.h"],
3967     [
3968       #ifndef __GTHREADS_CXX0X
3969       #error
3970       #endif
3971     ], [ac_has_gthreads=yes], [ac_has_gthreads=no])
3972   else
3973     ac_has_gthreads=no
3974   fi
3976   AC_MSG_RESULT([$ac_has_gthreads])
3978   if test x"$ac_has_gthreads" = x"yes"; then
3979     AC_DEFINE(_GLIBCXX_HAS_GTHREADS, 1,
3980               [Define if gthreads library is available.])
3982     # Also check for pthread_rwlock_t for std::shared_timed_mutex in C++14
3983     # but only do so if we're using pthread in the gthread library.
3984     # On VxWorks for example, pthread_rwlock_t is defined in sys/types.h
3985     # but the pthread library is not there by default and the gthread library
3986     # does not use it.
3987     AC_TRY_COMPILE([#include "gthr.h"],
3988     [
3989       #if (!defined(_PTHREADS))
3990       #error
3991       #endif
3992     ], [ac_gthread_use_pthreads=yes], [ac_gthread_use_pthreads=no])
3993     if test x"$ac_gthread_use_pthreads" = x"yes"; then
3994       AC_CHECK_TYPE([pthread_rwlock_t],
3995              [AC_DEFINE([_GLIBCXX_USE_PTHREAD_RWLOCK_T], 1,
3996              [Define if POSIX read/write locks are available in <gthr.h>.])],
3997              [],
3998              [#include "gthr.h"])
3999     fi
4000   fi
4002   AC_CHECK_HEADER(semaphore.h, [
4003     AC_MSG_CHECKING([for POSIX Semaphores and sem_timedwait])
4004     AC_TRY_COMPILE([
4005         #include <unistd.h>
4006         #include <semaphore.h>
4007         #include <limits.h>
4008       ],
4009       [
4010         #if !defined _POSIX_TIMEOUTS || _POSIX_TIMEOUTS <= 0
4011         # error "POSIX Timeouts option not supported"
4012         #elif !defined _POSIX_SEMAPHORES || _POSIX_SEMAPHORES <= 0
4013         # error "POSIX Semaphores option not supported"
4014         #else
4015         #if defined SEM_VALUE_MAX
4016         constexpr int sem_value_max = SEM_VALUE_MAX;
4017         #elif defined _POSIX_SEM_VALUE_MAX
4018         constexpr int sem_value_max = _POSIX_SEM_VALUE_MAX;
4019         #else
4020         # error "SEM_VALUE_MAX not available"
4021         #endif
4022         sem_t sem;
4023         sem_init(&sem, 0, sem_value_max);
4024         struct timespec ts = { 0 };
4025         sem_timedwait(&sem, &ts);
4026         #endif
4027       ],
4028       [ac_have_posix_semaphore=yes],
4029       [ac_have_posix_semaphore=no])],
4030       [ac_have_posix_semaphore=no])
4032   if test $ac_have_posix_semaphore = yes ; then
4033     AC_DEFINE(HAVE_POSIX_SEMAPHORE,
4034               1,
4035               [Define to 1 if POSIX Semaphores with sem_timedwait are available in <semaphore.h>.])
4036   fi
4037   AC_MSG_RESULT([$ac_have_posix_semaphore])
4039   CXXFLAGS="$ac_save_CXXFLAGS"
4040   AC_LANG_RESTORE
4044 # Check whether LC_MESSAGES is available in <locale.h>.
4045 # Ulrich Drepper <drepper@cygnus.com>, 1995.
4047 # This file file be copied and used freely without restrictions.  It can
4048 # be used in projects which are not available under the GNU Public License
4049 # but which still want to provide support for the GNU gettext functionality.
4050 # Please note that the actual code is *not* freely available.
4051 AC_DEFUN([AC_LC_MESSAGES], [
4052   AC_CHECK_HEADER(locale.h, [
4053     AC_CACHE_CHECK([for LC_MESSAGES], ac_cv_val_LC_MESSAGES,
4054       [AC_TRY_COMPILE([#include <locale.h>], [return LC_MESSAGES],
4055        ac_cv_val_LC_MESSAGES=yes, ac_cv_val_LC_MESSAGES=no)])
4056     if test $ac_cv_val_LC_MESSAGES = yes; then
4057       AC_DEFINE(HAVE_LC_MESSAGES, 1,
4058                 [Define if LC_MESSAGES is available in <locale.h>.])
4059     fi
4060   ])
4064 dnl Check whether rdrand is supported in the assembler.
4065 AC_DEFUN([GLIBCXX_CHECK_X86_RDRAND], [
4066   AC_MSG_CHECKING([for rdrand support in assembler])
4067   AC_CACHE_VAL(ac_cv_x86_rdrand, [
4068   ac_cv_x86_rdrand=no
4069   case "$target" in
4070     i?86-*-* | \
4071     x86_64-*-*)
4072     AC_TRY_COMPILE(, [asm("rdrand %eax");],
4073                 [ac_cv_x86_rdrand=yes], [ac_cv_x86_rdrand=no])
4074   esac
4075   ])
4076   if test $ac_cv_x86_rdrand = yes; then
4077     AC_DEFINE(_GLIBCXX_X86_RDRAND, 1,
4078                 [ Defined if as can handle rdrand. ])
4079   fi
4080   AC_MSG_RESULT($ac_cv_x86_rdrand)
4084 dnl Check whether rdseed is supported in the assembler.
4085 AC_DEFUN([GLIBCXX_CHECK_X86_RDSEED], [
4086   AC_MSG_CHECKING([for rdseed support in assembler])
4087   AC_CACHE_VAL(ac_cv_x86_rdseed, [
4088   ac_cv_x86_rdseed=no
4089   case "$target" in
4090     i?86-*-* | \
4091     x86_64-*-*)
4092     AC_TRY_COMPILE(, [asm("rdseed %eax");],
4093                 [ac_cv_x86_rdseed=yes], [ac_cv_x86_rdseed=no])
4094   esac
4095   ])
4096   if test $ac_cv_x86_rdseed = yes; then
4097     AC_DEFINE(_GLIBCXX_X86_RDSEED, 1,
4098                 [ Defined if as can handle rdseed. ])
4099   fi
4100   AC_MSG_RESULT($ac_cv_x86_rdseed)
4104 dnl Check whether get_nprocs is available in <sys/sysinfo.h>, and define _GLIBCXX_USE_GET_NPROCS.
4106 AC_DEFUN([GLIBCXX_CHECK_GET_NPROCS], [
4108   AC_LANG_SAVE
4109   AC_LANG_CPLUSPLUS
4110   ac_save_CXXFLAGS="$CXXFLAGS"
4111   CXXFLAGS="$CXXFLAGS -fno-exceptions"
4113   AC_MSG_CHECKING([for get_nprocs])
4114   AC_CACHE_VAL(glibcxx_cv_GET_NPROCS, [
4115     GCC_TRY_COMPILE_OR_LINK(
4116       [#include <sys/sysinfo.h>],
4117       [int n = get_nprocs();],
4118       [glibcxx_cv_GET_NPROCS=yes],
4119       [glibcxx_cv_GET_NPROCS=no])
4120   ])
4121   if test $glibcxx_cv_GET_NPROCS = yes; then
4122     AC_DEFINE(_GLIBCXX_USE_GET_NPROCS, 1, [Define if get_nprocs is available in <sys/sysinfo.h>.])
4123   fi
4124   AC_MSG_RESULT($glibcxx_cv_GET_NPROCS)
4126   CXXFLAGS="$ac_save_CXXFLAGS"
4127   AC_LANG_RESTORE
4131 dnl Check whether sysconf(_SC_NPROCESSORS_ONLN) is available in <unistd.h>, and define _GLIBCXX_USE_SC_NPROCESSORS_ONLN.
4133 AC_DEFUN([GLIBCXX_CHECK_SC_NPROCESSORS_ONLN], [
4135   AC_LANG_SAVE
4136   AC_LANG_CPLUSPLUS
4137   ac_save_CXXFLAGS="$CXXFLAGS"
4138   CXXFLAGS="$CXXFLAGS -fno-exceptions"
4140   AC_MSG_CHECKING([for _SC_NPROCESSORS_ONLN])
4141   AC_CACHE_VAL(glibcxx_cv_SC_NPROCESSORS_ONLN, [
4142     GCC_TRY_COMPILE_OR_LINK(
4143       [#include <unistd.h>],
4144       [int n = sysconf(_SC_NPROCESSORS_ONLN);],
4145       [glibcxx_cv_SC_NPROCESSORS_ONLN=yes],
4146       [glibcxx_cv_SC_NPROCESSORS_ONLN=no])
4147   ])
4148   if test $glibcxx_cv_SC_NPROCESSORS_ONLN = yes; then
4149     AC_DEFINE(_GLIBCXX_USE_SC_NPROCESSORS_ONLN, 1, [Define if _SC_NPROCESSORS_ONLN  is available in <unistd.h>.])
4150   fi
4151   AC_MSG_RESULT($glibcxx_cv_SC_NPROCESSORS_ONLN)
4153   CXXFLAGS="$ac_save_CXXFLAGS"
4154   AC_LANG_RESTORE
4158 dnl Check whether sysconf(_SC_NPROC_ONLN) is available in <unistd.h>, and define _GLIBCXX_USE_SC_NPROC_ONLN.
4160 AC_DEFUN([GLIBCXX_CHECK_SC_NPROC_ONLN], [
4162   AC_LANG_SAVE
4163   AC_LANG_CPLUSPLUS
4164   ac_save_CXXFLAGS="$CXXFLAGS"
4165   CXXFLAGS="$CXXFLAGS -fno-exceptions"
4167   AC_MSG_CHECKING([for _SC_NPROC_ONLN])
4168   AC_CACHE_VAL(glibcxx_cv_SC_NPROC_ONLN, [
4169     GCC_TRY_COMPILE_OR_LINK(
4170       [#include <unistd.h>],
4171       [int n = sysconf(_SC_NPROC_ONLN);],
4172       [glibcxx_cv_SC_NPROC_ONLN=yes],
4173       [glibcxx_cv_SC_NPROC_ONLN=no])
4174   ])
4175   if test $glibcxx_cv_SC_NPROC_ONLN = yes; then
4176     AC_DEFINE(_GLIBCXX_USE_SC_NPROC_ONLN, 1, [Define if _SC_NPROC_ONLN  is available in <unistd.h>.])
4177   fi
4178   AC_MSG_RESULT($glibcxx_cv_SC_NPROC_ONLN)
4180   CXXFLAGS="$ac_save_CXXFLAGS"
4181   AC_LANG_RESTORE
4185 dnl Check whether pthread_num_processors_np is available in <pthread.h>, and define _GLIBCXX_USE_PTHREADS_NUM_PROCESSORS_NP.
4187 AC_DEFUN([GLIBCXX_CHECK_PTHREADS_NUM_PROCESSORS_NP], [
4189   AC_LANG_SAVE
4190   AC_LANG_CPLUSPLUS
4191   ac_save_CXXFLAGS="$CXXFLAGS"
4192   CXXFLAGS="$CXXFLAGS -fno-exceptions"
4194   AC_MSG_CHECKING([for pthreads_num_processors_np])
4195   AC_CACHE_VAL(glibcxx_cv_PTHREADS_NUM_PROCESSORS_NP, [
4196     GCC_TRY_COMPILE_OR_LINK(
4197       [#include <pthread.h>],
4198       [int n = pthread_num_processors_np();],
4199       [glibcxx_cv_PTHREADS_NUM_PROCESSORS_NP=yes],
4200       [glibcxx_cv_PTHREADS_NUM_PROCESSORS_NP=no])
4201   ])
4202   if test $glibcxx_cv_PTHREADS_NUM_PROCESSORS_NP = yes; then
4203     AC_DEFINE(_GLIBCXX_USE_PTHREADS_NUM_PROCESSORS_NP, 1, [Define if pthreads_num_processors_np is available in <pthread.h>.])
4204   fi
4205   AC_MSG_RESULT($glibcxx_cv_PTHREADS_NUM_PROCESSORS_NP)
4207   CXXFLAGS="$ac_save_CXXFLAGS"
4208   AC_LANG_RESTORE
4212 dnl Check whether pthread_cond_clockwait is available in <pthread.h> for std::condition_variable to use,
4213 dnl and define _GLIBCXX_USE_PTHREAD_COND_CLOCKWAIT.
4215 AC_DEFUN([GLIBCXX_CHECK_PTHREAD_COND_CLOCKWAIT], [
4217   AC_LANG_SAVE
4218   AC_LANG_CPLUSPLUS
4219   ac_save_CXXFLAGS="$CXXFLAGS"
4220   CXXFLAGS="$CXXFLAGS -fno-exceptions"
4221   ac_save_LIBS="$LIBS"
4222   LIBS="$LIBS -lpthread"
4224   AC_MSG_CHECKING([for pthread_cond_clockwait])
4225   AC_CACHE_VAL(glibcxx_cv_PTHREAD_COND_CLOCKWAIT, [
4226     GCC_TRY_COMPILE_OR_LINK(
4227       [#include <pthread.h>],
4228       [pthread_mutex_t mutex; pthread_cond_t cond; struct timespec ts; int n = pthread_cond_clockwait(&cond, &mutex, 0, &ts);],
4229       [glibcxx_cv_PTHREAD_COND_CLOCKWAIT=yes],
4230       [glibcxx_cv_PTHREAD_COND_CLOCKWAIT=no])
4231   ])
4232   if test $glibcxx_cv_PTHREAD_COND_CLOCKWAIT = yes; then
4233     AC_DEFINE(_GLIBCXX_USE_PTHREAD_COND_CLOCKWAIT, 1, [Define if pthread_cond_clockwait is available in <pthread.h>.])
4234   fi
4235   AC_MSG_RESULT($glibcxx_cv_PTHREAD_COND_CLOCKWAIT)
4237   CXXFLAGS="$ac_save_CXXFLAGS"
4238   LIBS="$ac_save_LIBS"
4239   AC_LANG_RESTORE
4243 dnl Check whether pthread_mutex_clocklock is available in <pthread.h> for std::timed_mutex to use,
4244 dnl and define _GLIBCXX_USE_PTHREAD_MUTEX_CLOCKLOCK.
4246 AC_DEFUN([GLIBCXX_CHECK_PTHREAD_MUTEX_CLOCKLOCK], [
4248   AC_LANG_SAVE
4249   AC_LANG_CPLUSPLUS
4250   ac_save_CXXFLAGS="$CXXFLAGS"
4251   CXXFLAGS="$CXXFLAGS -fno-exceptions"
4252   ac_save_LIBS="$LIBS"
4253   LIBS="$LIBS -lpthread"
4255   AC_MSG_CHECKING([for pthread_mutex_clocklock])
4256   AC_CACHE_VAL(glibcxx_cv_PTHREAD_MUTEX_CLOCKLOCK, [
4257     GCC_TRY_COMPILE_OR_LINK(
4258       [#include <pthread.h>],
4259       [pthread_mutex_t mutex; struct timespec ts; int n = pthread_mutex_clocklock(&mutex, CLOCK_REALTIME, &ts);],
4260       [glibcxx_cv_PTHREAD_MUTEX_CLOCKLOCK=yes],
4261       [glibcxx_cv_PTHREAD_MUTEX_CLOCKLOCK=no])
4262   ])
4263   if test $glibcxx_cv_PTHREAD_MUTEX_CLOCKLOCK = yes; then
4264     AC_DEFINE(_GLIBCXX_USE_PTHREAD_MUTEX_CLOCKLOCK, 1, [Define if pthread_mutex_clocklock is available in <pthread.h>.])
4265   fi
4266   AC_MSG_RESULT($glibcxx_cv_PTHREAD_MUTEX_CLOCKLOCK)
4268   CXXFLAGS="$ac_save_CXXFLAGS"
4269   LIBS="$ac_save_LIBS"
4270   AC_LANG_RESTORE
4274 dnl Check whether pthread_mutex_clocklock is available in <pthread.h> for std::timed_mutex to use,
4275 dnl and define _GLIBCXX_USE_PTHREAD_MUTEX_CLOCKLOCK.
4277 AC_DEFUN([GLIBCXX_CHECK_PTHREAD_RWLOCK_CLOCKLOCK], [
4279   AC_LANG_SAVE
4280   AC_LANG_CPLUSPLUS
4281   ac_save_CXXFLAGS="$CXXFLAGS"
4282   CXXFLAGS="$CXXFLAGS -fno-exceptions"
4283   ac_save_LIBS="$LIBS"
4284   LIBS="$LIBS -lpthread"
4286   AC_MSG_CHECKING([for pthread_rwlock_clockrdlock, pthread_wlock_clockwrlock])
4287   AC_CACHE_VAL(glibcxx_cv_PTHREAD_RWLOCK_CLOCKLOCK, [
4288     GCC_TRY_COMPILE_OR_LINK(
4289       [#include <pthread.h>],
4290       [pthread_rwlock_t rwl; struct timespec ts;]
4291       [int n = pthread_rwlock_clockrdlock(&rwl, CLOCK_REALTIME, &ts);]
4292       [int m = pthread_rwlock_clockwrlock(&rwl, CLOCK_REALTIME, &ts);],
4293       [glibcxx_cv_PTHREAD_RWLOCK_CLOCKLOCK=yes],
4294       [glibcxx_cv_PTHREAD_RWLOCK_CLOCKLOCK=no])
4295   ])
4296   if test $glibcxx_cv_PTHREAD_RWLOCK_CLOCKLOCK = yes; then
4297     AC_DEFINE(_GLIBCXX_USE_PTHREAD_RWLOCK_CLOCKLOCK, 1, [Define if pthread_rwlock_clockrdlock and pthread_rwlock_clockwrlock are available in <pthread.h>.])
4298   fi
4299   AC_MSG_RESULT($glibcxx_cv_PTHREAD_RWLOCK_CLOCKLOCK)
4301   CXXFLAGS="$ac_save_CXXFLAGS"
4302   LIBS="$ac_save_LIBS"
4303   AC_LANG_RESTORE
4307 dnl Check whether sysctl is available in <pthread.h>, and define _GLIBCXX_USE_SYSCTL_HW_NCPU.
4309 AC_DEFUN([GLIBCXX_CHECK_SYSCTL_HW_NCPU], [
4311   AC_LANG_SAVE
4312   AC_LANG_CPLUSPLUS
4313   ac_save_CXXFLAGS="$CXXFLAGS"
4314   CXXFLAGS="$CXXFLAGS -fno-exceptions"
4316   AC_MSG_CHECKING([for hw.ncpu sysctl])
4317   AC_CACHE_VAL(glibcxx_cv_SYSCTL_HW_NCPU, [
4318     GCC_TRY_COMPILE_OR_LINK(
4319       [
4320        #include <stddef.h>
4321        #include <sys/sysctl.h>
4322        ],
4323       [
4324        int count;
4325        size_t size = sizeof(count);
4326        int mib[] = { CTL_HW, HW_NCPU };
4327        sysctl(mib, 2, &count, &size, NULL, 0);
4328       ],
4329       [glibcxx_cv_SYSCTL_HW_NCPU=yes],
4330       [glibcxx_cv_SYSCTL_HW_NCPU=no])
4331   ])
4332   if test $glibcxx_cv_SYSCTL_HW_NCPU = yes; then
4333     AC_DEFINE(_GLIBCXX_USE_SYSCTL_HW_NCPU, 1, [Define if sysctl(), CTL_HW and HW_NCPU are available in <sys/sysctl.h>.])
4334   fi
4335   AC_MSG_RESULT($glibcxx_cv_SYSCTL_HW_NCPU)
4337   CXXFLAGS="$ac_save_CXXFLAGS"
4338   AC_LANG_RESTORE
4342 dnl Check to see if python pretty printing can be activated.
4344 dnl --with-python-dir=dir
4345 dnl installs directory into $prefix/dir
4346 AC_DEFUN([GLIBCXX_ENABLE_PYTHON], [
4348 AC_MSG_CHECKING([for custom python install directory])
4349 AC_ARG_WITH([python-dir],
4350             AS_HELP_STRING([--with-python-dir],
4351                            [the location to install Python modules. This path is relative starting from the prefix.]),
4352             [with_python_dir=$withval], [with_python_dir="no"])
4353 AC_MSG_RESULT(${with_python_dir})
4355 # Needed for installing Python modules during make install.
4356 python_mod_dir="${with_python_dir}"
4357 AC_SUBST(python_mod_dir)
4358 GLIBCXX_CONDITIONAL(ENABLE_PYTHONDIR, test $python_mod_dir != no)
4362 dnl Check to see if -Werror is disabled.
4364 dnl --enable-werror/--disable-werror
4365 AC_DEFUN([GLIBCXX_ENABLE_WERROR], [
4366   AC_MSG_CHECKING([for -Werror])
4367   GLIBCXX_ENABLE(werror,$1,,[turns on -Werror])
4368   AC_MSG_RESULT($enable_werror)
4369   GLIBCXX_CONDITIONAL(ENABLE_WERROR, test $enable_werror = yes)
4373 dnl Check whether obsolescent tmpnam is available in <stdio.h>,
4374 dnl and define _GLIBCXX_USE_TMPNAM.
4376 AC_DEFUN([GLIBCXX_CHECK_TMPNAM], [dnl
4378   AC_LANG_SAVE
4379   AC_LANG_CPLUSPLUS
4380   ac_save_CXXFLAGS="$CXXFLAGS"
4381   CXXFLAGS="$CXXFLAGS -fno-exceptions"
4383   AC_MSG_CHECKING([for tmpnam])
4384   AC_CACHE_VAL(glibcxx_cv_TMPNAM, [dnl
4385     GCC_TRY_COMPILE_OR_LINK(
4386       [#include <stdio.h>],
4387       [char *tmp = tmpnam(NULL);],
4388       [glibcxx_cv_TMPNAM=yes],
4389       [glibcxx_cv_TMPNAM=no])
4390   ])
4391   if test $glibcxx_cv_TMPNAM = yes; then
4392     AC_DEFINE(_GLIBCXX_USE_TMPNAM, 1, [Define if obsolescent tmpnam is available in <stdio.h>.])
4393   fi
4394   AC_MSG_RESULT($glibcxx_cv_TMPNAM)
4396   CXXFLAGS="$ac_save_CXXFLAGS"
4397   AC_LANG_RESTORE
4401 dnl Check to see if sys/sdt.h exists and that it is suitable for use.
4402 dnl Some versions of sdt.h were not compatible with C++11.
4404 AC_DEFUN([GLIBCXX_CHECK_SDT_H], [
4405   AC_MSG_CHECKING([for suitable sys/sdt.h])
4406   # Note that this test has to be run with the C language.
4407   # Otherwise, sdt.h will try to include some headers from
4408   # libstdc++ itself.
4409   AC_LANG_SAVE
4410   AC_LANG_C
4411   AC_CACHE_VAL(glibcxx_cv_sys_sdt_h, [
4412     # Because we have to run the test in C, we use grep rather
4413     # than the compiler to check for the bug.  The bug is that
4414     # were strings without trailing whitespace, causing g++
4415     # to look for operator"".  The pattern searches for the fixed
4416     # output.
4417     AC_EGREP_CPP([ \",\" ], [
4418       #include <sys/sdt.h>
4419       int f() { STAP_PROBE(hi, bob); }
4420     ], [glibcxx_cv_sys_sdt_h=yes], [glibcxx_cv_sys_sdt_h=no])
4421   ])
4422   AC_LANG_RESTORE
4423   if test $glibcxx_cv_sys_sdt_h = yes; then
4424     AC_DEFINE(HAVE_SYS_SDT_H, 1,
4425               [Define to 1 if you have a suitable <sys/sdt.h> header file])
4426   fi
4427   AC_MSG_RESULT($glibcxx_cv_sys_sdt_h)
4431 dnl Control whether the library should define symbols for old and new ABIs.
4432 dnl This affects definitions of strings, stringstreams and locale facets.
4434 dnl --disable-libstdcxx-dual-abi will use old ABI for all types.
4436 dnl Defines:
4437 dnl  _GLIBCXX_USE_DUAL_ABI (always defined, either to 1 or 0)
4439 AC_DEFUN([GLIBCXX_ENABLE_LIBSTDCXX_DUAL_ABI], [
4440   GLIBCXX_ENABLE(libstdcxx-dual-abi,$1,,[support two versions of std::string])
4441   if test x$enable_symvers = xgnu-versioned-namespace; then
4442     # gnu-versioned-namespace is incompatible with the dual ABI.
4443     enable_libstdcxx_dual_abi="no"
4444   fi
4445   if test x"$enable_libstdcxx_dual_abi" != xyes; then
4446     AC_MSG_NOTICE([dual ABI is disabled])
4447     default_libstdcxx_abi="gcc4-compatible"
4448   fi
4449   GLIBCXX_CONDITIONAL(ENABLE_DUAL_ABI, test $enable_libstdcxx_dual_abi = yes)
4453 dnl Check to see which ABI should be enabled by default.
4455 dnl --with-default-libstdcxx-abi={gcc4-compatible,new}
4457 dnl Defines:
4458 dnl  _GLIBCXX_USE_CXX11_ABI (always defined, either to 1 or 0)
4460 AC_DEFUN([GLIBCXX_DEFAULT_ABI], [
4461   if test x$enable_libstdcxx_dual_abi = xyes; then
4462   AC_MSG_CHECKING([for default std::string ABI to use])
4463   AC_ARG_WITH([default-libstdcxx-abi],
4464     AS_HELP_STRING([--with-default-libstdcxx-abi],
4465                    [set the std::string ABI to use by default]),
4466     [case "$withval" in
4467       gcc4-compatible)  default_libstdcxx_abi="gcc4-compatible" ;;
4468       new|cxx11)  default_libstdcxx_abi="new" ;;
4469       c++*|gnu++*) AC_MSG_ERROR([Supported arguments for --with-default-libstdcxx-abi have changed, use "new" or "gcc4-compatible"]) ;;
4470       *) AC_MSG_ERROR([Invalid argument for --with-default-libstdcxx-abi]) ;;
4471      esac
4472      ],
4473     [default_libstdcxx_abi="new"])
4474   AC_MSG_RESULT(${default_libstdcxx_abi})
4475   fi
4476   if test $default_libstdcxx_abi = "new"; then
4477     glibcxx_cxx11_abi=1
4478     glibcxx_cxx98_abi=0
4479   else
4480     glibcxx_cxx11_abi=0
4481     glibcxx_cxx98_abi=1
4482   fi
4483   AC_SUBST(glibcxx_cxx98_abi)
4484   GLIBCXX_CONDITIONAL(ENABLE_CXX11_ABI, test $glibcxx_cxx11_abi = 1)
4488 dnl Check to see whether to build libstdc++fs.a
4490 dnl --enable-libstdcxx-filesystem-ts
4492 AC_DEFUN([GLIBCXX_ENABLE_FILESYSTEM_TS], [
4493   GLIBCXX_ENABLE(libstdcxx-filesystem-ts,auto,,
4494     [turns on ISO/IEC TS 18822 support],
4495     [permit yes|no|auto])
4497   AC_MSG_CHECKING([whether to build Filesystem TS support])
4498   if test x"$ac_cv_header_dirent_h" != x"yes"; then
4499     enable_libstdcxx_filesystem_ts=no
4500   fi
4501   if test x"$enable_libstdcxx_filesystem_ts" = x"auto"; then
4502     case "${target_os}" in
4503       freebsd*|netbsd*|openbsd*|dragonfly*|darwin*)
4504         enable_libstdcxx_filesystem_ts=yes
4505         ;;
4506       gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu | uclinux*)
4507         enable_libstdcxx_filesystem_ts=yes
4508         ;;
4509       rtems*)
4510         enable_libstdcxx_filesystem_ts=yes
4511         ;;
4512       solaris*)
4513         enable_libstdcxx_filesystem_ts=yes
4514         ;;
4515       mingw*)
4516         enable_libstdcxx_filesystem_ts=yes
4517         ;;
4518       *)
4519         enable_libstdcxx_filesystem_ts=no
4520         ;;
4521     esac
4522   fi
4523   AC_MSG_RESULT($enable_libstdcxx_filesystem_ts)
4524   GLIBCXX_CONDITIONAL(ENABLE_FILESYSTEM_TS, test $enable_libstdcxx_filesystem_ts = yes)
4528 dnl Check whether the library calls required by the C++17 Filesystem library
4529 dnl and the Filesystem TS are present.
4530 dnl Defines:
4531 dnl  HAVE_STRUCT_DIRENT_D_TYPE
4532 dnl  _GLIBCXX_USE_REALPATH
4533 dnl  _GLIBCXX_USE_UTIMENSAT
4534 dnl  _GLIBCXX_USE_ST_MTIM
4535 dnl  _GLIBCXX_USE_FCHMOD
4536 dnl  _GLIBCXX_USE_FCHMODAT
4537 dnl  _GLIBCXX_USE_SENDFILE
4538 dnl  HAVE_LINK
4539 dnl  HAVE_READLINK
4540 dnl  HAVE_SYMLINK
4542 AC_DEFUN([GLIBCXX_CHECK_FILESYSTEM_DEPS], [dnl
4544   AC_LANG_SAVE
4545   AC_LANG_CPLUSPLUS
4546   ac_save_CXXFLAGS="$CXXFLAGS"
4547   CXXFLAGS="$CXXFLAGS -fno-exceptions"
4549   AC_MSG_CHECKING([for struct dirent.d_type])
4550   AC_CACHE_VAL(glibcxx_cv_dirent_d_type, [dnl
4551     GCC_TRY_COMPILE_OR_LINK(
4552       [#include <dirent.h>],
4553       [
4554        struct dirent d;
4555        if (sizeof d.d_type) return 0;
4556       ],
4557       [glibcxx_cv_dirent_d_type=yes],
4558       [glibcxx_cv_dirent_d_type=no])
4559   ])
4560   if test $glibcxx_cv_dirent_d_type = yes; then
4561     AC_DEFINE(HAVE_STRUCT_DIRENT_D_TYPE, 1, [Define to 1 if `d_type' is a member of `struct dirent'.])
4562   fi
4563   AC_MSG_RESULT($glibcxx_cv_dirent_d_type)
4565   AC_MSG_CHECKING([for realpath])
4566   AC_CACHE_VAL(glibcxx_cv_realpath, [dnl
4567     GCC_TRY_COMPILE_OR_LINK(
4568       [
4569        #include <limits.h>
4570        #include <stdlib.h>
4571        #include <unistd.h>
4572       ],
4573       [
4574        #if _XOPEN_VERSION < 500
4575        #error
4576        #elif _XOPEN_VERSION >= 700 || defined(PATH_MAX)
4577        char *tmp = realpath((const char*)NULL, (char*)NULL);
4578        #else
4579        #error
4580        #endif
4581       ],
4582       [glibcxx_cv_realpath=yes],
4583       [glibcxx_cv_realpath=no])
4584   ])
4585   if test $glibcxx_cv_realpath = yes; then
4586     AC_DEFINE(_GLIBCXX_USE_REALPATH, 1, [Define if usable realpath is available in <stdlib.h>.])
4587   fi
4588   AC_MSG_RESULT($glibcxx_cv_realpath)
4590   AC_MSG_CHECKING([for utimensat])
4591   AC_CACHE_VAL(glibcxx_cv_utimensat, [dnl
4592     GCC_TRY_COMPILE_OR_LINK(
4593       [
4594         #include <fcntl.h>
4595         #include <sys/stat.h>
4596       ],
4597       [
4598         struct timespec ts[2] = { { 0, UTIME_OMIT }, { 1, 1 } };
4599         int i = utimensat(AT_FDCWD, "path", ts, 0);
4600       ],
4601       [glibcxx_cv_utimensat=yes],
4602       [glibcxx_cv_utimensat=no])
4603   ])
4604   if test $glibcxx_cv_utimensat = yes; then
4605     AC_DEFINE(_GLIBCXX_USE_UTIMENSAT, 1, [Define if utimensat and UTIME_OMIT are available in <sys/stat.h> and AT_FDCWD in <fcntl.h>.])
4606   fi
4607   AC_MSG_RESULT($glibcxx_cv_utimensat)
4609   AC_MSG_CHECKING([for utime])
4610   AC_CACHE_VAL(glibcxx_cv_utime, [dnl
4611     GCC_TRY_COMPILE_OR_LINK(
4612       [
4613         #include <utime.h>
4614       ],
4615       [
4616         struct utimbuf t = { 1, 1 };
4617         int i = utime("path", &t);
4618       ],
4619       [glibcxx_cv_utime=yes],
4620       [glibcxx_cv_utime=no])
4621   ])
4622   if test $glibcxx_cv_utime = yes; then
4623     AC_DEFINE(_GLIBCXX_USE_UTIME, 1, [Define if utime is available in <utime.h>.])
4624   fi
4625   AC_MSG_RESULT($glibcxx_cv_utime)
4627   AC_MSG_CHECKING([for lstat])
4628   AC_CACHE_VAL(glibcxx_cv_lstat, [dnl
4629     GCC_TRY_COMPILE_OR_LINK(
4630       [ #include <sys/stat.h> ],
4631       [
4632         struct stat st;
4633         int i = lstat("path", &st);
4634       ],
4635       [glibcxx_cv_lstat=yes],
4636       [glibcxx_cv_lstat=no])
4637   ])
4638   if test $glibcxx_cv_lstat = yes; then
4639     AC_DEFINE(_GLIBCXX_USE_LSTAT, 1, [Define if lstat is available in <sys/stat.h>.])
4640   fi
4641   AC_MSG_RESULT($glibcxx_cv_lstat)
4643   AC_MSG_CHECKING([for struct stat.st_mtim.tv_nsec])
4644   AC_CACHE_VAL(glibcxx_cv_st_mtim, [dnl
4645     GCC_TRY_COMPILE_OR_LINK(
4646       [ #include <sys/stat.h> ],
4647       [
4648         struct stat st;
4649         return st.st_mtim.tv_nsec;
4650       ],
4651       [glibcxx_cv_st_mtim=yes],
4652       [glibcxx_cv_st_mtim=no])
4653   ])
4654   if test $glibcxx_cv_st_mtim = yes; then
4655     AC_DEFINE(_GLIBCXX_USE_ST_MTIM, 1, [Define if struct stat has timespec members.])
4656   fi
4657   AC_MSG_RESULT($glibcxx_cv_st_mtim)
4659   AC_MSG_CHECKING([for fchmod])
4660   AC_CACHE_VAL(glibcxx_cv_fchmod, [dnl
4661     GCC_TRY_COMPILE_OR_LINK(
4662       [#include <sys/stat.h>],
4663       [fchmod(1, S_IWUSR);],
4664       [glibcxx_cv_fchmod=yes],
4665       [glibcxx_cv_fchmod=no])
4666   ])
4667   if test $glibcxx_cv_fchmod = yes; then
4668     AC_DEFINE(_GLIBCXX_USE_FCHMOD, 1, [Define if fchmod is available in <sys/stat.h>.])
4669   fi
4670   AC_MSG_RESULT($glibcxx_cv_fchmod)
4672   AC_MSG_CHECKING([for fchmodat])
4673   AC_CACHE_VAL(glibcxx_cv_fchmodat, [dnl
4674     GCC_TRY_COMPILE_OR_LINK(
4675       [
4676         #include <fcntl.h>
4677         #include <sys/stat.h>
4678       ],
4679       [fchmodat(AT_FDCWD, "", 0, AT_SYMLINK_NOFOLLOW);],
4680       [glibcxx_cv_fchmodat=yes],
4681       [glibcxx_cv_fchmodat=no])
4682   ])
4683   if test $glibcxx_cv_fchmodat = yes; then
4684     AC_DEFINE(_GLIBCXX_USE_FCHMODAT, 1, [Define if fchmodat is available in <sys/stat.h>.])
4685   fi
4686   AC_MSG_RESULT($glibcxx_cv_fchmodat)
4688   AC_MSG_CHECKING([for sendfile that can copy files])
4689   AC_CACHE_VAL(glibcxx_cv_sendfile, [dnl
4690     case "${target_os}" in
4691       gnu* | linux* | solaris* | uclinux*)
4692         GCC_TRY_COMPILE_OR_LINK(
4693           [#include <sys/sendfile.h>],
4694           [sendfile(1, 2, (off_t*)0, sizeof 1);],
4695           [glibcxx_cv_sendfile=yes],
4696           [glibcxx_cv_sendfile=no])
4697         ;;
4698       *)
4699         glibcxx_cv_sendfile=no
4700         ;;
4701     esac
4702   ])
4703   if test $glibcxx_cv_sendfile = yes; then
4704     AC_DEFINE(_GLIBCXX_USE_SENDFILE, 1, [Define if sendfile is available in <sys/sendfile.h>.])
4705   fi
4706   AC_MSG_RESULT($glibcxx_cv_sendfile)
4708   AC_MSG_CHECKING([for link])
4709   AC_CACHE_VAL(glibcxx_cv_link, [dnl
4710     GCC_TRY_COMPILE_OR_LINK(
4711       [#include <unistd.h>],
4712       [link("", "");],
4713       [glibcxx_cv_link=yes],
4714       [glibcxx_cv_link=no])
4715   ])
4716   if test $glibcxx_cv_link = yes; then
4717     AC_DEFINE(HAVE_LINK, 1, [Define if link is available in <unistd.h>.])
4718   fi
4719   AC_MSG_RESULT($glibcxx_cv_link)
4721   AC_MSG_CHECKING([for readlink])
4722   AC_CACHE_VAL(glibcxx_cv_readlink, [dnl
4723     GCC_TRY_COMPILE_OR_LINK(
4724       [#include <unistd.h>],
4725       [char buf[32]; readlink("", buf, sizeof(buf));],
4726       [glibcxx_cv_readlink=yes],
4727       [glibcxx_cv_readlink=no])
4728   ])
4729   if test $glibcxx_cv_readlink = yes; then
4730     AC_DEFINE(HAVE_READLINK, 1, [Define if readlink is available in <unistd.h>.])
4731   fi
4732   AC_MSG_RESULT($glibcxx_cv_readlink)
4734   AC_MSG_CHECKING([for symlink])
4735   AC_CACHE_VAL(glibcxx_cv_symlink, [dnl
4736     GCC_TRY_COMPILE_OR_LINK(
4737       [#include <unistd.h>],
4738       [symlink("", "");],
4739       [glibcxx_cv_symlink=yes],
4740       [glibcxx_cv_symlink=no])
4741   ])
4742   if test $glibcxx_cv_symlink = yes; then
4743     AC_DEFINE(HAVE_SYMLINK, 1, [Define if symlink is available in <unistd.h>.])
4744   fi
4745   AC_MSG_RESULT($glibcxx_cv_symlink)
4747   AC_MSG_CHECKING([for truncate])
4748   AC_CACHE_VAL(glibcxx_cv_truncate, [dnl
4749     GCC_TRY_COMPILE_OR_LINK(
4750       [#include <unistd.h>],
4751       [truncate("", 99);],
4752       [glibcxx_cv_truncate=yes],
4753       [glibcxx_cv_truncate=no])
4754   ])
4755   if test $glibcxx_cv_truncate = yes; then
4756     AC_DEFINE(HAVE_TRUNCATE, 1, [Define if truncate is available in <unistd.h>.])
4757   fi
4758   AC_MSG_RESULT($glibcxx_cv_truncate)
4760   CXXFLAGS="$ac_save_CXXFLAGS"
4761   AC_LANG_RESTORE
4765 dnl Check how size_t is mangled.  Copied from libitm.
4767 AC_DEFUN([GLIBCXX_CHECK_SIZE_T_MANGLING], [
4768   AC_CACHE_CHECK([how size_t is mangled],
4769                  glibcxx_cv_size_t_mangling, [
4770     AC_TRY_COMPILE([], [extern __SIZE_TYPE__ x; extern unsigned long x;],
4771                    [glibcxx_cv_size_t_mangling=m], [
4772       AC_TRY_COMPILE([], [extern __SIZE_TYPE__ x; extern unsigned int x;],
4773                      [glibcxx_cv_size_t_mangling=j], [
4774         AC_TRY_COMPILE([],
4775                        [extern __SIZE_TYPE__ x; extern unsigned long long x;],
4776                        [glibcxx_cv_size_t_mangling=y], [
4777           AC_TRY_COMPILE([],
4778                          [extern __SIZE_TYPE__ x; extern unsigned short x;],
4779                          [glibcxx_cv_size_t_mangling=t], [
4780             AC_TRY_COMPILE([],
4781                            [extern __SIZE_TYPE__ x; extern __int20 unsigned x;],
4782                            [glibcxx_cv_size_t_mangling=u6uint20],
4783                            [glibcxx_cv_size_t_mangling=x])
4784           ])
4785         ])
4786       ])
4787     ])
4788   ])
4789   if test $glibcxx_cv_size_t_mangling = x; then
4790     AC_MSG_ERROR([Unknown underlying type for size_t])
4791   fi
4792   AC_DEFINE_UNQUOTED(_GLIBCXX_MANGLE_SIZE_T, [$glibcxx_cv_size_t_mangling],
4793     [Define to the letter to which size_t is mangled.])
4797 dnl Determine whether std::exception_ptr symbols should be exported with
4798 dnl the symbol versions from GCC 4.6.0 or GCC 7.1.0, depending on which
4799 dnl release first added support for std::exception_ptr. Originally it was
4800 dnl only supported for targets with always-lock-free atomics for int, but
4801 dnl since GCC 7.1 it is supported for all targets.
4803 AC_DEFUN([GLIBCXX_CHECK_EXCEPTION_PTR_SYMVER], [
4804   if test $enable_symvers != no; then
4805     AC_MSG_CHECKING([for first version to support std::exception_ptr])
4806     case ${target} in
4807       aarch64-*-* | alpha-*-* | hppa*-*-* | i?86-*-* | x86_64-*-* | \
4808       m68k-*-* | powerpc*-*-* | s390*-*-* | *-*-solaris* )
4809         ac_exception_ptr_since_gcc46=yes
4810         ;;
4811       *)
4812         # If the value of this macro changes then we will need to hardcode
4813         # yes/no here for additional targets based on the original value.
4814         AC_TRY_COMPILE([], [
4815           #if __GCC_ATOMIC_INT_LOCK_FREE <= 1
4816           # error atomic int not always lock free
4817           #endif
4818           ],
4819           [ac_exception_ptr_since_gcc46=yes],
4820           [ac_exception_ptr_since_gcc46=no])
4821         ;;
4822     esac
4823     if test x"$ac_exception_ptr_since_gcc46" = x"yes" ; then
4824       AC_DEFINE(HAVE_EXCEPTION_PTR_SINCE_GCC46, 1,
4825         [Define to 1 if GCC 4.6 supported std::exception_ptr for the target])
4826       AC_MSG_RESULT([4.6.0])
4827     else
4828       AC_MSG_RESULT([7.1.0])
4829     fi
4830   fi
4833 # Macros from the top-level gcc directory.
4834 m4_include([../config/gc++filt.m4])
4835 m4_include([../config/tls.m4])
4836 m4_include([../config/gthr.m4])
4837 m4_include([../config/cet.m4])