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