From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2181) id B69EA3858436; Wed, 1 Feb 2023 21:06:59 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org B69EA3858436 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1675285619; bh=A9DHE46Om7yjWexIQvpPuedS4ARy9E3PswZR2W3Gow4=; h=From:To:Subject:Date:From; b=ZWxIuhNmlNoUb/9+9UUJ0Lw+uDX9vyYWevE3UNs3Km05Ro/oVaEay41wqBoic83LG 4vG1HRuBWbu7NP6/s/QFiauUiUi55czhKjfjeBOPyUBMN+uYT7Xjlr4ETIUcE2NVo8 XiKyGy9trBovQuS23DK5EJ/ku/W514AwIhBgs4vs= 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 r13-5638] libstdc++: Fix build failures for avr X-Act-Checkin: gcc X-Git-Author: Jonathan Wakely X-Git-Refname: refs/heads/master X-Git-Oldrev: 7314558c938245e5963494629e6436e0dccf1c8b X-Git-Newrev: 2d2e163d12f64a5e68f9e0381751ed9d5d6d3617 Message-Id: <20230201210659.B69EA3858436@sourceware.org> Date: Wed, 1 Feb 2023 21:06:59 +0000 (GMT) List-Id: https://gcc.gnu.org/g:2d2e163d12f64a5e68f9e0381751ed9d5d6d3617 commit r13-5638-g2d2e163d12f64a5e68f9e0381751ed9d5d6d3617 Author: Jonathan Wakely Date: Tue Jan 31 22:16:31 2023 +0000 libstdc++: Fix build failures for avr The abr-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 check for ENOENT etc. in switch. (fs::remove_all) [__AVR__]: Likewise. * src/filesystem/ops-common.h [__AVR__]: Do not use POSIX open, close etc. Diff: --- libstdc++-v3/config/os/generic/error_constants.h | 2 ++ libstdc++-v3/src/c++11/system_error.cc | 9 +++++++++ libstdc++-v3/src/c++17/fs_ops.cc | 6 +++++- libstdc++-v3/src/filesystem/ops-common.h | 2 +- 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/libstdc++-v3/config/os/generic/error_constants.h b/libstdc++-v3/config/os/generic/error_constants.h index 4d900414494..ba2795352bc 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 6e7c0ac0c26..748eee94168 100644 --- a/libstdc++-v3/src/c++11/system_error.cc +++ b/libstdc++-v3/src/c++11/system_error.cc @@ -251,6 +251,15 @@ namespace X (WRITE_PROTECT, EROFS); #undef X +#elif 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. diff --git a/libstdc++-v3/src/c++17/fs_ops.cc b/libstdc++-v3/src/c++17/fs_ops.cc index b49bf4a6b20..c94d260632f 100644 --- a/libstdc++-v3/src/c++17/fs_ops.cc +++ b/libstdc++-v3/src/c++17/fs_ops.cc @@ -736,7 +736,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)}) { @@ -1302,6 +1302,7 @@ fs::remove_all(const path& p) } // Directory is empty now, will remove it below. break; +#ifndef __AVR__ case ENOENT: // Our work here is done. return 0; @@ -1309,6 +1310,7 @@ fs::remove_all(const path& p) case ELOOP: // Not a directory, will remove below. break; +#endif default: // An error occurred. _GLIBCXX_THROW_OR_ABORT(filesystem_error("cannot remove all", p, ec)); @@ -1339,6 +1341,7 @@ fs::remove_all(const path& p, error_code& ec) } // Directory is empty now, will remove it below. break; +#ifndef __AVR__ case ENOENT: // Our work here is done. ec.clear(); @@ -1347,6 +1350,7 @@ fs::remove_all(const path& p, error_code& ec) case ELOOP: // Not a directory, will remove below. break; +#endif default: // An error occurred. return -1; diff --git a/libstdc++-v3/src/filesystem/ops-common.h b/libstdc++-v3/src/filesystem/ops-common.h index b0d49dd4d4f..02c75be09d2 100644 --- a/libstdc++-v3/src/filesystem/ops-common.h +++ b/libstdc++-v3/src/filesystem/ops-common.h @@ -167,7 +167,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