From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2181) id 64EF23858D35; Thu, 16 Mar 2023 16:51:12 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 64EF23858D35 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1678985472; bh=PmOP1pWbJ24WWMUEO/fKzCa7dsEwLSb1UJ5vrllOHow=; h=From:To:Subject:Date:From; b=ggpp3b41Eqga4LwdtYnBwhJZjdtF3dOaslLwdUiOGxClWY0uRrGLE4D7/7LpD3+kk R5RYzRK7kvfpJsv5XSPTWUvBfQKix38Esyn6SCn8lK21eYxvrSfiK2uAOFaYWSauCT 41b4LHUgyPl+DeRtXASKsP4CeIlyZGAbB+YJzO7w= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Jonathan Wakely To: gcc-cvs@gcc.gnu.org, libstdc++-cvs@gcc.gnu.org Subject: [gcc r11-10578] libstdc++: Fix build failures for avr X-Act-Checkin: gcc X-Git-Author: Jonathan Wakely X-Git-Refname: refs/heads/releases/gcc-11 X-Git-Oldrev: f2ef6e83e78502d6a2ffb0f41da41b00547efe7f X-Git-Newrev: c86ac1a463f97554b1df9ef8a3e18573ef115e35 Message-Id: <20230316165112.64EF23858D35@sourceware.org> Date: Thu, 16 Mar 2023 16:51:12 +0000 (GMT) List-Id: https://gcc.gnu.org/g:c86ac1a463f97554b1df9ef8a3e18573ef115e35 commit r11-10578-gc86ac1a463f97554b1df9ef8a3e18573ef115e35 Author: Jonathan Wakely Date: Tue Jan 31 22:16:31 2023 +0000 libstdc++: Fix build failures for avr The avr-libc does not define EOVERFLOW, which means that std::errc::value_too_large is not defined, and so cannot be compiled. Define value_too_large for avr with a value that does not clash with any that is defined in . This is a kluge to fix bootstrap for avr; it can be removed after PR libstdc++/104883 is resolved. The avr-libc fails to meet the C and POSIX requirements that each error macro has a distinct integral value, and is usable in #if directives. Add a special case for avr to system_error.cc so that only the valid errors are recognized. Also disable the errno checks in std::filesystem::remove_all that assume a meaningful value for errno. On avr-libc exists but does not define the POSIX functions needed by std::filesystem, so _GLIBCXX_HAVE_UNISTD_H is not sufficient to check for basic POSIX APIs. Check !defined __AVR__ as well as _GLIBCXX_HAVE_UNISTD_H before using those functions. This is a kluge and we should really have a specific macro that says the required functions are available. libstdc++-v3/ChangeLog: * config/os/generic/error_constants.h (errc::value_too_large) [__AVR__]: Define. * src/c++11/system_error.cc (system_category::default_error_condition) [__AVR__]: Only match recognize values equal to EDOM, ERANGE, ENOSYS and EINTR. * src/c++17/fs_ops.cc (fs::current_path) [__AVR__]: Do not use getcwd. * src/filesystem/ops-common.h [__AVR__]: Do not use POSIX open, close etc. (cherry picked from commit 2d2e163d12f64a5e68f9e0381751ed9d5d6d3617) Diff: --- libstdc++-v3/config/os/generic/error_constants.h | 2 ++ libstdc++-v3/src/c++11/system_error.cc | 12 +++++++++++- libstdc++-v3/src/c++17/fs_ops.cc | 2 +- libstdc++-v3/src/filesystem/ops-common.h | 2 +- 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/libstdc++-v3/config/os/generic/error_constants.h b/libstdc++-v3/config/os/generic/error_constants.h index 9d01c16ee27..1d37454ba2e 100644 --- a/libstdc++-v3/config/os/generic/error_constants.h +++ b/libstdc++-v3/config/os/generic/error_constants.h @@ -167,6 +167,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION #ifdef EOVERFLOW value_too_large = EOVERFLOW, +#elif defined __AVR__ + value_too_large = 999, #endif wrong_protocol_type = EPROTOTYPE diff --git a/libstdc++-v3/src/c++11/system_error.cc b/libstdc++-v3/src/c++11/system_error.cc index 34274387637..2b5010dbb40 100644 --- a/libstdc++-v3/src/c++11/system_error.cc +++ b/libstdc++-v3/src/c++11/system_error.cc @@ -93,6 +93,16 @@ namespace // and system category otherwise. switch (ev) { +#if defined __AVR__ + // avr-libc only defines a few distinct error numbers. Most + // constants are not usable in #if directives and have the same value. + case EDOM: + case ERANGE: + case ENOSYS: + case EINTR: + case 0: + return std::error_condition(ev, generic_category_instance.obj); +#else // List of errno macros from [cerrno.syn]. // C11 only defines EDOM, EILSEQ and ERANGE, the rest are from POSIX. // They expand to integer constant expressions with type int, @@ -339,7 +349,7 @@ namespace case EBLAH: return std::error_condition(EINVAL, std::generic_category()); */ - +#endif default: return std::error_condition(ev, *this); } diff --git a/libstdc++-v3/src/c++17/fs_ops.cc b/libstdc++-v3/src/c++17/fs_ops.cc index 481b49d20be..4155b4d64b9 100644 --- a/libstdc++-v3/src/c++17/fs_ops.cc +++ b/libstdc++-v3/src/c++17/fs_ops.cc @@ -735,7 +735,7 @@ fs::path fs::current_path(error_code& ec) { path p; -#ifdef _GLIBCXX_HAVE_UNISTD_H +#if defined _GLIBCXX_HAVE_UNISTD_H && ! defined __AVR__ #if defined __GLIBC__ || defined _GLIBCXX_FILESYSTEM_IS_WINDOWS if (char_ptr cwd = char_ptr{posix::getcwd(nullptr, 0)}) { diff --git a/libstdc++-v3/src/filesystem/ops-common.h b/libstdc++-v3/src/filesystem/ops-common.h index a76a2e6198d..54bafff2a9c 100644 --- a/libstdc++-v3/src/filesystem/ops-common.h +++ b/libstdc++-v3/src/filesystem/ops-common.h @@ -128,7 +128,7 @@ namespace __gnu_posix return ret; } using char_type = wchar_t; -#elif defined _GLIBCXX_HAVE_UNISTD_H +#elif defined _GLIBCXX_HAVE_UNISTD_H && ! defined __AVR__ using ::open; using ::close; # ifdef _GLIBCXX_HAVE_SYS_STAT_H