d: Fix #error You must define PREFERRED_DEBUGGING_TYPE if DWARF is not supported
[official-gcc.git] / libstdc++-v3 / acinclude.m4
blobe3cc3a8e867d3428d34f2b4db9c47104a0385450
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 src/libbacktrace 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_ld_is_mold (set to "no" or "yes")
176 dnl  glibcxx_gnu_ld_version (possibly)
178 dnl The last will be a single integer, e.g., version 1.23.45.0.67.89 will
179 dnl set glibcxx_gnu_ld_version to 12345.  Zeros cause problems.
181 AC_DEFUN([GLIBCXX_CHECK_LINKER_FEATURES], [
182   # If we're not using GNU ld, then there's no point in even trying these
183   # tests.  Check for that first.  We should have already tested for gld
184   # by now (in libtool), but require it now just to be safe...
185   test -z "$SECTION_LDFLAGS" && SECTION_LDFLAGS=''
186   test -z "$OPT_LDFLAGS" && OPT_LDFLAGS=''
187   AC_REQUIRE([AC_PROG_LD])
188   AC_REQUIRE([AC_PROG_AWK])
190   # The name set by libtool depends on the version of libtool.  Shame on us
191   # for depending on an impl detail, but c'est la vie.  Older versions used
192   # ac_cv_prog_gnu_ld, but now it's lt_cv_prog_gnu_ld, and is copied back on
193   # top of with_gnu_ld (which is also set by --with-gnu-ld, so that actually
194   # makes sense).  We'll test with_gnu_ld everywhere else, so if that isn't
195   # set (hence we're using an older libtool), then set it.
196   if test x${with_gnu_ld+set} != xset; then
197     if test x${ac_cv_prog_gnu_ld+set} != xset; then
198       # We got through "ac_require(ac_prog_ld)" and still not set?  Huh?
199       with_gnu_ld=no
200     else
201       with_gnu_ld=$ac_cv_prog_gnu_ld
202     fi
203   fi
205   # Start by getting the version number.  I think the libtool test already
206   # does some of this, but throws away the result.
207   glibcxx_ld_is_gold=no
208   glibcxx_ld_is_mold=no
209   if test x"$with_gnu_ld" = x"yes"; then
210     AC_MSG_CHECKING([for ld version])
211     changequote(,)
212     if $LD --version 2>/dev/null | grep 'GNU gold' >/dev/null 2>&1; then
213       glibcxx_ld_is_gold=yes
214     elif $LD --version 2>/dev/null | grep 'mold' >/dev/null 2>&1; then
215       glibcxx_ld_is_mold=yes
216     fi
217     ldver=`$LD --version 2>/dev/null |
218            sed -e 's/[. ][0-9]\{8\}$//;s/.* \([^ ]\{1,\}\)$/\1/; q'`
219     changequote([,])
220     glibcxx_gnu_ld_version=`echo $ldver | \
221            $AWK -F. '{ if (NF<3) [$]3=0; print ([$]1*100+[$]2)*100+[$]3 }'`
222     AC_MSG_RESULT($glibcxx_gnu_ld_version)
223   fi
225   # Set --gc-sections.
226   glibcxx_have_gc_sections=no
227   if test "$glibcxx_ld_is_gold" = "yes" || test "$glibcxx_ld_is_mold" = "yes" ; then
228     if $LD --help 2>/dev/null | grep gc-sections >/dev/null 2>&1; then
229       glibcxx_have_gc_sections=yes
230     fi
231   else
232     glibcxx_gcsections_min_ld=21602
233     if test x"$with_gnu_ld" = x"yes" &&
234         test $glibcxx_gnu_ld_version -gt $glibcxx_gcsections_min_ld ; then
235       glibcxx_have_gc_sections=yes
236     fi
237   fi
238   if test "$glibcxx_have_gc_sections" = "yes"; then
239     # Sufficiently young GNU ld it is!  Joy and bunny rabbits!
240     # NB: This flag only works reliably after 2.16.1. Configure tests
241     # for this are difficult, so hard wire a value that should work.
243     ac_test_CFLAGS="${CFLAGS+set}"
244     ac_save_CFLAGS="$CFLAGS"
245     CFLAGS='-Wl,--gc-sections'
247     # Check for -Wl,--gc-sections
248     AC_MSG_CHECKING([for ld that supports -Wl,--gc-sections])
249     AC_TRY_LINK([ int one(void) { return 1; }
250      int two(void) { return 2; }
251         ], [ two(); ] , [ac_gcsections=yes], [ac_gcsections=no])
252     if test "$ac_gcsections" = "yes"; then
253       rm -f conftest.c
254       touch conftest.c
255       if $CC -c conftest.c; then
256         if $LD --gc-sections -o conftest conftest.o 2>&1 | \
257            grep "Warning: gc-sections option ignored" > /dev/null; then
258           ac_gcsections=no
259         fi
260       fi
261       rm -f conftest.c conftest.o conftest
262     fi
263     if test "$ac_gcsections" = "yes"; then
264       SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS"
265     fi
266     AC_MSG_RESULT($ac_gcsections)
268     if test "$ac_test_CFLAGS" = set; then
269       CFLAGS="$ac_save_CFLAGS"
270     else
271       # this is the suspicious part
272       CFLAGS=''
273     fi
274   fi
276   # Set -z,relro.
277   # Note this is only for shared objects.
278   ac_ld_relro=no
279   if test x"$with_gnu_ld" = x"yes"; then
280     # cygwin and mingw uses PE, which has no ELF relro support,
281     # multi target ld may confuse configure machinery
282     case "$host" in
283     *-*-cygwin*)
284      ;;
285     *-*-mingw*)
286      ;;
287     *)
288       AC_MSG_CHECKING([for ld that supports -Wl,-z,relro])
289       cxx_z_relo=`$LD -v --help 2>/dev/null | grep "z relro"`
290       if test -n "$cxx_z_relo"; then
291         OPT_LDFLAGS="-Wl,-z,relro"
292         ac_ld_relro=yes
293       fi
294       AC_MSG_RESULT($ac_ld_relro)
295     esac
296   fi
298   # Set linker optimization flags.
299   if test x"$with_gnu_ld" = x"yes"; then
300     OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS"
301   fi
303   AC_SUBST(SECTION_LDFLAGS)
304   AC_SUBST(OPT_LDFLAGS)
309 dnl Check for headers for, and arguments to, the setrlimit() function.
310 dnl Used only in testsuite_hooks.h.  Called from GLIBCXX_CONFIGURE_TESTSUITE.
312 dnl Defines:
313 dnl  _GLIBCXX_RES_LIMITS if we can set artificial resource limits
314 dnl  various HAVE_LIMIT_* for individual limit names
316 AC_DEFUN([GLIBCXX_CHECK_SETRLIMIT_ancilliary], [
317   AC_MSG_CHECKING([for RLIMIT_$1])
318   AC_TRY_COMPILE(
319     [#include <unistd.h>
320      #include <sys/time.h>
321      #include <sys/resource.h>
322     ],
323     [ int f = RLIMIT_$1 ; ],
324     [glibcxx_mresult=1], [glibcxx_mresult=0])
325   AC_DEFINE_UNQUOTED(HAVE_LIMIT_$1, $glibcxx_mresult,
326                      [Only used in build directory testsuite_hooks.h.])
327   if test $glibcxx_mresult = 1 ; then res=yes ; else res=no ; fi
328   AC_MSG_RESULT($res)
331 AC_DEFUN([GLIBCXX_CHECK_SETRLIMIT], [
332   AC_LANG_SAVE
333   AC_LANG_CPLUSPLUS
334   setrlimit_have_headers=yes
335   AC_CHECK_HEADERS(unistd.h sys/time.h sys/resource.h,
336                    [],
337                    [setrlimit_have_headers=no])
338   # If don't have the headers, then we can't run the tests now, and we
339   # won't be seeing any of these during testsuite compilation.
340   if test $setrlimit_have_headers = yes; then
341     # Can't do these in a loop, else the resulting syntax is wrong.
342     GLIBCXX_CHECK_SETRLIMIT_ancilliary(DATA)
343     GLIBCXX_CHECK_SETRLIMIT_ancilliary(RSS)
344     GLIBCXX_CHECK_SETRLIMIT_ancilliary(VMEM)
345     GLIBCXX_CHECK_SETRLIMIT_ancilliary(AS)
346     GLIBCXX_CHECK_SETRLIMIT_ancilliary(FSIZE)
348     # Check for rlimit, setrlimit.
349     AC_CACHE_CHECK([for testsuite resource limits support],
350       glibcxx_cv_setrlimit, [
351       AC_TRY_COMPILE(
352         [#include <unistd.h>
353          #include <sys/time.h>
354          #include <sys/resource.h>
355         ],
356         [struct rlimit r;
357          setrlimit(0, &r);],
358         [glibcxx_cv_setrlimit=yes], [glibcxx_cv_setrlimit=no])
359     ])
361     if test $glibcxx_cv_setrlimit = yes; then
362       AC_DEFINE(_GLIBCXX_RES_LIMITS, 1,
363                 [Define if using setrlimit to set resource limits during
364                 "make check"])
365     fi
366   fi
367   AC_LANG_RESTORE
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_CACHE_CHECK([for poll], glibcxx_cv_POLL, [
429     GCC_TRY_COMPILE_OR_LINK(
430       [#include <poll.h>],
431       [struct pollfd pfd[1];
432        pfd[0].events = POLLIN;
433        poll(pfd, 1, 0);],
434       [glibcxx_cv_POLL=yes],
435       [glibcxx_cv_POLL=no])
436   ])
437   if test $glibcxx_cv_POLL = yes; then
438     AC_DEFINE(HAVE_POLL, 1, [Define if poll is available in <poll.h>.])
439   fi
441   CXXFLAGS="$ac_save_CXXFLAGS"
442   AC_LANG_RESTORE
447 dnl Check whether writev is available in <sys/uio.h>, and define HAVE_WRITEV.
449 AC_DEFUN([GLIBCXX_CHECK_WRITEV], [
451   AC_LANG_SAVE
452   AC_LANG_CPLUSPLUS
453   ac_save_CXXFLAGS="$CXXFLAGS"
454   CXXFLAGS="$CXXFLAGS -fno-exceptions"
456   AC_CACHE_CHECK([for writev], glibcxx_cv_WRITEV, [
457     GCC_TRY_COMPILE_OR_LINK(
458       [#include <sys/uio.h>],
459       [struct iovec iov[2];
460        writev(0, iov, 0);],
461       [glibcxx_cv_WRITEV=yes],
462       [glibcxx_cv_WRITEV=no])
463   ])
464   if test $glibcxx_cv_WRITEV = yes; then
465     AC_DEFINE(HAVE_WRITEV, 1, [Define if writev is available in <sys/uio.h>.])
466   fi
468   CXXFLAGS="$ac_save_CXXFLAGS"
469   AC_LANG_RESTORE
474 dnl Check whether LFS support is available.
476 AC_DEFUN([GLIBCXX_CHECK_LFS], [
477   AC_LANG_SAVE
478   AC_LANG_CPLUSPLUS
479   ac_save_CXXFLAGS="$CXXFLAGS"
480   CXXFLAGS="$CXXFLAGS -fno-exceptions"
481   AC_CACHE_CHECK([for LFS support], glibcxx_cv_LFS, [
482     GCC_TRY_COMPILE_OR_LINK(
483       [#include <unistd.h>
484        #include <stdio.h>
485        #include <sys/stat.h>
486       ],
487       [FILE* fp;
488        fopen64("t", "w");
489        fseeko64(fp, 0, SEEK_CUR);
490        ftello64(fp);
491        lseek64(1, 0, SEEK_CUR);
492        struct stat64 buf;
493        fstat64(1, &buf);],
494       [glibcxx_cv_LFS=yes],
495       [glibcxx_cv_LFS=no])
496   ])
497   if test $glibcxx_cv_LFS = yes; then
498     AC_DEFINE(_GLIBCXX_USE_LFS, 1, [Define if LFS support is available.])
499   fi
500   CXXFLAGS="$ac_save_CXXFLAGS"
501   AC_LANG_RESTORE
506 dnl Check whether the old Copy-On-Write basic_string should allocate a new
507 dnl empty representation for every default-constructed basic_string. Without
508 dnl this option, COW strings share a single empty rep in static storage,
509 dnl but this only works if the linker can guarantee the static storage has
510 dnl a unique definition in the process. It also doesn't work if basic_string
511 dnl objects are stored in shared memory (see PR libstdc++/16612).
512 dnl When fully dynamic strings are enabled, the static storage is not used
513 dnl and a new empty string with reference-count == 1 is allocated each time.
514 dnl Enabling this changes the libstdc++.so ABI.
516 dnl --enable-fully-dynamic-string defines _GLIBCXX_FULLY_DYNAMIC_STRING to 1
517 dnl --disable-fully-dynamic-string defines _GLIBCXX_FULLY_DYNAMIC_STRING to 0
518 dnl otherwise the macro is not defined.
519 dnl  +  Usage:  GLIBCXX_ENABLE_FULLY_DYNAMIC_STRING[(DEFAULT)]
520 dnl       Where DEFAULT is either `yes' or `no'.
522 AC_DEFUN([GLIBCXX_ENABLE_FULLY_DYNAMIC_STRING], [
523   GLIBCXX_ENABLE(fully-dynamic-string,$1,,[do not put empty strings in per-process static memory], [permit yes|no])
524   if test $enable_fully_dynamic_string = yes; then
525     enable_fully_dynamic_string_def=1
526   else
527     enable_fully_dynamic_string_def=0
528   fi
529   AC_DEFINE_UNQUOTED([_GLIBCXX_FULLY_DYNAMIC_STRING], [${enable_fully_dynamic_string_def}],
530               [Define to 1 if a fully dynamic basic_string is wanted, 0 to disable, undefined for platform defaults])
535 dnl Does any necessary configuration of the testsuite directory.  Generates
536 dnl the testsuite_hooks.h header.
538 dnl GLIBCXX_ENABLE_SYMVERS and GLIBCXX_IS_NATIVE must be done before this.
540 dnl Sets:
541 dnl  enable_abi_check
542 dnl  GLIBCXX_TEST_WCHAR_T
543 dnl  GLIBCXX_TEST_THREAD
544 dnl Substs:
545 dnl  baseline_dir
546 dnl  baseline_subdir_switch
548 AC_DEFUN([GLIBCXX_CONFIGURE_TESTSUITE], [
549   # Do checks for resource limit functions.
550   GLIBCXX_CHECK_SETRLIMIT
552   if $GLIBCXX_IS_NATIVE ; then
553     # Look for setenv, so that extended locale tests can be performed.
554     GLIBCXX_CHECK_STDLIB_DECL_AND_LINKAGE_3(setenv)
555   fi
557   if $GLIBCXX_IS_NATIVE && test $is_hosted = yes &&
558      test $enable_symvers != no; then
559     case "$host" in
560       *-*-cygwin*)
561         enable_abi_check=no ;;
562       *)
563         enable_abi_check=yes ;;
564     esac
565   else
566     # Only build this as native, since automake does not understand
567     # CXX_FOR_BUILD.
568     enable_abi_check=no
569   fi
571   # Export file names for ABI checking.
572   baseline_dir="$glibcxx_srcdir/config/abi/post/${abi_baseline_pair}"
573   AC_SUBST(baseline_dir)
574   baseline_subdir_switch="$abi_baseline_subdir_switch"
575   AC_SUBST(baseline_subdir_switch)
580 dnl Does any necessary configuration for docbook in the docs directory.
582 dnl XSLTPROC must be set before this
584 dnl Sets:
585 dnl  glibcxx_stylesheets
586 dnl Substs:
587 dnl  XSL_STYLE_DIR
589 AC_DEFUN([GLIBCXX_CONFIGURE_DOCBOOK], [
591 glibcxx_docbook_url=http://docbook.sourceforge.net/release/xsl-ns/current/
593 AC_MSG_CHECKING([for local stylesheet directory])
594 glibcxx_local_stylesheets=no
595 if test x${XMLCATALOG} = xyes && xsl_style_dir=`xmlcatalog "" $glibcxx_docbook_url 2>/dev/null`
596 then
597   XSL_STYLE_DIR=`echo $xsl_style_dir | sed -n 's;^file://;;p'`
598   glibcxx_local_stylesheets=yes
599 else
600   for dir in \
601     /usr/share/sgml/docbook/xsl-ns-stylesheets \
602     /usr/share/xml/docbook/stylesheet/docbook-xsl-ns \
603     /usr/share/xml/docbook/stylesheet/nwalsh5/current \
604     /usr/share/xml/docbook/stylesheet/nwalsh/current
605   do
606     if test -d $dir; then
607       glibcxx_local_stylesheets=yes
608       XSL_STYLE_DIR=$dir
609       break
610     fi
611   done
613 AC_MSG_RESULT($glibcxx_local_stylesheets)
615 if test x"$glibcxx_local_stylesheets" = x"yes"; then
616   AC_SUBST(XSL_STYLE_DIR)
617   AC_MSG_NOTICE($XSL_STYLE_DIR)
619   AC_MSG_CHECKING([for docbook stylesheets for documentation creation])
620   glibcxx_stylesheets=no
621   if test x${XMLCATALOG} = xno || xmlcatalog "" $glibcxx_docbook_url/xhtml/docbook.xsl >/dev/null 2>&1; then
622     if test x${XSLTPROC} = xyes && echo '<title/>' | xsltproc --noout --nonet --xinclude $glibcxx_docbook_url/xhtml/docbook.xsl - 2>/dev/null; then
623       glibcxx_stylesheets=yes
624     fi
625   fi
626   AC_MSG_RESULT($glibcxx_stylesheets)
628 else
629   glibcxx_stylesheets=no
632 # Check for epub3 dependencies.
633 AC_MSG_CHECKING([for epub3 stylesheets for documentation creation])
634 glibcxx_epub_stylesheets=no
635 if test x"$glibcxx_local_stylesheets" = x"yes"; then
636    if test -f "$XSL_STYLE_DIR/epub3/chunk.xsl"; then
637       glibcxx_epub_stylesheets=yes
638    fi
640 AC_MSG_RESULT($glibcxx_epub_stylesheets)
641 AM_CONDITIONAL(BUILD_EPUB, test x"$glibcxx_epub_stylesheets" = x"yes")
647 dnl Set up *_INCLUDES variables for all sundry Makefile.am's.
649 dnl Substs:
650 dnl  GLIBCXX_INCLUDES
651 dnl  TOPLEVEL_INCLUDES
653 AC_DEFUN([GLIBCXX_EXPORT_INCLUDES], [
654   # Used for every C++ compile we perform.
655   GLIBCXX_INCLUDES="\
656 -I$glibcxx_builddir/include/$host_alias \
657 -I$glibcxx_builddir/include \
658 -I$glibcxx_srcdir/libsupc++"
660   # For Canadian crosses, pick this up too.
661   if test $CANADIAN = yes; then
662     GLIBCXX_INCLUDES="$GLIBCXX_INCLUDES -I\${includedir}"
663   fi
665   # Stuff in the actual top level.  Currently only used by libsupc++ to
666   # get unwind* headers from the libgcc dir.
667   #TOPLEVEL_INCLUDES='-I$(toplevel_srcdir)/libgcc -I$(toplevel_srcdir)/include'
668   TOPLEVEL_INCLUDES='-I$(toplevel_srcdir)/libgcc'
670   # Now, export this to all the little Makefiles....
671   AC_SUBST(GLIBCXX_INCLUDES)
672   AC_SUBST(TOPLEVEL_INCLUDES)
677 dnl Set up *_FLAGS and *FLAGS variables for all sundry Makefile.am's.
678 dnl (SECTION_FLAGS is done under CHECK_COMPILER_FEATURES.)
680 dnl Substs:
681 dnl  OPTIMIZE_CXXFLAGS
682 dnl  WARN_FLAGS
684 AC_DEFUN([GLIBCXX_EXPORT_FLAGS], [
685   # Optimization flags that are probably a good idea for thrill-seekers. Just
686   # uncomment the lines below and make, everything else is ready to go...
687   # Alternatively OPTIMIZE_CXXFLAGS can be set in configure.host.
688   # OPTIMIZE_CXXFLAGS = -O3 -fstrict-aliasing -fvtable-gc
689   AC_SUBST(OPTIMIZE_CXXFLAGS)
691   WARN_FLAGS="-Wall -Wextra -Wwrite-strings -Wcast-qual -Wabi=2"
692   AC_SUBST(WARN_FLAGS)
697 dnl All installation directory information is determined here.
699 dnl Substs:
700 dnl  gxx_install_dir
701 dnl  glibcxx_prefixdir
702 dnl  glibcxx_toolexecdir
703 dnl  glibcxx_toolexeclibdir
705 dnl Assumes cross_compiling bits already done, and with_cross_host in
706 dnl particular.
708 dnl This logic must match gcc/configure.ac's setting of gcc_gxx_include_dir.
709 dnl config/gxx-include-dir.m4 must be kept consistant with this as well.
710 AC_DEFUN([GLIBCXX_EXPORT_INSTALL_INFO], [
711   glibcxx_toolexecdir=no
712   glibcxx_toolexeclibdir=no
713   glibcxx_prefixdir=$prefix
715   AC_MSG_CHECKING([for gxx-include-dir])
716   AC_ARG_WITH([gxx-include-dir],
717     AC_HELP_STRING([--with-gxx-include-dir=DIR],
718                    [installation directory for include files]),
719     [case "$withval" in
720       yes) AC_MSG_ERROR([Missing directory for --with-gxx-include-dir]) ;;
721       no)  gxx_include_dir=no ;;
722       *)   gxx_include_dir=$withval ;;
723      esac],
724     [gxx_include_dir=no])
725   AC_MSG_RESULT($gxx_include_dir)
727   AC_MSG_CHECKING([for --enable-version-specific-runtime-libs])
728   AC_ARG_ENABLE([version-specific-runtime-libs],
729     AC_HELP_STRING([--enable-version-specific-runtime-libs],
730                    [Specify that runtime libraries should be installed in a compiler-specific directory]),
731     [case "$enableval" in
732       yes) version_specific_libs=yes ;;
733       no)  version_specific_libs=no ;;
734       *)   AC_MSG_ERROR([Unknown argument to enable/disable version-specific libs]);;
735      esac],
736     [version_specific_libs=no])
737   AC_MSG_RESULT($version_specific_libs)
739   GCC_WITH_TOOLEXECLIBDIR
741   # Default case for install directory for include files.
742   if test $version_specific_libs = no && test $gxx_include_dir = no; then
743     gxx_include_dir='include/c++/${gcc_version}'
744     if test -n "$with_cross_host" &&
745        test x"$with_cross_host" != x"no"; then
746       gxx_include_dir='${prefix}/${target_alias}/'"$gxx_include_dir"
747     else
748       gxx_include_dir='${prefix}/'"$gxx_include_dir"
749     fi
750   fi
752   # Version-specific runtime libs processing.
753   if test $version_specific_libs = yes; then
754     # Need the gcc compiler version to know where to install libraries
755     # and header files if --enable-version-specific-runtime-libs option
756     # is selected.  FIXME: these variables are misnamed, there are
757     # no executables installed in _toolexecdir or _toolexeclibdir.
758     if test x"$gxx_include_dir" = x"no"; then
759       gxx_include_dir='${libdir}/gcc/${host_alias}/${gcc_version}/include/c++'
760     fi
761     glibcxx_toolexecdir='${libdir}/gcc/${host_alias}'
762     glibcxx_toolexeclibdir='${toolexecdir}/${gcc_version}$(MULTISUBDIR)'
763   fi
765   # Calculate glibcxx_toolexecdir, glibcxx_toolexeclibdir
766   # Install a library built with a cross compiler in tooldir, not libdir.
767   if test x"$glibcxx_toolexecdir" = x"no"; then
768     if test -n "$with_cross_host" &&
769        test x"$with_cross_host" != x"no"; then
770       glibcxx_toolexecdir='${exec_prefix}/${host_alias}'
771       case ${with_toolexeclibdir} in
772         no)
773           glibcxx_toolexeclibdir='${toolexecdir}/lib'
774           ;;
775         *)
776           glibcxx_toolexeclibdir=${with_toolexeclibdir}
777           ;;
778       esac
779     else
780       glibcxx_toolexecdir='${libdir}/gcc/${host_alias}'
781       glibcxx_toolexeclibdir='${libdir}'
782     fi
783     multi_os_directory=`$CXX -print-multi-os-directory`
784     case $multi_os_directory in
785       .) ;; # Avoid trailing /.
786       *) glibcxx_toolexeclibdir=$glibcxx_toolexeclibdir/$multi_os_directory ;;
787     esac
788   fi
790   AC_MSG_CHECKING([for install location])
791   AC_MSG_RESULT($gxx_include_dir)
793   AC_SUBST(glibcxx_prefixdir)
794   AC_SUBST(gxx_include_dir)
795   AC_SUBST(glibcxx_toolexecdir)
796   AC_SUBST(glibcxx_toolexeclibdir)
801 dnl GLIBCXX_ENABLE
802 dnl    (FEATURE, DEFAULT, HELP-ARG, HELP-STRING)
803 dnl    (FEATURE, DEFAULT, HELP-ARG, HELP-STRING, permit a|b|c)
804 dnl    (FEATURE, DEFAULT, HELP-ARG, HELP-STRING, SHELL-CODE-HANDLER)
806 dnl See manual/appendix_porting.html#appendix.porting.build_hacking for
807 dnl documentation.
809 m4_define([GLIBCXX_ENABLE],[dnl
810 m4_define([_g_switch],[--enable-$1])dnl
811 m4_define([_g_help],[AC_HELP_STRING([_g_switch$3],[$4 @<:@default=$2@:>@])])dnl
812  AC_ARG_ENABLE([$1],m4_dquote(_g_help),
813   m4_bmatch([$5],
814    [^permit ],
815      [[
816       case "$enableval" in
817        m4_bpatsubst([$5],[permit ])) ;;
818        *) AC_MSG_ERROR(Unknown argument to enable/disable $1) ;;
819           dnl Idea for future:  generate a URL pointing to
820           dnl "onlinedocs/configopts.html#whatever"
821       esac
822      ]],
823    [^$],
824      [[
825       case "$enableval" in
826        yes|no) ;;
827        *) AC_MSG_ERROR(Argument to enable/disable $1 must be yes or no) ;;
828       esac
829      ]],
830    [[$5]]),
831   [enable_]m4_bpatsubst([$1],-,_)[=][$2])
832 m4_undefine([_g_switch])dnl
833 m4_undefine([_g_help])dnl
838 dnl Check for ISO/IEC 9899:1999 "C99" support.
840 dnl --enable-c99 defines _GLIBCXX_USE_C99
841 dnl --disable-c99 leaves _GLIBCXX_USE_C99 undefined
842 dnl  +  Usage:  GLIBCXX_ENABLE_C99[(DEFAULT)]
843 dnl       Where DEFAULT is either `yes' or `no'.
844 dnl  +  If 'C99' stuff is not available, ignores DEFAULT and sets `no'.
846 AC_DEFUN([GLIBCXX_ENABLE_C99], [
847   GLIBCXX_ENABLE(c99,$1,,[turns on ISO/IEC 9899:1999 support])
849   if test x"$enable_c99" = x"yes"; then
850     AC_LANG_SAVE
851     AC_LANG_CPLUSPLUS
853     # Use -std=c++98 (instead of -std=gnu++98) because leaving __STRICT_ANSI__
854     # undefined may cause fake C99 facilities, like pre-standard snprintf,
855     # to be spuriously enabled.
856     ac_save_CXXFLAGS="$CXXFLAGS"
857     CXXFLAGS="$CXXFLAGS -std=c++98"
858     ac_save_LIBS="$LIBS"
859     ac_save_gcc_no_link="$gcc_no_link"
861     if test x$gcc_no_link != xyes; then
862       # Use -fno-exceptions to that the C driver can link these tests without
863       # hitting undefined references to personality routines.
864       CXXFLAGS="$CXXFLAGS -fno-exceptions"
865       AC_CHECK_LIB(m, sin, [LIBS="$LIBS -lm"], [
866         # Use the default compile-only tests in GCC_TRY_COMPILE_OR_LINK
867         gcc_no_link=yes
868       ])
869     fi
871     # Check for the existence of <math.h> functions used if C99 is enabled.
872     AC_CACHE_CHECK([for ISO C99 support in <math.h> for C++98],
873       glibcxx_cv_c99_math_cxx98, [
874       GCC_TRY_COMPILE_OR_LINK(
875         [#include <math.h>
876          volatile double d1, d2;
877          volatile int i;],
878         [i = fpclassify(d1);
879          i = isfinite(d1);
880          i = isinf(d1);
881          i = isnan(d1);
882          i = isnormal(d1);
883          i = signbit(d1);
884          i = isgreater(d1, d2);
885          i = isgreaterequal(d1, d2);
886          i = isless(d1, d2);
887          i = islessequal(d1, d2);
888          i = islessgreater(d1, d2);
889          i = islessgreater(d1, d2);
890          i = isunordered(d1, d2);
891         ], [glibcxx_cv_c99_math_cxx98=yes], [glibcxx_cv_c99_math_cxx98=no])
892     ])
893     if test x"$glibcxx_cv_c99_math_cxx98" = x"yes"; then
894       AC_DEFINE(_GLIBCXX98_USE_C99_MATH, 1,
895         [Define if C99 functions or macros in <math.h> should be imported
896         in <cmath> in namespace std for C++98.])
897     fi
899     # Check for the existence of <complex.h> complex math functions.
900     # This is necessary even though libstdc++ uses the builtin versions
901     # of these functions, because if the builtin cannot be used, a reference
902     # to the library function is emitted.
903     AC_CHECK_HEADERS(tgmath.h, ac_has_tgmath_h=yes, ac_has_tgmath_h=no)
904     AC_CHECK_HEADERS(complex.h, ac_has_complex_h=yes, ac_has_complex_h=no)
905     if test x"$ac_has_complex_h" = x"yes"; then
906       AC_CACHE_CHECK([for ISO C99 support in <complex.h> for C++98],
907         glibcxx_cv_c99_complex_cxx98, [
908         GCC_TRY_COMPILE_OR_LINK(
909           [#include <complex.h>
910            typedef __complex__ float float_type;
911            typedef __complex__ double double_type;
912            typedef __complex__ long double ld_type;
913            volatile float_type tmpf;
914            volatile double_type tmpd;
915            volatile ld_type tmpld;
916            volatile float f;
917            volatile double d;
918            volatile long double ld;],
919           [f = cabsf(tmpf);
920            f = cargf(tmpf);
921            tmpf = ccosf(tmpf);
922            tmpf = ccoshf(tmpf);
923            tmpf = cexpf(tmpf);
924            tmpf = clogf(tmpf);
925            tmpf = csinf(tmpf);
926            tmpf = csinhf(tmpf);
927            tmpf = csqrtf(tmpf);
928            tmpf = ctanf(tmpf);
929            tmpf = ctanhf(tmpf);
930            tmpf = cpowf(tmpf, tmpf);
931            tmpf = cprojf(tmpf);
932            d = cabs(tmpd);
933            d = carg(tmpd);
934            tmpd = ccos(tmpd);
935            tmpd = ccosh(tmpd);
936            tmpd = cexp(tmpd);
937            tmpd = clog(tmpd);
938            tmpd = csin(tmpd);
939            tmpd = csinh(tmpd);
940            tmpd = csqrt(tmpd);
941            tmpd = ctan(tmpd);
942            tmpd = ctanh(tmpd);
943            tmpd = cpow(tmpd, tmpd);
944            tmpd = cproj(tmpd);
945            ld = cabsl(tmpld);
946            ld = cargl(tmpld);
947            tmpld = ccosl(tmpld);
948            tmpld = ccoshl(tmpld);
949            tmpld = cexpl(tmpld);
950            tmpld = clogl(tmpld);
951            tmpld = csinl(tmpld);
952            tmpld = csinhl(tmpld);
953            tmpld = csqrtl(tmpld);
954            tmpld = ctanl(tmpld);
955            tmpld = ctanhl(tmpld);
956            tmpld = cpowl(tmpld, tmpld);
957            tmpld = cprojl(tmpld);
958           ], [glibcxx_cv_c99_complex_cxx98=yes], [glibcxx_cv_c99_complex_cxx98=no])
959       ])
960     fi
961     if test x"$glibcxx_cv_c99_complex_cxx98" = x"yes"; then
962       AC_DEFINE(_GLIBCXX98_USE_C99_COMPLEX, 1,
963         [Define if C99 functions in <complex.h> should be used in
964         <complex> for C++98. Using compiler builtins for these functions
965         requires corresponding C99 library functions to be present.])
966     fi
968     # Check for the existence in <stdio.h> of vscanf, et. al.
969     AC_CACHE_CHECK([for ISO C99 support in <stdio.h> for C++98],
970       glibcxx_cv_c99_stdio_cxx98, [
971       GCC_TRY_COMPILE_OR_LINK(
972         [#include <stdio.h>
973          #include <stdarg.h>
974          void foo(char* fmt, ...)
975          {
976            va_list args; va_start(args, fmt);
977            vfscanf(stderr, "%i", args);
978            vscanf("%i", args);
979            vsnprintf(fmt, 0, "%i", args);
980            vsscanf(fmt, "%i", args);
981            snprintf(fmt, 0, "%i");
982          }], [],
983         [glibcxx_cv_c99_stdio_cxx98=yes], [glibcxx_cv_c99_stdio_cxx98=no])
984     ])
985     if test x"$glibcxx_cv_c99_stdio_cxx98" = x"yes"; then
986       AC_DEFINE(_GLIBCXX98_USE_C99_STDIO, 1,
987         [Define if C99 functions or macros in <stdio.h> should be imported
988         in <cstdio> in namespace std for C++98.])
989     fi
991     # Check for the existence in <stdlib.h> of lldiv_t, et. al.
992     AC_CACHE_CHECK([for ISO C99 support in <stdlib.h> for C++98],
993       glibcxx_cv_c99_stdlib_cxx98, [
994       GCC_TRY_COMPILE_OR_LINK(
995         [#include <stdlib.h>
996          volatile float f;
997          volatile long double ld;
998          volatile unsigned long long ll;
999          lldiv_t mydivt;],
1000         [char* tmp;
1001          f = strtof("gnu", &tmp);
1002          ld = strtold("gnu", &tmp);
1003          ll = strtoll("gnu", &tmp, 10);
1004          ll = strtoull("gnu", &tmp, 10);
1005          ll = llabs(10);
1006          mydivt = lldiv(10,1);
1007          ll = mydivt.quot;
1008          ll = mydivt.rem;
1009          ll = atoll("10");
1010          _Exit(0);
1011         ], [glibcxx_cv_c99_stdlib_cxx98=yes], [glibcxx_cv_c99_stdlib_cxx98=no])
1012     ])
1013     if test x"$glibcxx_cv_c99_stdlib_cxx98" = x"yes"; then
1014       AC_DEFINE(_GLIBCXX98_USE_C99_STDLIB, 1,
1015         [Define if C99 functions or macros in <stdlib.h> should be imported
1016         in <cstdlib> in namespace std for C++98.])
1017     fi
1019     # Check for the existence in <wchar.h> of wcstold, etc.
1020     if test x"$ac_has_wchar_h" = xyes &&
1021        test x"$ac_has_wctype_h" = xyes; then
1022       AC_CACHE_CHECK([for ISO C99 support in <wchar.h> for C++98],
1023         glibcxx_cv_c99_wchar_cxx98, [
1024         AC_TRY_COMPILE([#include <wchar.h>
1025           namespace test
1026           {
1027             using ::wcstold;
1028             using ::wcstoll;
1029             using ::wcstoull;
1030           }
1031         ], [], [glibcxx_cv_c99_wchar_cxx98=yes], [glibcxx_cv_c99_wchar_cxx98=no])
1032       ])
1034       # Checks for wide character functions that may not be present.
1035       # Injection of these is wrapped with guard macros.
1036       # NB: only put functions here, instead of immediately above, if
1037       # absolutely necessary.
1038       AC_TRY_COMPILE([#include <wchar.h>
1039         namespace test { using ::vfwscanf; }], [],
1040         [AC_DEFINE(HAVE_VFWSCANF, 1, [Defined if vfwscanf exists.])], [])
1042       AC_TRY_COMPILE([#include <wchar.h>
1043         namespace test { using ::vswscanf; }], [],
1044         [AC_DEFINE(HAVE_VSWSCANF, 1, [Defined if vswscanf exists.])], [])
1046       AC_TRY_COMPILE([#include <wchar.h>
1047         namespace test { using ::vwscanf; }], [],
1048         [AC_DEFINE(HAVE_VWSCANF, 1, [Defined if vwscanf exists.])], [])
1050       AC_TRY_COMPILE([#include <wchar.h>
1051         namespace test { using ::wcstof; }], [],
1052         [AC_DEFINE(HAVE_WCSTOF, 1, [Defined if wcstof exists.])], [])
1054       AC_TRY_COMPILE([#include <wctype.h>],
1055         [wint_t t; int i = iswblank(t);],
1056         [AC_DEFINE(HAVE_ISWBLANK, 1, [Defined if iswblank exists.])], [])
1058       if test x"$glibcxx_cv_c99_wchar_cxx98" = x"yes"; then
1059         AC_DEFINE(_GLIBCXX98_USE_C99_WCHAR, 1,
1060           [Define if C99 functions or macros in <wchar.h> should be imported
1061           in <cwchar> in namespace std for C++98.])
1062       fi
1063     fi
1065     # Option parsed, now set things appropriately.
1066     if test x"$glibcxx_cv_c99_math_cxx98" = x"no" ||
1067        test x"$glibcxx_cv_c99_complex_cxx98" = x"no" ||
1068        test x"$glibcxx_cv_c99_stdio_cxx98" = x"no" ||
1069        test x"$glibcxx_cv_c99_stdlib_cxx98" = x"no" ||
1070        test x"$glibcxx_cv_c99_wchar_cxx98" = x"no"; then
1071       enable_c99=no;
1072     else
1073       AC_DEFINE(_GLIBCXX_USE_C99, 1,
1074         [Define if C99 functions or macros from <wchar.h>, <math.h>,
1075         <complex.h>, <stdio.h>, and <stdlib.h> can be used or exposed.])
1076     fi
1078     gcc_no_link="$ac_save_gcc_no_link"
1079     LIBS="$ac_save_LIBS"
1080     CXXFLAGS="$ac_save_CXXFLAGS"
1081     AC_LANG_RESTORE
1083     AC_LANG_SAVE
1084     AC_LANG_CPLUSPLUS
1086     # Use -std=c++11 and test again for C99 library feature in C++11 mode.
1087     # For the reasons given above we use -std=c++11 not -std=gnu++11.
1088     ac_save_CXXFLAGS="$CXXFLAGS"
1089     CXXFLAGS="$CXXFLAGS -std=c++11"
1090     ac_save_LIBS="$LIBS"
1091     ac_save_gcc_no_link="$gcc_no_link"
1093     if test x$gcc_no_link != xyes; then
1094       # Use -fno-exceptions to that the C driver can link these tests without
1095       # hitting undefined references to personality routines.
1096       CXXFLAGS="$CXXFLAGS -fno-exceptions"
1097       AC_CHECK_LIB(m, sin, [LIBS="$LIBS -lm"], [
1098         # Use the default compile-only tests in GCC_TRY_COMPILE_OR_LINK
1099         gcc_no_link=yes
1100       ])
1101     fi
1103     # Check for the existence of <math.h> functions used if C99 is enabled.
1104     AC_CACHE_CHECK([for ISO C99 support in <math.h> for C++11],
1105     glibcxx_cv_c99_math_cxx11, [
1106       GCC_TRY_COMPILE_OR_LINK(
1107         [#include <math.h>
1108          volatile double d1, d2;
1109          volatile int i;],
1110         [i = fpclassify(d1);
1111          i = isfinite(d1);
1112          i = isinf(d1);
1113          i = isnan(d1);
1114          i = isnormal(d1);
1115          i = signbit(d1);
1116          i = isgreater(d1, d2);
1117          i = isgreaterequal(d1, d2);
1118          i = isless(d1, d2);
1119          i = islessequal(d1, d2);
1120          i = islessgreater(d1, d2);
1121          i = islessgreater(d1, d2);
1122          i = isunordered(d1, d2);
1123         ], [glibcxx_cv_c99_math_cxx11=yes], [glibcxx_cv_c99_math_cxx11=no])
1124     ])
1125     if test x"$glibcxx_cv_c99_math_cxx11" = x"yes"; then
1126       AC_DEFINE(_GLIBCXX11_USE_C99_MATH, 1,
1127         [Define if C99 functions or macros in <math.h> should be imported
1128         in <cmath> in namespace std for C++11.])
1129     fi
1131     # Check for the existence of <complex.h> complex math functions.
1132     # This is necessary even though libstdc++ uses the builtin versions
1133     # of these functions, because if the builtin cannot be used, a reference
1134     # to the library function is emitted.
1135     AC_CHECK_HEADERS(tgmath.h, ac_has_tgmath_h=yes, ac_has_tgmath_h=no)
1136     AC_CHECK_HEADERS(complex.h, ac_has_complex_h=yes, ac_has_complex_h=no)
1137     if test x"$ac_has_complex_h" = x"yes"; then
1138       AC_CACHE_CHECK([for ISO C99 support in <complex.h> for C++11],
1139         glibcxx_cv_c99_complex_cxx11, [
1140         GCC_TRY_COMPILE_OR_LINK(
1141           [#include <complex.h>
1142            typedef __complex__ float float_type;
1143            typedef __complex__ double double_type;
1144            typedef __complex__ long double ld_type;
1145            volatile float_type tmpf;
1146            volatile double_type tmpd;
1147            volatile ld_type tmpld;
1148            volatile float f;
1149            volatile double d;
1150            volatile long double ld;],
1151           [f = cabsf(tmpf);
1152            f = cargf(tmpf);
1153            tmpf = ccosf(tmpf);
1154            tmpf = ccoshf(tmpf);
1155            tmpf = cexpf(tmpf);
1156            tmpf = clogf(tmpf);
1157            tmpf = csinf(tmpf);
1158            tmpf = csinhf(tmpf);
1159            tmpf = csqrtf(tmpf);
1160            tmpf = ctanf(tmpf);
1161            tmpf = ctanhf(tmpf);
1162            tmpf = cpowf(tmpf, tmpf);
1163            tmpf = cprojf(tmpf);
1164            d = cabs(tmpd);
1165            d = carg(tmpd);
1166            tmpd = ccos(tmpd);
1167            tmpd = ccosh(tmpd);
1168            tmpd = cexp(tmpd);
1169            tmpd = clog(tmpd);
1170            tmpd = csin(tmpd);
1171            tmpd = csinh(tmpd);
1172            tmpd = csqrt(tmpd);
1173            tmpd = ctan(tmpd);
1174            tmpd = ctanh(tmpd);
1175            tmpd = cpow(tmpd, tmpd);
1176            tmpd = cproj(tmpd);
1177            ld = cabsl(tmpld);
1178            ld = cargl(tmpld);
1179            tmpld = ccosl(tmpld);
1180            tmpld = ccoshl(tmpld);
1181            tmpld = cexpl(tmpld);
1182            tmpld = clogl(tmpld);
1183            tmpld = csinl(tmpld);
1184            tmpld = csinhl(tmpld);
1185            tmpld = csqrtl(tmpld);
1186            tmpld = ctanl(tmpld);
1187            tmpld = ctanhl(tmpld);
1188            tmpld = cpowl(tmpld, tmpld);
1189            tmpld = cprojl(tmpld);
1190           ], [glibcxx_cv_c99_complex_cxx11=yes], [glibcxx_cv_c99_complex_cxx11=no])
1191       ])
1192     fi
1193     if test x"$glibcxx_cv_c99_complex_cxx11" = x"yes"; then
1194       AC_DEFINE(_GLIBCXX11_USE_C99_COMPLEX, 1,
1195         [Define if C99 functions in <complex.h> should be used in
1196         <complex> for C++11. Using compiler builtins for these functions
1197         requires corresponding C99 library functions to be present.])
1198     fi
1200     # Check for the existence in <stdio.h> of vscanf, et. al.
1201     AC_CACHE_CHECK([for ISO C99 support in <stdio.h> for C++11],
1202       glibcxx_cv_c99_stdio_cxx11, [
1203       GCC_TRY_COMPILE_OR_LINK(
1204         [#include <stdio.h>
1205          #include <stdarg.h>
1206          void foo(char* fmt, ...)
1207          {
1208            va_list args; va_start(args, fmt);
1209            vfscanf(stderr, "%i", args);
1210            vscanf("%i", args);
1211            vsnprintf(fmt, 0, "%i", args);
1212            vsscanf(fmt, "%i", args);
1213            snprintf(fmt, 0, "%i");
1214          }], [],
1215         [glibcxx_cv_c99_stdio_cxx11=yes], [glibcxx_cv_c99_stdio_cxx11=no])
1216     ])
1217     if test x"$glibcxx_cv_c99_stdio_cxx11" = x"yes"; then
1218       AC_DEFINE(_GLIBCXX11_USE_C99_STDIO, 1,
1219         [Define if C99 functions or macros in <stdio.h> should be imported
1220         in <cstdio> in namespace std for C++11.])
1221     fi
1223     # Check for the existence in <stdlib.h> of lldiv_t, et. al.
1224     AC_CACHE_CHECK([for ISO C99 support in <stdlib.h> for C++11],
1225       glibcxx_cv_c99_stdlib_cxx11, [
1226       GCC_TRY_COMPILE_OR_LINK(
1227         [#include <stdlib.h>
1228          volatile float f;
1229          volatile long double ld;
1230          volatile unsigned long long ll;
1231          lldiv_t mydivt;],
1232         [char* tmp;
1233          f = strtof("gnu", &tmp);
1234          ld = strtold("gnu", &tmp);
1235          ll = strtoll("gnu", &tmp, 10);
1236          ll = strtoull("gnu", &tmp, 10);
1237          ll = llabs(10);
1238          mydivt = lldiv(10,1);
1239          ll = mydivt.quot;
1240          ll = mydivt.rem;
1241          ll = atoll("10");
1242          _Exit(0);
1243         ], [glibcxx_cv_c99_stdlib_cxx11=yes], [glibcxx_cv_c99_stdlib_cxx11=no])
1244     ])
1245     if test x"$glibcxx_cv_c99_stdlib_cxx11" = x"yes"; then
1246       AC_DEFINE(_GLIBCXX11_USE_C99_STDLIB, 1,
1247         [Define if C99 functions or macros in <stdlib.h> should be imported
1248         in <cstdlib> in namespace std for C++11.])
1249     fi
1251     # Check for the existence in <wchar.h> of wcstold, etc.
1252     if test x"$ac_has_wchar_h" = xyes &&
1253        test x"$ac_has_wctype_h" = xyes; then
1254       AC_CACHE_CHECK([for ISO C99 support in <wchar.h> for C++11],
1255         glibcxx_cv_c99_wchar_cxx11, [
1256         AC_TRY_COMPILE([#include <wchar.h>
1257           namespace test
1258           {
1259             using ::wcstold;
1260             using ::wcstoll;
1261             using ::wcstoull;
1262           }
1263         ], [], [glibcxx_cv_c99_wchar_cxx11=yes], [glibcxx_cv_c99_wchar_cxx11=no])
1264       ])
1266       # Checks for wide character functions that may not be present.
1267       # Injection of these is wrapped with guard macros.
1268       # NB: only put functions here, instead of immediately above, if
1269       # absolutely necessary.
1270       AC_TRY_COMPILE([#include <wchar.h>
1271         namespace test { using ::vfwscanf; }], [],
1272         [AC_DEFINE(HAVE_VFWSCANF, 1, [Defined if vfwscanf exists.])], [])
1274       AC_TRY_COMPILE([#include <wchar.h>
1275         namespace test { using ::vswscanf; }], [],
1276         [AC_DEFINE(HAVE_VSWSCANF, 1, [Defined if vswscanf exists.])], [])
1278       AC_TRY_COMPILE([#include <wchar.h>
1279         namespace test { using ::vwscanf; }], [],
1280         [AC_DEFINE(HAVE_VWSCANF, 1, [Defined if vwscanf exists.])], [])
1282       AC_TRY_COMPILE([#include <wchar.h>
1283         namespace test { using ::wcstof; }], [],
1284         [AC_DEFINE(HAVE_WCSTOF, 1, [Defined if wcstof exists.])], [])
1286       AC_TRY_COMPILE([#include <wctype.h>],
1287         [wint_t t; int i = iswblank(t);],
1288         [AC_DEFINE(HAVE_ISWBLANK, 1, [Defined if iswblank exists.])], [])
1290       if test x"$glibcxx_cv_c99_wchar_cxx11" = x"yes"; then
1291         AC_DEFINE(_GLIBCXX11_USE_C99_WCHAR, 1,
1292           [Define if C99 functions or macros in <wchar.h> should be imported
1293           in <cwchar> in namespace std for C++11.])
1294       fi
1295     fi
1297     gcc_no_link="$ac_save_gcc_no_link"
1298     LIBS="$ac_save_LIBS"
1299     CXXFLAGS="$ac_save_CXXFLAGS"
1300     AC_LANG_RESTORE
1301   fi
1303   AC_MSG_CHECKING([for fully enabled ISO C99 support])
1304   AC_MSG_RESULT($enable_c99)
1309 dnl Check for clock_gettime, nanosleep and sched_yield, used in the
1310 dnl implementation of 20.11.7 [time.clock], and 30.3.2 [thread.thread.this]
1311 dnl in the C++11 standard.
1313 dnl --enable-libstdcxx-time
1314 dnl --enable-libstdcxx-time=yes
1315 dnl        checks for the availability of monotonic and realtime clocks,
1316 dnl        nanosleep and sched_yield in libc.
1317 dnl --enable-libstdcxx-time=rt
1318 dnl        also searches (and, if needed, links) librt.  Note that this is
1319 dnl        not always desirable because, in glibc 2.16 and earlier, for
1320 dnl        example, in turn it triggers the linking of libpthread too,
1321 dnl        which activates locking,
1322 dnl        a large overhead for single-thread programs.
1323 dnl --enable-libstdcxx-time=no
1324 dnl --disable-libstdcxx-time
1325 dnl        disables the checks completely
1327 dnl N.B. Darwin provides nanosleep but doesn't support the whole POSIX
1328 dnl Timers option, so doesn't define _POSIX_TIMERS. Because the test
1329 dnl below fails Darwin unconditionally defines _GLIBCXX_USE_NANOSLEEP in
1330 dnl os_defines.h and also defines _GLIBCXX_USE_SCHED_YIELD.
1332 AC_DEFUN([GLIBCXX_ENABLE_LIBSTDCXX_TIME], [
1334   GLIBCXX_ENABLE(libstdcxx-time,auto,[[[=KIND]]],
1335     [use KIND for check type],
1336     [permit yes|no|rt])
1338   AC_LANG_SAVE
1339   AC_LANG_CPLUSPLUS
1340   ac_save_CXXFLAGS="$CXXFLAGS"
1341   CXXFLAGS="$CXXFLAGS -fno-exceptions"
1342   ac_save_LIBS="$LIBS"
1344   ac_has_clock_monotonic=no
1345   ac_has_clock_realtime=no
1346   ac_has_nanosleep=no
1347   ac_has_sched_yield=no
1349   if test x"$enable_libstdcxx_time" = x"auto"; then
1351     case "${target_os}" in
1352       cygwin*)
1353         ac_has_nanosleep=yes
1354         ;;
1355       darwin*)
1356         ac_has_nanosleep=yes
1357         ac_has_sched_yield=yes
1358         ;;
1359       # VxWorks has nanosleep as soon as the kernel is configured with
1360       # INCLUDE_POSIX_TIMERS, which is normally/most-often the case.
1361       vxworks*)
1362         ac_has_nanosleep=yes
1363         ;;
1364       gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu)
1365         # Don't use link test for freestanding library, in case gcc_no_link=yes
1366         if test x"$is_hosted" = xyes; then
1367           # Versions of glibc before 2.17 needed -lrt for clock_gettime.
1368           AC_SEARCH_LIBS(clock_gettime, [rt])
1369           if test x"$ac_cv_search_clock_gettime" = x"none required"; then
1370             ac_has_clock_monotonic=yes
1371             ac_has_clock_realtime=yes
1372           fi
1373         fi
1374         ac_has_nanosleep=yes
1375         ac_has_sched_yield=yes
1376         ;;
1377       freebsd*|netbsd*|dragonfly*|rtems*)
1378         ac_has_clock_monotonic=yes
1379         ac_has_clock_realtime=yes
1380         ac_has_nanosleep=yes
1381         ac_has_sched_yield=yes
1382         ;;
1383       openbsd*)
1384         ac_has_clock_monotonic=yes
1385         ac_has_clock_realtime=yes
1386         ac_has_nanosleep=yes
1387         ;;
1388       solaris*)
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       uclinux*)
1395         ac_has_nanosleep=yes
1396         ac_has_sched_yield=yes
1397     esac
1399   elif test x"$enable_libstdcxx_time" != x"no"; then
1401     if test x"$enable_libstdcxx_time" = x"rt"; then
1402       AC_SEARCH_LIBS(clock_gettime, [rt])
1403       AC_SEARCH_LIBS(nanosleep, [rt])
1404     else
1405       AC_CHECK_FUNC(clock_gettime)
1406       AC_CHECK_FUNC(nanosleep)
1407     fi
1409     case "$ac_cv_search_clock_gettime" in
1410       -l*) GLIBCXX_LIBS=$ac_cv_search_clock_gettime
1411       ;;
1412     esac
1413     case "$ac_cv_search_nanosleep" in
1414       -l*) GLIBCXX_LIBS="$GLIBCXX_LIBS $ac_cv_search_nanosleep"
1415       ;;
1416     esac
1418     AC_SEARCH_LIBS(sched_yield, [rt])
1420     case "$ac_cv_search_sched_yield" in
1421       -lrt*)
1422       if test x"$enable_libstdcxx_time" = x"rt"; then
1423         GLIBCXX_LIBS="$GLIBCXX_LIBS $ac_cv_search_sched_yield"
1424         ac_has_sched_yield=yes
1425       fi
1426       ;;
1427       *)
1428       ac_has_sched_yield=yes
1429       ;;
1430     esac
1432     AC_CHECK_HEADERS(unistd.h, ac_has_unistd_h=yes, ac_has_unistd_h=no)
1434     if test x"$ac_has_unistd_h" = x"yes"; then
1435       AC_MSG_CHECKING([for monotonic clock])
1436       AC_TRY_LINK(
1437         [#include <unistd.h>
1438          #include <time.h>
1439         ],
1440         [#if _POSIX_TIMERS > 0 && defined(_POSIX_MONOTONIC_CLOCK)
1441           timespec tp;
1442          #endif
1443           clock_gettime(CLOCK_MONOTONIC, &tp);
1444         ], [ac_has_clock_monotonic=yes], [ac_has_clock_monotonic=no])
1446       AC_MSG_RESULT($ac_has_clock_monotonic)
1448       AC_MSG_CHECKING([for realtime clock])
1449       AC_TRY_LINK(
1450         [#include <unistd.h>
1451          #include <time.h>
1452         ],
1453         [#if _POSIX_TIMERS > 0
1454           timespec tp;
1455          #endif
1456           clock_gettime(CLOCK_REALTIME, &tp);
1457         ], [ac_has_clock_realtime=yes], [ac_has_clock_realtime=no])
1459       AC_MSG_RESULT($ac_has_clock_realtime)
1461       AC_MSG_CHECKING([for nanosleep])
1462       AC_TRY_LINK(
1463         [#include <unistd.h>
1464          #include <time.h>
1465         ],
1466         [#if _POSIX_TIMERS > 0
1467           timespec tp;
1468          #endif
1469           nanosleep(&tp, 0);
1470         ], [ac_has_nanosleep=yes], [ac_has_nanosleep=no])
1472       AC_MSG_RESULT($ac_has_nanosleep)
1473     fi
1474   fi
1476   if test x"$ac_has_clock_monotonic" != x"yes"; then
1477     case ${target_os} in
1478       linux* | uclinux*)
1479         AC_MSG_CHECKING([for clock_gettime syscall])
1480         AC_TRY_COMPILE(
1481           [#include <unistd.h>
1482            #include <time.h>
1483            #include <sys/syscall.h>
1484           ],
1485           [#if _POSIX_TIMERS > 0 && defined(_POSIX_MONOTONIC_CLOCK)
1486             timespec tp;
1487            #endif
1488            syscall(SYS_clock_gettime, CLOCK_MONOTONIC, &tp);
1489            syscall(SYS_clock_gettime, CLOCK_REALTIME, &tp);
1490           ], [ac_has_clock_gettime_syscall=yes], [ac_has_clock_gettime_syscall=no])
1491         AC_MSG_RESULT($ac_has_clock_gettime_syscall)
1492         if test x"$ac_has_clock_gettime_syscall" = x"yes"; then
1493           AC_DEFINE(_GLIBCXX_USE_CLOCK_GETTIME_SYSCALL, 1,
1494           [Defined if clock_gettime syscall has monotonic and realtime clock support. ])
1495           ac_has_clock_monotonic=yes
1496           ac_has_clock_realtime=yes
1497           AC_MSG_CHECKING([for struct timespec that matches syscall])
1498           AC_TRY_COMPILE(
1499             [#include <time.h>
1500              #include <sys/syscall.h>
1501             ],
1502             [#ifdef SYS_clock_gettime64
1503              #if SYS_clock_gettime64 != SYS_clock_gettime
1504              // We need to use SYS_clock_gettime and libc appears to
1505              // also know about the SYS_clock_gettime64 syscall.
1506              // Check that userspace doesn't use time64 version of timespec.
1507              static_assert(sizeof(timespec::tv_sec) == sizeof(long),
1508                "struct timespec must be compatible with SYS_clock_gettime");
1509              #endif
1510              #endif
1511             ],
1512             [ac_timespec_matches_syscall=yes],
1513             [ac_timespec_matches_syscall=no])
1514           AC_MSG_RESULT($ac_timespec_matches_syscall)
1515           if test x"$ac_timespec_matches_syscall" = no; then
1516             AC_MSG_ERROR([struct timespec is not compatible with SYS_clock_gettime, please report a bug to http://gcc.gnu.org/bugzilla])
1517           fi
1518         fi;;
1519     esac
1520   fi
1522   if test x"$ac_has_clock_monotonic" = x"yes"; then
1523     AC_DEFINE(_GLIBCXX_USE_CLOCK_MONOTONIC, 1,
1524       [ Defined if clock_gettime has monotonic clock support. ])
1525   fi
1527   if test x"$ac_has_clock_realtime" = x"yes"; then
1528     AC_DEFINE(_GLIBCXX_USE_CLOCK_REALTIME, 1,
1529       [ Defined if clock_gettime has realtime clock support. ])
1530   fi
1532   if test x"$ac_has_sched_yield" = x"yes"; then
1533     AC_DEFINE(_GLIBCXX_USE_SCHED_YIELD, 1,
1534               [ Defined if sched_yield is available. ])
1535   fi
1537   if test x"$ac_has_nanosleep" = x"yes"; then
1538     AC_DEFINE(_GLIBCXX_USE_NANOSLEEP, 1,
1539       [ Defined if nanosleep is available. ])
1540   else
1541       AC_MSG_CHECKING([for sleep])
1542       AC_TRY_COMPILE([#include <unistd.h>],
1543                      [sleep(1)],
1544                      [ac_has_sleep=yes],[ac_has_sleep=no])
1545       if test x"$ac_has_sleep" = x"yes"; then
1546         AC_DEFINE(HAVE_SLEEP,1, [Defined if sleep exists.])
1547       fi
1548       AC_MSG_RESULT($ac_has_sleep)
1549       AC_MSG_CHECKING([for usleep])
1550       AC_TRY_COMPILE([#include <unistd.h>],
1551                      [sleep(1);
1552                       usleep(100);],
1553                      [ac_has_usleep=yes],[ac_has_usleep=no])
1554       if test x"$ac_has_usleep" = x"yes"; then
1555         AC_DEFINE(HAVE_USLEEP,1, [Defined if usleep exists.])
1556       fi
1557       AC_MSG_RESULT($ac_has_usleep)
1558   fi
1560   if test x"$ac_has_nanosleep$ac_has_sleep" = x"nono"; then
1561       ac_no_sleep=yes
1562       AC_MSG_CHECKING([for Sleep])
1563       AC_TRY_COMPILE([#include <windows.h>],
1564                      [Sleep(1)],
1565                      [ac_has_win32_sleep=yes],[ac_has_win32_sleep=no])
1566       if test x"$ac_has_win32_sleep" = x"yes"; then
1567         AC_DEFINE(HAVE_WIN32_SLEEP,1, [Defined if Sleep exists.])
1568         ac_no_sleep=no
1569       fi
1570       AC_MSG_RESULT($ac_has_win32_sleep)
1571   fi
1573   if test x"$ac_no_sleep" = x"yes"; then
1574     AC_DEFINE(_GLIBCXX_NO_SLEEP,1, [Defined if no way to sleep is available.])
1575   fi
1577   AC_SUBST(GLIBCXX_LIBS)
1579   CXXFLAGS="$ac_save_CXXFLAGS"
1580   LIBS="$ac_save_LIBS"
1581   AC_LANG_RESTORE
1585 dnl Check for gettimeofday, used in the implementation of 20.11.7
1586 dnl [time.clock] in the C++11 standard.
1588 AC_DEFUN([GLIBCXX_CHECK_GETTIMEOFDAY], [
1590   AC_MSG_CHECKING([for gettimeofday])
1592   AC_LANG_SAVE
1593   AC_LANG_CPLUSPLUS
1594   ac_save_CXXFLAGS="$CXXFLAGS"
1595   CXXFLAGS="$CXXFLAGS -fno-exceptions"
1597   ac_has_gettimeofday=no;
1598   AC_CHECK_HEADERS(sys/time.h, ac_has_sys_time_h=yes, ac_has_sys_time_h=no)
1599   if test x"$ac_has_sys_time_h" = x"yes"; then
1600     AC_MSG_CHECKING([for gettimeofday])
1601     GCC_TRY_COMPILE_OR_LINK([#include <sys/time.h>],
1602       [timeval tv; gettimeofday(&tv, 0);],
1603       [ac_has_gettimeofday=yes], [ac_has_gettimeofday=no])
1605     AC_MSG_RESULT($ac_has_gettimeofday)
1606   fi
1608   if test x"$ac_has_gettimeofday" = x"yes"; then
1609     AC_DEFINE(_GLIBCXX_USE_GETTIMEOFDAY, 1,
1610       [ Defined if gettimeofday is available. ])
1611   fi
1613   CXXFLAGS="$ac_save_CXXFLAGS"
1614   AC_LANG_RESTORE
1618 dnl Check for ISO/IEC 9899:1999 "C99" support to ISO/IEC DTR 19768 "TR1"
1619 dnl facilities in Chapter 8, "C compatibility".
1621 AC_DEFUN([GLIBCXX_CHECK_C99_TR1], [
1623   AC_LANG_SAVE
1624   AC_LANG_CPLUSPLUS
1626   # Use -std=c++98 because the default (-std=gnu++98) leaves __STRICT_ANSI__
1627   # undefined and fake C99 facilities may be spuriously enabled.
1628   ac_save_CXXFLAGS="$CXXFLAGS"
1629   CXXFLAGS="$CXXFLAGS -std=c++98"
1631   # Check for the existence of <complex.h> complex math functions used
1632   # by tr1/complex.
1633   AC_CHECK_HEADERS(complex.h, ac_has_complex_h=yes, ac_has_complex_h=no)
1634   ac_c99_complex_tr1=no;
1635   if test x"$ac_has_complex_h" = x"yes"; then
1636     AC_MSG_CHECKING([for ISO C99 support to TR1 in <complex.h>])
1637     AC_TRY_COMPILE([#include <complex.h>],
1638                    [typedef __complex__ float float_type; float_type tmpf;
1639                     cacosf(tmpf);
1640                     casinf(tmpf);
1641                     catanf(tmpf);
1642                     cacoshf(tmpf);
1643                     casinhf(tmpf);
1644                     catanhf(tmpf);
1645                     typedef __complex__ double double_type; double_type tmpd;
1646                     cacos(tmpd);
1647                     casin(tmpd);
1648                     catan(tmpd);
1649                     cacosh(tmpd);
1650                     casinh(tmpd);
1651                     catanh(tmpd);
1652                     typedef __complex__ long double ld_type; ld_type tmpld;
1653                     cacosl(tmpld);
1654                     casinl(tmpld);
1655                     catanl(tmpld);
1656                     cacoshl(tmpld);
1657                     casinhl(tmpld);
1658                     catanhl(tmpld);
1659                    ],[ac_c99_complex_tr1=yes], [ac_c99_complex_tr1=no])
1660   fi
1661   AC_MSG_RESULT($ac_c99_complex_tr1)
1662   if test x"$ac_c99_complex_tr1" = x"yes"; then
1663     AC_DEFINE(_GLIBCXX_USE_C99_COMPLEX_TR1, 1,
1664               [Define if C99 functions in <complex.h> should be used in
1665               <tr1/complex>. Using compiler builtins for these functions
1666               requires corresponding C99 library functions to be present.])
1667   fi
1669   # Check for the existence of <ctype.h> functions.
1670   AC_CACHE_CHECK([for ISO C99 support to TR1 in <ctype.h>],
1671   glibcxx_cv_c99_ctype_tr1, [
1672   AC_TRY_COMPILE([#include <ctype.h>],
1673                  [int ch;
1674                   int ret;
1675                   ret = isblank(ch);
1676                  ],[glibcxx_cv_c99_ctype_tr1=yes],
1677                    [glibcxx_cv_c99_ctype_tr1=no])
1678   ])
1679   if test x"$glibcxx_cv_c99_ctype_tr1" = x"yes"; then
1680     AC_DEFINE(_GLIBCXX_USE_C99_CTYPE_TR1, 1,
1681               [Define if C99 functions in <ctype.h> should be imported in
1682               <tr1/cctype> in namespace std::tr1.])
1683   fi
1685   # Check for the existence of <fenv.h> functions.
1686   AC_CHECK_HEADERS(fenv.h, ac_has_fenv_h=yes, ac_has_fenv_h=no)
1687   ac_c99_fenv_tr1=no;
1688   if test x"$ac_has_fenv_h" = x"yes"; then
1689     AC_MSG_CHECKING([for ISO C99 support to TR1 in <fenv.h>])
1690     AC_TRY_COMPILE([#include <fenv.h>],
1691                    [int except, mode;
1692                     fexcept_t* pflag;
1693                     fenv_t* penv;
1694                     int ret;
1695                     ret = feclearexcept(except);
1696                     ret = fegetexceptflag(pflag, except);
1697                     ret = feraiseexcept(except);
1698                     ret = fesetexceptflag(pflag, except);
1699                     ret = fetestexcept(except);
1700                     ret = fegetround();
1701                     ret = fesetround(mode);
1702                     ret = fegetenv(penv);
1703                     ret = feholdexcept(penv);
1704                     ret = fesetenv(penv);
1705                     ret = feupdateenv(penv);
1706                    ],[ac_c99_fenv_tr1=yes], [ac_c99_fenv_tr1=no])
1707     AC_MSG_RESULT($ac_c99_fenv_tr1)
1708   fi
1709   if test x"$ac_c99_fenv_tr1" = x"yes"; then
1710     AC_DEFINE(_GLIBCXX_USE_C99_FENV_TR1, 1,
1711               [Define if C99 functions in <fenv.h> should be imported in
1712               <tr1/cfenv> in namespace std::tr1.])
1713   fi
1715   # Check for the existence of <stdint.h> types.
1716   AC_CACHE_CHECK([for ISO C99 support to TR1 in <stdint.h>],
1717   glibcxx_cv_c99_stdint_tr1, [
1718   AC_TRY_COMPILE([#define __STDC_LIMIT_MACROS
1719                   #define __STDC_CONSTANT_MACROS
1720                   #include <stdint.h>],
1721                  [typedef int8_t          my_int8_t;
1722                   my_int8_t               i8 = INT8_MIN;
1723                   i8 = INT8_MAX;
1724                   typedef int16_t         my_int16_t;
1725                   my_int16_t              i16 = INT16_MIN;
1726                   i16 = INT16_MAX;
1727                   typedef int32_t         my_int32_t;
1728                   my_int32_t              i32 = INT32_MIN;
1729                   i32 = INT32_MAX;
1730                   typedef int64_t         my_int64_t;
1731                   my_int64_t              i64 = INT64_MIN;
1732                   i64 = INT64_MAX;
1733                   typedef int_fast8_t     my_int_fast8_t;
1734                   my_int_fast8_t          if8 = INT_FAST8_MIN;
1735                   if8 = INT_FAST8_MAX;
1736                   typedef int_fast16_t    my_int_fast16_t;
1737                   my_int_fast16_t         if16 = INT_FAST16_MIN;
1738                   if16 = INT_FAST16_MAX;
1739                   typedef int_fast32_t    my_int_fast32_t;
1740                   my_int_fast32_t         if32 = INT_FAST32_MIN;
1741                   if32 = INT_FAST32_MAX;
1742                   typedef int_fast64_t    my_int_fast64_t;
1743                   my_int_fast64_t         if64 = INT_FAST64_MIN;
1744                   if64 = INT_FAST64_MAX;
1745                   typedef int_least8_t    my_int_least8_t;
1746                   my_int_least8_t         il8 = INT_LEAST8_MIN;
1747                   il8 = INT_LEAST8_MAX;
1748                   typedef int_least16_t   my_int_least16_t;
1749                   my_int_least16_t        il16 = INT_LEAST16_MIN;
1750                   il16 = INT_LEAST16_MAX;
1751                   typedef int_least32_t   my_int_least32_t;
1752                   my_int_least32_t        il32 = INT_LEAST32_MIN;
1753                   il32 = INT_LEAST32_MAX;
1754                   typedef int_least64_t   my_int_least64_t;
1755                   my_int_least64_t        il64 = INT_LEAST64_MIN;
1756                   il64 = INT_LEAST64_MAX;
1757                   typedef intmax_t        my_intmax_t;
1758                   my_intmax_t             im = INTMAX_MAX;
1759                   im = INTMAX_MIN;
1760                   typedef intptr_t        my_intptr_t;
1761                   my_intptr_t             ip = INTPTR_MAX;
1762                   ip = INTPTR_MIN;
1763                   typedef uint8_t         my_uint8_t;
1764                   my_uint8_t              ui8 = UINT8_MAX;
1765                   ui8 = UINT8_MAX;
1766                   typedef uint16_t        my_uint16_t;
1767                   my_uint16_t             ui16 = UINT16_MAX;
1768                   ui16 = UINT16_MAX;
1769                   typedef uint32_t        my_uint32_t;
1770                   my_uint32_t             ui32 = UINT32_MAX;
1771                   ui32 = UINT32_MAX;
1772                   typedef uint64_t        my_uint64_t;
1773                   my_uint64_t             ui64 = UINT64_MAX;
1774                   ui64 = UINT64_MAX;
1775                   typedef uint_fast8_t    my_uint_fast8_t;
1776                   my_uint_fast8_t         uif8 = UINT_FAST8_MAX;
1777                   uif8 = UINT_FAST8_MAX;
1778                   typedef uint_fast16_t   my_uint_fast16_t;
1779                   my_uint_fast16_t        uif16 = UINT_FAST16_MAX;
1780                   uif16 = UINT_FAST16_MAX;
1781                   typedef uint_fast32_t   my_uint_fast32_t;
1782                   my_uint_fast32_t        uif32 = UINT_FAST32_MAX;
1783                   uif32 = UINT_FAST32_MAX;
1784                   typedef uint_fast64_t   my_uint_fast64_t;
1785                   my_uint_fast64_t        uif64 = UINT_FAST64_MAX;
1786                   uif64 = UINT_FAST64_MAX;
1787                   typedef uint_least8_t   my_uint_least8_t;
1788                   my_uint_least8_t        uil8 = UINT_LEAST8_MAX;
1789                   uil8 = UINT_LEAST8_MAX;
1790                   typedef uint_least16_t  my_uint_least16_t;
1791                   my_uint_least16_t       uil16 = UINT_LEAST16_MAX;
1792                   uil16 = UINT_LEAST16_MAX;
1793                   typedef uint_least32_t  my_uint_least32_t;
1794                   my_uint_least32_t       uil32 = UINT_LEAST32_MAX;
1795                   uil32 = UINT_LEAST32_MAX;
1796                   typedef uint_least64_t  my_uint_least64_t;
1797                   my_uint_least64_t       uil64 = UINT_LEAST64_MAX;
1798                   uil64 = UINT_LEAST64_MAX;
1799                   typedef uintmax_t       my_uintmax_t;
1800                   my_uintmax_t            uim = UINTMAX_MAX;
1801                   uim = UINTMAX_MAX;
1802                   typedef uintptr_t       my_uintptr_t;
1803                   my_uintptr_t            uip = UINTPTR_MAX;
1804                   uip = UINTPTR_MAX;
1805                  ],[glibcxx_cv_c99_stdint_tr1=yes],
1806                    [glibcxx_cv_c99_stdint_tr1=no])
1807   ])
1808   if test x"$glibcxx_cv_c99_stdint_tr1" = x"yes"; then
1809     AC_DEFINE(_GLIBCXX_USE_C99_STDINT_TR1, 1,
1810               [Define if C99 types in <stdint.h> should be imported in
1811               <tr1/cstdint> in namespace std::tr1.])
1812   fi
1814   # Check for the existence of <math.h> functions.
1815   AC_CACHE_CHECK([for ISO C99 support to TR1 in <math.h>],
1816   glibcxx_cv_c99_math_tr1, [
1817   AC_TRY_COMPILE([#include <math.h>],
1818                  [typedef double_t  my_double_t;
1819                   typedef float_t   my_float_t;
1820                   acosh(0.0);
1821                   acoshf(0.0f);
1822                   acoshl(0.0l);
1823                   asinh(0.0);
1824                   asinhf(0.0f);
1825                   asinhl(0.0l);
1826                   atanh(0.0);
1827                   atanhf(0.0f);
1828                   atanhl(0.0l);
1829                   cbrt(0.0);
1830                   cbrtf(0.0f);
1831                   cbrtl(0.0l);
1832                   copysign(0.0, 0.0);
1833                   copysignf(0.0f, 0.0f);
1834                   copysignl(0.0l, 0.0l);
1835                   erf(0.0);
1836                   erff(0.0f);
1837                   erfl(0.0l);
1838                   erfc(0.0);
1839                   erfcf(0.0f);
1840                   erfcl(0.0l);
1841                   exp2(0.0);
1842                   exp2f(0.0f);
1843                   exp2l(0.0l);
1844                   expm1(0.0);
1845                   expm1f(0.0f);
1846                   expm1l(0.0l);
1847                   fdim(0.0, 0.0);
1848                   fdimf(0.0f, 0.0f);
1849                   fdiml(0.0l, 0.0l);
1850                   fma(0.0, 0.0, 0.0);
1851                   fmaf(0.0f, 0.0f, 0.0f);
1852                   fmal(0.0l, 0.0l, 0.0l);
1853                   fmax(0.0, 0.0);
1854                   fmaxf(0.0f, 0.0f);
1855                   fmaxl(0.0l, 0.0l);
1856                   fmin(0.0, 0.0);
1857                   fminf(0.0f, 0.0f);
1858                   fminl(0.0l, 0.0l);
1859                   hypot(0.0, 0.0);
1860                   hypotf(0.0f, 0.0f);
1861                   hypotl(0.0l, 0.0l);
1862                   ilogb(0.0);
1863                   ilogbf(0.0f);
1864                   ilogbl(0.0l);
1865                   lgamma(0.0);
1866                   lgammaf(0.0f);
1867                   lgammal(0.0l);
1868                   #ifndef __APPLE__ /* see below */
1869                   llrint(0.0);
1870                   llrintf(0.0f);
1871                   llrintl(0.0l);
1872                   llround(0.0);
1873                   llroundf(0.0f);
1874                   llroundl(0.0l);
1875                   #endif
1876                   log1p(0.0);
1877                   log1pf(0.0f);
1878                   log1pl(0.0l);
1879                   log2(0.0);
1880                   log2f(0.0f);
1881                   log2l(0.0l);
1882                   logb(0.0);
1883                   logbf(0.0f);
1884                   logbl(0.0l);
1885                   lrint(0.0);
1886                   lrintf(0.0f);
1887                   lrintl(0.0l);
1888                   lround(0.0);
1889                   lroundf(0.0f);
1890                   lroundl(0.0l);
1891                   nan(0);
1892                   nanf(0);
1893                   nanl(0);
1894                   nearbyint(0.0);
1895                   nearbyintf(0.0f);
1896                   nearbyintl(0.0l);
1897                   nextafter(0.0, 0.0);
1898                   nextafterf(0.0f, 0.0f);
1899                   nextafterl(0.0l, 0.0l);
1900                   nexttoward(0.0, 0.0);
1901                   nexttowardf(0.0f, 0.0f);
1902                   nexttowardl(0.0l, 0.0l);
1903                   remainder(0.0, 0.0);
1904                   remainderf(0.0f, 0.0f);
1905                   remainderl(0.0l, 0.0l);
1906                   remquo(0.0, 0.0, 0);
1907                   remquof(0.0f, 0.0f, 0);
1908                   remquol(0.0l, 0.0l, 0);
1909                   rint(0.0);
1910                   rintf(0.0f);
1911                   rintl(0.0l);
1912                   round(0.0);
1913                   roundf(0.0f);
1914                   roundl(0.0l);
1915                   scalbln(0.0, 0l);
1916                   scalblnf(0.0f, 0l);
1917                   scalblnl(0.0l, 0l);
1918                   scalbn(0.0, 0);
1919                   scalbnf(0.0f, 0);
1920                   scalbnl(0.0l, 0);
1921                   tgamma(0.0);
1922                   tgammaf(0.0f);
1923                   tgammal(0.0l);
1924                   trunc(0.0);
1925                   truncf(0.0f);
1926                   truncl(0.0l);
1927                  ],[glibcxx_cv_c99_math_tr1=yes], [glibcxx_cv_c99_math_tr1=no])
1928   ])
1929   if test x"$glibcxx_cv_c99_math_tr1" = x"yes"; then
1930     AC_DEFINE(_GLIBCXX_USE_C99_MATH_TR1, 1,
1931               [Define if C99 functions or macros in <math.h> should be imported
1932               in <tr1/cmath> in namespace std::tr1.])
1934     case "${target_os}" in
1935       darwin*)
1936         AC_CACHE_CHECK([for ISO C99 rounding functions in <math.h>],
1937           glibcxx_cv_c99_math_llround, [
1938           AC_TRY_COMPILE([#include <math.h>],
1939                  [llrint(0.0);
1940                   llrintf(0.0f);
1941                   llrintl(0.0l);
1942                   llround(0.0);
1943                   llroundf(0.0f);
1944                   llroundl(0.0l);
1945                  ],
1946                  [glibcxx_cv_c99_math_llround=yes],
1947                  [glibcxx_cv_c99_math_llround=no])
1948           ])
1949         ;;
1950     esac
1951     if test x"$glibcxx_cv_c99_math_llround" = x"no"; then
1952       AC_DEFINE(_GLIBCXX_NO_C99_ROUNDING_FUNCS, 1,
1953                 [Define if C99 llrint and llround functions are missing from <math.h>.])
1954     fi
1955   fi
1957   # Check for the existence of <inttypes.h> functions (NB: doesn't make
1958   # sense if the glibcxx_cv_c99_stdint_tr1 check fails, per C99, 7.8/1).
1959   ac_c99_inttypes_tr1=no;
1960   if test x"$glibcxx_cv_c99_stdint_tr1" = x"yes"; then
1961     AC_MSG_CHECKING([for ISO C99 support to TR1 in <inttypes.h>])
1962     AC_TRY_COMPILE([#include <inttypes.h>],
1963                    [intmax_t i, numer, denom, base;
1964                     const char* s;
1965                     char** endptr;
1966                     intmax_t ret = imaxabs(i);
1967                     imaxdiv_t dret = imaxdiv(numer, denom);
1968                     ret = strtoimax(s, endptr, base);
1969                     uintmax_t uret = strtoumax(s, endptr, base);
1970                    ],[ac_c99_inttypes_tr1=yes], [ac_c99_inttypes_tr1=no])
1971     AC_MSG_RESULT($ac_c99_inttypes_tr1)
1972   fi
1973   if test x"$ac_c99_inttypes_tr1" = x"yes"; then
1974     AC_DEFINE(_GLIBCXX_USE_C99_INTTYPES_TR1, 1,
1975               [Define if C99 functions in <inttypes.h> should be imported in
1976               <tr1/cinttypes> in namespace std::tr1.])
1977   fi
1979   # Check for the existence of wchar_t <inttypes.h> functions (NB: doesn't
1980   # make sense if the glibcxx_cv_c99_stdint_tr1 check fails, per C99, 7.8/1).
1981   ac_c99_inttypes_wchar_t_tr1=no;
1982   if test x"$glibcxx_cv_c99_stdint_tr1" = x"yes"; then
1983     AC_MSG_CHECKING([for wchar_t ISO C99 support to TR1 in <inttypes.h>])
1984     AC_TRY_COMPILE([#include <inttypes.h>],
1985                    [intmax_t base;
1986                     const wchar_t* s;
1987                     wchar_t** endptr;
1988                     intmax_t ret = wcstoimax(s, endptr, base);
1989                     uintmax_t uret = wcstoumax(s, endptr, base);
1990                    ],[ac_c99_inttypes_wchar_t_tr1=yes],
1991                      [ac_c99_inttypes_wchar_t_tr1=no])
1992     AC_MSG_RESULT($ac_c99_inttypes_wchar_t_tr1)
1993   fi
1994   if test x"$ac_c99_inttypes_wchar_t_tr1" = x"yes"; then
1995     AC_DEFINE(_GLIBCXX_USE_C99_INTTYPES_WCHAR_T_TR1, 1,
1996               [Define if wchar_t C99 functions in <inttypes.h> should be
1997               imported in <tr1/cinttypes> in namespace std::tr1.])
1998   fi
2000   # Check for the existence of the <stdbool.h> header.
2001   AC_CHECK_HEADERS(stdbool.h)
2003   # Check for the existence of the <stdalign.h> header.
2004   AC_CHECK_HEADERS(stdalign.h)
2006   CXXFLAGS="$ac_save_CXXFLAGS"
2007   AC_LANG_RESTORE
2011 dnl Check for uchar.h and usability.
2013 AC_DEFUN([GLIBCXX_CHECK_UCHAR_H], [
2015   # Test uchar.h.
2016   AC_CHECK_HEADERS(uchar.h, ac_has_uchar_h=yes, ac_has_uchar_h=no)
2018   AC_LANG_SAVE
2019   AC_LANG_CPLUSPLUS
2020   ac_save_CXXFLAGS="$CXXFLAGS"
2021   CXXFLAGS="$CXXFLAGS -std=c++11"
2023   if test x"$ac_has_uchar_h" = x"yes"; then
2024     AC_MSG_CHECKING([for ISO C11 support for <uchar.h>])
2025     AC_TRY_COMPILE([#include <uchar.h>
2026                     #ifdef __STDC_UTF_16__
2027                     long i = __STDC_UTF_16__;
2028                     #endif
2029                     #ifdef __STDC_UTF_32__
2030                     long j = __STDC_UTF_32__;
2031                     #endif
2032                     namespace test
2033                     {
2034                       using ::c16rtomb;
2035                       using ::c32rtomb;
2036                       using ::mbrtoc16;
2037                       using ::mbrtoc32;
2038                     }
2039                    ],
2040                    [], [ac_c11_uchar_cxx11=yes], [ac_c11_uchar_cxx11=no])
2041     AC_MSG_RESULT($ac_c11_uchar_cxx11)
2042   else
2043     ac_c11_uchar_cxx11=no
2044   fi
2045   if test x"$ac_c11_uchar_cxx11" = x"yes"; then
2046     AC_DEFINE(_GLIBCXX_USE_C11_UCHAR_CXX11, 1,
2047               [Define if C11 functions in <uchar.h> should be imported into
2048               namespace std in <cuchar>.])
2049   fi
2051   CXXFLAGS="$CXXFLAGS -fchar8_t"
2052   if test x"$ac_has_uchar_h" = x"yes"; then
2053     AC_MSG_CHECKING([for c8rtomb and mbrtoc8 in <uchar.h> with -fchar8_t])
2054     AC_TRY_COMPILE([#include <uchar.h>
2055                     namespace test
2056                     {
2057                       using ::c8rtomb;
2058                       using ::mbrtoc8;
2059                     }
2060                    ],
2061                    [], [ac_uchar_c8rtomb_mbrtoc8_fchar8_t=yes],
2062                        [ac_uchar_c8rtomb_mbrtoc8_fchar8_t=no])
2063   else
2064     ac_uchar_c8rtomb_mbrtoc8_fchar8_t=no
2065   fi
2066   AC_MSG_RESULT($ac_uchar_c8rtomb_mbrtoc8_fchar8_t)
2067   if test x"$ac_uchar_c8rtomb_mbrtoc8_fchar8_t" = x"yes"; then
2068     AC_DEFINE(_GLIBCXX_USE_UCHAR_C8RTOMB_MBRTOC8_FCHAR8_T, 1,
2069               [Define if c8rtomb and mbrtoc8 functions in <uchar.h> should be
2070               imported into namespace std in <cuchar> for -fchar8_t.])
2071   fi
2073   CXXFLAGS="$CXXFLAGS -std=c++20"
2074   if test x"$ac_has_uchar_h" = x"yes"; then
2075     AC_MSG_CHECKING([for c8rtomb and mbrtoc8 in <uchar.h> with -std=c++20])
2076     AC_TRY_COMPILE([#include <uchar.h>
2077                     namespace test
2078                     {
2079                       using ::c8rtomb;
2080                       using ::mbrtoc8;
2081                     }
2082                    ],
2083                    [], [ac_uchar_c8rtomb_mbrtoc8_cxx20=yes],
2084                        [ac_uchar_c8rtomb_mbrtoc8_cxx20=no])
2085   else
2086     ac_uchar_c8rtomb_mbrtoc8_cxx20=no
2087   fi
2088   AC_MSG_RESULT($ac_uchar_c8rtomb_mbrtoc8_cxx20)
2089   if test x"$ac_uchar_c8rtomb_mbrtoc8_cxx20" = x"yes"; then
2090     AC_DEFINE(_GLIBCXX_USE_UCHAR_C8RTOMB_MBRTOC8_CXX20, 1,
2091               [Define if c8rtomb and mbrtoc8 functions in <uchar.h> should be
2092               imported into namespace std in <cuchar> for C++20.])
2093   fi
2095   CXXFLAGS="$ac_save_CXXFLAGS"
2096   AC_LANG_RESTORE
2101 dnl Check whether "/dev/random" and "/dev/urandom" are available for
2102 dnl class std::random_device from C++ 2011 [rand.device], and
2103 dnl random_device of "TR1" (Chapter 5.1, "Random number generation").
2105 AC_DEFUN([GLIBCXX_CHECK_DEV_RANDOM], [
2107   AC_CACHE_CHECK([for "/dev/random" and "/dev/urandom" for std::random_device],
2108     glibcxx_cv_dev_random, [
2109     if test -r /dev/random && test -r /dev/urandom; then
2110   ## For MSys environment the test above is detected as false-positive
2111   ## on mingw-targets.  So disable it explicitly for them.
2112       case ${target_os} in
2113         *mingw*) glibcxx_cv_dev_random=no ;;
2114         *) glibcxx_cv_dev_random=yes ;;
2115       esac
2116     else
2117       glibcxx_cv_dev_random=no;
2118     fi
2119   ])
2121   if test x"$glibcxx_cv_dev_random" = x"yes"; then
2122     AC_DEFINE(_GLIBCXX_USE_DEV_RANDOM, 1,
2123               [Define if /dev/random and /dev/urandom are available for
2124                std::random_device.])
2125     AC_DEFINE(_GLIBCXX_USE_RANDOM_TR1, 1,
2126               [Define if /dev/random and /dev/urandom are available for
2127                the random_device of TR1 (Chapter 5.1).])
2128   fi
2133 dnl Compute the EOF, SEEK_CUR, and SEEK_END integer constants.
2135 AC_DEFUN([GLIBCXX_COMPUTE_STDIO_INTEGER_CONSTANTS], [
2137 if test "$is_hosted" = yes; then
2138   AC_CACHE_CHECK([for the value of EOF], glibcxx_cv_stdio_eof, [
2139   AC_COMPUTE_INT([glibcxx_cv_stdio_eof], [[EOF]],
2140                  [#include <stdio.h>],
2141                  [AC_MSG_ERROR([computing EOF failed])])
2142   ])
2143   AC_DEFINE_UNQUOTED(_GLIBCXX_STDIO_EOF, $glibcxx_cv_stdio_eof,
2144                      [Define to the value of the EOF integer constant.])
2146   AC_CACHE_CHECK([for the value of SEEK_CUR], glibcxx_cv_stdio_seek_cur, [
2147   AC_COMPUTE_INT([glibcxx_cv_stdio_seek_cur], [[SEEK_CUR]],
2148                  [#include <stdio.h>],
2149                  [AC_MSG_ERROR([computing SEEK_CUR failed])])
2150   ])
2151   AC_DEFINE_UNQUOTED(_GLIBCXX_STDIO_SEEK_CUR, $glibcxx_cv_stdio_seek_cur,
2152                      [Define to the value of the SEEK_CUR integer constant.])
2154   AC_CACHE_CHECK([for the value of SEEK_END], glibcxx_cv_stdio_seek_end, [
2155   AC_COMPUTE_INT([glibcxx_cv_stdio_seek_end], [[SEEK_END]],
2156                  [#include <stdio.h>],
2157                  [AC_MSG_ERROR([computing SEEK_END failed])])
2158   ])
2159   AC_DEFINE_UNQUOTED(_GLIBCXX_STDIO_SEEK_END, $glibcxx_cv_stdio_seek_end,
2160                      [Define to the value of the SEEK_END integer constant.])
2165 dnl Check whether required C++ overloads are present in <stdio.h>.
2167 AC_DEFUN([GLIBCXX_CHECK_STDIO_PROTO], [
2169   AC_LANG_SAVE
2170   AC_LANG_CPLUSPLUS
2171   # Use C++11 because a conforming <stdio.h> won't define gets for C++14,
2172   # and we don't need a declaration for C++14 anyway.
2173   ac_save_CXXFLAGS="$CXXFLAGS"
2174   CXXFLAGS="$CXXFLAGS -std=gnu++11"
2176   AC_CACHE_CHECK([for gets declaration], glibcxx_cv_gets, [
2177   AC_COMPILE_IFELSE([AC_LANG_SOURCE(
2178           [#include <stdio.h>
2179            namespace test
2180            {
2181               using ::gets;
2182            }
2183         ])],
2184         [glibcxx_cv_gets=yes],
2185         [glibcxx_cv_gets=no]
2186       )])
2188   if test $glibcxx_cv_gets = yes; then
2189     AC_DEFINE(HAVE_GETS, 1, [Define if gets is available in <stdio.h> before C++14.])
2190   fi
2192   CXXFLAGS="$ac_save_CXXFLAGS"
2193   AC_LANG_RESTORE
2197 dnl Check whether required C++11 overloads for floating point and integral
2198 dnl types are present in <math.h>.
2200 AC_DEFUN([GLIBCXX_CHECK_MATH11_PROTO], [
2202   AC_LANG_SAVE
2203   AC_LANG_CPLUSPLUS
2204   ac_save_CXXFLAGS="$CXXFLAGS"
2205   CXXFLAGS="$CXXFLAGS -std=c++11"
2207   case "$host" in
2208     *-*-solaris2.*)
2209       # Solaris 12 Build 86, Solaris 11.3 SRU 3.6, and Solaris 10 Patch
2210       # 11996[67]-02 introduced the C++11 <math.h> floating point overloads.
2211       AC_CACHE_CHECK([for C++11 <math.h> floating point overloads],
2212         glibcxx_cv_math11_fp_overload, [
2213         AC_COMPILE_IFELSE([AC_LANG_SOURCE(
2214           [#include <math.h>
2215            #undef isfinite
2216            namespace std {
2217              inline bool isfinite(float __x)
2218              { return __builtin_isfinite(__x); }
2219            }
2220         ])],
2221         [glibcxx_cv_math11_fp_overload=no],
2222         [glibcxx_cv_math11_fp_overload=yes]
2223       )])
2225       # autoheader cannot handle indented templates.
2226       AH_VERBATIM([__CORRECT_ISO_CPP11_MATH_H_PROTO_FP],
2227         [/* Define if all C++11 floating point overloads are available in <math.h>.  */
2228 #if __cplusplus >= 201103L
2229 #undef __CORRECT_ISO_CPP11_MATH_H_PROTO_FP
2230 #endif])
2232       if test $glibcxx_cv_math11_fp_overload = yes; then
2233         AC_DEFINE(__CORRECT_ISO_CPP11_MATH_H_PROTO_FP)
2234       fi
2236       # Solaris 12 Build 90, Solaris 11.3 SRU 5.6, and Solaris 10 Patch
2237       # 11996[67]-02 introduced the C++11 <math.h> integral type overloads.
2238       AC_CACHE_CHECK([for C++11 <math.h> integral type overloads],
2239         glibcxx_cv_math11_int_overload, [
2240         AC_COMPILE_IFELSE([AC_LANG_SOURCE(
2241           [#include <math.h>
2242            namespace std {
2243              template<typename _Tp>
2244                struct __is_integer;
2245              template<>
2246                struct __is_integer<int>
2247                {
2248                  enum { __value = 1 };
2249                };
2250            }
2251            namespace __gnu_cxx {
2252              template<bool, typename>
2253                struct __enable_if;
2254              template<typename _Tp>
2255                struct __enable_if<true, _Tp>
2256                { typedef _Tp __type; };
2257            }
2258            namespace std {
2259              template<typename _Tp>
2260                constexpr typename __gnu_cxx::__enable_if
2261                          <__is_integer<_Tp>::__value, double>::__type
2262                log2(_Tp __x)
2263                { return __builtin_log2(__x); }
2264            }
2265            int
2266            main (void)
2267            {
2268              int i = 1000;
2269              return std::log2(i);
2270            }
2271         ])],
2272         [glibcxx_cv_math11_int_overload=no],
2273         [glibcxx_cv_math11_int_overload=yes]
2274       )])
2276       # autoheader cannot handle indented templates.
2277       AH_VERBATIM([__CORRECT_ISO_CPP11_MATH_H_PROTO_INT],
2278         [/* Define if all C++11 integral type overloads are available in <math.h>.  */
2279 #if __cplusplus >= 201103L
2280 #undef __CORRECT_ISO_CPP11_MATH_H_PROTO_INT
2281 #endif])
2283       if test $glibcxx_cv_math11_int_overload = yes; then
2284         AC_DEFINE(__CORRECT_ISO_CPP11_MATH_H_PROTO_INT)
2285       fi
2286       ;;
2287     *)
2288       # If <math.h> defines the obsolete isinf(double) and isnan(double)
2289       # functions (instead of or as well as the C99 generic macros) then we
2290       # can't define std::isinf(double) and std::isnan(double) in <cmath>
2291       # and must use the ones from <math.h> instead.
2292         AC_CACHE_CHECK([for obsolete isinf function in <math.h>],
2293           glibcxx_cv_obsolete_isinf, [
2294           AC_COMPILE_IFELSE([AC_LANG_SOURCE(
2295             [#define _GLIBCXX_INCLUDE_NEXT_C_HEADERS
2296              #include <math.h>
2297              #undef isinf
2298              namespace std {
2299                using ::isinf;
2300                bool isinf(float);
2301                bool isinf(long double);
2302              }
2303              using std::isinf;
2304              bool b = isinf(0.0);
2305           ])],
2306           [glibcxx_cv_obsolete_isinf=yes],
2307           [glibcxx_cv_obsolete_isinf=no]
2308         )])
2309       if test $glibcxx_cv_obsolete_isinf = yes; then
2310         AC_DEFINE(HAVE_OBSOLETE_ISINF, 1,
2311                   [Define if <math.h> defines obsolete isinf function.])
2312       fi
2314         AC_CACHE_CHECK([for obsolete isnan function in <math.h>],
2315           glibcxx_cv_obsolete_isnan, [
2316           AC_COMPILE_IFELSE([AC_LANG_SOURCE(
2317             [#define _GLIBCXX_INCLUDE_NEXT_C_HEADERS
2318              #include <math.h>
2319              #undef isnan
2320              namespace std {
2321                using ::isnan;
2322                bool isnan(float);
2323                bool isnan(long double);
2324              }
2325              using std::isnan;
2326              bool b = isnan(0.0);
2327           ])],
2328           [glibcxx_cv_obsolete_isnan=yes],
2329           [glibcxx_cv_obsolete_isnan=no]
2330         )])
2331       if test $glibcxx_cv_obsolete_isnan = yes; then
2332         AC_DEFINE(HAVE_OBSOLETE_ISNAN, 1,
2333                   [Define if <math.h> defines obsolete isnan function.])
2334       fi
2335       ;;
2336   esac
2338   CXXFLAGS="$ac_save_CXXFLAGS"
2339   AC_LANG_RESTORE
2343 dnl Check for what type of C headers to use.
2345 dnl --enable-cheaders= [does stuff].
2346 dnl --disable-cheaders [does not do anything, really].
2347 dnl  +  Usage:  GLIBCXX_ENABLE_CHEADERS[(DEFAULT)]
2348 dnl       Where DEFAULT is either 'c' or 'c_global' or 'c_std'.
2350 dnl To use the obsolete 'c_std' headers use --enable-cheaders-obsolete as
2351 dnl well as --enable-cheaders=c_std, otherwise configure will fail.
2353 AC_DEFUN([GLIBCXX_ENABLE_CHEADERS], [
2354   GLIBCXX_ENABLE(cheaders-obsolete,no,,
2355     [allow use of obsolete "C" headers for g++])
2356   GLIBCXX_ENABLE(cheaders,$1,[[[=KIND]]],
2357     [construct "C" headers for g++], [permit c|c_global|c_std])
2358   AC_MSG_NOTICE("C" header strategy set to $enable_cheaders)
2359   if test $enable_cheaders = c_std ; then
2360     AC_MSG_WARN([the --enable-cheaders=c_std configuration is obsolete, c_global should be used instead])
2361     AC_MSG_WARN([if you are unable to use c_global please report a bug or inform libstdc++@gcc.gnu.org])
2362     if test $enable_cheaders_obsolete != yes ; then
2363       AC_MSG_ERROR(use --enable-cheaders-obsolete to use c_std "C" headers)
2364     fi
2365   fi
2367   C_INCLUDE_DIR='${glibcxx_srcdir}/include/'$enable_cheaders
2369   # Allow overrides to configure.host here.
2370   if test $enable_cheaders = c_global; then
2371      c_compatibility=yes
2372   fi
2374   AC_SUBST(C_INCLUDE_DIR)
2375   GLIBCXX_CONDITIONAL(GLIBCXX_C_HEADERS_C, test $enable_cheaders = c)
2376   GLIBCXX_CONDITIONAL(GLIBCXX_C_HEADERS_C_STD, test $enable_cheaders = c_std)
2377   GLIBCXX_CONDITIONAL(GLIBCXX_C_HEADERS_C_GLOBAL, test $enable_cheaders = c_global)
2378   GLIBCXX_CONDITIONAL(GLIBCXX_C_HEADERS_COMPATIBILITY, test $c_compatibility = yes)
2383 dnl Check for which locale library to use.  The choice is mapped to
2384 dnl a subdirectory of config/locale.
2386 dnl Default is generic.
2388 AC_DEFUN([GLIBCXX_ENABLE_CLOCALE], [
2389   GLIBCXX_ENABLE(clocale,auto,[[[=MODEL]]],
2390     [use MODEL for target locale package],
2391     [permit generic|gnu|ieee_1003.1-2001|newlib|yes|no|auto])
2393   # Deal with gettext issues.  Default to not using it (=no) until we detect
2394   # support for it later.  Let the user turn it off via --e/d, but let that
2395   # default to on for easier handling.
2396   USE_NLS=no
2397   AC_ARG_ENABLE(nls,
2398     AC_HELP_STRING([--enable-nls],[use Native Language Support (default)]),
2399     [],
2400     [enable_nls=yes])
2402   # Either a known package, or "auto"
2403   if test $enable_clocale = no || test $enable_clocale = yes; then
2404      enable_clocale=auto
2405   fi
2406   enable_clocale_flag=$enable_clocale
2408   # Probe for locale model to use if none specified.
2409   # Default to "generic".
2410   if test $enable_clocale_flag = auto; then
2411     case ${target_os} in
2412       linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
2413         enable_clocale_flag=gnu
2414         ;;
2415       darwin*)
2416         enable_clocale_flag=darwin
2417         ;;
2418       vxworks*)
2419         enable_clocale_flag=vxworks
2420         ;;
2421       dragonfly* | freebsd*)
2422         enable_clocale_flag=dragonfly
2423         ;;
2424       openbsd*)
2425         enable_clocale_flag=newlib
2426         ;;
2427       *)
2428         if test x"$with_newlib" = x"yes"; then
2429           enable_clocale_flag=newlib
2430         else
2431           enable_clocale_flag=generic
2432         fi
2433         ;;
2434     esac
2435   fi
2437   # Sanity check model, and test for special functionality.
2438   if test $enable_clocale_flag = gnu; then
2439     AC_EGREP_CPP([_GLIBCXX_ok], [
2440     #include <features.h>
2441     #if (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3)) && !defined(__UCLIBC__)
2442       _GLIBCXX_ok
2443     #endif
2444     ], enable_clocale_flag=gnu, enable_clocale_flag=generic)
2446     # Set it to scream when it hurts.
2447     ac_save_CFLAGS="$CFLAGS"
2448     CFLAGS="-Wimplicit-function-declaration -Werror"
2450     # Use strxfrm_l if available.
2451     AC_TRY_COMPILE([#define _GNU_SOURCE 1
2452                     #include <string.h>
2453                     #include <locale.h>],
2454                     [char s[128]; __locale_t loc; strxfrm_l(s, "C", 5, loc);],
2455                     AC_DEFINE(HAVE_STRXFRM_L, 1,
2456                     [Define if strxfrm_l is available in <string.h>.]),)
2458     # Use strerror_l if available.
2459     AC_TRY_COMPILE([#define _GNU_SOURCE 1
2460                     #include <string.h>
2461                     #include <locale.h>],
2462                     [__locale_t loc; strerror_l(5, loc);],
2463                     AC_DEFINE(HAVE_STRERROR_L, 1,
2464                     [Define if strerror_l is available in <string.h>.]),)
2466     CFLAGS="$ac_save_CFLAGS"
2467   fi
2469   # Perhaps use strerror_r if available, and strerror_l isn't.
2470   ac_save_CFLAGS="$CFLAGS"
2471   CFLAGS="-Wimplicit-function-declaration -Werror"
2472   AC_TRY_COMPILE([#define _GNU_SOURCE 1
2473                   #include <string.h>
2474                   #include <locale.h>],
2475                   [char s[128]; strerror_r(5, s, 128);],
2476                   AC_DEFINE(HAVE_STRERROR_R, 1,
2477                   [Define if strerror_r is available in <string.h>.]),)
2478   CFLAGS="$ac_save_CFLAGS"
2480   # Set configure bits for specified locale package
2481   AC_MSG_CHECKING([for C locale to use])
2482   case ${enable_clocale_flag} in
2483     generic)
2484       AC_MSG_RESULT(generic)
2486       CLOCALE_H=config/locale/generic/c_locale.h
2487       CLOCALE_CC=config/locale/generic/c_locale.cc
2488       CCODECVT_CC=config/locale/generic/codecvt_members.cc
2489       CCOLLATE_CC=config/locale/generic/collate_members.cc
2490       CCTYPE_CC=config/locale/generic/ctype_members.cc
2491       CMESSAGES_H=config/locale/generic/messages_members.h
2492       CMESSAGES_CC=config/locale/generic/messages_members.cc
2493       CMONEY_CC=config/locale/generic/monetary_members.cc
2494       CNUMERIC_CC=config/locale/generic/numeric_members.cc
2495       CTIME_H=config/locale/generic/time_members.h
2496       CTIME_CC=config/locale/generic/time_members.cc
2497       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
2498       ;;
2499     darwin)
2500       AC_MSG_RESULT(darwin)
2502       CLOCALE_H=config/locale/generic/c_locale.h
2503       CLOCALE_CC=config/locale/generic/c_locale.cc
2504       CCODECVT_CC=config/locale/generic/codecvt_members.cc
2505       CCOLLATE_CC=config/locale/generic/collate_members.cc
2506       CCTYPE_CC=config/locale/darwin/ctype_members.cc
2507       CMESSAGES_H=config/locale/generic/messages_members.h
2508       CMESSAGES_CC=config/locale/generic/messages_members.cc
2509       CMONEY_CC=config/locale/generic/monetary_members.cc
2510       CNUMERIC_CC=config/locale/generic/numeric_members.cc
2511       CTIME_H=config/locale/generic/time_members.h
2512       CTIME_CC=config/locale/generic/time_members.cc
2513       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
2514       ;;
2515     vxworks)
2516       AC_MSG_RESULT(vxworks)
2518       CLOCALE_H=config/locale/generic/c_locale.h
2519       CLOCALE_CC=config/locale/generic/c_locale.cc
2520       CCODECVT_CC=config/locale/generic/codecvt_members.cc
2521       CCOLLATE_CC=config/locale/generic/collate_members.cc
2522       CCTYPE_CC=config/locale/vxworks/ctype_members.cc
2523       CMESSAGES_H=config/locale/generic/messages_members.h
2524       CMESSAGES_CC=config/locale/generic/messages_members.cc
2525       CMONEY_CC=config/locale/generic/monetary_members.cc
2526       CNUMERIC_CC=config/locale/generic/numeric_members.cc
2527       CTIME_H=config/locale/generic/time_members.h
2528       CTIME_CC=config/locale/generic/time_members.cc
2529       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
2530       ;;
2531     dragonfly)
2532       AC_MSG_RESULT(dragonfly or freebsd)
2534       CLOCALE_H=config/locale/dragonfly/c_locale.h
2535       CLOCALE_CC=config/locale/dragonfly/c_locale.cc
2536       CCODECVT_CC=config/locale/dragonfly/codecvt_members.cc
2537       CCOLLATE_CC=config/locale/dragonfly/collate_members.cc
2538       CCTYPE_CC=config/locale/dragonfly/ctype_members.cc
2539       CMESSAGES_H=config/locale/generic/messages_members.h
2540       CMESSAGES_CC=config/locale/generic/messages_members.cc
2541       CMONEY_CC=config/locale/dragonfly/monetary_members.cc
2542       CNUMERIC_CC=config/locale/dragonfly/numeric_members.cc
2543       CTIME_H=config/locale/dragonfly/time_members.h
2544       CTIME_CC=config/locale/dragonfly/time_members.cc
2545       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
2546       ;;
2548     gnu)
2549       AC_MSG_RESULT(gnu)
2551       # Declare intention to use gettext, and add support for specific
2552       # languages.
2553       # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT
2554       ALL_LINGUAS="de fr"
2556       # Don't call AM-GNU-GETTEXT here. Instead, assume glibc.
2557       AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no)
2558       if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then
2559         USE_NLS=yes
2560       fi
2561       # Export the build objects.
2562       for ling in $ALL_LINGUAS; do \
2563         glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \
2564         glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \
2565       done
2566       AC_SUBST(glibcxx_MOFILES)
2567       AC_SUBST(glibcxx_POFILES)
2569       CLOCALE_H=config/locale/gnu/c_locale.h
2570       CLOCALE_CC=config/locale/gnu/c_locale.cc
2571       CCODECVT_CC=config/locale/gnu/codecvt_members.cc
2572       CCOLLATE_CC=config/locale/gnu/collate_members.cc
2573       CCTYPE_CC=config/locale/gnu/ctype_members.cc
2574       CMESSAGES_H=config/locale/gnu/messages_members.h
2575       CMESSAGES_CC=config/locale/gnu/messages_members.cc
2576       CMONEY_CC=config/locale/gnu/monetary_members.cc
2577       CNUMERIC_CC=config/locale/gnu/numeric_members.cc
2578       CTIME_H=config/locale/gnu/time_members.h
2579       CTIME_CC=config/locale/gnu/time_members.cc
2580       CLOCALE_INTERNAL_H=config/locale/gnu/c++locale_internal.h
2581       ;;
2582     ieee_1003.1-2001)
2583       AC_MSG_RESULT(IEEE 1003.1)
2585       CLOCALE_H=config/locale/ieee_1003.1-2001/c_locale.h
2586       CLOCALE_CC=config/locale/ieee_1003.1-2001/c_locale.cc
2587       CCODECVT_CC=config/locale/generic/codecvt_members.cc
2588       CCOLLATE_CC=config/locale/generic/collate_members.cc
2589       CCTYPE_CC=config/locale/generic/ctype_members.cc
2590       CMESSAGES_H=config/locale/ieee_1003.1-2001/messages_members.h
2591       CMESSAGES_CC=config/locale/ieee_1003.1-2001/messages_members.cc
2592       CMONEY_CC=config/locale/generic/monetary_members.cc
2593       CNUMERIC_CC=config/locale/generic/numeric_members.cc
2594       CTIME_H=config/locale/generic/time_members.h
2595       CTIME_CC=config/locale/generic/time_members.cc
2596       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
2597       ;;
2598     newlib)
2599       AC_MSG_RESULT(newlib)
2601       CLOCALE_H=config/locale/generic/c_locale.h
2602       CLOCALE_CC=config/locale/generic/c_locale.cc
2603       CCODECVT_CC=config/locale/generic/codecvt_members.cc
2604       CCOLLATE_CC=config/locale/generic/collate_members.cc
2605       CCTYPE_CC=config/locale/newlib/ctype_members.cc
2606       CMESSAGES_H=config/locale/generic/messages_members.h
2607       CMESSAGES_CC=config/locale/generic/messages_members.cc
2608       CMONEY_CC=config/locale/generic/monetary_members.cc
2609       CNUMERIC_CC=config/locale/generic/numeric_members.cc
2610       CTIME_H=config/locale/generic/time_members.h
2611       CTIME_CC=config/locale/generic/time_members.cc
2612       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
2613       ;;
2614   esac
2616   # This is where the testsuite looks for locale catalogs, using the
2617   # -DLOCALEDIR define during testsuite compilation.
2618   glibcxx_localedir=${glibcxx_builddir}/po/share/locale
2619   AC_SUBST(glibcxx_localedir)
2621   # A standalone libintl (e.g., GNU libintl) may be in use.
2622   if test $USE_NLS = yes; then
2623     AC_CHECK_HEADERS([libintl.h], [], USE_NLS=no)
2624     AC_SEARCH_LIBS(gettext, intl, [], USE_NLS=no)
2625   fi
2626   if test $USE_NLS = yes; then
2627     AC_DEFINE(_GLIBCXX_USE_NLS, 1,
2628               [Define if NLS translations are to be used.])
2629   fi
2631   AC_SUBST(USE_NLS)
2632   AC_SUBST(CLOCALE_H)
2633   AC_SUBST(CMESSAGES_H)
2634   AC_SUBST(CCODECVT_CC)
2635   AC_SUBST(CCOLLATE_CC)
2636   AC_SUBST(CCTYPE_CC)
2637   AC_SUBST(CMESSAGES_CC)
2638   AC_SUBST(CMONEY_CC)
2639   AC_SUBST(CNUMERIC_CC)
2640   AC_SUBST(CTIME_H)
2641   AC_SUBST(CTIME_CC)
2642   AC_SUBST(CLOCALE_CC)
2643   AC_SUBST(CLOCALE_INTERNAL_H)
2648 dnl Check for which std::allocator base class to use.  The choice is
2649 dnl mapped from a subdirectory of include/ext.
2651 dnl Default is new.
2653 AC_DEFUN([GLIBCXX_ENABLE_ALLOCATOR], [
2654   AC_MSG_CHECKING([for std::allocator base class])
2655   GLIBCXX_ENABLE(libstdcxx-allocator,auto,[[[=KIND]]],
2656     [use KIND for target std::allocator base],
2657     [permit new|malloc|yes|no|auto])
2659   # If they didn't use this option switch, or if they specified --enable
2660   # with no specific model, we'll have to look for one.  If they
2661   # specified --disable (???), do likewise.
2662   if test $enable_libstdcxx_allocator = no ||
2663      test $enable_libstdcxx_allocator = yes;
2664   then
2665      enable_libstdcxx_allocator=auto
2666   fi
2668   # Either a known package, or "auto". Auto implies the default choice
2669   # for a particular platform.
2670   enable_libstdcxx_allocator_flag=$enable_libstdcxx_allocator
2672   # Probe for host-specific support if no specific model is specified.
2673   # Default to "new".
2674   if test $enable_libstdcxx_allocator_flag = auto; then
2675     case ${target_os} in
2676       linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
2677         enable_libstdcxx_allocator_flag=new
2678         ;;
2679       *)
2680         enable_libstdcxx_allocator_flag=new
2681         ;;
2682     esac
2683   fi
2684   AC_MSG_RESULT($enable_libstdcxx_allocator_flag)
2687   # Set configure bits for specified locale package
2688   case ${enable_libstdcxx_allocator_flag} in
2689     malloc)
2690       ALLOCATOR_H=config/allocator/malloc_allocator_base.h
2691       ALLOCATOR_NAME=__gnu_cxx::malloc_allocator
2692       ;;
2693     new)
2694       ALLOCATOR_H=config/allocator/new_allocator_base.h
2695       ALLOCATOR_NAME=__gnu_cxx::new_allocator
2696       ;;
2697   esac
2699   GLIBCXX_CONDITIONAL(ENABLE_ALLOCATOR_NEW,
2700                       test $enable_libstdcxx_allocator_flag = new)
2701   AC_SUBST(ALLOCATOR_H)
2702   AC_SUBST(ALLOCATOR_NAME)
2707 dnl Check for whether the Boost-derived checks should be turned on.
2709 dnl --enable-concept-checks turns them on.
2710 dnl --disable-concept-checks leaves them off.
2711 dnl  +  Usage:  GLIBCXX_ENABLE_CONCEPT_CHECKS[(DEFAULT)]
2712 dnl       Where DEFAULT is either `yes' or `no'.
2714 AC_DEFUN([GLIBCXX_ENABLE_CONCEPT_CHECKS], [
2715   GLIBCXX_ENABLE(concept-checks,$1,,[use Boost-derived template checks])
2716   if test $enable_concept_checks = yes; then
2717     AC_DEFINE(_GLIBCXX_CONCEPT_CHECKS, 1,
2718               [Define to use concept checking code from the boost libraries.])
2719   fi
2723 dnl Use extern templates.
2725 dnl --enable-extern-template defines _GLIBCXX_EXTERN_TEMPLATE to 1
2726 dnl --disable-extern-template defines _GLIBCXX_EXTERN_TEMPLATE to 0
2728 dnl  +  Usage:  GLIBCXX_ENABLE_TEMPLATE[(DEFAULT)]
2729 dnl       Where DEFAULT is `yes' or `no'.
2731 AC_DEFUN([GLIBCXX_ENABLE_EXTERN_TEMPLATE], [
2733   GLIBCXX_ENABLE(extern-template,$1,,[enable extern template])
2735   AC_MSG_CHECKING([for extern template support])
2736   AC_MSG_RESULT([$enable_extern_template])
2738   GLIBCXX_CONDITIONAL(ENABLE_EXTERN_TEMPLATE, test $enable_extern_template = yes)
2742 dnl Use vtable verification.
2744 dnl --enable-vtable-verify defines _GLIBCXX_VTABLE_VERIFY to 1
2745 dnl --disable-vtable-verify defines _GLIBCXX_VTABLE_VERIFY to 0
2747 dnl  +  Usage:  GLIBCXX_ENABLE_VTABLE_VERIFY[(DEFAULT)]
2748 dnl       Where DEFAULT is `yes' or `no'.
2750 AC_DEFUN([GLIBCXX_ENABLE_VTABLE_VERIFY], [
2752   GLIBCXX_ENABLE(vtable-verify,$1,,[enable vtable verify])
2754   AC_MSG_CHECKING([for vtable verify support])
2755   AC_MSG_RESULT([$enable_vtable_verify])
2757   vtv_cygmin=no
2758   if test $enable_vtable_verify = yes; then
2759     case ${target_os} in
2760       cygwin*|mingw32*)
2761         VTV_CXXFLAGS="-fvtable-verify=std -Wl,-lvtv,-u_vtable_map_vars_start,-u_vtable_map_vars_end"
2762         VTV_CXXLINKFLAGS="-L${toplevel_builddir}/libvtv/.libs -Wl,--rpath -Wl,${toplevel_builddir}/libvtv/.libs"
2763         vtv_cygmin=yes
2764         ;;
2765       darwin*)
2766         VTV_CXXFLAGS="-fvtable-verify=std -Wl,-u,_vtable_map_vars_start -Wl,-u,_vtable_map_vars_end"
2767         VTV_CXXLINKFLAGS="-L${toplevel_builddir}/libvtv/.libs -Wl,-rpath,${toplevel_builddir}/libvtv/.libs"
2768         ;;
2769       solaris2*)
2770         VTV_CXXFLAGS="-fvtable-verify=std -Wl,-u_vtable_map_vars_start,-u_vtable_map_vars_end"
2771         VTV_CXXLINKFLAGS="-L${toplevel_builddir}/libvtv/.libs -Wl,-R -Wl,${toplevel_builddir}/libvtv/.libs"
2772         ;;
2773       *)
2774         VTV_CXXFLAGS="-fvtable-verify=std -Wl,-u_vtable_map_vars_start,-u_vtable_map_vars_end"
2775         VTV_CXXLINKFLAGS="-L${toplevel_builddir}/libvtv/.libs -Wl,--rpath -Wl,${toplevel_builddir}/libvtv/.libs"
2776         ;;
2777     esac
2778     VTV_PCH_CXXFLAGS="-fvtable-verify=std"
2779   else
2780     VTV_CXXFLAGS=
2781     VTV_PCH_CXXFLAGS=
2782     VTV_CXXLINKFLAGS=
2783   fi
2785   AC_SUBST(VTV_CXXFLAGS)
2786   AC_SUBST(VTV_PCH_CXXFLAGS)
2787   AC_SUBST(VTV_CXXLINKFLAGS)
2788   AM_CONDITIONAL(VTV_CYGMIN, test x$vtv_cygmin = xyes)
2789   GLIBCXX_CONDITIONAL(ENABLE_VTABLE_VERIFY, test $enable_vtable_verify = yes)
2793 dnl Check for parallel mode pre-requisites, including OpenMP support.
2795 dnl  +  Usage:  GLIBCXX_ENABLE_PARALLEL
2797 AC_DEFUN([GLIBCXX_ENABLE_PARALLEL], [
2799   enable_parallel=no;
2801   # See if configured libgomp/omp.h exists. (libgomp may be in
2802   # noconfigdirs but not explicitly disabled.)
2803   if echo " ${TARGET_CONFIGDIRS} " | grep " libgomp " > /dev/null 2>&1 ; then
2804     enable_parallel=yes;
2805   else
2806     AC_MSG_NOTICE([target-libgomp not built])
2807   fi
2809   AC_MSG_CHECKING([for parallel mode support])
2810   AC_MSG_RESULT([$enable_parallel])
2815 dnl Check for which I/O library to use:  stdio and POSIX, or pure stdio.
2817 dnl Default is stdio_posix.
2819 AC_DEFUN([GLIBCXX_ENABLE_CSTDIO], [
2820   AC_MSG_CHECKING([for underlying I/O to use])
2821   GLIBCXX_ENABLE(cstdio,stdio,[[[=PACKAGE]]],
2822     [use target-specific I/O package], [permit stdio|stdio_posix|stdio_pure])
2824   # The only available I/O model is based on stdio, via basic_file_stdio.
2825   # The default "stdio" is actually "stdio + POSIX" because it uses fdopen(3)
2826   # to get a file descriptor and then uses read(3) and write(3) with it.
2827   # The "stdio_pure" model doesn't use fdopen and only uses FILE* for I/O.
2828   case ${enable_cstdio} in
2829     stdio*)
2830       CSTDIO_H=config/io/c_io_stdio.h
2831       BASIC_FILE_H=config/io/basic_file_stdio.h
2832       BASIC_FILE_CC=config/io/basic_file_stdio.cc
2834       if test "x$enable_cstdio" = "xstdio_pure" ; then
2835         AC_MSG_RESULT([stdio (without POSIX read/write)])
2836         AC_DEFINE(_GLIBCXX_USE_STDIO_PURE, 1,
2837                   [Define to restrict std::__basic_file<> to stdio APIs.])
2838       else
2839         AC_MSG_RESULT([stdio (with POSIX read/write)])
2840       fi
2841       ;;
2842   esac
2844   AC_SUBST(CSTDIO_H)
2845   AC_SUBST(BASIC_FILE_H)
2846   AC_SUBST(BASIC_FILE_CC)
2851 dnl Check for "unusual" flags to pass to the compiler while building.
2853 dnl --enable-cxx-flags='-foo -bar -baz' is a general method for passing
2854 dnl     experimental flags such as -fpch, -fIMI, -Dfloat=char, etc.
2855 dnl --disable-cxx-flags passes nothing.
2856 dnl  +  See http://gcc.gnu.org/ml/libstdc++/2000-q2/msg00131.html
2857 dnl         http://gcc.gnu.org/ml/libstdc++/2000-q2/msg00284.html
2858 dnl         http://gcc.gnu.org/ml/libstdc++/2000-q1/msg00035.html
2859 dnl  +  Usage:  GLIBCXX_ENABLE_CXX_FLAGS(default flags)
2860 dnl       If "default flags" is an empty string, the effect is the same
2861 dnl       as --disable or --enable=no.
2863 AC_DEFUN([GLIBCXX_ENABLE_CXX_FLAGS], [dnl
2864   AC_MSG_CHECKING([for extra compiler flags for building])
2865   GLIBCXX_ENABLE(cxx-flags,$1,[=FLAGS],
2866     [pass compiler FLAGS when building library],
2867     [case "x$enable_cxx_flags" in
2868       xno | x)   enable_cxx_flags= ;;
2869       x-*)       ;;
2870       *)         AC_MSG_ERROR(_g_switch needs compiler flags as arguments) ;;
2871      esac])
2873   # Run through flags (either default or command-line) and set anything
2874   # extra (e.g., #defines) that must accompany particular g++ options.
2875   if test -n "$enable_cxx_flags"; then
2876     for f in $enable_cxx_flags; do
2877       case "$f" in
2878         -fhonor-std)  ;;
2879         -*)  ;;
2880         *)   # and we're trying to pass /what/ exactly?
2881              AC_MSG_ERROR([compiler flags start with a -]) ;;
2882       esac
2883     done
2884   fi
2886   EXTRA_CXX_FLAGS="$enable_cxx_flags"
2887   AC_MSG_RESULT($EXTRA_CXX_FLAGS)
2888   AC_SUBST(EXTRA_CXX_FLAGS)
2893 dnl Check to see if debugging libraries are to be built.
2895 dnl --enable-libstdcxx-debug
2896 dnl builds a separate set of debugging libraries in addition to the
2897 dnl normal (shared, static) libstdc++ binaries.
2899 dnl --disable-libstdcxx-debug
2900 dnl builds only one (non-debug) version of libstdc++.
2902 dnl --enable-libstdcxx-debug-flags=FLAGS
2903 dnl iff --enable-debug == yes, then use FLAGS to build the debug library.
2905 dnl  +  Usage:  GLIBCXX_ENABLE_DEBUG[(DEFAULT)]
2906 dnl       Where DEFAULT is either `yes' or `no'.
2908 AC_DEFUN([GLIBCXX_ENABLE_DEBUG], [
2909   AC_MSG_CHECKING([for additional debug build])
2910   skip_debug_build=
2911   GLIBCXX_ENABLE(libstdcxx-debug,$1,,[build extra debug library])
2912   if test x$enable_libstdcxx_debug = xyes; then
2913     if test -f $toplevel_builddir/../stage_final \
2914       && test -f $toplevel_builddir/../stage_current; then
2915       stage_final=`cat $toplevel_builddir/../stage_final`
2916       stage_current=`cat $toplevel_builddir/../stage_current`
2917       if test x$stage_current != x$stage_final ; then
2918         skip_debug_build=" (skipped for bootstrap stage $stage_current)"
2919         enable_libstdcxx_debug=no
2920       fi
2921     fi
2922   fi
2923   AC_MSG_RESULT($enable_libstdcxx_debug$skip_debug_build)
2924   GLIBCXX_CONDITIONAL(GLIBCXX_BUILD_DEBUG, test $enable_libstdcxx_debug = yes)
2929 dnl Check for explicit debug flags.
2931 dnl --enable-libstdcxx-debug-flags='-O1'
2932 dnl is a general method for passing flags to be used when
2933 dnl building debug libraries with --enable-libstdcxx-debug.
2935 dnl --disable-libstdcxx-debug-flags does nothing.
2936 dnl  +  Usage:  GLIBCXX_ENABLE_DEBUG_FLAGS(default flags)
2937 dnl       If "default flags" is an empty string, the effect is the same
2938 dnl       as --disable or --enable=no.
2940 AC_DEFUN([GLIBCXX_ENABLE_DEBUG_FLAGS], [
2941   GLIBCXX_ENABLE(libstdcxx-debug-flags,[$1],[=FLAGS],
2942     [pass compiler FLAGS when building debug library],
2943     [case "x$enable_libstdcxx_debug_flags" in
2944       xno | x)    enable_libstdcxx_debug_flags= ;;
2945       x-*)        ;;
2946       *)          AC_MSG_ERROR(_g_switch needs compiler flags as arguments) ;;
2947      esac])
2949   # Option parsed, now set things appropriately
2950   DEBUG_FLAGS="$enable_libstdcxx_debug_flags"
2951   AC_SUBST(DEBUG_FLAGS)
2953   AC_MSG_NOTICE([Debug build flags set to $DEBUG_FLAGS])
2958 dnl Check if the user only wants a freestanding library implementation.
2960 dnl --disable-hosted-libstdcxx will turn off most of the library build,
2961 dnl installing only the headers required by [17.4.1.3] and the language
2962 dnl support library.  More than that will be built (to keep the Makefiles
2963 dnl conveniently clean), but not installed.
2965 dnl Sets:
2966 dnl  is_hosted  (yes/no)
2968 dnl Defines:
2969 dnl  _GLIBCXX_HOSTED   (always defined, either to 1 or 0)
2971 AC_DEFUN([GLIBCXX_ENABLE_HOSTED], [
2972   AC_ARG_ENABLE([hosted-libstdcxx],
2973     AC_HELP_STRING([--disable-hosted-libstdcxx],
2974                    [only build freestanding C++ runtime support]),,
2975     [case "$host" in
2976         arm*-*-symbianelf*)
2977             enable_hosted_libstdcxx=no
2978             ;;
2979         *)
2980             enable_hosted_libstdcxx=yes
2981             ;;
2982      esac])
2983   freestanding_flags=
2984   if test "$enable_hosted_libstdcxx" = no; then
2985     AC_MSG_NOTICE([Only freestanding libraries will be built])
2986     is_hosted=no
2987     hosted_define=0
2988     enable_abi_check=no
2989     enable_libstdcxx_pch=no
2990     if test "x$with_headers" = xno; then
2991       freestanding_flags="-ffreestanding"
2992     fi
2993   else
2994     is_hosted=yes
2995     hosted_define=1
2996   fi
2997   GLIBCXX_CONDITIONAL(GLIBCXX_HOSTED, test $is_hosted = yes)
2998   AC_DEFINE_UNQUOTED(_GLIBCXX_HOSTED, $hosted_define,
2999     [Define to 1 if a full hosted library is built, or 0 if freestanding.])
3000   FREESTANDING_FLAGS="$freestanding_flags"
3001   AC_SUBST(FREESTANDING_FLAGS)
3006 dnl Check if the user wants a non-verbose library implementation.
3008 dnl --disable-libstdcxx-verbose will turn off descriptive messages to
3009 dnl standard error on termination.
3011 dnl Defines:
3012 dnl  _GLIBCXX_VERBOSE (always defined, either to 1 or 0)
3014 AC_DEFUN([GLIBCXX_ENABLE_VERBOSE], [
3015   AC_ARG_ENABLE([libstdcxx-verbose],
3016     AC_HELP_STRING([--disable-libstdcxx-verbose],
3017                    [disable termination messages to standard error]),,
3018                    [enable_libstdcxx_verbose=yes])
3019   if test x"$enable_libstdcxx_verbose" = xyes; then
3020     verbose_define=1
3021   else
3022     AC_MSG_NOTICE([verbose termination messages are disabled])
3023     verbose_define=0
3024   fi
3025   AC_DEFINE_UNQUOTED(_GLIBCXX_VERBOSE, $verbose_define,
3026     [Define to 1 if a verbose library is built, or 0 otherwise.])
3031 dnl Check for template specializations for the 'long long' type.
3032 dnl The result determines only whether 'long long' I/O is enabled; things
3033 dnl like numeric_limits<> specializations are always available.
3035 dnl --enable-long-long defines _GLIBCXX_USE_LONG_LONG
3036 dnl --disable-long-long leaves _GLIBCXX_USE_LONG_LONG undefined
3037 dnl  +  Usage:  GLIBCXX_ENABLE_LONG_LONG[(DEFAULT)]
3038 dnl       Where DEFAULT is either `yes' or `no'.
3040 AC_DEFUN([GLIBCXX_ENABLE_LONG_LONG], [
3041   GLIBCXX_ENABLE(long-long,$1,,[enable template specializations for 'long long'])
3042   if test $enable_long_long = yes; then
3043     AC_DEFINE(_GLIBCXX_USE_LONG_LONG, 1,
3044               [Define if code specialized for long long should be used.])
3045   fi
3046   AC_MSG_CHECKING([for enabled long long specializations])
3047   AC_MSG_RESULT([$enable_long_long])
3052 dnl Check for decimal floating point.
3053 dnl See:
3054 dnl http://gcc.gnu.org/onlinedocs/gcc/Decimal-Float.html#Decimal-Float
3056 dnl This checks to see if the host supports decimal floating point types.
3058 dnl Defines:
3059 dnl  _GLIBCXX_USE_DECIMAL_FLOAT
3061 AC_DEFUN([GLIBCXX_ENABLE_DECIMAL_FLOAT], [
3063   # Fake what AC_TRY_COMPILE does, without linking as this is
3064   # unnecessary for this test.
3066     cat > conftest.$ac_ext << EOF
3067 [#]line __oline__ "configure"
3068 int main()
3070   _Decimal32 d1;
3071   _Decimal64 d2;
3072   _Decimal128 d3;
3073   return 0;
3077     AC_MSG_CHECKING([for ISO/IEC TR 24733 ])
3078     if AC_TRY_EVAL(ac_compile); then
3079       AC_DEFINE(_GLIBCXX_USE_DECIMAL_FLOAT, 1,
3080       [Define if ISO/IEC TR 24733 decimal floating point types are supported on this host.])
3081       enable_dfp=yes
3082     else
3083       enable_dfp=no
3084     fi
3085     AC_MSG_RESULT($enable_dfp)
3086     rm -f conftest*
3090 dnl Check for GNU 128-bit floating point type.
3092 dnl Note: also checks that the type isn't a standard types.
3094 dnl Defines:
3095 dnl  ENABLE_FLOAT128
3097 AC_DEFUN([GLIBCXX_ENABLE_FLOAT128], [
3099   AC_LANG_SAVE
3100   AC_LANG_CPLUSPLUS
3102   # Fake what AC_TRY_COMPILE does, without linking as this is
3103   # unnecessary for this test.
3105   cat > conftest.$ac_ext << EOF
3106 [#]line __oline__ "configure"
3107 template<typename T1, typename T2>
3108   struct same
3109   { typedef T2 type; };
3111 template<typename T>
3112   struct same<T, T>;
3114 int main()
3116   typename same<double, __float128>::type      f1;
3117   typename same<long double, __float128>::type f2;
3121     AC_MSG_CHECKING([for __float128])
3122     if AC_TRY_EVAL(ac_compile); then
3123       enable_float128=yes
3124     else
3125       enable_float128=no
3126     fi
3127     AC_MSG_RESULT($enable_float128)
3128     GLIBCXX_CONDITIONAL(ENABLE_FLOAT128, test $enable_float128 = yes)
3129     rm -f conftest*
3131   AC_LANG_RESTORE
3135 dnl Check for template specializations for the 'wchar_t' type.
3137 dnl --enable-wchar_t defines _GLIBCXX_USE_WCHAR_T
3138 dnl --disable-wchar_t leaves _GLIBCXX_USE_WCHAR_T undefined
3139 dnl  +  Usage:  GLIBCXX_ENABLE_WCHAR_T[(DEFAULT)]
3140 dnl       Where DEFAULT is either `yes' or `no'.
3142 dnl Necessary support must also be present.
3144 AC_DEFUN([GLIBCXX_ENABLE_WCHAR_T], [
3145   GLIBCXX_ENABLE(wchar_t,$1,,[enable template specializations for 'wchar_t'])
3147   # Test wchar.h for mbstate_t, which is needed for char_traits and fpos.
3148   AC_CHECK_HEADERS(wchar.h, ac_has_wchar_h=yes, ac_has_wchar_h=no)
3149   AC_MSG_CHECKING([for mbstate_t])
3150   AC_TRY_COMPILE([#include <wchar.h>],
3151   [mbstate_t teststate;],
3152   have_mbstate_t=yes, have_mbstate_t=no)
3153   AC_MSG_RESULT($have_mbstate_t)
3154   if test x"$have_mbstate_t" = xyes; then
3155     AC_DEFINE(HAVE_MBSTATE_T,1,[Define if mbstate_t exists in wchar.h.])
3156   fi
3158   # Test it always, for use in GLIBCXX_ENABLE_C99, together with
3159   # ac_has_wchar_h.
3160   AC_CHECK_HEADERS(wctype.h, ac_has_wctype_h=yes, ac_has_wctype_h=no)
3162   if test x"$enable_wchar_t" = x"yes"; then
3164     AC_LANG_SAVE
3165     AC_LANG_CPLUSPLUS
3167     if test x"$ac_has_wchar_h" = xyes &&
3168        test x"$ac_has_wctype_h" = xyes; then
3169       AC_TRY_COMPILE([#include <wchar.h>
3170                       #include <stddef.h>
3171                       wint_t i;
3172                       long l = WEOF;
3173                       long j = WCHAR_MIN;
3174                       long k = WCHAR_MAX;
3175                       namespace test
3176                       {
3177                         using ::btowc;
3178                         using ::fgetwc;
3179                         using ::fgetws;
3180                         using ::fputwc;
3181                         using ::fputws;
3182                         using ::fwide;
3183                         using ::fwprintf;
3184                         using ::fwscanf;
3185                         using ::getwc;
3186                         using ::getwchar;
3187                         using ::mbrlen;
3188                         using ::mbrtowc;
3189                         using ::mbsinit;
3190                         using ::mbsrtowcs;
3191                         using ::putwc;
3192                         using ::putwchar;
3193                         using ::swprintf;
3194                         using ::swscanf;
3195                         using ::ungetwc;
3196                         using ::vfwprintf;
3197                         using ::vswprintf;
3198                         using ::vwprintf;
3199                         using ::wcrtomb;
3200                         using ::wcscat;
3201                         using ::wcschr;
3202                         using ::wcscmp;
3203                         using ::wcscoll;
3204                         using ::wcscpy;
3205                         using ::wcscspn;
3206                         using ::wcsftime;
3207                         using ::wcslen;
3208                         using ::wcsncat;
3209                         using ::wcsncmp;
3210                         using ::wcsncpy;
3211                         using ::wcspbrk;
3212                         using ::wcsrchr;
3213                         using ::wcsrtombs;
3214                         using ::wcsspn;
3215                         using ::wcsstr;
3216                         using ::wcstod;
3217                         using ::wcstok;
3218                         using ::wcstol;
3219                         using ::wcstoul;
3220                         using ::wcsxfrm;
3221                         using ::wctob;
3222                         using ::wmemchr;
3223                         using ::wmemcmp;
3224                         using ::wmemcpy;
3225                         using ::wmemmove;
3226                         using ::wmemset;
3227                         using ::wprintf;
3228                         using ::wscanf;
3229                       }
3230                      ],[],[], [enable_wchar_t=no])
3231     else
3232       enable_wchar_t=no
3233     fi
3235     AC_LANG_RESTORE
3236   fi
3238   if test x"$enable_wchar_t" = x"yes"; then
3239     AC_DEFINE(_GLIBCXX_USE_WCHAR_T, 1,
3240               [Define if code specialized for wchar_t should be used.])
3241   fi
3243   AC_MSG_CHECKING([for enabled wchar_t specializations])
3244   AC_MSG_RESULT([$enable_wchar_t])
3249 dnl Check to see if building and using a C++ precompiled header can be done.
3251 dnl --enable-libstdcxx-pch=yes
3252 dnl default, this shows intent to use stdc++.h.gch If it looks like it
3253 dnl may work, after some light-hearted attempts to puzzle out compiler
3254 dnl support, flip bits on in include/Makefile.am
3256 dnl --disable-libstdcxx-pch
3257 dnl turns off attempts to use or build stdc++.h.gch.
3259 dnl Substs:
3260 dnl  glibcxx_PCHFLAGS
3262 AC_DEFUN([GLIBCXX_ENABLE_PCH], [
3263   GLIBCXX_ENABLE(libstdcxx-pch,$1,,[build pre-compiled libstdc++ headers])
3264   if test $enable_libstdcxx_pch = yes; then
3265     AC_CACHE_CHECK([for compiler with PCH support],
3266       [glibcxx_cv_prog_CXX_pch],
3267       [ac_save_CXXFLAGS="$CXXFLAGS"
3268        CXXFLAGS="$CXXFLAGS -Werror -Winvalid-pch -Wno-deprecated"
3269        AC_LANG_SAVE
3270        AC_LANG_CPLUSPLUS
3271        echo '#include <math.h>' > conftest.h
3272        if $CXX $CXXFLAGS $CPPFLAGS -x c++-header conftest.h \
3273                           -o conftest.h.gch 1>&5 2>&1 &&
3274                 echo '#error "pch failed"' > conftest.h &&
3275           echo '#include "conftest.h"' > conftest.cc &&
3276                $CXX -c $CXXFLAGS $CPPFLAGS conftest.cc 1>&5 2>&1 ;
3277        then
3278          glibcxx_cv_prog_CXX_pch=yes
3279        else
3280          glibcxx_cv_prog_CXX_pch=no
3281        fi
3282        rm -f conftest*
3283        CXXFLAGS=$ac_save_CXXFLAGS
3284        AC_LANG_RESTORE
3285       ])
3286     enable_libstdcxx_pch=$glibcxx_cv_prog_CXX_pch
3287   fi
3289   AC_MSG_CHECKING([for enabled PCH])
3290   AC_MSG_RESULT([$enable_libstdcxx_pch])
3292   GLIBCXX_CONDITIONAL(GLIBCXX_BUILD_PCH, test $enable_libstdcxx_pch = yes)
3293   if test $enable_libstdcxx_pch = yes; then
3294     glibcxx_PCHFLAGS="-include bits/stdc++.h"
3295   else
3296     glibcxx_PCHFLAGS=""
3297   fi
3298   AC_SUBST(glibcxx_PCHFLAGS)
3303 dnl Check for atomic builtins.
3304 dnl See:
3305 dnl http://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html
3307 dnl This checks to see if the host supports the compiler-generated
3308 dnl builtins for atomic operations for various integral sizes. Note, this
3309 dnl is intended to be an all-or-nothing switch, so all the atomic operations
3310 dnl that are used should be checked.
3312 dnl Note:
3313 dnl libgomp and libgfortran use a link test, see CHECK_SYNC_FETCH_AND_ADD.
3315 AC_DEFUN([GLIBCXX_ENABLE_ATOMIC_BUILTINS], [
3316   AC_LANG_SAVE
3317   AC_LANG_CPLUSPLUS
3318   old_CXXFLAGS="$CXXFLAGS"
3320   # Do link tests if possible, instead asm tests, limited to some platforms
3321   # see discussion in PR target/40134, PR libstdc++/40133 and the thread
3322   # starting at http://gcc.gnu.org/ml/gcc-patches/2009-07/msg00322.html
3323   atomic_builtins_link_tests=no
3324   if test x$gcc_no_link != xyes; then
3325     # Can do link tests. Limit to some tested platforms
3326     case "$host" in
3327       *-*-linux* | *-*-uclinux* | *-*-kfreebsd*-gnu | *-*-gnu*)
3328         atomic_builtins_link_tests=yes
3329         ;;
3330     esac
3331   fi
3333   if test x$atomic_builtins_link_tests = xyes; then
3335   # Do link tests.
3337   CXXFLAGS="$CXXFLAGS -fno-exceptions"
3339   AC_CACHE_CHECK([for atomic builtins for bool],
3340     glibcxx_cv_atomic_bool, [
3341     AC_TRY_LINK(
3342       [ ],
3343       [typedef bool atomic_type;
3344        atomic_type c1;
3345        atomic_type c2;
3346        atomic_type c3(0);
3347        // N.B. __atomic_fetch_add is not supported for bool.
3348        __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
3349                                    __ATOMIC_RELAXED);
3350        __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
3351        __atomic_load_n(&c1, __ATOMIC_RELAXED);
3352       ],
3353       [glibcxx_cv_atomic_bool=yes],
3354       [glibcxx_cv_atomic_bool=no])
3355   ])
3357   AC_CACHE_CHECK([for atomic builtins for short],
3358     glibcxx_cv_atomic_short, [
3359     AC_TRY_LINK(
3360       [ ],
3361       [typedef short 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_short=yes],
3372       [glibcxx_cv_atomic_short=no])
3373   ])
3375   AC_CACHE_CHECK([for atomic builtins for int],
3376     glibcxx_cv_atomic_int, [
3377     AC_TRY_LINK(
3378       [ ],
3379       [typedef int atomic_type;
3380        atomic_type c1;
3381        atomic_type c2;
3382        atomic_type c3(0);
3383        __atomic_fetch_add(&c1, c2, __ATOMIC_RELAXED);
3384        __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
3385                                    __ATOMIC_RELAXED);
3386        __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
3387        __atomic_load_n(&c1, __ATOMIC_RELAXED);
3388       ],
3389       [glibcxx_cv_atomic_int=yes],
3390       [glibcxx_cv_atomic_int=no])
3391   ])
3393   AC_CACHE_CHECK([for atomic builtins for long long],
3394     glibcxx_cv_atomic_long_long, [
3395     AC_TRY_LINK(
3396       [ ],
3397       [typedef long long atomic_type;
3398        atomic_type c1;
3399        atomic_type c2;
3400        atomic_type c3(0);
3401        __atomic_fetch_add(&c1, c2, __ATOMIC_RELAXED);
3402        __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
3403                                    __ATOMIC_RELAXED);
3404        __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
3405        __atomic_load_n(&c1, __ATOMIC_RELAXED);
3406       ],
3407       [glibcxx_cv_atomic_long_long=yes],
3408       [glibcxx_cv_atomic_long_long=no])
3409   ])
3411   else
3413   # Do asm tests.
3415   # Compile unoptimized.
3416   CXXFLAGS='-O0 -S'
3418   # Fake what AC_TRY_COMPILE does.
3420     cat > conftest.$ac_ext << EOF
3421 [#]line __oline__ "configure"
3422 int main()
3424   typedef bool atomic_type;
3425   atomic_type c1;
3426   atomic_type c2;
3427   atomic_type c3(0);
3428   // N.B. __atomic_fetch_add is not supported for bool.
3429   __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
3430                               __ATOMIC_RELAXED);
3431   __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
3432   __atomic_load_n(&c1, __ATOMIC_RELAXED);
3434   return 0;
3438     AC_MSG_CHECKING([for atomic builtins for bool])
3439     if AC_TRY_EVAL(ac_compile); then
3440       if grep __atomic_ conftest.s >/dev/null 2>&1 ; then
3441         glibcxx_cv_atomic_bool=no
3442       else
3443         glibcxx_cv_atomic_bool=yes
3444       fi
3445     fi
3446     AC_MSG_RESULT($glibcxx_cv_atomic_bool)
3447     rm -f conftest*
3449     cat > conftest.$ac_ext << EOF
3450 [#]line __oline__ "configure"
3451 int main()
3453   typedef short atomic_type;
3454   atomic_type c1;
3455   atomic_type c2;
3456   atomic_type c3(0);
3457   __atomic_fetch_add(&c1, c2, __ATOMIC_RELAXED);
3458   __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
3459                               __ATOMIC_RELAXED);
3460   __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
3461   __atomic_load_n(&c1, __ATOMIC_RELAXED);
3463   return 0;
3467     AC_MSG_CHECKING([for atomic builtins for short])
3468     if AC_TRY_EVAL(ac_compile); then
3469       if grep __atomic_ conftest.s >/dev/null 2>&1 ; then
3470         glibcxx_cv_atomic_short=no
3471       else
3472         glibcxx_cv_atomic_short=yes
3473       fi
3474     fi
3475     AC_MSG_RESULT($glibcxx_cv_atomic_short)
3476     rm -f conftest*
3478     cat > conftest.$ac_ext << EOF
3479 [#]line __oline__ "configure"
3480 int main()
3482   // NB: _Atomic_word not necessarily int.
3483   typedef int atomic_type;
3484   atomic_type c1;
3485   atomic_type c2;
3486   atomic_type c3(0);
3487   __atomic_fetch_add(&c1, c2, __ATOMIC_RELAXED);
3488   __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
3489                               __ATOMIC_RELAXED);
3490   __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
3491   __atomic_load_n(&c1, __ATOMIC_RELAXED);
3493   return 0;
3497     AC_MSG_CHECKING([for atomic builtins for int])
3498     if AC_TRY_EVAL(ac_compile); then
3499       if grep __atomic_ conftest.s >/dev/null 2>&1 ; then
3500         glibcxx_cv_atomic_int=no
3501       else
3502         glibcxx_cv_atomic_int=yes
3503       fi
3504     fi
3505     AC_MSG_RESULT($glibcxx_cv_atomic_int)
3506     rm -f conftest*
3508     cat > conftest.$ac_ext << EOF
3509 [#]line __oline__ "configure"
3510 int main()
3512   typedef long long atomic_type;
3513   atomic_type c1;
3514   atomic_type c2;
3515   atomic_type c3(0);
3516   __atomic_fetch_add(&c1, c2, __ATOMIC_RELAXED);
3517   __atomic_compare_exchange_n(&c1, &c2, c3, true, __ATOMIC_ACQ_REL,
3518                               __ATOMIC_RELAXED);
3519   __atomic_test_and_set(&c1, __ATOMIC_RELAXED);
3520   __atomic_load_n(&c1, __ATOMIC_RELAXED);
3522   return 0;
3526     AC_MSG_CHECKING([for atomic builtins for long long])
3527     if AC_TRY_EVAL(ac_compile); then
3528       if grep __atomic_ conftest.s >/dev/null 2>&1 ; then
3529         glibcxx_cv_atomic_long_long=no
3530       else
3531         glibcxx_cv_atomic_long_long=yes
3532       fi
3533     fi
3534     AC_MSG_RESULT($glibcxx_cv_atomic_long_long)
3535     rm -f conftest*
3537   fi
3539   CXXFLAGS="$old_CXXFLAGS"
3540   AC_LANG_RESTORE
3542   # Set atomicity_dir to builtins if all but the long long test above passes,
3543   # or if the builtins were already chosen (e.g. by configure.host).
3544   if { test "$glibcxx_cv_atomic_bool" = yes \
3545      && test "$glibcxx_cv_atomic_short" = yes \
3546      && test "$glibcxx_cv_atomic_int" = yes; } \
3547      || test "$atomicity_dir" = "cpu/generic/atomicity_builtins"; then
3548     AC_DEFINE(_GLIBCXX_ATOMIC_BUILTINS, 1,
3549     [Define if the compiler supports C++11 atomics.])
3550     atomicity_dir=cpu/generic/atomicity_builtins
3551   fi
3553   # If still generic, set to mutex.
3554   if test $atomicity_dir = "cpu/generic" ; then
3555     atomicity_dir=cpu/generic/atomicity_mutex
3556     AC_MSG_WARN([No native atomic operations are provided for this platform.])
3557       if test "x$target_thread_file" = xsingle; then
3558         AC_MSG_WARN([They cannot be faked when thread support is disabled.])
3559         AC_MSG_WARN([Thread-safety of certain classes is not guaranteed.])
3560       else
3561         AC_MSG_WARN([They will be faked using a mutex.])
3562         AC_MSG_WARN([Performance of certain classes will degrade as a result.])
3563       fi
3564   fi
3569 dnl Set default lock policy for synchronizing shared_ptr reference counting.
3571 dnl --with-libstdcxx-lock-policy=auto
3572 dnl     Use atomic operations for shared_ptr reference counting only if
3573 dnl     the default target supports atomic compare-and-swap.
3574 dnl --with-libstdcxx-lock-policy=atomic
3575 dnl     Use atomic operations for shared_ptr reference counting.
3576 dnl --with-libstdcxx-lock-policy=mutex
3577 dnl     Use a mutex to synchronize shared_ptr reference counting.
3579 dnl This controls the value of __gnu_cxx::__default_lock_policy, which
3580 dnl determines how shared_ptr reference counts are synchronized.
3581 dnl The option "atomic" means that atomic operations should be used,
3582 dnl "mutex" means that a mutex will be used. The default option, "auto",
3583 dnl will check if the target supports the compiler-generated builtins
3584 dnl for atomic compare-and-swap operations for 2-byte and 4-byte integers,
3585 dnl and will use "atomic" if supported, "mutex" otherwise.
3586 dnl This option is ignored if the thread model used by GCC is "single",
3587 dnl as no synchronization is used at all in that case.
3588 dnl This option affects the library ABI (except in the "single" thread model).
3590 dnl Defines _GLIBCXX_HAVE_ATOMIC_LOCK_POLICY to 1 if atomics should be used.
3592 AC_DEFUN([GLIBCXX_ENABLE_LOCK_POLICY], [
3594   AC_ARG_WITH([libstdcxx-lock-policy],
3595     AC_HELP_STRING([--with-libstdcxx-lock-policy={atomic,mutex,auto}],
3596       [synchronization policy for shared_ptr reference counting [default=auto]]),
3597               [libstdcxx_atomic_lock_policy=$withval],
3598               [libstdcxx_atomic_lock_policy=auto])
3600   case "$libstdcxx_atomic_lock_policy" in
3601     atomic|mutex|auto) ;;
3602     *) AC_MSG_ERROR([Invalid argument for --with-libstdcxx-lock-policy]) ;;
3603   esac
3604   AC_MSG_CHECKING([for lock policy for shared_ptr reference counts])
3606   if test x"$libstdcxx_atomic_lock_policy" = x"auto"; then
3607     AC_LANG_SAVE
3608     AC_LANG_CPLUSPLUS
3609     ac_save_CXXFLAGS="$CXXFLAGS"
3611     dnl Why do we care about 2-byte CAS on targets with 4-byte _Atomic_word?!
3612     dnl Why don't we check 8-byte CAS for sparc64, where _Atomic_word is long?!
3613     dnl New targets should only check for CAS for the _Atomic_word type.
3614     AC_TRY_COMPILE([
3615     #if defined __riscv
3616     # error "Defaulting to mutex-based locks for ABI compatibility"
3617     #endif
3618     #if ! defined __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2
3619     # error "No 2-byte compare-and-swap"
3620     #elif ! defined __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4
3621     # error "No 4-byte compare-and-swap"
3622     #endif
3623     ],,
3624     [libstdcxx_atomic_lock_policy=atomic],
3625     [libstdcxx_atomic_lock_policy=mutex])
3626     AC_LANG_RESTORE
3627     CXXFLAGS="$ac_save_CXXFLAGS"
3628   fi
3630   if test x"$libstdcxx_atomic_lock_policy" = x"atomic"; then
3631     AC_MSG_RESULT(atomic)
3632     AC_DEFINE(HAVE_ATOMIC_LOCK_POLICY,1,
3633       [Defined if shared_ptr reference counting should use atomic operations.])
3634   else
3635     AC_MSG_RESULT(mutex)
3636   fi
3641 dnl Allow visibility attributes to be used on namespaces, objects, etc.
3643 dnl --enable-libstdcxx-visibility enables attempt to use visibility attributes.
3644 dnl --disable-libstdcxx-visibility turns off all use of visibility attributes.
3645 dnl  +  Usage:  GLIBCXX_ENABLE_LIBSTDCXX_VISIBILITY[(DEFAULT)]
3646 dnl       Where DEFAULT is 'yes'.
3648 AC_DEFUN([GLIBCXX_ENABLE_LIBSTDCXX_VISIBILITY], [
3649 GLIBCXX_ENABLE(libstdcxx-visibility,$1,,[enables visibility safe usage])
3651 if test x$enable_libstdcxx_visibility = xyes ; then
3652   dnl all hail libgfortran
3653   dnl Check whether the target supports hidden visibility.
3654   AC_CACHE_CHECK([whether the target supports hidden visibility],
3655                  glibcxx_cv_have_attribute_visibility, [
3656   save_CFLAGS="$CFLAGS"
3657   CFLAGS="$CFLAGS -Werror"
3658   AC_TRY_COMPILE([void __attribute__((visibility("hidden"))) foo(void) { }],
3659                  [], glibcxx_cv_have_attribute_visibility=yes,
3660                  glibcxx_cv_have_attribute_visibility=no)
3661   CFLAGS="$save_CFLAGS"])
3662   if test $glibcxx_cv_have_attribute_visibility = no; then
3663     enable_libstdcxx_visibility=no
3664   fi
3667 GLIBCXX_CONDITIONAL(ENABLE_VISIBILITY, test $enable_libstdcxx_visibility = yes)
3668 AC_MSG_NOTICE([visibility supported: $enable_libstdcxx_visibility])
3673 dnl Add version tags to symbols in shared library (or not), additionally
3674 dnl marking other symbols as private/local (or not).
3676 dnl Sets libtool_VERSION, and determines shared library SONAME.
3678 dnl  This depends on GLIBCXX CHECK_LINKER_FEATURES, but without it assumes no.
3680 dnl --enable-symvers=style adds a version script to the linker call when
3681 dnl       creating the shared library.  The choice of version script is
3682 dnl       controlled by 'style'.
3683 dnl --disable-symvers does not.
3685 dnl  +  Usage:  GLIBCXX_ENABLE_SYMVERS[(DEFAULT)]
3686 dnl       Where DEFAULT is either 'yes' or 'no'.  Passing `yes' tries to
3687 dnl       choose a default style based on linker characteristics.  Passing
3688 dnl       'no' disables versioning.
3690 AC_DEFUN([GLIBCXX_ENABLE_SYMVERS], [
3692 GLIBCXX_ENABLE(symvers,$1,[[[=STYLE]]],
3693   [enables symbol versioning of the shared library],
3694   [permit yes|no|gnu|gnu-versioned-namespace|darwin|darwin-export|sun])
3696 # If we never went through the GLIBCXX_CHECK_LINKER_FEATURES macro, then we
3697 # don't know enough about $LD to do tricks...
3698 AC_REQUIRE([GLIBCXX_CHECK_LINKER_FEATURES])
3699 # Sun style symbol versions needs GNU c++filt for make_sunver.pl to work
3700 # with extern "C++" in version scripts.
3701 AC_REQUIRE([GCC_PROG_GNU_CXXFILT])
3703 # Turn a 'yes' into a suitable default.
3704 if test x$enable_symvers = xyes ; then
3705   if test $enable_shared = no || test "x$LD" = x || test x$gcc_no_link = xyes; then
3706     enable_symvers=no
3707   else
3708     if test $with_gnu_ld = yes ; then
3709       case ${target_os} in
3710         hpux*)
3711           enable_symvers=no ;;
3712         *)
3713           enable_symvers=gnu ;;
3714       esac
3715     else
3716       case ${target_os} in
3717         darwin*)
3718           enable_symvers=darwin ;;
3719         # Sun symbol versioning exists since Solaris 2.5.
3720         solaris2.[[5-9]]* | solaris2.1[[0-9]]*)
3721           # make_sunver.pl needs GNU c++filt to support extern "C++" in
3722           # version scripts, so disable symbol versioning if none can be
3723           # found.
3724           if test -z "$ac_cv_path_CXXFILT"; then
3725             AC_MSG_WARN([=== You have requested Sun symbol versioning, but])
3726             AC_MSG_WARN([=== no GNU c++filt could  be found.])
3727             AC_MSG_WARN([=== Symbol versioning will be disabled.])
3728             enable_symvers=no
3729           else
3730             enable_symvers=sun
3731           fi
3732           ;;
3733         *)
3734           enable_symvers=no ;;
3735       esac
3736     fi
3737   fi
3740 # Check to see if 'darwin' or 'darwin-export' can win.
3741 if test x$enable_symvers = xdarwin-export ; then
3742     enable_symvers=darwin
3745 # Check if 'sun' was requested on non-Solaris 2 platforms.
3746 if test x$enable_symvers = xsun ; then
3747   case ${target_os} in
3748     solaris2*)
3749       # All fine.
3750       ;;
3751     *)
3752       # Unlikely to work.
3753       AC_MSG_WARN([=== You have requested Sun symbol versioning, but])
3754       AC_MSG_WARN([=== you are not targetting Solaris 2.])
3755       AC_MSG_WARN([=== Symbol versioning will be disabled.])
3756       enable_symvers=no
3757       ;;
3758   esac
3761 # Check to see if 'gnu' can win.
3762 if test $enable_symvers = gnu ||
3763   test $enable_symvers = gnu-versioned-namespace ||
3764   test $enable_symvers = sun; then
3765   # Check to see if libgcc_s exists, indicating that shared libgcc is possible.
3766   AC_MSG_CHECKING([for shared libgcc])
3767   ac_save_CFLAGS="$CFLAGS"
3768   CFLAGS=' -lgcc_s'
3769   AC_TRY_LINK(, [return 0;], glibcxx_shared_libgcc=yes, glibcxx_shared_libgcc=no)
3770   CFLAGS="$ac_save_CFLAGS"
3771   if test $glibcxx_shared_libgcc = no; then
3772     cat > conftest.c <<EOF
3773 int main (void) { return 0; }
3775 changequote(,)dnl
3776     glibcxx_libgcc_s_suffix=`${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS \
3777                              -shared -shared-libgcc -o conftest.so \
3778                              conftest.c -v 2>&1 >/dev/null \
3779                              | sed -n 's/^.* -lgcc_s\([^ ]*\) .*$/\1/p'`
3780 changequote([,])dnl
3781     rm -f conftest.c conftest.so
3782     if test x${glibcxx_libgcc_s_suffix+set} = xset; then
3783       CFLAGS=" -lgcc_s$glibcxx_libgcc_s_suffix"
3784       AC_TRY_LINK(, [return 0;], glibcxx_shared_libgcc=yes)
3785       CFLAGS="$ac_save_CFLAGS"
3786     fi
3787   fi
3788   AC_MSG_RESULT($glibcxx_shared_libgcc)
3790   # For GNU ld, we need at least this version.  The format is described in
3791   # GLIBCXX_CHECK_LINKER_FEATURES above.
3792   glibcxx_min_gnu_ld_version=21400
3794   # If no shared libgcc, can't win.
3795   if test $glibcxx_shared_libgcc != yes; then
3796       AC_MSG_WARN([=== You have requested GNU symbol versioning, but])
3797       AC_MSG_WARN([=== you are not building a shared libgcc_s.])
3798       AC_MSG_WARN([=== Symbol versioning will be disabled.])
3799       enable_symvers=no
3800   elif test $with_gnu_ld != yes && test $enable_symvers = sun; then
3801     : All interesting versions of Sun ld support sun style symbol versioning.
3802   elif test $with_gnu_ld != yes ; then
3803     # just fail for now
3804     AC_MSG_WARN([=== You have requested GNU symbol versioning, but])
3805     AC_MSG_WARN([=== you are not using the GNU linker.])
3806     AC_MSG_WARN([=== Symbol versioning will be disabled.])
3807     enable_symvers=no
3808   elif test $glibcxx_ld_is_gold = yes ; then
3809     : All versions of gold support symbol versioning.
3810   elif test $glibcxx_ld_is_mold = yes ; then
3811     : All versions of mold support symbol versioning.
3812   elif test $glibcxx_gnu_ld_version -lt $glibcxx_min_gnu_ld_version ; then
3813     # The right tools, the right setup, but too old.  Fallbacks?
3814     AC_MSG_WARN(=== Linker version $glibcxx_gnu_ld_version is too old for)
3815     AC_MSG_WARN(=== full symbol versioning support in this release of GCC.)
3816     AC_MSG_WARN(=== You would need to upgrade your binutils to version)
3817     AC_MSG_WARN(=== $glibcxx_min_gnu_ld_version or later and rebuild GCC.)
3818     AC_MSG_WARN([=== Symbol versioning will be disabled.])
3819     enable_symvers=no
3820   fi
3823 # For libtool versioning info, format is CURRENT:REVISION:AGE
3824 libtool_VERSION=6:30:0
3826 # Everything parsed; figure out what files and settings to use.
3827 case $enable_symvers in
3828   no)
3829     SYMVER_FILE=config/abi/pre/none.ver
3830     ;;
3831   gnu)
3832     SYMVER_FILE=config/abi/pre/gnu.ver
3833     AC_DEFINE(_GLIBCXX_SYMVER_GNU, 1,
3834               [Define to use GNU versioning in the shared library.])
3835     ;;
3836   gnu-versioned-namespace)
3837     libtool_VERSION=8:0:0
3838     SYMVER_FILE=config/abi/pre/gnu-versioned-namespace.ver
3839     AC_DEFINE(_GLIBCXX_SYMVER_GNU_NAMESPACE, 1,
3840               [Define to use GNU namespace versioning in the shared library.])
3841     ;;
3842   darwin)
3843     SYMVER_FILE=config/abi/pre/gnu.ver
3844     AC_DEFINE(_GLIBCXX_SYMVER_DARWIN, 1,
3845               [Define to use darwin versioning in the shared library.])
3846     ;;
3847   sun)
3848     SYMVER_FILE=config/abi/pre/gnu.ver
3849     AC_DEFINE(_GLIBCXX_SYMVER_SUN, 1,
3850               [Define to use Sun versioning in the shared library.])
3851     ;;
3852 esac
3854 if test x$enable_symvers != xno ; then
3855   AC_DEFINE(_GLIBCXX_SYMVER, 1,
3856          [Define to use symbol versioning in the shared library.])
3859 AC_CACHE_CHECK([whether the target supports .symver directive],
3860                glibcxx_cv_have_as_symver_directive, [
3861   AC_TRY_COMPILE([void foo (void); __asm (".symver foo, bar@SYMVER");],
3862                  [], glibcxx_cv_have_as_symver_directive=yes,
3863                  glibcxx_cv_have_as_symver_directive=no)])
3864 if test $glibcxx_cv_have_as_symver_directive = yes; then
3865   AC_DEFINE(HAVE_AS_SYMVER_DIRECTIVE, 1,
3866     [Define to 1 if the target assembler supports .symver directive.])
3869 AC_SUBST(SYMVER_FILE)
3870 AC_SUBST(port_specific_symbol_files)
3871 GLIBCXX_CONDITIONAL(ENABLE_SYMVERS, test $enable_symvers != no)
3872 GLIBCXX_CONDITIONAL(ENABLE_SYMVERS_GNU, test $enable_symvers = gnu)
3873 GLIBCXX_CONDITIONAL(ENABLE_SYMVERS_GNU_NAMESPACE, test $enable_symvers = gnu-versioned-namespace)
3874 GLIBCXX_CONDITIONAL(ENABLE_SYMVERS_DARWIN, test $enable_symvers = darwin)
3875 GLIBCXX_CONDITIONAL(ENABLE_SYMVERS_SUN, test $enable_symvers = sun)
3876 AC_MSG_NOTICE(versioning on shared library symbols is $enable_symvers)
3878 if test $enable_symvers != no ; then
3879    case ${target_os} in
3880      # The Solaris 2 runtime linker doesn't support the GNU extension of
3881      # binding the same symbol to different versions
3882      solaris2*)
3883        ;;
3884      # Other platforms with GNU symbol versioning (GNU/Linux, more?) do.
3885      *)
3886        AC_DEFINE(HAVE_SYMVER_SYMBOL_RENAMING_RUNTIME_SUPPORT, 1,
3887          [Define to 1 if the target runtime linker supports binding the same symbol to different versions.])
3888        ;;
3889     esac
3892 # Now, set up compatibility support, if any.
3893 # In addition, need this to deal with std::size_t mangling in
3894 # src/compatibility.cc.  In a perfect world, could use
3895 # typeid(std::size_t).name()[0] to do direct substitution.
3896 AC_MSG_CHECKING([for size_t as unsigned int])
3897 ac_save_CFLAGS="$CFLAGS"
3898 CFLAGS="-Werror"
3899 AC_TRY_COMPILE(, [__SIZE_TYPE__* stp; unsigned int* uip; stp = uip;],
3900                  [glibcxx_size_t_is_i=yes], [glibcxx_size_t_is_i=no])
3901 CFLAGS=$ac_save_CFLAGS
3902 if test "$glibcxx_size_t_is_i" = yes; then
3903   AC_DEFINE(_GLIBCXX_SIZE_T_IS_UINT, 1, [Define if size_t is unsigned int.])
3905 AC_MSG_RESULT([$glibcxx_size_t_is_i])
3907 AC_MSG_CHECKING([for ptrdiff_t as int])
3908 ac_save_CFLAGS="$CFLAGS"
3909 CFLAGS="-Werror"
3910 AC_TRY_COMPILE(, [__PTRDIFF_TYPE__* ptp; int* ip; ptp = ip;],
3911                  [glibcxx_ptrdiff_t_is_i=yes], [glibcxx_ptrdiff_t_is_i=no])
3912 CFLAGS=$ac_save_CFLAGS
3913 if test "$glibcxx_ptrdiff_t_is_i" = yes; then
3914   AC_DEFINE(_GLIBCXX_PTRDIFF_T_IS_INT, 1, [Define if ptrdiff_t is int.])
3916 AC_MSG_RESULT([$glibcxx_ptrdiff_t_is_i])
3921 dnl Setup to use the gcc gthr.h thread-specific memory and mutex model.
3922 dnl We must stage the required headers so that they will be installed
3923 dnl with the library (unlike libgcc, the STL implementation is provided
3924 dnl solely within headers).  Since we must not inject random user-space
3925 dnl macro names into user-provided C++ code, we first stage into <file>-in
3926 dnl and process to <file> with an output command.  The reason for a two-
3927 dnl stage process here is to correctly handle $srcdir!=$objdir without
3928 dnl having to write complex code (the sed commands to clean the macro
3929 dnl namespace are complex and fragile enough as it is).  We must also
3930 dnl add a relative path so that -I- is supported properly.
3932 dnl Substs:
3933 dnl  thread_header
3935 AC_DEFUN([GLIBCXX_ENABLE_THREADS], [
3936   AC_MSG_CHECKING([for thread model used by GCC])
3937   target_thread_file=`$CXX -v 2>&1 | sed -n 's/^Thread model: //p'`
3938   AC_MSG_RESULT([$target_thread_file])
3939   GCC_AC_THREAD_HEADER([$target_thread_file])
3944 dnl Check if gthread implementation defines the types and functions
3945 dnl required by the c++0x thread library.  Conforming gthread
3946 dnl implementations can define __GTHREADS_CXX0X to enable use with c++0x.
3948 dnl GLIBCXX_ENABLE_SYMVERS must be done before this.
3950 AC_DEFUN([GLIBCXX_CHECK_GTHREADS], [
3951   GLIBCXX_ENABLE(libstdcxx-threads,auto,,[enable C++11 threads support])
3953   if test x$enable_libstdcxx_threads = xauto ||
3954      test x$enable_libstdcxx_threads = xyes; then
3956   AC_LANG_SAVE
3957   AC_LANG_CPLUSPLUS
3959   ac_save_CXXFLAGS="$CXXFLAGS"
3960   CXXFLAGS="$CXXFLAGS -fno-exceptions \
3961         -I${toplevel_srcdir}/libgcc -I${toplevel_builddir}/libgcc"
3963   target_thread_file=`$CXX -v 2>&1 | sed -n 's/^Thread model: //p'`
3964   case $target_thread_file in
3965     posix)
3966       CXXFLAGS="$CXXFLAGS -DSUPPORTS_WEAK -DGTHREAD_USE_WEAK -D_PTHREADS"
3967   esac
3969   AC_MSG_CHECKING([whether it can be safely assumed that mutex_timedlock is available])
3971   AC_TRY_COMPILE([#include <unistd.h>],
3972     [
3973       // In case of POSIX threads check _POSIX_TIMEOUTS.
3974       #if (defined(_PTHREADS) \
3975           && (!defined(_POSIX_TIMEOUTS) || _POSIX_TIMEOUTS <= 0))
3976       #error
3977       #endif
3978     ], [ac_gthread_use_mutex_timedlock=1], [ac_gthread_use_mutex_timedlock=0])
3980   AC_DEFINE_UNQUOTED(_GTHREAD_USE_MUTEX_TIMEDLOCK, $ac_gthread_use_mutex_timedlock,
3981                      [Define to 1 if mutex_timedlock is available.])
3983   if test $ac_gthread_use_mutex_timedlock = 1 ; then res_mutex_timedlock=yes ;
3984   else res_mutex_timedlock=no ; fi
3985   AC_MSG_RESULT([$res_mutex_timedlock])
3987   AC_MSG_CHECKING([for gthreads library])
3989   AC_TRY_COMPILE([#include "gthr.h"],
3990     [
3991       #ifndef __GTHREADS_CXX0X
3992       #error
3993       #endif
3994     ], [ac_has_gthreads=yes], [ac_has_gthreads=no])
3995   else
3996     ac_has_gthreads=no
3997   fi
3999   AC_MSG_RESULT([$ac_has_gthreads])
4001   if test x"$ac_has_gthreads" = x"yes"; then
4002     AC_DEFINE(_GLIBCXX_HAS_GTHREADS, 1,
4003               [Define if gthreads library is available.])
4005     # Also check for pthread_rwlock_t for std::shared_timed_mutex in C++14
4006     # but only do so if we're using pthread in the gthread library.
4007     # On VxWorks for example, pthread_rwlock_t is defined in sys/types.h
4008     # but the pthread library is not there by default and the gthread library
4009     # does not use it.
4010     AC_TRY_COMPILE([#include "gthr.h"],
4011     [
4012       #if (!defined(_PTHREADS))
4013       #error
4014       #endif
4015     ], [ac_gthread_use_pthreads=yes], [ac_gthread_use_pthreads=no])
4016     if test x"$ac_gthread_use_pthreads" = x"yes"; then
4017       AC_CHECK_TYPE([pthread_rwlock_t],
4018              [AC_DEFINE([_GLIBCXX_USE_PTHREAD_RWLOCK_T], 1,
4019              [Define if POSIX read/write locks are available in <gthr.h>.])],
4020              [],
4021              [#include "gthr.h"])
4022     fi
4023   fi
4025   AC_CHECK_HEADER(semaphore.h, [
4026     AC_MSG_CHECKING([for POSIX Semaphores and sem_timedwait])
4027     AC_TRY_COMPILE([
4028         #include <unistd.h>
4029         #include <semaphore.h>
4030         #include <limits.h>
4031       ],
4032       [
4033         #if !defined _POSIX_TIMEOUTS || _POSIX_TIMEOUTS <= 0
4034         # error "POSIX Timeouts option not supported"
4035         #elif !defined _POSIX_SEMAPHORES || _POSIX_SEMAPHORES <= 0
4036         # error "POSIX Semaphores option not supported"
4037         #else
4038         #if defined SEM_VALUE_MAX
4039         constexpr int sem_value_max = SEM_VALUE_MAX;
4040         #elif defined _POSIX_SEM_VALUE_MAX
4041         constexpr int sem_value_max = _POSIX_SEM_VALUE_MAX;
4042         #else
4043         # error "SEM_VALUE_MAX not available"
4044         #endif
4045         sem_t sem;
4046         sem_init(&sem, 0, sem_value_max);
4047         struct timespec ts = { 0 };
4048         sem_timedwait(&sem, &ts);
4049         #endif
4050       ],
4051       [ac_have_posix_semaphore=yes],
4052       [ac_have_posix_semaphore=no])],
4053       [ac_have_posix_semaphore=no])
4055   if test $ac_have_posix_semaphore = yes ; then
4056     AC_DEFINE(HAVE_POSIX_SEMAPHORE,
4057               1,
4058               [Define to 1 if POSIX Semaphores with sem_timedwait are available in <semaphore.h>.])
4059   fi
4060   AC_MSG_RESULT([$ac_have_posix_semaphore])
4062   CXXFLAGS="$ac_save_CXXFLAGS"
4063   AC_LANG_RESTORE
4067 # Check whether LC_MESSAGES is available in <locale.h>.
4068 # Ulrich Drepper <drepper@cygnus.com>, 1995.
4070 # This file file be copied and used freely without restrictions.  It can
4071 # be used in projects which are not available under the GNU Public License
4072 # but which still want to provide support for the GNU gettext functionality.
4073 # Please note that the actual code is *not* freely available.
4074 AC_DEFUN([AC_LC_MESSAGES], [
4075   AC_CHECK_HEADER(locale.h, [
4076     AC_CACHE_CHECK([for LC_MESSAGES], ac_cv_val_LC_MESSAGES,
4077       [AC_TRY_COMPILE([#include <locale.h>], [return LC_MESSAGES],
4078        ac_cv_val_LC_MESSAGES=yes, ac_cv_val_LC_MESSAGES=no)])
4079     if test $ac_cv_val_LC_MESSAGES = yes; then
4080       AC_DEFINE(HAVE_LC_MESSAGES, 1,
4081                 [Define if LC_MESSAGES is available in <locale.h>.])
4082     fi
4083   ])
4087 dnl Check whether rdrand is supported in the assembler.
4088 AC_DEFUN([GLIBCXX_CHECK_X86_RDRAND], [
4089   AC_CACHE_CHECK([for rdrand support in assembler],
4090   ac_cv_x86_rdrand, [
4091   ac_cv_x86_rdrand=no
4092   case "$target" in
4093     i?86-*-* | \
4094     x86_64-*-*)
4095     AC_TRY_COMPILE(, [asm("rdrand %eax");],
4096                 [ac_cv_x86_rdrand=yes], [ac_cv_x86_rdrand=no])
4097   esac
4098   ])
4099   if test $ac_cv_x86_rdrand = yes; then
4100     AC_DEFINE(_GLIBCXX_X86_RDRAND, 1,
4101                 [ Defined if as can handle rdrand. ])
4102   fi
4106 dnl Check whether rdseed is supported in the assembler.
4107 AC_DEFUN([GLIBCXX_CHECK_X86_RDSEED], [
4108   AC_CACHE_CHECK([for rdseed support in assembler],
4109   ac_cv_x86_rdseed, [
4110   ac_cv_x86_rdseed=no
4111   case "$target" in
4112     i?86-*-* | \
4113     x86_64-*-*)
4114     AC_TRY_COMPILE(, [asm("rdseed %eax");],
4115                 [ac_cv_x86_rdseed=yes], [ac_cv_x86_rdseed=no])
4116   esac
4117   ])
4118   if test $ac_cv_x86_rdseed = yes; then
4119     AC_DEFINE(_GLIBCXX_X86_RDSEED, 1,
4120                 [ Defined if as can handle rdseed. ])
4121   fi
4125 dnl Check whether get_nprocs is available in <sys/sysinfo.h>, and define _GLIBCXX_USE_GET_NPROCS.
4127 AC_DEFUN([GLIBCXX_CHECK_GET_NPROCS], [
4129   AC_LANG_SAVE
4130   AC_LANG_CPLUSPLUS
4131   ac_save_CXXFLAGS="$CXXFLAGS"
4132   CXXFLAGS="$CXXFLAGS -fno-exceptions"
4134   AC_CACHE_CHECK([for get_nprocs],
4135     glibcxx_cv_GET_NPROCS, [
4136     GCC_TRY_COMPILE_OR_LINK(
4137       [#include <sys/sysinfo.h>],
4138       [int n = get_nprocs();],
4139       [glibcxx_cv_GET_NPROCS=yes],
4140       [glibcxx_cv_GET_NPROCS=no])
4141   ])
4142   if test $glibcxx_cv_GET_NPROCS = yes; then
4143     AC_DEFINE(_GLIBCXX_USE_GET_NPROCS, 1, [Define if get_nprocs is available in <sys/sysinfo.h>.])
4144   fi
4146   CXXFLAGS="$ac_save_CXXFLAGS"
4147   AC_LANG_RESTORE
4151 dnl Check whether sysconf(_SC_NPROCESSORS_ONLN) is available in <unistd.h>, and define _GLIBCXX_USE_SC_NPROCESSORS_ONLN.
4153 AC_DEFUN([GLIBCXX_CHECK_SC_NPROCESSORS_ONLN], [
4155   AC_LANG_SAVE
4156   AC_LANG_CPLUSPLUS
4157   ac_save_CXXFLAGS="$CXXFLAGS"
4158   CXXFLAGS="$CXXFLAGS -fno-exceptions"
4160   AC_CACHE_CHECK([for _SC_NPROCESSORS_ONLN],
4161     glibcxx_cv_SC_NPROCESSORS_ONLN, [
4162     GCC_TRY_COMPILE_OR_LINK(
4163       [#include <unistd.h>],
4164       [int n = sysconf(_SC_NPROCESSORS_ONLN);],
4165       [glibcxx_cv_SC_NPROCESSORS_ONLN=yes],
4166       [glibcxx_cv_SC_NPROCESSORS_ONLN=no])
4167   ])
4168   if test $glibcxx_cv_SC_NPROCESSORS_ONLN = yes; then
4169     AC_DEFINE(_GLIBCXX_USE_SC_NPROCESSORS_ONLN, 1, [Define if _SC_NPROCESSORS_ONLN  is available in <unistd.h>.])
4170   fi
4172   CXXFLAGS="$ac_save_CXXFLAGS"
4173   AC_LANG_RESTORE
4177 dnl Check whether sysconf(_SC_NPROC_ONLN) is available in <unistd.h>, and define _GLIBCXX_USE_SC_NPROC_ONLN.
4179 AC_DEFUN([GLIBCXX_CHECK_SC_NPROC_ONLN], [
4181   AC_LANG_SAVE
4182   AC_LANG_CPLUSPLUS
4183   ac_save_CXXFLAGS="$CXXFLAGS"
4184   CXXFLAGS="$CXXFLAGS -fno-exceptions"
4186   AC_CACHE_CHECK([for _SC_NPROC_ONLN],
4187     glibcxx_cv_SC_NPROC_ONLN, [
4188     GCC_TRY_COMPILE_OR_LINK(
4189       [#include <unistd.h>],
4190       [int n = sysconf(_SC_NPROC_ONLN);],
4191       [glibcxx_cv_SC_NPROC_ONLN=yes],
4192       [glibcxx_cv_SC_NPROC_ONLN=no])
4193   ])
4194   if test $glibcxx_cv_SC_NPROC_ONLN = yes; then
4195     AC_DEFINE(_GLIBCXX_USE_SC_NPROC_ONLN, 1, [Define if _SC_NPROC_ONLN  is available in <unistd.h>.])
4196   fi
4198   CXXFLAGS="$ac_save_CXXFLAGS"
4199   AC_LANG_RESTORE
4203 dnl Check whether pthread_num_processors_np is available in <pthread.h>, and define _GLIBCXX_USE_PTHREADS_NUM_PROCESSORS_NP.
4205 AC_DEFUN([GLIBCXX_CHECK_PTHREADS_NUM_PROCESSORS_NP], [
4207   AC_LANG_SAVE
4208   AC_LANG_CPLUSPLUS
4209   ac_save_CXXFLAGS="$CXXFLAGS"
4210   CXXFLAGS="$CXXFLAGS -fno-exceptions"
4212   AC_CACHE_CHECK([for pthreads_num_processors_np],
4213     glibcxx_cv_PTHREADS_NUM_PROCESSORS_NP, [
4214     GCC_TRY_COMPILE_OR_LINK(
4215       [#include <pthread.h>],
4216       [int n = pthread_num_processors_np();],
4217       [glibcxx_cv_PTHREADS_NUM_PROCESSORS_NP=yes],
4218       [glibcxx_cv_PTHREADS_NUM_PROCESSORS_NP=no])
4219   ])
4220   if test $glibcxx_cv_PTHREADS_NUM_PROCESSORS_NP = yes; then
4221     AC_DEFINE(_GLIBCXX_USE_PTHREADS_NUM_PROCESSORS_NP, 1, [Define if pthreads_num_processors_np is available in <pthread.h>.])
4222   fi
4224   CXXFLAGS="$ac_save_CXXFLAGS"
4225   AC_LANG_RESTORE
4229 dnl Check whether pthread_cond_clockwait is available in <pthread.h> for std::condition_variable to use,
4230 dnl and define _GLIBCXX_USE_PTHREAD_COND_CLOCKWAIT.
4232 AC_DEFUN([GLIBCXX_CHECK_PTHREAD_COND_CLOCKWAIT], [
4234   AC_LANG_SAVE
4235   AC_LANG_CPLUSPLUS
4236   ac_save_CXXFLAGS="$CXXFLAGS"
4237   CXXFLAGS="$CXXFLAGS -fno-exceptions"
4238   ac_save_LIBS="$LIBS"
4239   LIBS="$LIBS -lpthread"
4241   AC_CACHE_CHECK([for pthread_cond_clockwait],
4242     glibcxx_cv_PTHREAD_COND_CLOCKWAIT, [
4243     GCC_TRY_COMPILE_OR_LINK(
4244       [#include <pthread.h>],
4245       [pthread_mutex_t mutex; pthread_cond_t cond; struct timespec ts; int n = pthread_cond_clockwait(&cond, &mutex, 0, &ts);],
4246       [glibcxx_cv_PTHREAD_COND_CLOCKWAIT=yes],
4247       [glibcxx_cv_PTHREAD_COND_CLOCKWAIT=no])
4248   ])
4249   if test $glibcxx_cv_PTHREAD_COND_CLOCKWAIT = yes; then
4250     AC_DEFINE(_GLIBCXX_USE_PTHREAD_COND_CLOCKWAIT, 1, [Define if pthread_cond_clockwait is available in <pthread.h>.])
4251   fi
4253   CXXFLAGS="$ac_save_CXXFLAGS"
4254   LIBS="$ac_save_LIBS"
4255   AC_LANG_RESTORE
4259 dnl Check whether pthread_mutex_clocklock is available in <pthread.h> for std::timed_mutex to use,
4260 dnl and define _GLIBCXX_USE_PTHREAD_MUTEX_CLOCKLOCK.
4262 AC_DEFUN([GLIBCXX_CHECK_PTHREAD_MUTEX_CLOCKLOCK], [
4264   AC_LANG_SAVE
4265   AC_LANG_CPLUSPLUS
4266   ac_save_CXXFLAGS="$CXXFLAGS"
4267   CXXFLAGS="$CXXFLAGS -fno-exceptions"
4268   ac_save_LIBS="$LIBS"
4269   LIBS="$LIBS -lpthread"
4271   AC_CACHE_CHECK([for pthread_mutex_clocklock],
4272     glibcxx_cv_PTHREAD_MUTEX_CLOCKLOCK, [
4273     GCC_TRY_COMPILE_OR_LINK(
4274       [#include <pthread.h>],
4275       [pthread_mutex_t mutex; struct timespec ts; int n = pthread_mutex_clocklock(&mutex, CLOCK_REALTIME, &ts);],
4276       [glibcxx_cv_PTHREAD_MUTEX_CLOCKLOCK=yes],
4277       [glibcxx_cv_PTHREAD_MUTEX_CLOCKLOCK=no])
4278   ])
4279   if test $glibcxx_cv_PTHREAD_MUTEX_CLOCKLOCK = yes; then
4280     AC_DEFINE(_GLIBCXX_USE_PTHREAD_MUTEX_CLOCKLOCK, 1, [Define if pthread_mutex_clocklock is available in <pthread.h>.])
4281   fi
4283   CXXFLAGS="$ac_save_CXXFLAGS"
4284   LIBS="$ac_save_LIBS"
4285   AC_LANG_RESTORE
4289 dnl Check whether pthread_mutex_clocklock is available in <pthread.h> for std::timed_mutex to use,
4290 dnl and define _GLIBCXX_USE_PTHREAD_MUTEX_CLOCKLOCK.
4292 AC_DEFUN([GLIBCXX_CHECK_PTHREAD_RWLOCK_CLOCKLOCK], [
4294   AC_LANG_SAVE
4295   AC_LANG_CPLUSPLUS
4296   ac_save_CXXFLAGS="$CXXFLAGS"
4297   CXXFLAGS="$CXXFLAGS -fno-exceptions"
4298   ac_save_LIBS="$LIBS"
4299   LIBS="$LIBS -lpthread"
4301   AC_CACHE_CHECK([for pthread_rwlock_clockrdlock, pthread_wlock_clockwrlock],
4302     glibcxx_cv_PTHREAD_RWLOCK_CLOCKLOCK, [
4303     GCC_TRY_COMPILE_OR_LINK(
4304       [#include <pthread.h>],
4305       [pthread_rwlock_t rwl; struct timespec ts;]
4306       [int n = pthread_rwlock_clockrdlock(&rwl, CLOCK_REALTIME, &ts);]
4307       [int m = pthread_rwlock_clockwrlock(&rwl, CLOCK_REALTIME, &ts);],
4308       [glibcxx_cv_PTHREAD_RWLOCK_CLOCKLOCK=yes],
4309       [glibcxx_cv_PTHREAD_RWLOCK_CLOCKLOCK=no])
4310   ])
4311   if test $glibcxx_cv_PTHREAD_RWLOCK_CLOCKLOCK = yes; then
4312     AC_DEFINE(_GLIBCXX_USE_PTHREAD_RWLOCK_CLOCKLOCK, 1, [Define if pthread_rwlock_clockrdlock and pthread_rwlock_clockwrlock are available in <pthread.h>.])
4313   fi
4315   CXXFLAGS="$ac_save_CXXFLAGS"
4316   LIBS="$ac_save_LIBS"
4317   AC_LANG_RESTORE
4321 dnl Check whether sysctl is available in <pthread.h>, and define _GLIBCXX_USE_SYSCTL_HW_NCPU.
4323 AC_DEFUN([GLIBCXX_CHECK_SYSCTL_HW_NCPU], [
4325   AC_LANG_SAVE
4326   AC_LANG_CPLUSPLUS
4327   ac_save_CXXFLAGS="$CXXFLAGS"
4328   CXXFLAGS="$CXXFLAGS -fno-exceptions"
4330   AC_CACHE_CHECK([for hw.ncpu sysctl],
4331     glibcxx_cv_SYSCTL_HW_NCPU, [
4332     GCC_TRY_COMPILE_OR_LINK(
4333       [
4334        #include <stddef.h>
4335        #include <sys/sysctl.h>
4336        ],
4337       [
4338        int count;
4339        size_t size = sizeof(count);
4340        int mib[] = { CTL_HW, HW_NCPU };
4341        sysctl(mib, 2, &count, &size, NULL, 0);
4342       ],
4343       [glibcxx_cv_SYSCTL_HW_NCPU=yes],
4344       [glibcxx_cv_SYSCTL_HW_NCPU=no])
4345   ])
4346   if test $glibcxx_cv_SYSCTL_HW_NCPU = yes; then
4347     AC_DEFINE(_GLIBCXX_USE_SYSCTL_HW_NCPU, 1, [Define if sysctl(), CTL_HW and HW_NCPU are available in <sys/sysctl.h>.])
4348   fi
4350   CXXFLAGS="$ac_save_CXXFLAGS"
4351   AC_LANG_RESTORE
4355 dnl Check to see if python pretty printing can be activated.
4357 dnl --with-python-dir=dir
4358 dnl installs directory into $prefix/dir
4359 AC_DEFUN([GLIBCXX_ENABLE_PYTHON], [
4361 AC_MSG_CHECKING([for custom python install directory])
4362 AC_ARG_WITH([python-dir],
4363             AS_HELP_STRING([--with-python-dir],
4364                            [the location to install Python modules. This path is relative starting from the prefix.]),
4365             [with_python_dir=$withval], [with_python_dir="no"])
4366 AC_MSG_RESULT(${with_python_dir})
4368 # Needed for installing Python modules during make install.
4369 python_mod_dir="${with_python_dir}"
4370 AC_SUBST(python_mod_dir)
4371 GLIBCXX_CONDITIONAL(ENABLE_PYTHONDIR, test $python_mod_dir != no)
4375 dnl Check to see if -Werror is disabled.
4377 dnl --enable-werror/--disable-werror
4378 AC_DEFUN([GLIBCXX_ENABLE_WERROR], [
4379   AC_MSG_CHECKING([for -Werror])
4380   GLIBCXX_ENABLE(werror,$1,,[turns on -Werror])
4381   AC_MSG_RESULT($enable_werror)
4382   GLIBCXX_CONDITIONAL(ENABLE_WERROR, test $enable_werror = yes)
4386 dnl Check whether obsolescent tmpnam is available in <stdio.h>,
4387 dnl and define _GLIBCXX_USE_TMPNAM.
4389 AC_DEFUN([GLIBCXX_CHECK_TMPNAM], [dnl
4391   AC_LANG_SAVE
4392   AC_LANG_CPLUSPLUS
4393   ac_save_CXXFLAGS="$CXXFLAGS"
4394   CXXFLAGS="$CXXFLAGS -fno-exceptions"
4396   AC_CACHE_CHECK([for tmpnam], glibcxx_cv_TMPNAM, [dnl
4397     GCC_TRY_COMPILE_OR_LINK(
4398       [#include <stdio.h>],
4399       [char *tmp = tmpnam(NULL);],
4400       [glibcxx_cv_TMPNAM=yes],
4401       [glibcxx_cv_TMPNAM=no])
4402   ])
4403   if test $glibcxx_cv_TMPNAM = yes; then
4404     AC_DEFINE(_GLIBCXX_USE_TMPNAM, 1, [Define if obsolescent tmpnam is available in <stdio.h>.])
4405   fi
4407   CXXFLAGS="$ac_save_CXXFLAGS"
4408   AC_LANG_RESTORE
4412 dnl Check to see if sys/sdt.h exists and that it is suitable for use.
4413 dnl Some versions of sdt.h were not compatible with C++11.
4415 AC_DEFUN([GLIBCXX_CHECK_SDT_H], [
4416   # Note that this test has to be run with the C language.
4417   # Otherwise, sdt.h will try to include some headers from
4418   # libstdc++ itself.
4419   AC_LANG_SAVE
4420   AC_LANG_C
4421   AC_CACHE_CHECK([for suitable sys/sdt.h],
4422     glibcxx_cv_sys_sdt_h, [
4423     # Because we have to run the test in C, we use grep rather
4424     # than the compiler to check for the bug.  The bug is that
4425     # were strings without trailing whitespace, causing g++
4426     # to look for operator"".  The pattern searches for the fixed
4427     # output.
4428     AC_EGREP_CPP([ \",\" ], [
4429       #include <sys/sdt.h>
4430       int f() { STAP_PROBE(hi, bob); }
4431     ], [glibcxx_cv_sys_sdt_h=yes], [glibcxx_cv_sys_sdt_h=no])
4432   ])
4433   AC_LANG_RESTORE
4434   if test $glibcxx_cv_sys_sdt_h = yes; then
4435     AC_DEFINE(HAVE_SYS_SDT_H, 1,
4436               [Define to 1 if you have a suitable <sys/sdt.h> header file])
4437   fi
4441 dnl Control whether the library should define symbols for old and new ABIs.
4442 dnl This affects definitions of strings, stringstreams and locale facets.
4444 dnl --disable-libstdcxx-dual-abi will use old ABI for all types.
4446 dnl Defines:
4447 dnl  _GLIBCXX_USE_DUAL_ABI (always defined, either to 1 or 0)
4449 AC_DEFUN([GLIBCXX_ENABLE_LIBSTDCXX_DUAL_ABI], [
4450   GLIBCXX_ENABLE(libstdcxx-dual-abi,$1,,[support two versions of std::string])
4451   if test x$enable_symvers = xgnu-versioned-namespace; then
4452     # gnu-versioned-namespace is incompatible with the dual ABI.
4453     enable_libstdcxx_dual_abi="no"
4454   fi
4455   if test x"$enable_libstdcxx_dual_abi" != xyes; then
4456     AC_MSG_NOTICE([dual ABI is disabled])
4457     default_libstdcxx_abi="gcc4-compatible"
4458   fi
4459   GLIBCXX_CONDITIONAL(ENABLE_DUAL_ABI, test $enable_libstdcxx_dual_abi = yes)
4463 dnl Check to see which ABI should be enabled by default.
4465 dnl --with-default-libstdcxx-abi={gcc4-compatible,new}
4467 dnl Defines:
4468 dnl  _GLIBCXX_USE_CXX11_ABI (always defined, either to 1 or 0)
4470 AC_DEFUN([GLIBCXX_DEFAULT_ABI], [
4471   if test x$enable_libstdcxx_dual_abi = xyes; then
4472   AC_MSG_CHECKING([for default std::string ABI to use])
4473   AC_ARG_WITH([default-libstdcxx-abi],
4474     AS_HELP_STRING([--with-default-libstdcxx-abi],
4475                    [set the std::string ABI to use by default]),
4476     [case "$withval" in
4477       gcc4-compatible)  default_libstdcxx_abi="gcc4-compatible" ;;
4478       new|cxx11)  default_libstdcxx_abi="new" ;;
4479       c++*|gnu++*) AC_MSG_ERROR([Supported arguments for --with-default-libstdcxx-abi have changed, use "new" or "gcc4-compatible"]) ;;
4480       *) AC_MSG_ERROR([Invalid argument for --with-default-libstdcxx-abi]) ;;
4481      esac
4482      ],
4483     [default_libstdcxx_abi="new"])
4484   AC_MSG_RESULT(${default_libstdcxx_abi})
4485   fi
4486   if test $default_libstdcxx_abi = "new"; then
4487     glibcxx_cxx11_abi=1
4488     glibcxx_cxx98_abi=0
4489   else
4490     glibcxx_cxx11_abi=0
4491     glibcxx_cxx98_abi=1
4492   fi
4493   AC_SUBST(glibcxx_cxx98_abi)
4494   GLIBCXX_CONDITIONAL(ENABLE_CXX11_ABI, test $glibcxx_cxx11_abi = 1)
4498 dnl Check to see whether to build libstdc++fs.a
4500 dnl --enable-libstdcxx-filesystem-ts
4502 AC_DEFUN([GLIBCXX_ENABLE_FILESYSTEM_TS], [
4503   GLIBCXX_ENABLE(libstdcxx-filesystem-ts,auto,,
4504     [turns on ISO/IEC TS 18822 support],
4505     [permit yes|no|auto])
4507   AC_MSG_CHECKING([whether to build Filesystem TS support])
4508   if test x"$ac_cv_header_dirent_h" != x"yes"; then
4509     enable_libstdcxx_filesystem_ts=no
4510   fi
4511   if test x"$enable_libstdcxx_filesystem_ts" = x"auto"; then
4512     case "${target_os}" in
4513       freebsd*|netbsd*|openbsd*|dragonfly*|darwin*)
4514         enable_libstdcxx_filesystem_ts=yes
4515         ;;
4516       gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu | uclinux*)
4517         enable_libstdcxx_filesystem_ts=yes
4518         ;;
4519       rtems*)
4520         enable_libstdcxx_filesystem_ts=yes
4521         ;;
4522       solaris*)
4523         enable_libstdcxx_filesystem_ts=yes
4524         ;;
4525       mingw*)
4526         enable_libstdcxx_filesystem_ts=yes
4527         ;;
4528       *)
4529         enable_libstdcxx_filesystem_ts=no
4530         ;;
4531     esac
4532   fi
4533   AC_MSG_RESULT($enable_libstdcxx_filesystem_ts)
4534   GLIBCXX_CONDITIONAL(ENABLE_FILESYSTEM_TS, test $enable_libstdcxx_filesystem_ts = yes)
4538 dnl Check whether the library calls required by the C++17 Filesystem library
4539 dnl and the Filesystem TS are present.
4540 dnl Defines:
4541 dnl  HAVE_STRUCT_DIRENT_D_TYPE
4542 dnl  _GLIBCXX_USE_REALPATH
4543 dnl  _GLIBCXX_USE_UTIMENSAT
4544 dnl  _GLIBCXX_USE_ST_MTIM
4545 dnl  _GLIBCXX_USE_FCHMOD
4546 dnl  _GLIBCXX_USE_FCHMODAT
4547 dnl  _GLIBCXX_USE_SENDFILE
4548 dnl  HAVE_LINK
4549 dnl  HAVE_READLINK
4550 dnl  HAVE_SYMLINK
4552 AC_DEFUN([GLIBCXX_CHECK_FILESYSTEM_DEPS], [dnl
4554   AC_LANG_SAVE
4555   AC_LANG_CPLUSPLUS
4556   ac_save_CXXFLAGS="$CXXFLAGS"
4557   CXXFLAGS="$CXXFLAGS -fno-exceptions"
4559   AC_CACHE_CHECK([for struct dirent.d_type], glibcxx_cv_dirent_d_type, [dnl
4560     GCC_TRY_COMPILE_OR_LINK(
4561       [#include <dirent.h>],
4562       [
4563        struct dirent d;
4564        if (sizeof d.d_type) return 0;
4565       ],
4566       [glibcxx_cv_dirent_d_type=yes],
4567       [glibcxx_cv_dirent_d_type=no])
4568   ])
4569   if test $glibcxx_cv_dirent_d_type = yes; then
4570     AC_DEFINE(HAVE_STRUCT_DIRENT_D_TYPE, 1, [Define to 1 if `d_type' is a member of `struct dirent'.])
4571   fi
4573   AC_CACHE_CHECK([for realpath], glibcxx_cv_realpath, [dnl
4574     GCC_TRY_COMPILE_OR_LINK(
4575       [
4576        #include <limits.h>
4577        #include <stdlib.h>
4578        #include <unistd.h>
4579       ],
4580       [
4581        #if _XOPEN_VERSION < 500
4582        #error
4583        #elif _XOPEN_VERSION >= 700 || defined(PATH_MAX)
4584        char *tmp = realpath((const char*)NULL, (char*)NULL);
4585        #else
4586        #error
4587        #endif
4588       ],
4589       [glibcxx_cv_realpath=yes],
4590       [glibcxx_cv_realpath=no])
4591   ])
4592   if test $glibcxx_cv_realpath = yes; then
4593     AC_DEFINE(_GLIBCXX_USE_REALPATH, 1, [Define if usable realpath is available in <stdlib.h>.])
4594   fi
4596   AC_CACHE_CHECK([for utimensat], glibcxx_cv_utimensat, [dnl
4597     GCC_TRY_COMPILE_OR_LINK(
4598       [
4599         #include <fcntl.h>
4600         #include <sys/stat.h>
4601       ],
4602       [
4603         struct timespec ts[2] = { { 0, UTIME_OMIT }, { 1, 1 } };
4604         int i = utimensat(AT_FDCWD, "path", ts, 0);
4605       ],
4606       [glibcxx_cv_utimensat=yes],
4607       [glibcxx_cv_utimensat=no])
4608   ])
4609   if test $glibcxx_cv_utimensat = yes; then
4610     AC_DEFINE(_GLIBCXX_USE_UTIMENSAT, 1, [Define if utimensat and UTIME_OMIT are available in <sys/stat.h> and AT_FDCWD in <fcntl.h>.])
4611   fi
4613   AC_CACHE_CHECK([for utime], glibcxx_cv_utime, [dnl
4614     GCC_TRY_COMPILE_OR_LINK(
4615       [
4616         #include <utime.h>
4617       ],
4618       [
4619         struct utimbuf t = { 1, 1 };
4620         int i = utime("path", &t);
4621       ],
4622       [glibcxx_cv_utime=yes],
4623       [glibcxx_cv_utime=no])
4624   ])
4625   if test $glibcxx_cv_utime = yes; then
4626     AC_DEFINE(_GLIBCXX_USE_UTIME, 1, [Define if utime is available in <utime.h>.])
4627   fi
4629   AC_CACHE_CHECK([for lstat], glibcxx_cv_lstat, [dnl
4630     GCC_TRY_COMPILE_OR_LINK(
4631       [ #include <sys/stat.h> ],
4632       [
4633         struct stat st;
4634         int i = lstat("path", &st);
4635       ],
4636       [glibcxx_cv_lstat=yes],
4637       [glibcxx_cv_lstat=no])
4638   ])
4639   if test $glibcxx_cv_lstat = yes; then
4640     AC_DEFINE(_GLIBCXX_USE_LSTAT, 1, [Define if lstat is available in <sys/stat.h>.])
4641   fi
4643   AC_CACHE_CHECK([for struct stat.st_mtim.tv_nsec],
4644     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
4658   AC_CACHE_CHECK([for fchmod],
4659     glibcxx_cv_fchmod, [dnl
4660     GCC_TRY_COMPILE_OR_LINK(
4661       [#include <sys/stat.h>],
4662       [fchmod(1, S_IWUSR);],
4663       [glibcxx_cv_fchmod=yes],
4664       [glibcxx_cv_fchmod=no])
4665   ])
4666   if test $glibcxx_cv_fchmod = yes; then
4667     AC_DEFINE(_GLIBCXX_USE_FCHMOD, 1, [Define if fchmod is available in <sys/stat.h>.])
4668   fi
4670   AC_CACHE_CHECK([for fchmodat],
4671     glibcxx_cv_fchmodat, [dnl
4672     GCC_TRY_COMPILE_OR_LINK(
4673       [
4674         #include <fcntl.h>
4675         #include <sys/stat.h>
4676       ],
4677       [fchmodat(AT_FDCWD, "", 0, AT_SYMLINK_NOFOLLOW);],
4678       [glibcxx_cv_fchmodat=yes],
4679       [glibcxx_cv_fchmodat=no])
4680   ])
4681   if test $glibcxx_cv_fchmodat = yes; then
4682     AC_DEFINE(_GLIBCXX_USE_FCHMODAT, 1, [Define if fchmodat is available in <sys/stat.h>.])
4683   fi
4685   AC_CACHE_CHECK([for sendfile that can copy files],
4686     glibcxx_cv_sendfile, [dnl
4687     case "${target_os}" in
4688       gnu* | linux* | solaris* | uclinux*)
4689         GCC_TRY_COMPILE_OR_LINK(
4690           [#include <sys/sendfile.h>],
4691           [sendfile(1, 2, (off_t*)0, sizeof 1);],
4692           [glibcxx_cv_sendfile=yes],
4693           [glibcxx_cv_sendfile=no])
4694         ;;
4695       *)
4696         glibcxx_cv_sendfile=no
4697         ;;
4698     esac
4699   ])
4700   if test $glibcxx_cv_sendfile = yes; then
4701     AC_DEFINE(_GLIBCXX_USE_SENDFILE, 1, [Define if sendfile is available in <sys/sendfile.h>.])
4702   fi
4704   AC_CACHE_CHECK([for link],
4705     glibcxx_cv_link, [dnl
4706     GCC_TRY_COMPILE_OR_LINK(
4707       [#include <unistd.h>],
4708       [link("", "");],
4709       [glibcxx_cv_link=yes],
4710       [glibcxx_cv_link=no])
4711   ])
4712   if test $glibcxx_cv_link = yes; then
4713     AC_DEFINE(HAVE_LINK, 1, [Define if link is available in <unistd.h>.])
4714   fi
4716   AC_CACHE_CHECK([for readlink],
4717     glibcxx_cv_readlink, [dnl
4718     GCC_TRY_COMPILE_OR_LINK(
4719       [#include <unistd.h>],
4720       [char buf[32]; readlink("", buf, sizeof(buf));],
4721       [glibcxx_cv_readlink=yes],
4722       [glibcxx_cv_readlink=no])
4723   ])
4724   if test $glibcxx_cv_readlink = yes; then
4725     AC_DEFINE(HAVE_READLINK, 1, [Define if readlink is available in <unistd.h>.])
4726   fi
4728   AC_CACHE_CHECK([for symlink],
4729     glibcxx_cv_symlink, [dnl
4730     GCC_TRY_COMPILE_OR_LINK(
4731       [#include <unistd.h>],
4732       [symlink("", "");],
4733       [glibcxx_cv_symlink=yes],
4734       [glibcxx_cv_symlink=no])
4735   ])
4736   if test $glibcxx_cv_symlink = yes; then
4737     AC_DEFINE(HAVE_SYMLINK, 1, [Define if symlink is available in <unistd.h>.])
4738   fi
4740   AC_CACHE_CHECK([for truncate],
4741     glibcxx_cv_truncate, [dnl
4742     GCC_TRY_COMPILE_OR_LINK(
4743       [#include <unistd.h>],
4744       [truncate("", 99);],
4745       [glibcxx_cv_truncate=yes],
4746       [glibcxx_cv_truncate=no])
4747   ])
4748   if test $glibcxx_cv_truncate = yes; then
4749     AC_DEFINE(HAVE_TRUNCATE, 1, [Define if truncate is available in <unistd.h>.])
4750   fi
4752   AC_CACHE_CHECK([for fdopendir],
4753     glibcxx_cv_fdopendir, [dnl
4754     GCC_TRY_COMPILE_OR_LINK(
4755       [#include <dirent.h>],
4756       [::DIR* dir = ::fdopendir(1);],
4757       [glibcxx_cv_fdopendir=yes],
4758       [glibcxx_cv_fdopendir=no])
4759   ])
4760   if test $glibcxx_cv_fdopendir = yes; then
4761     AC_DEFINE(HAVE_FDOPENDIR, 1, [Define if fdopendir is available in <dirent.h>.])
4762   fi
4764   AC_CACHE_CHECK([for dirfd],
4765     glibcxx_cv_dirfd, [dnl
4766     GCC_TRY_COMPILE_OR_LINK(
4767       [#include <dirent.h>],
4768       [int fd = ::dirfd((::DIR*)0);],
4769       [glibcxx_cv_dirfd=yes],
4770       [glibcxx_cv_dirfd=no])
4771   ])
4772   if test $glibcxx_cv_dirfd = yes; then
4773     AC_DEFINE(HAVE_DIRFD, 1, [Define if dirfd is available in <dirent.h>.])
4774   fi
4776   AC_CACHE_CHECK([for openat],
4777     glibcxx_cv_openat, [dnl
4778     GCC_TRY_COMPILE_OR_LINK(
4779       [#include <fcntl.h>],
4780       [int fd = ::openat(AT_FDCWD, "", 0);],
4781       [glibcxx_cv_openat=yes],
4782       [glibcxx_cv_openat=no])
4783   ])
4784   if test $glibcxx_cv_openat = yes; then
4785     AC_DEFINE(HAVE_OPENAT, 1, [Define if openat is available in <fcntl.h>.])
4786   fi
4788   AC_CACHE_CHECK([for unlinkat],
4789     glibcxx_cv_unlinkat, [dnl
4790     GCC_TRY_COMPILE_OR_LINK(
4791       [#include <fcntl.h>
4792        #include <unistd.h>],
4793       [::unlinkat(AT_FDCWD, "", AT_REMOVEDIR);],
4794       [glibcxx_cv_unlinkat=yes],
4795       [glibcxx_cv_unlinkat=no])
4796   ])
4797   if test $glibcxx_cv_unlinkat = yes; then
4798     AC_DEFINE(HAVE_UNLINKAT, 1, [Define if unlinkat is available in <fcntl.h>.])
4799   fi
4801   CXXFLAGS="$ac_save_CXXFLAGS"
4802   AC_LANG_RESTORE
4806 dnl Check how size_t is mangled.  Copied from libitm.
4808 AC_DEFUN([GLIBCXX_CHECK_SIZE_T_MANGLING], [
4809   AC_CACHE_CHECK([how size_t is mangled],
4810                  glibcxx_cv_size_t_mangling, [
4811     AC_TRY_COMPILE([], [extern __SIZE_TYPE__ x; extern unsigned long x;],
4812                    [glibcxx_cv_size_t_mangling=m], [
4813       AC_TRY_COMPILE([], [extern __SIZE_TYPE__ x; extern unsigned int x;],
4814                      [glibcxx_cv_size_t_mangling=j], [
4815         AC_TRY_COMPILE([],
4816                        [extern __SIZE_TYPE__ x; extern unsigned long long x;],
4817                        [glibcxx_cv_size_t_mangling=y], [
4818           AC_TRY_COMPILE([],
4819                          [extern __SIZE_TYPE__ x; extern unsigned short x;],
4820                          [glibcxx_cv_size_t_mangling=t], [
4821             AC_TRY_COMPILE([],
4822                            [extern __SIZE_TYPE__ x; extern __int20 unsigned x;],
4823                            [glibcxx_cv_size_t_mangling=u6uint20],
4824                            [glibcxx_cv_size_t_mangling=x])
4825           ])
4826         ])
4827       ])
4828     ])
4829   ])
4830   if test $glibcxx_cv_size_t_mangling = x; then
4831     AC_MSG_ERROR([Unknown underlying type for size_t])
4832   fi
4833   AC_DEFINE_UNQUOTED(_GLIBCXX_MANGLE_SIZE_T, [$glibcxx_cv_size_t_mangling],
4834     [Define to the letter to which size_t is mangled.])
4838 dnl Determine whether std::exception_ptr symbols should be exported with
4839 dnl the symbol versions from GCC 4.6.0 or GCC 7.1.0, depending on which
4840 dnl release first added support for std::exception_ptr. Originally it was
4841 dnl only supported for targets with always-lock-free atomics for int, but
4842 dnl since GCC 7.1 it is supported for all targets.
4844 AC_DEFUN([GLIBCXX_CHECK_EXCEPTION_PTR_SYMVER], [
4845   if test $enable_symvers != no; then
4846     AC_MSG_CHECKING([for first version to support std::exception_ptr])
4847     case ${target} in
4848       aarch64-*-* | alpha-*-* | hppa*-*-* | i?86-*-* | x86_64-*-* | \
4849       m68k-*-* | powerpc*-*-* | s390*-*-* | *-*-solaris* )
4850         ac_exception_ptr_since_gcc46=yes
4851         ;;
4852       *)
4853         # If the value of this macro changes then we will need to hardcode
4854         # yes/no here for additional targets based on the original value.
4855         AC_TRY_COMPILE([], [
4856           #if __GCC_ATOMIC_INT_LOCK_FREE <= 1
4857           # error atomic int not always lock free
4858           #endif
4859           ],
4860           [ac_exception_ptr_since_gcc46=yes],
4861           [ac_exception_ptr_since_gcc46=no])
4862         ;;
4863     esac
4864     if test x"$ac_exception_ptr_since_gcc46" = x"yes" ; then
4865       AC_DEFINE(HAVE_EXCEPTION_PTR_SINCE_GCC46, 1,
4866         [Define to 1 if GCC 4.6 supported std::exception_ptr for the target])
4867       AC_MSG_RESULT([4.6.0])
4868     else
4869       AC_MSG_RESULT([7.1.0])
4870     fi
4871   fi
4875 dnl Check whether getentropy is present in <unistd.h>.
4877 AC_DEFUN([GLIBCXX_CHECK_GETENTROPY], [
4879   AC_LANG_SAVE
4880   AC_LANG_CPLUSPLUS
4881   AC_CACHE_CHECK([for getentropy], glibcxx_cv_getentropy, [
4882       GCC_TRY_COMPILE_OR_LINK(
4883         [#include <unistd.h>],
4884         [unsigned i;
4885          ::getentropy(&i, sizeof(i));],
4886         [glibcxx_cv_getentropy=yes], [glibcxx_cv_getentropy=no])
4887     ])
4889   if test $glibcxx_cv_getentropy = yes; then
4890     AC_DEFINE(HAVE_GETENTROPY, 1, [Define if getentropy is available in <unistd.h>.])
4891   fi
4892   AC_LANG_RESTORE
4896 dnl Check whether arc4random is present in <stdlib.h>.
4898 AC_DEFUN([GLIBCXX_CHECK_ARC4RANDOM], [
4900   AC_LANG_SAVE
4901   AC_LANG_CPLUSPLUS
4902   AC_CACHE_CHECK([for arc4random], glibcxx_cv_arc4random, [
4903       GCC_TRY_COMPILE_OR_LINK(
4904         [#include <stdlib.h>],
4905         [unsigned i = ::arc4random();],
4906         [glibcxx_cv_arc4random=yes], [glibcxx_cv_arc4random=no])
4907     ])
4909   if test $glibcxx_cv_arc4random = yes; then
4910     AC_DEFINE(HAVE_ARC4RANDOM, 1, [Define if arc4random is available in <stdlib.h>.])
4911   fi
4912   AC_LANG_RESTORE
4916 dnl Check to see whether to build libstdc++_libbacktrace.a
4918 dnl --enable-libstdcxx-backtrace
4920 AC_DEFUN([GLIBCXX_ENABLE_BACKTRACE], [
4921   GLIBCXX_ENABLE(libstdcxx-backtrace,auto,,
4922     [turns on libbacktrace support],
4923     [permit yes|no|auto])
4925   # Most of this is adapted from libsanitizer/configure.ac
4927   BACKTRACE_CPPFLAGS=
4929   # libbacktrace only needs atomics for int, which we've already tested
4930   if test "$glibcxx_cv_atomic_int" = "yes"; then
4931     BACKTRACE_CPPFLAGS="$BACKTRACE_CPPFLAGS -DHAVE_ATOMIC_FUNCTIONS=1"
4932   fi
4934   # Test for __sync support.
4935   AC_CACHE_CHECK([__sync extensions],
4936   [glibcxx_cv_sys_sync],
4937   [GCC_TRY_COMPILE_OR_LINK(
4938      [int i;],
4939      [__sync_bool_compare_and_swap (&i, i, i);
4940      __sync_lock_test_and_set (&i, 1);
4941      __sync_lock_release (&i);],
4942      [glibcxx_cv_sys_sync=yes],
4943      [glibcxx_cv_sys_sync=no])
4944   ])
4945   if test "$glibcxx_cv_sys_sync" = "yes"; then
4946     BACKTRACE_CPPFLAGS="$BACKTRACE_CPPFLAGS -DHAVE_SYNC_FUNCTIONS=1"
4947   fi
4949   # Check for dl_iterate_phdr.
4950   AC_CHECK_HEADERS(link.h)
4951   if test "$ac_cv_header_link_h" = "no"; then
4952     have_dl_iterate_phdr=no
4953   else
4954     # When built as a GCC target library, we can't do a link test.
4955     AC_EGREP_HEADER([dl_iterate_phdr], [link.h], [have_dl_iterate_phdr=yes],
4956                     [have_dl_iterate_phdr=no])
4957   fi
4958   if test "$have_dl_iterate_phdr" = "yes"; then
4959     BACKTRACE_CPPFLAGS="$BACKTRACE_CPPFLAGS -DHAVE_DL_ITERATE_PHDR=1"
4960   fi
4962   # Check for the fcntl function.
4963   if test -n "${with_target_subdir}"; then
4964      case "${host}" in
4965      *-*-mingw*) have_fcntl=no ;;
4966      *) have_fcntl=yes ;;
4967      esac
4968   else
4969     AC_CHECK_FUNC(fcntl, [have_fcntl=yes], [have_fcntl=no])
4970   fi
4971   if test "$have_fcntl" = "yes"; then
4972     BACKTRACE_CPPFLAGS="$BACKTRACE_CPPFLAGS -DHAVE_FCNTL=1"
4973   fi
4975   AC_CHECK_DECLS(strnlen)
4977   # Check for getexecname function.
4978   if test -n "${with_target_subdir}"; then
4979      case "${host}" in
4980      *-*-solaris2*) have_getexecname=yes ;;
4981      *) have_getexecname=no ;;
4982      esac
4983   else
4984     AC_CHECK_FUNC(getexecname, [have_getexecname=yes], [have_getexecname=no])
4985   fi
4986   if test "$have_getexecname" = "yes"; then
4987     BACKTRACE_CPPFLAGS="$BACKTRACE_CPPFLAGS -DHAVE_GETEXECNAME=1"
4988   fi
4990 # The library needs to be able to read the executable itself.  Compile
4991 # a file to determine the executable format.  The awk script
4992 # filetype.awk prints out the file type.
4993 AC_CACHE_CHECK([output filetype],
4994 [glibcxx_cv_sys_filetype],
4995 [filetype=
4996 AC_COMPILE_IFELSE(
4997   [AC_LANG_PROGRAM([int i;], [int j;])],
4998   [filetype=`${AWK} -f $srcdir/../libbacktrace/filetype.awk conftest.$ac_objext`],
4999   [AC_MSG_FAILURE([compiler failed])])
5000 glibcxx_cv_sys_filetype=$filetype])
5002 # Match the file type to decide what files to compile.
5003 FORMAT_FILE=
5004 case "$glibcxx_cv_sys_filetype" in
5005 elf*) FORMAT_FILE="elf.lo" ;;
5006 *) AC_MSG_WARN([could not determine output file type])
5007    FORMAT_FILE="unknown.lo"
5008    enable_libstdcxx_backtrace=no
5009    ;;
5010 esac
5011 AC_SUBST(FORMAT_FILE)
5013 # ELF defines.
5014 elfsize=
5015 case "$glibcxx_cv_sys_filetype" in
5016 elf32) elfsize=32 ;;
5017 elf64) elfsize=64 ;;
5018 esac
5019 BACKTRACE_CPPFLAGS="$BACKTRACE_CPPFLAGS -DBACKTRACE_ELF_SIZE=$elfsize"
5021   AC_MSG_CHECKING([whether to build libbacktrace support])
5022   if test "$enable_libstdcxx_backtrace" = "auto"; then
5023     enable_libstdcxx_backtrace=no
5024   fi
5025   if test "$enable_libstdcxx_backtrace" = "yes"; then
5026     BACKTRACE_SUPPORTED=1
5028     AC_CHECK_HEADERS(sys/mman.h)
5029     case "${host}" in
5030       *-*-msdosdjgpp) # DJGPP has sys/man.h, but no mmap
5031         have_mmap=no ;;
5032       *-*-*)
5033         have_mmap="$ac_cv_header_sys_mman_h" ;;
5034     esac
5036     if test "$have_mmap" = "no"; then
5037       VIEW_FILE=read.lo
5038       ALLOC_FILE=alloc.lo
5039     else
5040       VIEW_FILE=mmapio.lo
5041       AC_PREPROC_IFELSE([AC_LANG_SOURCE([
5042     #include <sys/mman.h>
5043     #if !defined(MAP_ANONYMOUS) && !defined(MAP_ANON)
5044       #error no MAP_ANONYMOUS
5045     #endif
5046     ])], [ALLOC_FILE=mmap.lo], [ALLOC_FILE=alloc.lo])
5047     fi
5048     AC_SUBST(VIEW_FILE)
5049     AC_SUBST(ALLOC_FILE)
5051     BACKTRACE_USES_MALLOC=0
5052     if test "$ALLOC_FILE" = "alloc.lo"; then
5053       BACKTRACE_USES_MALLOC=1
5054     fi
5056     if test "$ac_has_gthreads" = "yes"; then
5057       BACKTRACE_SUPPORTS_THREADS=1
5058     else
5059       BACKTRACE_SUPPORTS_THREADS=0
5060     fi
5061     AC_SUBST(BACKTRACE_CPPFLAGS)
5062     AC_SUBST(BACKTRACE_SUPPORTED)
5063     AC_SUBST(BACKTRACE_USES_MALLOC)
5064     AC_SUBST(BACKTRACE_SUPPORTS_THREADS)
5065     AC_DEFINE(HAVE_STACKTRACE, 1, [Define if the <stacktrace> header is supported.])
5066   else
5067     BACKTRACE_SUPPORTED=0
5068     BACKTRACE_USES_MALLOC=0
5069     BACKTRACE_SUPPORTS_THREADS=0
5070   fi
5071   AC_MSG_RESULT($enable_libstdcxx_backtrace)
5072   GLIBCXX_CONDITIONAL(ENABLE_BACKTRACE, [test "$enable_libstdcxx_backtrace" = yes])
5075 # Macros from the top-level gcc directory.
5076 m4_include([../config/gc++filt.m4])
5077 m4_include([../config/tls.m4])
5078 m4_include([../config/gthr.m4])
5079 m4_include([../config/cet.m4])