From f7cee44ef2a2bf62f3c939d5686c45c71f3b14bc Mon Sep 17 00:00:00 2001 From: Joseph Huber Date: Tue, 16 Jul 2024 16:17:01 -0500 Subject: [PATCH] [libc] Add `strerror` and `strerror_k` to the GPU (#99083) Summary: The GPU ignores `errno` primarily, but targets want these functions to be defined for certain C standard interfaces. This patch enables them and makes the test function on non-Linux targets. --- libc/config/gpu/entrypoints.txt | 2 + .../generic-error-number-macros.h | 1 + .../__support/StringUtil/tables/stdc_errors.h | 3 +- libc/test/src/string/strerror_test.cpp | 145 +----------------- 4 files changed, 9 insertions(+), 142 deletions(-) diff --git a/libc/config/gpu/entrypoints.txt b/libc/config/gpu/entrypoints.txt index 63228216c85e..36c5b8c80852 100644 --- a/libc/config/gpu/entrypoints.txt +++ b/libc/config/gpu/entrypoints.txt @@ -47,6 +47,8 @@ set(TARGET_LIBC_ENTRYPOINTS libc.src.string.strcpy libc.src.string.strcspn libc.src.string.strdup + libc.src.string.strerror + libc.src.string.strerror_r libc.src.string.strlcat libc.src.string.strlcpy libc.src.string.strlen diff --git a/libc/include/llvm-libc-macros/generic-error-number-macros.h b/libc/include/llvm-libc-macros/generic-error-number-macros.h index 59b121ef1481..199a86217b34 100644 --- a/libc/include/llvm-libc-macros/generic-error-number-macros.h +++ b/libc/include/llvm-libc-macros/generic-error-number-macros.h @@ -43,5 +43,6 @@ #define EPIPE 32 #define EDOM 33 #define ERANGE 34 +#define EILSEQ 84 #endif // LLVM_LIBC_MACROS_GENERIC_ERROR_NUMBER_MACROS_H diff --git a/libc/src/__support/StringUtil/tables/stdc_errors.h b/libc/src/__support/StringUtil/tables/stdc_errors.h index a5d2279ff399..d893be63ab89 100644 --- a/libc/src/__support/StringUtil/tables/stdc_errors.h +++ b/libc/src/__support/StringUtil/tables/stdc_errors.h @@ -16,10 +16,11 @@ namespace LIBC_NAMESPACE_DECL { -LIBC_INLINE_VAR constexpr const MsgTable<3> STDC_ERRORS = { +LIBC_INLINE_VAR constexpr const MsgTable<4> STDC_ERRORS = { MsgMapping(0, "Success"), MsgMapping(EDOM, "Numerical argument out of domain"), MsgMapping(ERANGE, "Numerical result out of range"), + MsgMapping(EILSEQ, "Invalid or incomplete multibyte or wide character"), }; } // namespace LIBC_NAMESPACE_DECL diff --git a/libc/test/src/string/strerror_test.cpp b/libc/test/src/string/strerror_test.cpp index cfc79481699b..6c59c709df24 100644 --- a/libc/test/src/string/strerror_test.cpp +++ b/libc/test/src/string/strerror_test.cpp @@ -6,153 +6,16 @@ // //===----------------------------------------------------------------------===// +#include "src/__support/StringUtil/platform_errors.h" +#include "src/__support/macros/properties/architectures.h" #include "src/string/strerror.h" #include "test/UnitTest/Test.h" TEST(LlvmLibcStrErrorTest, KnownErrors) { ASSERT_STREQ(LIBC_NAMESPACE::strerror(0), "Success"); - const char *message_array[] = { - "Success", - "Operation not permitted", - "No such file or directory", - "No such process", - "Interrupted system call", - "Input/output error", - "No such device or address", - "Argument list too long", - "Exec format error", - "Bad file descriptor", - "No child processes", - "Resource temporarily unavailable", - "Cannot allocate memory", - "Permission denied", - "Bad address", - "Block device required", - "Device or resource busy", - "File exists", - "Invalid cross-device link", - "No such device", - "Not a directory", - "Is a directory", - "Invalid argument", - "Too many open files in system", - "Too many open files", - "Inappropriate ioctl for device", - "Text file busy", - "File too large", - "No space left on device", - "Illegal seek", - "Read-only file system", - "Too many links", - "Broken pipe", - "Numerical argument out of domain", - "Numerical result out of range", - "Resource deadlock avoided", - "File name too long", - "No locks available", - "Function not implemented", - "Directory not empty", - "Too many levels of symbolic links", - "Unknown error 41", // Unknown - "No message of desired type", - "Identifier removed", - "Channel number out of range", - "Level 2 not synchronized", - "Level 3 halted", - "Level 3 reset", - "Link number out of range", - "Protocol driver not attached", - "No CSI structure available", - "Level 2 halted", - "Invalid exchange", - "Invalid request descriptor", - "Exchange full", - "No anode", - "Invalid request code", - "Invalid slot", - "Unknown error 58", // Unknown - "Bad font file format", - "Device not a stream", - "No data available", - "Timer expired", - "Out of streams resources", - "Machine is not on the network", - "Package not installed", - "Object is remote", - "Link has been severed", - "Advertise error", - "Srmount error", - "Communication error on send", - "Protocol error", - "Multihop attempted", - "RFS specific error", - "Bad message", - "Value too large for defined data type", - "Name not unique on network", - "File descriptor in bad state", - "Remote address changed", - "Can not access a needed shared library", - "Accessing a corrupted shared library", - ".lib section in a.out corrupted", - "Attempting to link in too many shared libraries", - "Cannot exec a shared library directly", - "Unknown error 84", // Unknown - "Interrupted system call should be restarted", - "Streams pipe error", - "Too many users", - "Socket operation on non-socket", - "Destination address required", - "Message too long", - "Protocol wrong type for socket", - "Protocol not available", - "Protocol not supported", - "Socket type not supported", - "Operation not supported", - "Protocol family not supported", - "Address family not supported by protocol", - "Address already in use", - "Cannot assign requested address", - "Network is down", - "Network is unreachable", - "Network dropped connection on reset", - "Software caused connection abort", - "Connection reset by peer", - "No buffer space available", - "Transport endpoint is already connected", - "Transport endpoint is not connected", - "Cannot send after transport endpoint shutdown", - "Too many references: cannot splice", - "Connection timed out", - "Connection refused", - "Host is down", - "No route to host", - "Operation already in progress", - "Operation now in progress", - "Stale file handle", - "Structure needs cleaning", - "Not a XENIX named type file", - "No XENIX semaphores available", - "Is a named type file", - "Remote I/O error", - "Disk quota exceeded", - "No medium found", - "Wrong medium type", - "Operation canceled", - "Required key not available", - "Key has expired", - "Key has been revoked", - "Key was rejected by service", - "Owner died", - "State not recoverable", - "Operation not possible due to RF-kill", - "Memory page has hardware error", - }; - - for (size_t i = 0; i < (sizeof(message_array) / sizeof(char *)); ++i) { - EXPECT_STREQ(LIBC_NAMESPACE::strerror(static_cast(i)), - message_array[i]); - } + for (auto [i, msg] : LIBC_NAMESPACE::PLATFORM_ERRORS) + EXPECT_STREQ(LIBC_NAMESPACE::strerror(static_cast(i)), msg.begin()); } TEST(LlvmLibcStrErrorTest, UnknownErrors) {