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