Skip to content
Snippets Groups Projects
  1. Jul 19, 2023
    • Jonathan Wakely's avatar
      libstdc++: Fix iostream init for Clang on darwin [PR110432] · 61bf34d1
      Jonathan Wakely authored
      
      The __has_attribute(init_priority) check in <iostream> is true for Clang
      on darwin, which means that user code including <iostream> thinks the
      library will initialize the global streams. However, when libstdc++ is
      built by GCC on darwin, the __has_attribute(init_priority) check is
      false, which means that the library thinks that user code will do the
      initialization when <iostream> is included. This means that the
      initialization is never done.
      
      Add an autoconf check so that the header and the library both make their
      decision based on the static properties of GCC at build time, with a
      consistent outcome.
      
      As a belt and braces check, also do the initialization in <iostream> if
      the compiler including that header doesn't support the attribute (even
      if the library also containers the initialization). This might result in
      redundant initialization done in <iostream>, but ensures the
      initialization happens somewhere if there's any doubt about the
      attribute working correctly due to missing linker support.
      
      libstdc++-v3/ChangeLog:
      
      	PR libstdc++/110432
      	* acinclude.m4 (GLIBCXX_CHECK_INIT_PRIORITY): New.
      	* config.h.in: Regenerate.
      	* configure: Regenerate.
      	* configure.ac: Use GLIBCXX_CHECK_INIT_PRIORITY.
      	* include/std/iostream: Use new autoconf macro as well as
      	__has_attribute.
      	* src/c++98/ios_base_init.h: Use new autoconf macro instead of
      	__has_attribute.
      
      Reviewed-by: default avatarPatrick Palka <ppalka@redhat.com>
      (cherry picked from commit fe2651af)
      61bf34d1
  2. Jul 18, 2023
    • Jonathan Wakely's avatar
      libstdc++: Fix --enable-cstdio=stdio_pure [PR110574] · 5342e3cc
      Jonathan Wakely authored
      When configured with --enable-cstdio=stdio_pure we need to consistently
      use fseek and not mix seeks on the file descriptor with reads and writes
      on the FILE stream.
      
      There are also a number of bugs related to error handling and return
      values, because fread and fwrite return 0 on error, not -1, and fseek
      returns 0 on success, not the file offset.
      
      libstdc++-v3/ChangeLog:
      
      	PR libstdc++/110574
      	* acinclude.m4 (GLIBCXX_CHECK_LFS): Check for fseeko and ftello
      	and define _GLIBCXX_USE_FSEEKO_FTELLO.
      	* config.h.in: Regenerate.
      	* configure: Regenerate.
      	* config/io/basic_file_stdio.cc (xwrite) [_GLIBCXX_USE_STDIO_PURE]:
      	Check for fwrite error correctly.
      	(__basic_file<char>::xsgetn) [_GLIBCXX_USE_STDIO_PURE]: Check for
      	fread error correctly.
      	(get_file_offset): New function.
      	(__basic_file<char>::seekoff) [_GLIBCXX_USE_STDIO_PURE]: Use
      	fseeko if available. Use get_file_offset instead of return value
      	of fseek.
      	(__basic_file<char>::showmanyc): Use get_file_offset.
      
      (cherry picked from commit 2f6bbc9a)
      5342e3cc
  3. Jun 29, 2023
    • Jonathan Wakely's avatar
      libstdc++: Fix configure test for 32-bit targets · b7b70cba
      Jonathan Wakely authored
      The -mlarge model for msp430-elf uses 20-bit pointers, which means that
      sizeof(void*) == 4 and so the r14-1432-g51cf0b3949b88b change gives the
      wrong answer. Check __INTPTR_WIDTH__ >= 32 instead.
      
      libstdc++-v3/ChangeLog:
      
      	* acinclude.m4 (GLIBCXX_ZONEINFO_DIR): Fix for 32-bit pointers
      	to check __INT_PTR_WIDTH__ instead of sizeof(void*).
      	* configure: Regenerate.
      
      (cherry picked from commit 2a919c08)
      b7b70cba
    • Jonathan Wakely's avatar
      libstdc++: Disable embedded tzdata for all 16-bit targets · fa78e9a6
      Jonathan Wakely authored
      libstdc++-v3/ChangeLog:
      
      	* acinclude.m4 (GLIBCXX_ZONEINFO_DIR): Extend logic for avr and
      	msp430 to all 16-bit targets.
      	* configure: Regenerate.
      
      (cherry picked from commit 51cf0b39)
      fa78e9a6
    • Jonathan Wakely's avatar
      libstdc++: Disable cacheline alignment for DJGPP [PR109741] · dbd4acd7
      Jonathan Wakely authored
      DJGPP (and maybe other targets) uses MAX_OFILE_ALIGNMENT=16 which means
      that globals (and static objects) can't have alignment greater than 16.
      This causes an error for the locks defined in src/c++11/shared_ptr.cc
      because we try to align them to the cacheline size, to avoid false
      sharing.
      
      Add a configure check for the increased alignment, and live with false
      sharing where we can't increase the alignment.
      
      libstdc++-v3/ChangeLog:
      
      	PR libstdc++/109741
      	* acinclude.m4 (GLIBCXX_CHECK_ALIGNAS_CACHELINE): Define.
      	* config.h.in: Regenerate.
      	* configure: Regenerate.
      	* configure.ac: Use GLIBCXX_CHECK_ALIGNAS_CACHELINE.
      	* src/c++11/shared_ptr.cc (__gnu_internal::get_mutex): Do not
      	align lock table if not supported. use __GCC_DESTRUCTIVE_SIZE
      	instead of hardcoded 64.
      
      (cherry picked from commit 94a311ab)
      dbd4acd7
  4. Jun 01, 2023
    • Jonathan Wakely's avatar
      libstdc++: Fix -Wnonnull warnings during configure · 81059051
      Jonathan Wakely authored
      We should not test for nan by passing it a null pointer, as this can
      trigger -Wnonnull warnings.
      
      Also fix an outdated comment about the default -std mode.
      
      libstdc++-v3/ChangeLog:
      
      	* acinclude.m4 (GLIBCXX_CHECK_C99_TR1): Use a non-null pointer
      	to check for nan, nanf, and nanl.
      	* configure: Regenerate.
      
      (cherry picked from commit 6190a74e)
      81059051
  5. May 04, 2023
    • Jakub Jelinek's avatar
      libstdc++: Another attempt to ensure g++ 13+ compiled programs enforce gcc... · 9c9061e0
      Jakub Jelinek authored
      libstdc++: Another attempt to ensure g++ 13+ compiled programs enforce gcc 13.2+ libstdc++.so.6 [PR108969]
      
      GCC used to emit an instance of an empty ios_base::Init class in
      every TU which included <iostream> to ensure it is std::cout etc.
      is initialized, but thanks to Patrick work on some targets (which have
      init_priority attribute support) it is now initialized only inside of
      libstdc++.so.6/libstdc++.a.
      
      This causes a problem if people do something that has never been supported,
      try to run GCC 13 compiled C++ code against GCC 12 or earlier
      libstdc++.so.6 - std::cout etc. are then never initialized because code
      including <iostream> expects the library to initialize it and the library
      expects code including <iostream> to do that.
      
      The following patch is second attempt to make this work cheaply as the
      earlier attempt of aliasing the std::cout etc. symbols with another symbol
      version didn't work out due to copy relocation breaking the aliases appart.
      
      The patch forces just a _ZSt21ios_base_library_initv undefined symbol
      into all *.o files which include <iostream> and while there is no runtime
      relocation against that, it seems to enforce the right version of
      libstdc++.so.6.  /home/jakub/src/gcc/obj08i/usr/local/ is the install
      directory of trunk patched with this patch, /home/jakub/src/gcc/obj06/
      is builddir of trunk without this patch, system g++ is GCC 12.1.1.
      $ cat /tmp/hw.C
       #include <iostream>
      
      int
      main ()
      {
        std::cout << "Hello, world!" << std::endl;
      }
      $ cd /home/jakub/src/gcc/obj08i/usr/local/bin
      $ ./g++ -o /tmp/hw /tmp/hw.C
      $ readelf -Wa /tmp/hw 2>/dev/null | grep initv
           4: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND _ZSt21ios_base_library_initv@GLIBCXX_3.4.32 (4)
          71: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND _ZSt21ios_base_library_initv@GLIBCXX_3.4.32
      $ /tmp/hw
      /tmp/hw: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.32' not found (required by /tmp/hw)
      $ LD_LIBRARY_PATH=/home/jakub/src/gcc/obj08i/usr/local/lib64/ /tmp/hw
      Hello, world!
      $ LD_LIBRARY_PATH=/home/jakub/src/gcc/obj06/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/ /tmp/hw
      /tmp/hw: /home/jakub/src/gcc/obj06/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6: version `GLIBCXX_3.4.32' not found (required by /tmp/hw)
      $ g++ -o /tmp/hw /tmp/hw.C
      $ /tmp/hw
      Hello, world!
      $ LD_LIBRARY_PATH=/home/jakub/src/gcc/obj06/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/ /tmp/hw
      Hello, world!
      $ LD_LIBRARY_PATH=/home/jakub/src/gcc/obj08i/usr/local/lib64/ /tmp/hw
      Hello, world!
      
      On sparc-sun-solaris2.11 one I've actually checked a version which had
      defined(_GLIBCXX_SYMVER_SUN) next to defined(_GLIBCXX_SYMVER_GNU), but
      init_priority attribute doesn't seem to be supported there and so I couldn't
      actually test how this works there.  Using gas and Sun ld, Rainer, does one
      need to use gas + gld for init_priority or something else?
      
      2023-04-28  Jakub Jelinek  <jakub@redhat.com>
      
      	PR libstdc++/108969
      	* config/abi/pre/gnu.ver (GLIBCXX_3.4.32): Export
      	_ZSt21ios_base_library_initv.
      	* testsuite/util/testsuite_abi.cc (check_version): Add GLIBCXX_3.4.32
      	symver and make it the latestp.
      	* src/c++98/ios_init.cc (ios_base_library_init): New alias.
      	* acinclude.m4 (libtool_VERSION): Change to 6:32:0.
      	* include/std/iostream: If init_priority attribute is supported
      	and _GLIBCXX_SYMVER_GNU, force undefined _ZSt21ios_base_library_initv
      	symbol into the object.
      	* configure: Regenerated.
      
      (cherry picked from commit 9a41d2cd)
      9c9061e0
  6. Feb 01, 2023
    • Jonathan Wakely's avatar
      libstdc++: Do not embed tzdata.zi for 8-bit and 16-bit targets · 7314558c
      Jonathan Wakely authored
      The string literal containing the static tzdata.zi information is too
      large for some targets, so do not enable it by default for avr-*-* and
      msp430-*-*.
      
      libstdc++-v3/ChangeLog:
      
      	* acinclude.m4 (GLIBCXX_ZONEINFO_DIR) [avr-*-*, msp430-*-*]: Set
      	embed_zoneinfo=no
      	* configure: Regenerate.
      7314558c
  7. Jan 17, 2023
    • Jonathan Wakely's avatar
      libstdc++: Fix configuration of default zoneinfo dir on linux · d74d84c6
      Jonathan Wakely authored
      The config for --with-libstdcxx-zoneinfo=yes was comparing the target
      triplet to "gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu" which is only
      the last component of the triplet, so failed to match and always used
      the zoneinfo_dir=none default. Check $target_os instead.
      
      There was also an error in the check for native builds that tzdata.zi is
      actually present in the configured directory. That meant a warning was
      printed even when the file was present:
      
      configure: zoneinfo data directory: /usr/share/zoneinfo
      configure: WARNING: "/usr/share/zoneinfo does not contain tzdata.zi file"
      configure: static tzdata.zi file will be compiled into the library
      
      libstdc++-v3/ChangeLog:
      
      	* acinclude.m4 (GLIBCXX_ZONEINFO_DIR): Check $target_os instead
      	of $host. Fix check for file being present during native build.
      	* configure: Regenerate.
      d74d84c6
  8. Jan 14, 2023
    • Björn Schäpers's avatar
      libstdc++: enable <stacktrace> on windows · 523e8716
      Björn Schäpers authored
      
      libstdc++-v3/Changelog
      
      	* acinclude.m4 (GLIBCXX_ENABLE_BACKTRACE): Add check for
      	windows.h. Add pecoff as FORMAT_FILE.
      	* config.h.in: Regenerate.
      	* configure: Regenerate.
      	* src/libbacktrace/Makefile.am: Regenerate.
      	* src/libbacktrace/Makefile.in: Add pecoff.c as FORMAT_FILE.
      
      Signed-off-by: default avatarBjörn Schäpers <bjoern@hazardy.de>
      523e8716
    • Jonathan Wakely's avatar
      libstdc++: Embed a static copy of tzdata.zi · 559993b8
      Jonathan Wakely authored
      This adds a copy of the tzdata.zi file to the library, and allows
      configuring to use it instead of a copy read from disk at runtime.
      The content of the file is in the public domain, but will need to be
      updated to the latest upstream file before making GCC releases.
      
      libstdc++-v3/ChangeLog:
      
      	* acinclude.m4 (GLIBCXX_ZONEINFO_DIR): Replace the
      	--with-libstdcxx-zoneinfo-dir configure option with
      	--with-libstdcxx-zoneinfo with yes/no/static choices as well as
      	a directory.
      	* config.h.in: Regenerate.
      	* configure: Regenerate.
      	* doc/xml/manual/configure.xml: Document configure option.
      	* doc/html/manual/configure.html: Regenerate.
      	* src/c++20/Makefile.am: Generate tzdata.zi.h header.
      	* src/c++20/Makefile.in: Regenerate.
      	* src/c++20/tzdb.cc (__gnu_cxx::zoneinfo_dir_override): Return a
      	null pointer if no directory is configured.
      	(zoneinfo_dir): Replace with ...
      	(zoneinfo_file): New function.
      	(tzdata_stream): New istream class.
      	(remote_version, reload_tzdb): Use tzdata_stream.
      	* testsuite/lib/libstdc++.exp (check_effective_target_tzdb):
      	Check new _GLIBCXX_STATIC_TZDATA macro and ignore presence of
      	tzdata.zi file in default location.
      	* src/c++20/tzdata.zi: New file.
      559993b8
  9. Dec 23, 2022
    • Eric Botcazou's avatar
      Reimplement GNU threads library on native Windows · 9149a5b7
      Eric Botcazou authored
      
      This reimplements the GNU threads library on native Windows (except for the
      Objective-C specific subset) using direct Win32 API calls, in lieu of the
      implementation based on semaphores.  This base implementations requires
      Windows XP/Server 2003, which was the default minimal setting of MinGW-W64
      until end of 2020.  This also adds the support required for the C++11 threads,
      using again direct Win32 API calls; this additional layer requires Windows
      Vista/Server 2008 and is enabled only if _WIN32_WINNT >= 0x0600.
      
      This also changes libstdc++ to pass -D_WIN32_WINNT=0x0600 but only when the
      switch --enable-libstdcxx-threads is passed, which means that C++11 threads
      are still disabled by default *unless* MinGW-W64 itself is configured for
      Windows Vista/Server 2008 or later by default (this has been the case in
      the development version since end of 2020, for earlier versions you can
      configure it --with-default-win32-winnt=0x0600 to get the same effect).
      
      I only manually tested it on i686-w64-mingw32 and x86_64-w64-mingw32 but
      AdaCore has used it in their C/C++/Ada compilers for 3 years now and the
      30_threads chapter of the libstdc++ testsuite was clean at the time.
      
      2022-10-31  Eric Botcazou  <ebotcazou@adacore.com>
      
      libgcc/
      	* config.host (i[34567]86-*-mingw*): Add thread fragment after EH one
      	as well as new i386/t-slibgcc-mingw fragment.
      	(x86_64-*-mingw*): Likewise.
      	* config/i386/gthr-win32.h: If _WIN32_WINNT is at least 0x0600, define
      	both __GTHREAD_HAS_COND and __GTHREADS_CXX0X to 1.
      	Error out if _GTHREAD_USE_MUTEX_TIMEDLOCK is 1.
      	Include stdlib.h instead of errno.h and do not include _mingw.h.
      	(CONST_CAST2): Add specific definition for C++.
      	(ATTRIBUTE_UNUSED): New macro.
      	(__UNUSED_PARAM): Delete.
      	Define WIN32_LEAN_AND_MEAN before including windows.h.
      	(__gthread_objc_data_tls): Use TLS_OUT_OF_INDEXES instead of (DWORD)-1.
      	(__gthread_objc_init_thread_system): Likewise.
      	(__gthread_objc_thread_get_data): Minor tweak.
      	(__gthread_objc_condition_allocate): Use ATTRIBUTE_UNUSED.
      	(__gthread_objc_condition_deallocate): Likewise.
      	(__gthread_objc_condition_wait): Likewise.
      	(__gthread_objc_condition_broadcast): Likewise.
      	(__gthread_objc_condition_signal): Likewise.
      	Include sys/time.h.
      	(__gthr_win32_DWORD): New typedef.
      	(__gthr_win32_HANDLE): Likewise.
      	(__gthr_win32_CRITICAL_SECTION): Likewise.
      	(__gthr_win32_CONDITION_VARIABLE): Likewise.
      	(__gthread_t): Adjust.
      	(__gthread_key_t): Likewise.
      	(__gthread_mutex_t): Likewise.
      	(__gthread_recursive_mutex_t): Likewise.
      	(__gthread_cond_t): New typedef.
      	(__gthread_time_t): Likewise.
      	(__GTHREAD_MUTEX_INIT_DEFAULT): Delete.
      	(__GTHREAD_RECURSIVE_MUTEX_INIT_DEFAULT): Likewise.
      	(__GTHREAD_COND_INIT_FUNCTION): Define.
      	(__GTHREAD_TIME_INIT): Likewise.
      	(__gthr_i486_lock_cmp_xchg): Delete.
      	(__gthr_win32_create): Declare.
      	(__gthr_win32_join): Likewise.
      	(__gthr_win32_self): Likewise.
      	(__gthr_win32_detach): Likewise.
      	(__gthr_win32_equal): Likewise.
      	(__gthr_win32_yield): Likewise.
      	(__gthr_win32_mutex_destroy): Likewise.
      	(__gthr_win32_cond_init_function): Likewise if __GTHREADS_HAS_COND is 1.
      	(__gthr_win32_cond_broadcast): Likewise.
      	(__gthr_win32_cond_signal): Likewise.
      	(__gthr_win32_cond_wait): Likewise.
      	(__gthr_win32_cond_timedwait): Likewise.
      	(__gthr_win32_recursive_mutex_init_function): Delete.
      	(__gthr_win32_recursive_mutex_lock): Likewise.
      	(__gthr_win32_recursive_mutex_unlock): Likewise.
      	(__gthr_win32_recursive_mutex_destroy): Likewise.
      	(__gthread_create): New inline function.
      	(__gthread_join): Likewise.
      	(__gthread_self): Likewise.
      	(__gthread_detach): Likewise.
      	(__gthread_equal): Likewise.
      	(__gthread_yield): Likewise.
      	(__gthread_cond_init_function): Likewise if __GTHREADS_HAS_COND is 1.
      	(__gthread_cond_broadcast): Likewise.
      	(__gthread_cond_signal): Likewise.
      	(__gthread_cond_wait): Likewise.
      	(__gthread_cond_timedwait): Likewise.
      	(__GTHREAD_WIN32_INLINE): New macro.
      	(__GTHREAD_WIN32_COND_INLINE): Likewise.
      	(__GTHREAD_WIN32_ACTIVE_P): Likewise.
      	Define WIN32_LEAN_AND_MEAN before including windows.h.
      	(__gthread_once): Minor tweaks.
      	(__gthread_key_create): Use ATTRIBUTE_UNUSED and TLS_OUT_OF_INDEXES.
      	(__gthread_key_delete): Minor tweak.
      	(__gthread_getspecific): Likewise.
      	(__gthread_setspecific): Likewise.
      	(__gthread_mutex_init_function): Reimplement.
      	(__gthread_mutex_destroy): Likewise.
      	(__gthread_mutex_lock): Likewise.
      	(__gthread_mutex_trylock): Likewise.
      	(__gthread_mutex_unlock): Likewise.
      	(__gthr_win32_abs_to_rel_time): Declare.
      	(__gthread_recursive_mutex_init_function): Reimplement.
      	(__gthread_recursive_mutex_destroy): Likewise.
      	(__gthread_recursive_mutex_lock): Likewise.
      	(__gthread_recursive_mutex_trylock): Likewise.
      	(__gthread_recursive_mutex_unlock): Likewise.
      	(__gthread_cond_destroy): New inline function.
      	(__gthread_cond_wait_recursive): Likewise.
      	* config/i386/gthr-win32.c: Delete everything.
      	Include gthr-win32.h to get the out-of-line version of inline routines.
      	Add compile-time checks for the local version of the Win32 types.
      	* config/i386/gthr-win32-cond.c: New file.
      	* config/i386/gthr-win32-thread.c: Likewise.
      	* config/i386/t-gthr-win32: Add config/i386/gthr-win32-thread.c to the
      	EH part, config/i386/gthr-win32-cond.c and config/i386/gthr-win32.c to
      	the static version of libgcc.
      	* config/i386/t-slibgcc-mingw: New file.
      	* config/i386/libgcc-mingw.ver: Likewise.
      libstdc++-v3/
      	* acinclude.m4 (GLIBCXX_EXPORT_FLAGS): Substitute CPPFLAGS.
      	(GLIBCXX_ENABLE_LIBSTDCXX_TIME): Set ac_has_sched_yield and
      	ac_has_win32_sleep to yes for MinGW.  Change HAVE_WIN32_SLEEP
      	into _GLIBCXX_USE_WIN32_SLEEP.
      	(GLIBCXX_CHECK_GTHREADS): Add _WIN32_THREADS to compilation flags for
      	Win32 threads and force _GTHREAD_USE_MUTEX_TIMEDLOCK to 0 for them.
      	Add -D_WIN32_WINNT=0x0600 to compilation flags if yes was configured
      	and add it to CPPFLAGS on success.
      	* config.h.in: Regenerate.
      	* configure: Likewise.
      	* config/os/mingw32-w64/os_defines.h (_GLIBCXX_USE_GET_NPROCS_WIN32):
      	Define to 1.
      	* config/os/mingw32/os_defines.h (_GLIBCXX_USE_GET_NPROCS_WIN32): Ditto
      	* src/c++11/thread.cc (get_nprocs): Provide Win32 implementation if
      	_GLIBCXX_USE_GET_NPROCS_WIN32 is defined.  Replace HAVE_WIN32_SLEEP
      	with USE_WIN32_SLEEP.
      	* testsuite/19_diagnostics/headers/system_error/errc_std_c++0x.cc: Add
      	missing conditional compilation.
      	* testsuite/lib/libstdc++.exp (check_v3_target_sleep): Add support for
      	_GLIBCXX_USE_WIN32_SLEEP.
      	(check_v3_target_nprocs): Likewise for _GLIBCXX_USE_GET_NPROCS_WIN32.
      
      Signed-off-by: default avatarEric Botcazou <ebotcazou@adacore.com>
      Signed-off-by: default avatarJonathan Yong <10walls@gmail.com>
      9149a5b7
  10. Dec 22, 2022
    • Jonathan Wakely's avatar
      libstdc++: Implement C++20 time zone support in <chrono> · 9fc61d45
      Jonathan Wakely authored
      This is the largest missing piece of C++20 support. Only the cxx11 ABI
      is supported, due to the use of std::string in the API for time zones.
      For the old gcc4 ABI, utc_clock and leap seconds are supported, but only
      using a hardcoded list of leap seconds, no up-to-date tzdb::leap_seconds
      information is available, and no time zones or zoned_time conversions.
      
      The implementation currently depends on a tzdata.zi file being provided
      by the OS or the user. The expected location is /usr/share/zoneinfo but
      that can be changed using --with-libstdcxx-zoneinfo-dir=PATH. On targets
      that support it there is also a weak symbol that users can override in
      their own program (which also helps with testing):
      
      extern "C++" const char* __gnu_cxx::zoneinfo_dir_override();
      
      If no file is found, a fallback tzdb object will be created which only
      contains the "Etc/UTC" and "Etc/GMT" time zones.
      
      A leapseconds file is also expected in the same directory, but if that
      isn't present then a hardcoded list of leapseconds is used, which is
      correct at least as far as 2023-06-28 (and it currently looks like no
      leap second will be inserted for a few years).
      
      The tzdata.zi and leapseconds files from https://www.iana.org/time-zones
      are in the public domain, so shipping copies of them with GCC would be
      an option. However, the tzdata.zi file will rapidly become outdated, so
      users should really provide it themselves (or convince their OS vendor
      to do so). It would also be possible to implement an alternative parser
      for the compiled tzdata files (one per time zone) under
      /usr/share/zoneinfo. Those files are present on more operating systems,
      but do not contain all the information present in tzdata.zi.
      Specifically, the "links" are not present, so that e.g. "UTC" and
      "Universal" are distinct time zones, rather than both being links to the
      canonical "Etc/UTC" zone. For some platforms those files are hard links
      to the same file, but there's no indication which zone is the canonical
      name and which is a link. Other platforms just store them in different
      inodes anyway. I do not plan to add such an alternative parser for the
      compiled files. That would need to be contributed by maintainers or
      users of targets that require it, if making tzdata.zi available is not
      an option. The library ABI would not need to change for a new tzdb
      implementation, because everything in tzdb_list, tzdb and time_zone is
      implemented as a pimpl (except for the shared_ptr links between nodes,
      described below). That means the new exported symbols added by this
      commit should be stable even if the implementation is completely
      rewritten.
      
      The information from tzdata.zi is parsed and stored in data structures
      that closely model the info in the file. This is a space-efficient
      representation that uses less memory that storing every transition for
      every time zone.  It also avoids spending time expanding that
      information into time zone transitions that might never be needed by the
      program.  When a conversion to/from a local time to UTC is requested the
      information will be processed to determine the time zone transitions
      close to the time being converted.
      
      There is a bug in some time zone transitions. When generating a sys_info
      object immediately after one that was previously generated, we need to
      find the previous rule that was in effect and note its offset and
      letters. This is so that the start time and abbreviation of the new
      sys_info will be correct. This only affects time zones that use a format
      like "C%sT" where the LETTERS replacing %s are non-empty for standard
      time, e.g. "Asia/Shanghai" which uses "CST" for standard time and "CDT"
      for daylight time.
      
      The tzdb_list structure maintains a linked list of tzdb nodes using
      shared_ptr links. This allows the iterators into the list to share
      ownership with the list itself. This offers a non-portable solution to a
      lifetime issue in the API. Because tzdb objects can be erased from the
      list using tzdb_list::erase_after, separate modules/libraries in a large
      program cannot guarantee that any const tzdb& or const time_zone*
      remains valid indefinitely. Holding onto a tzdb_list::const_iterator
      will extend the tzdb object's lifetime, even if it's erased from the
      list. An alternative design would be for the list iterator to hold a
      weak_ptr. This would allow users to test whether the tzdb still exists
      when the iterator is dereferenced, which is better than just having a
      dangling raw pointer. That doesn't actually extend the tzdb's lifetime
      though, and every use of it would need to be preceded by checking the
      weak_ptr. Using shared_ptr adds a little bit of overhead but allows
      users to solve the lifetime issue if they rely on the libstdc++-specific
      iterator property.
      
      libstdc++-v3/ChangeLog:
      
      	* acinclude.m4 (GLIBCXX_ZONEINFO_DIR): New macro.
      	* config.h.in: Regenerate.
      	* config/abi/pre/gnu.ver: Export new symbols.
      	* configure: Regenerate.
      	* configure.ac (GLIBCXX_ZONEINFO_DIR): Use new macro.
      	* include/std/chrono (utc_clock::from_sys): Correct handling
      	of leap seconds.
      	(nonexistent_local_time::_M_make_what_str): Define.
      	(ambiguous_local_time::_M_make_what_str): Define.
      	(__throw_bad_local_time): Define new function.
      	(time_zone, tzdb_list, tzdb): Implement all members.
      	(remote_version, zoned_time, get_leap_second_info): Define.
      	* include/std/version: Add comment for __cpp_lib_chrono.
      	* src/c++20/Makefile.am: Add new file.
      	* src/c++20/Makefile.in: Regenerate.
      	* src/c++20/tzdb.cc: New file.
      	* testsuite/lib/libstdc++.exp: Define effective target tzdb.
      	* testsuite/std/time/clock/file/members.cc: Check file_time
      	alias and file_clock::now() member.
      	* testsuite/std/time/clock/gps/1.cc: Likewise for gps_clock.
      	* testsuite/std/time/clock/tai/1.cc: Likewise for tai_clock.
      	* testsuite/std/time/syn_c++20.cc: Uncomment everything except
      	parse.
      	* testsuite/std/time/clock/utc/leap_second_info.cc: New test.
      	* testsuite/std/time/exceptions.cc: New test.
      	* testsuite/std/time/time_zone/get_info_local.cc: New test.
      	* testsuite/std/time/time_zone/get_info_sys.cc: New test.
      	* testsuite/std/time/time_zone/requirements.cc: New test.
      	* testsuite/std/time/tzdb/1.cc: New test.
      	* testsuite/std/time/tzdb/leap_seconds.cc: New test.
      	* testsuite/std/time/tzdb_list/1.cc: New test.
      	* testsuite/std/time/tzdb_list/requirements.cc: New test.
      	* testsuite/std/time/zoned_time/1.cc: New test.
      	* testsuite/std/time/zoned_time/custom.cc: New test.
      	* testsuite/std/time/zoned_time/deduction.cc: New test.
      	* testsuite/std/time/zoned_time/req_neg.cc: New test.
      	* testsuite/std/time/zoned_time/requirements.cc: New test.
      	* testsuite/std/time/zoned_traits.cc: New test.
      9fc61d45
  11. Nov 25, 2022
    • Jonathan Wakely's avatar
      libstdc++: Fix orphaned/nested output of configure checks · 7b648e83
      Jonathan Wakely authored
      This moves two AC_MSG_RESULT lines for <uchar.h> features so that they
      are only printed when the corresponding AC_MSG_CHECKING actually
      happened. This fixes configure output like:
      
      checking for uchar.h... no
      no
      checking for int64_t... yes
      
      Also move the AC_MSG_CHECKING for libbacktrace support so it doesn't
      come after AC_CHECK_HEADERS output. This fixes:
      
      checking whether to build libbacktrace support... checking for sys/mman.h... (cached) yes
      yes
      
      libstdc++-v3/ChangeLog:
      
      	* acinclude.m4 (GLIBCXX_CHECK_UCHAR_H): Don't use AC_MSG_RESULT
      	unless the AC_MSG_CHECKING happened.
      	* configure: Regenerate.
      7b648e83
  12. Nov 19, 2022
    • Jeff Chapman II's avatar
      libstdc++: add experimental Contracts support · ea63396f
      Jeff Chapman II authored
      
      This patch adds the library support for the experimental C++ Contracts
      implementation.  This now consists only of a default definition of the
      violation handler, which users can override through defining their own
      version.  To avoid ABI stability problems with libstdc++.so this is added to
      a separate -lstdc++exp static library, which the driver knows to add when it
      sees -fcontracts.
      
      Co-authored-by: default avatarAndrew Marmaduke <amarmaduke@lock3software.com>
      Co-authored-by: default avatarJason Merrill <jason@redhat.com>
      
      libstdc++-v3/ChangeLog:
      
      	* acinclude.m4 (glibcxx_SUBDIRS): Add src/experimental.
      	* include/Makefile.am (experimental_headers): Add contract.
      	* include/Makefile.in: Regenerate.
      	* src/Makefile.am (SUBDIRS): Add experimental.
      	* src/Makefile.in: Regenerate.
      	* configure: Regenerate.
      	* src/experimental/contract.cc: New file.
      	* src/experimental/Makefile.am: New file.
      	* src/experimental/Makefile.in: New file.
      	* include/experimental/contract: New file.
      ea63396f
  13. Oct 21, 2022
  14. Oct 11, 2022
    • Jonathan Wakely's avatar
      libstdc++: Allow emergency EH alloc pool size to be tuned [PR68606] · 637e3668
      Jonathan Wakely authored
      Implement a long-standing request to support tuning the size of the
      emergency buffer for allocating exceptions after malloc fails, or to
      disable that buffer entirely.
      
      It's now possible to disable the dynamic allocation of the buffer and
      use a fixed-size static buffer, via --enable-libstdcxx-static-eh-pool.
      This is a built-time choice that is baked into libstdc++ and so affects
      all code linked against that build of libstdc++.
      
      The size of the pool can be set by --with-libstdcxx-eh-pool-obj-count=N
      which is measured in units of sizeof(void*) not bytes. A given exception
      type such as std::system_error depends on the target, so giving a size
      in bytes wouldn't be portable across 16/32/64-bit targets.
      
      When libstdc++ is configured to use a dynamic buffer, the size of that
      buffer can now be tuned at runtime by setting the GLIBCXX_TUNABLES
      environment variable (c.f. PR libstdc++/88264). The number of exceptions
      to reserve space for is controlled by the "glibcxx.eh_pool.obj_count"
      and "glibcxx.eh_pool.obj_size" tunables. The pool will be sized to be
      able to allocate obj_count exceptions of size obj_size*sizeof(void*) and
      obj_count "dependent" exceptions rethrown by std::rethrow_exception.
      
      With the ability to tune the buffer size, we can reduce the default pool
      size on 32-bit and 16-bit targets. Most users never need to throw 1kB
      exceptions in parallel from hundreds of threads after malloc is OOM. The
      users who do need that can use the tunables to select larger sizes.
      
      The old defaults can be chosen at runtime by setting GLIBCXX_TUNABLES
      to:
      64-bit: glibcxx.eh_pool.obj_count=64:glibcxx.eh_pool.obj_size=112
      32-bit: glibcxx.eh_pool.obj_count=32:glibcxx.eh_pool.obj_size=104
      
      Or approximated by configuring with:
      64-bit: --with-libstdcxx-eh-pool-obj-count=252
      32-bit: --with-libstdcxx-eh-pool-obj-count=94
      
      libstdc++-v3/ChangeLog:
      
      	PR libstdc++/68606
      	* Makefile.in: Regenerate.
      	* acinclude.m4 (GLIBCXX_EMERGENCY_EH_ALLOC): New macro.
      	* configure: Regenerate.
      	* configure.ac: Use GLIBCXX_EMERGENCY_EH_ALLOC.
      	* crossconfig.m4: Check for secure_getenv.
      	* doc/Makefile.in: Regenerate.
      	* doc/xml/manual/configure.xml: Document new configure options.
      	* doc/xml/manual/evolution.xml: Document addition of tunables.
      	* doc/xml/manual/using_exceptions.xml: Document emergency
      	buffer and tunables.
      	* doc/html/*: Regenerate.
      	* include/Makefile.in: Regenerate.
      	* libsupc++/Makefile.am: Use EH_POOL_FLAGS.
      	* libsupc++/Makefile.in: Regenerate.
      	* libsupc++/eh_alloc.cc (EMERGENCY_OBJ_SIZE): Define in units
      	of sizeof(void*) not including the ABI's exception header.
      	(EMERGENCY_OBJ_COUNT): Define as target-independent calculation
      	based on word size.
      	(MAX_OBJ_COUNT): Define macro for upper limit on pool size.
      	(pool) [_GLIBCXX_EH_POOL_STATIC]: Use fixed-size buffer.
      	(pool::buffer_size_in_bytes): New static member function.
      	(pool::pool): Parse GLIBCXX_TUNABLES environment variable to set
      	pool size at runtime.
      	(pool::in_pool): Use std::less<void*> for total order.
      	(__freeres) [_GLIBCXX_EH_POOL_STATIC]: Do nothing.
      	(__cxa_free_exception, __cxa_free_dependent_exception): Add
      	[[unlikely]] attributes.
      	* po/Makefile.in: Regenerate.
      	* python/Makefile.in: Regenerate.
      	* src/Makefile.in: Regenerate.
      	* src/c++11/Makefile.in: Regenerate.
      	* src/c++17/Makefile.in: Regenerate.
      	* src/c++20/Makefile.in: Regenerate.
      	* src/c++98/Makefile.in: Regenerate.
      	* src/filesystem/Makefile.in: Regenerate.
      	* src/libbacktrace/Makefile.in: Regenerate.
      	* testsuite/Makefile.in: Regenerate.
      637e3668
  15. Oct 07, 2022
    • Jonathan Wakely's avatar
      libstdc++: Add --disable-libstdcxx-hosted as an alias for hosted-libstdcxx · 6bd2c123
      Jonathan Wakely authored
      Most libstdc++ configure args are of the form --enable-libstdcxx-xxx but
      the option to build freestanding is --disable-hosted-libstdcxx. If you
      accidentally type --disable-libstdcxx-hosted then it will be ignored.
      
      This adds --disable-libstdcxx-hosted as an alias for the existing arg,
      so it works whichever way you say it. If both args are used explicitly
      and their values do not agree, configure fails with an error.
      
      libstdc++-v3/ChangeLog:
      
      	* acinclude.m4 (GLIBCXX_ENABLE_HOSTED): Add libstdcxx-hosted
      	enable arg as an alias for hosted-libstdcxx enable arg.
      	* configure: Regenerate.
      6bd2c123
  16. Oct 03, 2022
    • Jonathan Wakely's avatar
      libstdc++: Make _GLIBCXX_HOSTED respect -ffreestanding [PR103626] · f1b51f68
      Jonathan Wakely authored
      This allows the library to switch to freestanding mode when compiling
      with the -ffreestanding flag. This means you don't need a separate
      libstdc++ build configured with --disable-hosted-libstdcxx in order to
      compile for a freestanding environment.
      
      The testsuite support files cannot be compiled for freestanding, so add
      -fno-freestanding to override any -ffreestanding in the test flags.
      
      libstdc++-v3/ChangeLog:
      
      	PR libstdc++/103626
      	* acinclude.m4 (GLIBCXX_ENABLE_HOSTED): Define _GLIBCXX_HOSTED
      	to __STDC_HOSTED__ for non-freestanding installations.
      	* configure: Regenerate.
      	* include/Makefile.am (${host_builddir}/c++config.h): Adjust
      	grep pattern.
      	* include/Makefile.in: Regenerate.
      	* testsuite/lib/libstdc++.exp (v3-build_support): Use
      	-fno-freestanding.
      	* testsuite/libstdc++-abi/abi.exp: Likewise.
      f1b51f68
  17. Sep 12, 2022
    • Jakub Jelinek's avatar
      libstdc++: Outline the overlapping case of string _M_replace into a separate function [PR105329] · 723ef5a9
      Jakub Jelinek authored
      The following patch is partially a workaround for bogus warnings
      when the compiler isn't able to fold _M_disjunct call into constant
      false, but also an optimization attempt - assuming _M_disjunct (__s)
      is rare, the patch should shrink code size for the common case and
      use library or for non-standard instantiations an out of line
      function to handle the rare case.
      
      2022-09-12  Jakub Jelinek  <jakub@redhat.com>
      
      	PR tree-optimization/105329
      	* acinclude.m4 (libtool_VERSION): Change to 6:31:0.
      	* config/abi/pre/gnu.ver (GLIBCXX_3.4.21): Don't export
      	std::basic_string methods with name length of 15.
      	(GLIBCXX_3.4.31): Export std::basic_string::_M_replace_cold.
      	* testsuite/util/testsuite_abi.cc (check_version): Handle
      	GLIBCXX_3.4.31.
      	* include/bits/basic_string.h (std::basic_string::_M_replace_cold):
      	Declare.
      	* include/bits/basic_string.tcc (std::basic_string::_M_replace_cold):
      	Define and export even for C++20.
      	(std::basic_string::_M_replace): Use __builtin_expect, outline
      	the overlapping case to _M_replace_cold.
      	* configure: Regenerated.
      723ef5a9
  18. Jun 24, 2022
    • Alexandre Oliva's avatar
      libstdc++: check for openat · 93070671
      Alexandre Oliva authored
      rtems6.0 has fdopendir, and fcntl.h defines AT_FDCWD and declares
      openat, but there's no openat in libc.  Adjust dir-common.h to not
      assume ::openat just because of AT_FDCWD.
      
      
      for  libstdc++-v3/ChangeLog
      
      	* acinclude.m4 (GLIBCXX_CHECK_FILESYSTEM_DEPS): Check for
      	openat.
      	* configure, config.h.in: Rebuilt.
      	* src/filesystem/dir-common.h (openat): Use ::openat if
      	_GLIBCXX_HAVE_OPENAT.
      	* src/filesystem/dir.cc (dir_and_pathname): Use dirfd if
      	_GLIBCXX_HAVE_OPENAT.
      93070671
  19. Apr 19, 2022
    • Jonathan Wakely's avatar
      libstdc++: Fix syntax error in libbacktrace configuration · a2a7da1a
      Jonathan Wakely authored
      Using == instead of = causes a configuration error with dash as the
      shell:
      
      checking whether to build libbacktrace support... /home/devel/building/work/src/gcc-12-20220417/libstdc++-v3/configure: 77471: test: auto: unexpected operator
      /home/devel/building/work/src/gcc-12-20220417/libstdc++-v3/configure: 77474: test: auto: unexpected operator
      auto
      
      This means we fail to change the value from "auto" to "no" and so this
      test passes:
      GLIBCXX_CONDITIONAL(ENABLE_BACKTRACE, [test "$enable_libstdcxx_backtrace" != no])
      
      This leads to the libbacktrace directory being included in the build
      without being configured properly, and bootstrap fails.
      
      libstdc++-v3/ChangeLog:
      
      	* acinclude.m4 (GLIBCXX_ENABLE_BACKTRACE): Fix shell operators.
      	* configure: Regenerate.
      a2a7da1a
  20. Apr 14, 2022
    • Palmer Dabbelt's avatar
      libstdc++: Default to mutex-based atomics on RISC-V · 3fc22eed
      Palmer Dabbelt authored
      The RISC-V port requires libatomic to be linked in order to resolve
      various atomic functions, which results in builds that have
      "--with-libstdcxx-lock-policy=auto" defaulting to mutex-based locks.
      Changing this to direct atomics breaks the ABI, this forces the auto
      detection mutex-based atomics on RISC-V in order to avoid a silent ABI
      break for users.
      
      See Bug 84568 for more discussion.  In the long run there may be a way
      to get the higher-performance atomics without an ABI flag day, but
      that's going to be a much more complicated operation.  We don't even
      have support for the inline atomics yet, but given that some folks have
      been discussing hacks to make these libatomic routines appear implicitly
      it seems prudent to just turn off the automatic detection for RISC-V.
      
      libstdc++-v3/ChangeLog:
      
      	* acinclude.m4 (GLIBCXX_ENABLE_LOCK_POLICY): Force auto to mutex
      	for RISC-V.
      	* configure: Regenerate.
      3fc22eed
  21. Apr 12, 2022
    • Jonathan Wakely's avatar
      libstdc++: Prefer to use mmap instead of malloc in libbacktrace · 3c742621
      Jonathan Wakely authored
      As reported in PR libbacktrace/105240, libbacktrace leaks memory when
      using malloc for allocations. I originally thought it would be simpler
      to just use malloc unconditionally (because it's supported on all
      targets) but the leaks make that problematic.
      
      This adds libbacktrace's detection for mmap to the libstdc++
      configury, so that we use mmap.c and mmapio.c when possible. This avoids
      the leaks seen previously, at least on linux.
      
      libstdc++-v3/ChangeLog:
      
      	* acinclude.m4 (GLIBCXX_ENABLE_BACKTRACE): Check for mmap.
      	* config.h.in: Regenerate.
      	* configure: Regenerate.
      3c742621
  22. Feb 08, 2022
  23. Feb 04, 2022
    • Jonathan Wakely's avatar
      libstdc++: Fix filesystem::remove_all races [PR104161] · ebf61754
      Jonathan Wakely authored
      This fixes the remaining filesystem::remove_all race condition by using
      POSIX openat to recurse into sub-directories and using POSIX unlinkat to
      remove files. This avoids the remaining race where the directory being
      removed is replaced with a symlink after the directory has been opened,
      so that the filesystem::remove("subdir/file") resolves to "target/file"
      instead, because "subdir" has been removed and replaced with a symlink.
      The previous patch only fixed the case where the directory was replaced
      with a symlink before we tried to open it, but it still used the full
      (potentially compromised) path as an argument to filesystem::remove.
      
      The first part of the fix is to use openat when recursing into a
      sub-directory with recursive_directory_iterator. This means that opening
      "dir/subdir" uses the file descriptor for "dir", and so is sure to open
      "dir/subdir" and not "symlink/subdir". (The previous patch to use
      O_NOFOLLOW already ensured we won't open "dir/symlink/" here.)
      
      The second part of the fix is to use unlinkat for the remove_all
      operation. Previously we used a directory_iterator to get the name of
      each file in a directory and then used filesystem::remove(iter->path())
      on that name. This meant that any checks (e.g. O_NOFOLLOW) done by the
      iterator could be invalidated before the remove operation on that
      pathname. The directory iterator contains an open DIR stream, which we
      can use to obtain a file descriptor to pass to unlinkat. This ensures
      that the file being deleted really is contained within the directory
      we're iterating over, rather than using a pathname that could resolve to
      some other file.
      
      The filesystem::remove_all function previously used a (non-recursive)
      filesystem::directory_iterator for each directory, and called itself
      recursively for sub-directories. The new implementation uses a single
      filesystem::recursive_directory_iterator object, and calls a new __erase
      member function on that iterator. That new __erase member function does
      the actual work of removing a file (or a directory after its contents
      have been iterated over and removed) using unlinkat. That means we don't
      need to expose the DIR stream or its file descriptor to the remove_all
      function, it's still encapuslated by the iterator class.
      
      It would be possible to add a __rewind member to directory iterators
      too, to call rewinddir after each modification to the directory. That
      would make it more likely for filesystem::remove_all to successfully
      remove everything even if files are being written to the directory tree
      while removing it. It's unclear if that is actually prefereable, or if
      it's better to fail and report an error at the first opportunity.
      
      The necessary APIs (openat, unlinkat, fdopendir, dirfd) are defined in
      POSIX.1-2008, and in Glibc since 2.10. But if the target doesn't provide
      them, the original code (with race conditions) is still used.
      
      This also reduces the number of small memory allocations needed for
      std::filesystem::remove_all, because we do not store the full path to
      every directory entry that is iterated over. The new filename_only
      option means we only store the filename in the directory entry, as that
      is all we need in order to use openat or unlinkat.
      
      Finally, rather than duplicating everything for the Filesystem TS, the
      std::experimental::filesystem::remove_all implementation now just calls
      std::filesystem::remove_all to do the work.
      
      libstdc++-v3/ChangeLog:
      
      	PR libstdc++/104161
      	* acinclude.m4 (GLIBCXX_CHECK_FILESYSTEM_DEPS): Check for dirfd
      	and unlinkat.
      	* config.h.in: Regenerate.
      	* configure: Regenerate.
      	* include/bits/fs_dir.h (recursive_directory_iterator): Declare
      	remove_all overloads as friends.
      	(recursive_directory_iterator::__erase): Declare new member
      	function.
      	* include/bits/fs_fwd.h (remove, remove_all): Declare.
      	* src/c++17/fs_dir.cc (_Dir): Add filename_only parameter to
      	constructor. Pass file descriptor argument to base constructor.
      	(_Dir::dir_and_pathname, _Dir::open_subdir, _Dir::do_unlink)
      	(_Dir::unlink, _Dir::rmdir): Define new member functions.
      	(directory_iterator): Pass filename_only argument to _Dir
      	constructor.
      	(recursive_directory_iterator::_Dir_stack): Adjust constructor
      	parameters to take a _Dir rvalue instead of creating one.
      	(_Dir_stack::orig): Add data member for storing original path.
      	(_Dir_stack::report_error): Define new member function.
      	(__directory_iterator_nofollow): Move here from dir-common.h and
      	fix value to be a power of two.
      	(__directory_iterator_filename_only): Define new constant.
      	(recursive_directory_iterator): Construct _Dir object and move
      	into _M_dirs stack. Pass skip_permission_denied argument to first
      	advance call.
      	(recursive_directory_iterator::increment): Use _Dir::open_subdir.
      	(recursive_directory_iterator::__erase): Define new member
      	function.
      	* src/c++17/fs_ops.cc (ErrorReporter, do_remove_all): Remove.
      	(fs::remove_all): Use new recursive_directory_iterator::__erase
      	member function.
      	* src/filesystem/dir-common.h (_Dir_base): Add int parameter to
      	constructor and use openat to implement nofollow semantics.
      	(_Dir_base::fdcwd, _Dir_base::set_close_on_exec, _Dir_base::openat):
      	Define new member functions.
      	(__directory_iterator_nofollow): Move to fs_dir.cc.
      	* src/filesystem/dir.cc (_Dir): Pass file descriptor argument to
      	base constructor.
      	(_Dir::dir_and_pathname, _Dir::open_subdir): Define new member
      	functions.
      	(recursive_directory_iterator::_Dir_stack): Adjust constructor
      	parameters to take a _Dir rvalue instead of creating one.
      	(recursive_directory_iterator): Check for new nofollow option.
      	Construct _Dir object and move into _M_dirs stack. Pass
      	skip_permission_denied argument to first advance call.
      	(recursive_directory_iterator::increment): Use _Dir::open_subdir.
      	* src/filesystem/ops.cc (fs::remove_all): Use C++17 remove_all.
      ebf61754
  24. Feb 01, 2022
    • Jonathan Wakely's avatar
      libstdc++: Improve config output for --enable-cstdio [PR104301] · 19b8946d
      Jonathan Wakely authored
      Currently we just print "checking for underlying I/O to use... stdio"
      unconditionally, whether configured to use stdio_pure or stdio_posix. We
      should make it clear that the user's configure option chose the right
      thing.
      
      libstdc++-v3/ChangeLog:
      
      	PR libstdc++/104301
      	* acinclude.m4 (GLIBCXX_ENABLE_CSTDIO): Print different messages
      	for stdio_pure and stdio_posix options.
      	* configure: Regenerate.
      19b8946d
  25. Jan 31, 2022
    • Martin Liska's avatar
      Add mold detection for libs. · c99a6eb0
      Martin Liska authored
      libatomic/ChangeLog:
      
      	* acinclude.m4: Detect *_ld_is_mold and use it.
      	* configure: Regenerate.
      
      libgomp/ChangeLog:
      
      	* acinclude.m4: Detect *_ld_is_mold and use it.
      	* configure: Regenerate.
      
      libitm/ChangeLog:
      
      	* acinclude.m4: Detect *_ld_is_mold and use it.
      	* configure: Regenerate.
      
      libstdc++-v3/ChangeLog:
      
      	* acinclude.m4: Detect *_ld_is_mold and use it.
      	* configure: Regenerate.
      c99a6eb0
  26. Jan 27, 2022
  27. Jan 25, 2022
    • Jonathan Wakely's avatar
      libstdc++: Avoid symlink race in filesystem::remove_all [PR104161] · c8bd4dc8
      Jonathan Wakely authored
      This adds a new internal flag to the filesystem::directory_iterator
      constructor that makes it fail if the path is a symlink that resolves to
      a directory. This prevents filesystem::remove_all from following a
      symlink to a directory, rather than deleting the symlink itself.
      
      We can also use that new flag in recursive_directory_iterator to ensure
      that we don't follow symlinks if the follow_directory_symlink option is
      not set.
      
      This also moves an error check in filesystem::remove_all after the while
      loop, so that errors from the directory_iterator constructor are
      reproted, instead of continuing to the filesystem::remove call below.
      
      libstdc++-v3/ChangeLog:
      
      	PR libstdc++/104161
      	* acinclude.m4 (GLIBCXX_CHECK_FILESYSTEM_DEPS): Check for
      	fdopendir.
      	* config.h.in: Regenerate.
      	* configure: Regenerate.
      	* src/c++17/fs_dir.cc (_Dir): Add nofollow flag to constructor
      	and pass it to base class constructor.
      	(directory_iterator): Pass nofollow flag to _Dir constructor.
      	(fs::recursive_directory_iterator::increment): Likewise.
      	* src/c++17/fs_ops.cc (do_remove_all): Use nofollow option for
      	directory_iterator constructor. Move error check outside loop.
      	* src/filesystem/dir-common.h (_Dir_base): Add nofollow flag to
      	constructor and when it's set use ::open with O_NOFOLLOW and
      	O_DIRECTORY.
      	* src/filesystem/dir.cc (_Dir): Add nofollow flag to constructor
      	and pass it to base class constructor.
      	(directory_iterator): Pass nofollow flag to _Dir constructor.
      	(fs::recursive_directory_iterator::increment): Likewise.
      	* src/filesystem/ops.cc (remove_all): Use nofollow option for
      	directory_iterator constructor. Move error check outside loop.
      c8bd4dc8
  28. Jan 18, 2022
  29. Jan 17, 2022
    • Jonathan Wakely's avatar
      libstdc++: Define <stacktrace> header for C++23 · 3acb929c
      Jonathan Wakely authored
      Add the <stacktrace> header and a new libstdc++_libbacktrace.a library
      that provides the implementation. For now, the new library is only built
      if --enable-libstdcxx-backtrace=yes is used. As with the Filesystem TS,
      the new library is only provided as a static archive.
      
      libstdc++-v3/ChangeLog:
      
      	* acinclude.m4 (GLIBCXX_ENABLE_BACKTRACE): New macro.
      	* configure.ac: Use GLIBCXX_ENABLE_BACKTRACE.
      	* include/Makefile.am: Add new header.
      	* include/Makefile.in: Regenerate.
      	* include/std/stacktrace: New header.
      	* include/std/version (__cpp_lib_stacktrace): Define.
      	* Makefile.in: Regenerate.
      	* config.h.in: Regenerate.
      	* configure: Regenerate.
      	* doc/Makefile.in: Regenerate.
      	* libsupc++/Makefile.in: Regenerate.
      	* po/Makefile.in: Regenerate.
      	* python/Makefile.in: Regenerate.
      	* src/Makefile.am: Regenerate.
      	* src/Makefile.in: Regenerate.
      	* src/c++11/Makefile.in: Regenerate.
      	* src/c++17/Makefile.in: Regenerate.
      	* src/c++20/Makefile.in: Regenerate.
      	* src/c++98/Makefile.in: Regenerate.
      	* src/filesystem/Makefile.in: Regenerate.
      	* testsuite/Makefile.in: Regenerate.
      	* src/libbacktrace/Makefile.am: New file.
      	* src/libbacktrace/Makefile.in: New file.
      	* src/libbacktrace/backtrace-rename.h: New file.
      	* src/libbacktrace/backtrace-supported.h.in: New file.
      	* src/libbacktrace/config.h.in: New file.
      	* testsuite/lib/libstdc++.exp (check_effective_target_stacktrace):
      	New proc.
      	* testsuite/20_util/stacktrace/entry.cc: New test.
      	* testsuite/20_util/stacktrace/synopsis.cc: New test.
      	* testsuite/20_util/stacktrace/version.cc: New test.
      3acb929c
  30. Jan 10, 2022
    • Jonathan Wakely's avatar
      libstdc++: Fix and simplify freestanding configuration [PR103866] · 68c2e9e9
      Jonathan Wakely authored
      This fixes the --disable-hosted-libstdcxx build so that it works with
      --without-headers. Currently you need to also use --with-newlib, which
      is confusing for users who aren't actually using newlib.
      
      The AM_PROG_LIBTOOL checks are currently skipped for --with-newlib and
      --with-avrlibc builds, with this change they are also skipped when using
      --without-headers.  It would be nice if using --disable-hosted-libstdcxx
      automatically skipped those checks, but GLIBCXX_ENABLE_HOSTED comes too
      late to make the AM_PROG_LIBTOOL checks depend on $is_hosted.
      
      The checks for EOF, SEEK_CUR etc. cause the build to fail if there is no
      <stdio.h> available.  Unlike most headers, which get a HAVE_FOO_H macro,
      <stdio.h> is in autoconf's default includes, so every check tries to
      include it unconditionally. This change skips those checks for
      freestanding builds.
      
      Similarly, the checks for <stdint.h> types done by GCC_HEADER_STDINT try
      to include <stdio.h> and fail for --without-headers builds. This change
      skips the use of GCC_HEADER_STDINT for freestanding. We can probably
      stop using GCC_HEADER_STDINT entirely, since only one file uses the
      gstdint.h header that is generated, and that could easily be changed to
      use <stdint.h> instead. That can wait for stage 1.
      
      We also need to skip the GLIBCXX_CROSSCONFIG stage if --without-headers
      was used, since we don't have any of the functions it deals with.
      
      The end result of the changes above is that it should not be necessary
      for a --disable-hosted-libstdcxx --without-headers build to also use
      --with-newlib.
      
      Finally, compile libsupc++ with -ffreestanding when --without-headers is
      used, so that <stdint.h> will use <gcc-stdint.h> instead of expecting it
      to come from libc.
      
      libstdc++-v3/ChangeLog:
      
      	PR libstdc++/103866
      	* acinclude.m4 (GLIBCXX_COMPUTE_STDIO_INTEGER_CONSTANTS): Do
      	nothing for freestanding builds.
      	(GLIBCXX_ENABLE_HOSTED): Define FREESTANDING_FLAGS.
      	* configure.ac: Do not use AC_LIBTOOL_DLOPEN when configured
      	with --without-headers.  Do not use GCC_HEADER_STDINT for
      	freestanding builds.
      	* libsupc++/Makefile.am (HOSTED_CXXFLAGS): Use -ffreestanding
      	for freestanding builds.
      	* configure: Regenerate.
      	* Makefile.in: Regenerate.
      	* doc/Makefile.in: Regenerate.
      	* include/Makefile.in: Regenerate.
      	* libsupc++/Makefile.in: Regenerate.
      	* po/Makefile.in: Regenerate.
      	* python/Makefile.in: Regenerate.
      	* src/Makefile.in: Regenerate.
      	* src/c++11/Makefile.in: Regenerate.
      	* src/c++17/Makefile.in: Regenerate.
      	* src/c++20/Makefile.in: Regenerate.
      	* src/c++98/Makefile.in: Regenerate.
      	* src/filesystem/Makefile.in: Regenerate.
      	* testsuite/Makefile.in: Regenerate.
      68c2e9e9
  31. Dec 10, 2021
    • Jonathan Wakely's avatar
      libstdc++: Fix definition of _GLIBCXX_NO_SLEEP config macro · ca1c7065
      Jonathan Wakely authored
      If no OS function to sleep (e.g. nanosleep, usleep, Win32 Sleep etc.) is
      available then configure defines the macro NO_SLEEP. But this will not
      get prefixed with "_GLIBCXX_" because include/Makefile.am only does that
      for macros beginning with "HAVE_". The configure script should define
      _GLIBCXX_NO_SLEEP instead (which is what the code actually checks for).
      
      libstdc++-v3/ChangeLog:
      
      	* acinclude.m4 (GLIBCXX_ENABLE_LIBSTDCXX_TIME): Add _GLIBCXX_
      	prefix to NO_SLEEP macro.
      	* config.h.in: Regenerate.
      	* configure: Regenerate.
      ca1c7065
  32. Dec 02, 2021
    • Jonathan Wakely's avatar
      libstdc++: Remove broken std::allocator base classes [PR103340] · e2e98f52
      Jonathan Wakely authored
      The bitmap_allocator, __mt_alloc and __pool_alloc extensions are no
      longer suitable for use as the base class of std::allocator, because
      they have not been updated to meet the C++20 requirements.  There is a
      patch attached to PR 103340 which addresses that, but more work would be
      needed to solve the linking errors that occur when the library is
      configured to use them.
      
      Using --enable-libstdcxx-allocator=bitmap wouldn't even bootstrap for
      the past few years, and I can't find any gcc-testresults reports using
      any of these allocators. This patch removes the configure option to use
      these as the std::allocator base class. The allocators are still in the
      tree and can be used directly, you just can't configure the library to
      use one of them as the base class of std::allocator.
      
      libstdc++-v3/ChangeLog:
      
      	PR libstdc++/103340
      	PR libstdc++/103400
      	PR libstdc++/103381
      	* acinclude.m4 (GLIBCXX_ENABLE_ALLOCATOR): Remove mt, bitmap
      	and pool options.
      	* configure: Regenerate.
      	* config/allocator/bitmap_allocator_base.h: Removed.
      	* config/allocator/mt_allocator_base.h: Removed.
      	* config/allocator/pool_allocator_base.h: Removed.
      	* doc/xml/manual/allocator.xml: Update.
      	* doc/xml/manual/configure.xml: Update.
      	* doc/xml/manual/evolution.xml: Document removal.
      	* doc/xml/manual/mt_allocator.xml: Editorial tweaks.
      	* doc/html/manual/*: Regenerate.
      e2e98f52
  33. Nov 18, 2021
    • Jonathan Wakely's avatar
      libstdc++: Replace AC_CACHE_VAL with AC_CACHE_CHECK · 9646a322
      Jonathan Wakely authored
      This replaces most uses of AC_CACHE_VAL with AC_CACHE_CHECK, which means
      we don't need separate AC_MSG_CHECKING and AC_MSG_RESULT macros.
      
      There are a few trivial bugs fixed as a side effect, where an
      AC_MSG_RESULT was printed out even if the actual checks hadn't been
      done. That didn't affect the results, only the content of config.log.
      
      libstdc++-v3/ChangeLog:
      
      	* acinclude.m4: Replace AC_CACHE_VAL with AC_CACHE_CHECK.
      	* configure: Regenerate.
      9646a322
  34. Nov 13, 2021
    • Hans-Peter Nilsson's avatar
      libstdc++: Use GCC_TRY_COMPILE_OR_LINK for getentropy, arc4random · 60f761c7
      Hans-Peter Nilsson authored
      Since r12-5056-g3439657b0286, there has been a regression in
      test results; an additional 100 FAILs running the g++ and
      libstdc++ testsuite on cris-elf, a newlib target.  The
      failures are linker errors, not finding a definition for
      getentropy.  It appears newlib has since 2017-12-03
      declarations of getentropy and arc4random, and provides an
      implementation of arc4random using getentropy, but provides no
      definition of getentropy, not even a stub yielding ENOSYS.
      This is similar to what it does for many other functions too.
      
      While fixing newlib (like adding said stub) would likely help,
      it still leaves older newlib releases hanging.  Thankfully,
      the libstdc++ configury test can be improved to try linking
      where possible; using the bespoke GCC_TRY_COMPILE_OR_LINK
      instead of AC_TRY_COMPILE.  BTW, I see a lack of consistency;
      some tests use AC_TRY_COMPILE and some GCC_TRY_COMPILE_OR_LINK
      for no apparent reason, but this commit just amends
      r12-5056-g3439657b0286.
      
      libstdc++-v3:
      	PR libstdc++/103166
      	* acinclude.m4 (GLIBCXX_CHECK_GETENTROPY, GLIBCXX_CHECK_ARC4RANDOM):
      	Use GCC_TRY_COMPILE_OR_LINK instead of AC_TRY_COMPILE.
      	* configure: Regenerate.
      60f761c7
  35. Nov 12, 2021
    • Jonathan Wakely's avatar
      libstdc++: Print assertion messages to stderr [PR59675] · a54ce886
      Jonathan Wakely authored
      This replaces the printf used by failed debug assertions with fprintf,
      so we can write to stderr.
      
      To avoid including <stdio.h> the assert function is moved into the
      library. To avoid programs using a vague linkage definition of the old
      inline function, the function is renamed. Code compiled with old
      versions of GCC might still call the old function, but code compiled
      with the newer GCC will call the new function and write to stderr.
      
      libstdc++-v3/ChangeLog:
      
      	PR libstdc++/59675
      	* acinclude.m4 (libtool_VERSION): Bump version.
      	* config/abi/pre/gnu.ver (GLIBCXX_3.4.30): Add version and
      	export new symbol.
      	* configure: Regenerate.
      	* include/bits/c++config (__replacement_assert): Remove, declare
      	__glibcxx_assert_fail instead.
      	* src/c++11/debug.cc (__glibcxx_assert_fail): New function to
      	replace __replacement_assert, writing to stderr instead of
      	stdout.
      	* testsuite/util/testsuite_abi.cc: Update latest version.
      a54ce886
  36. Nov 09, 2021
    • Jonathan Wakely's avatar
      libstdc++: Support getentropy and arc4random in std::random_device · 3439657b
      Jonathan Wakely authored
      This adds additional "getentropy" and "arc4random" tokens to
      std::random_device. The former is supported on Glibc and OpenBSD (and
      apparently wasm), and the latter is supported on various BSDs.
      
      libstdc++-v3/ChangeLog:
      
      	* acinclude.m4 (GLIBCXX_CHECK_GETENTROPY, GLIBCXX_CHECK_ARC4RANDOM):
      	Define.
      	* configure.ac (GLIBCXX_CHECK_GETENTROPY, GLIBCXX_CHECK_ARC4RANDOM):
      	Use them.
      	* config.h.in: Regenerate.
      	* configure: Regenerate.
      	* src/c++11/random.cc (random_device): Add getentropy and
      	arc4random as sources.
      	* testsuite/26_numerics/random/random_device/cons/token.cc:
      	Check new tokens.
      	* testsuite/26_numerics/random/random_device/entropy.cc:
      	Likewise.
      3439657b
Loading