libstdc++: Fix build failures for avr
The abr-libc <errno.h> does not define EOVERFLOW, which means that std::errc::value_too_large is not defined, and so <charconv> cannot be compiled. Define value_too_large for avr with a value that does not clash with any that is defined in <errno.h>. This is a kluge to fix bootstrap for avr; it can be removed after PR libstdc++/104883 is resolved. The avr-libc <errno.h> 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 <unistd.h> 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.
This commit is contained in:
parent
7314558c93
commit
2d2e163d12
4 changed files with 17 additions and 2 deletions
|
@ -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
|
||||
|
|
|
@ -251,6 +251,15 @@ namespace
|
|||
X (WRITE_PROTECT, EROFS);
|
||||
#undef X
|
||||
|
||||
#elif defined __AVR__
|
||||
// avr-libc only defines a few distinct error numbers. Most <errno.h>
|
||||
// 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.
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue