diff --git a/libc/src/__support/StringUtil/CMakeLists.txt b/libc/src/__support/StringUtil/CMakeLists.txt --- a/libc/src/__support/StringUtil/CMakeLists.txt +++ b/libc/src/__support/StringUtil/CMakeLists.txt @@ -3,10 +3,13 @@ HDRS message_mapper.h DEPENDS - libc.src.__support.CPP.string_view - libc.src.__support.CPP.optional + libc.src.__support.CPP.string_view + libc.src.__support.CPP.optional ) +# The table maps depend on message_mapper. +add_subdirectory(tables) + add_object_library( error_to_string HDRS @@ -14,15 +17,15 @@ SRCS error_to_string.cpp DEPENDS - .message_mapper - libc.src.errno.errno - libc.src.__support.CPP.span - libc.src.__support.CPP.string_view - libc.src.__support.CPP.stringstream - libc.src.__support.integer_to_string + .message_mapper + libc.src.errno.errno + libc.src.__support.CPP.span + libc.src.__support.CPP.string_view + libc.src.__support.CPP.stringstream + libc.src.__support.integer_to_string + libc.src.__support.StringUtil.tables.error_table ) - add_object_library( signal_to_string HDRS @@ -30,10 +33,11 @@ SRCS signal_to_string.cpp DEPENDS - .message_mapper - libc.include.signal - libc.src.__support.CPP.span - libc.src.__support.CPP.string_view - libc.src.__support.CPP.stringstream - libc.src.__support.integer_to_string + .message_mapper + libc.include.signal + libc.src.__support.CPP.span + libc.src.__support.CPP.string_view + libc.src.__support.CPP.stringstream + libc.src.__support.integer_to_string + libc.src.__support.StringUtil.tables.signal_table ) diff --git a/libc/src/__support/StringUtil/error_to_string.h b/libc/src/__support/StringUtil/error_to_string.h --- a/libc/src/__support/StringUtil/error_to_string.h +++ b/libc/src/__support/StringUtil/error_to_string.h @@ -6,12 +6,12 @@ // //===----------------------------------------------------------------------===// -#include "src/__support/CPP/span.h" -#include "src/__support/CPP/string_view.h" - #ifndef LLVM_LIBC_SRC_SUPPORT_ERROR_TO_STRING_H #define LLVM_LIBC_SRC_SUPPORT_ERROR_TO_STRING_H +#include "src/__support/CPP/span.h" +#include "src/__support/CPP/string_view.h" + namespace __llvm_libc { cpp::string_view get_error_string(int err_num); diff --git a/libc/src/__support/StringUtil/error_to_string.cpp b/libc/src/__support/StringUtil/error_to_string.cpp --- a/libc/src/__support/StringUtil/error_to_string.cpp +++ b/libc/src/__support/StringUtil/error_to_string.cpp @@ -8,12 +8,16 @@ #include "src/__support/StringUtil/error_to_string.h" +#include "src/errno/libc_errno.h" // For error macros + +#include "src/__support/CPP/array.h" #include "src/__support/CPP/span.h" #include "src/__support/CPP/string_view.h" #include "src/__support/CPP/stringstream.h" #include "src/__support/StringUtil/message_mapper.h" #include "src/__support/integer_to_string.h" -#include "src/errno/libc_errno.h" // For error macros + +#include "src/__support/StringUtil/tables/error_table.h" #include @@ -33,157 +37,21 @@ constexpr size_t ERR_BUFFER_SIZE = max_buff_size(); thread_local char error_buffer[ERR_BUFFER_SIZE]; +constexpr size_t RAW_ARRAY_LEN = PLATFORM_ERRORS.size(); +constexpr size_t TOTAL_STR_LEN = + total_str_len(PLATFORM_ERRORS.data(), RAW_ARRAY_LEN); + // Since the StringMappings array is a map from error numbers to their // corresponding strings, we have to have an array large enough we can use the -// error numbers as indexes. Thankfully there are 132 errors in the above list -// (41 and 58 are skipped) and the highest number is 133. If other platforms use -// different error numbers, then this number may need to be adjusted. -// Also if negative numbers or particularly large numbers are used, then the -// array should be turned into a proper hashmap. -constexpr size_t ERR_ARRAY_SIZE = 134; - -constexpr MsgMapping raw_err_array[] = { - MsgMapping(0, "Success"), - MsgMapping(EPERM, "Operation not permitted"), - MsgMapping(ENOENT, "No such file or directory"), - MsgMapping(ESRCH, "No such process"), - MsgMapping(EINTR, "Interrupted system call"), - MsgMapping(EIO, "Input/output error"), - MsgMapping(ENXIO, "No such device or address"), - MsgMapping(E2BIG, "Argument list too long"), - MsgMapping(ENOEXEC, "Exec format error"), - MsgMapping(EBADF, "Bad file descriptor"), - MsgMapping(ECHILD, "No child processes"), - MsgMapping(EAGAIN, "Resource temporarily unavailable"), - MsgMapping(ENOMEM, "Cannot allocate memory"), - MsgMapping(EACCES, "Permission denied"), - MsgMapping(EFAULT, "Bad address"), - MsgMapping(ENOTBLK, "Block device required"), - MsgMapping(EBUSY, "Device or resource busy"), - MsgMapping(EEXIST, "File exists"), - MsgMapping(EXDEV, "Invalid cross-device link"), - MsgMapping(ENODEV, "No such device"), - MsgMapping(ENOTDIR, "Not a directory"), - MsgMapping(EISDIR, "Is a directory"), - MsgMapping(EINVAL, "Invalid argument"), - MsgMapping(ENFILE, "Too many open files in system"), - MsgMapping(EMFILE, "Too many open files"), - MsgMapping(ENOTTY, "Inappropriate ioctl for device"), - MsgMapping(ETXTBSY, "Text file busy"), - MsgMapping(EFBIG, "File too large"), - MsgMapping(ENOSPC, "No space left on device"), - MsgMapping(ESPIPE, "Illegal seek"), - MsgMapping(EROFS, "Read-only file system"), - MsgMapping(EMLINK, "Too many links"), - MsgMapping(EPIPE, "Broken pipe"), - MsgMapping(EDOM, "Numerical argument out of domain"), - MsgMapping(ERANGE, "Numerical result out of range"), - MsgMapping(EDEADLK, "Resource deadlock avoided"), - MsgMapping(ENAMETOOLONG, "File name too long"), - MsgMapping(ENOLCK, "No locks available"), - MsgMapping(ENOSYS, "Function not implemented"), - MsgMapping(ENOTEMPTY, "Directory not empty"), - MsgMapping(ELOOP, "Too many levels of symbolic links"), - // No error for 41. Would be EWOULDBLOCK - MsgMapping(ENOMSG, "No message of desired type"), - MsgMapping(EIDRM, "Identifier removed"), - MsgMapping(ECHRNG, "Channel number out of range"), - MsgMapping(EL2NSYNC, "Level 2 not synchronized"), - MsgMapping(EL3HLT, "Level 3 halted"), - MsgMapping(EL3RST, "Level 3 reset"), - MsgMapping(ELNRNG, "Link number out of range"), - MsgMapping(EUNATCH, "Protocol driver not attached"), - MsgMapping(ENOCSI, "No CSI structure available"), - MsgMapping(EL2HLT, "Level 2 halted"), - MsgMapping(EBADE, "Invalid exchange"), - MsgMapping(EBADR, "Invalid request descriptor"), - MsgMapping(EXFULL, "Exchange full"), - MsgMapping(ENOANO, "No anode"), - MsgMapping(EBADRQC, "Invalid request code"), - MsgMapping(EBADSLT, "Invalid slot"), - // No error for 58. Would be EDEADLOCK. - MsgMapping(EBFONT, "Bad font file format"), - MsgMapping(ENOSTR, "Device not a stream"), - MsgMapping(ENODATA, "No data available"), - MsgMapping(ETIME, "Timer expired"), - MsgMapping(ENOSR, "Out of streams resources"), - MsgMapping(ENONET, "Machine is not on the network"), - MsgMapping(ENOPKG, "Package not installed"), - MsgMapping(EREMOTE, "Object is remote"), - MsgMapping(ENOLINK, "Link has been severed"), - MsgMapping(EADV, "Advertise error"), - MsgMapping(ESRMNT, "Srmount error"), - MsgMapping(ECOMM, "Communication error on send"), - MsgMapping(EPROTO, "Protocol error"), - MsgMapping(EMULTIHOP, "Multihop attempted"), - MsgMapping(EDOTDOT, "RFS specific error"), - MsgMapping(EBADMSG, "Bad message"), - MsgMapping(EOVERFLOW, "Value too large for defined data type"), - MsgMapping(ENOTUNIQ, "Name not unique on network"), - MsgMapping(EBADFD, "File descriptor in bad state"), - MsgMapping(EREMCHG, "Remote address changed"), - MsgMapping(ELIBACC, "Can not access a needed shared library"), - MsgMapping(ELIBBAD, "Accessing a corrupted shared library"), - MsgMapping(ELIBSCN, ".lib section in a.out corrupted"), - MsgMapping(ELIBMAX, "Attempting to link in too many shared libraries"), - MsgMapping(ELIBEXEC, "Cannot exec a shared library directly"), - MsgMapping(EILSEQ, "Invalid or incomplete multibyte or wide character"), - MsgMapping(ERESTART, "Interrupted system call should be restarted"), - MsgMapping(ESTRPIPE, "Streams pipe error"), - MsgMapping(EUSERS, "Too many users"), - MsgMapping(ENOTSOCK, "Socket operation on non-socket"), - MsgMapping(EDESTADDRREQ, "Destination address required"), - MsgMapping(EMSGSIZE, "Message too long"), - MsgMapping(EPROTOTYPE, "Protocol wrong type for socket"), - MsgMapping(ENOPROTOOPT, "Protocol not available"), - MsgMapping(EPROTONOSUPPORT, "Protocol not supported"), - MsgMapping(ESOCKTNOSUPPORT, "Socket type not supported"), - MsgMapping(ENOTSUP, "Operation not supported"), - MsgMapping(EPFNOSUPPORT, "Protocol family not supported"), - MsgMapping(EAFNOSUPPORT, "Address family not supported by protocol"), - MsgMapping(EADDRINUSE, "Address already in use"), - MsgMapping(EADDRNOTAVAIL, "Cannot assign requested address"), - MsgMapping(ENETDOWN, "Network is down"), - MsgMapping(ENETUNREACH, "Network is unreachable"), - MsgMapping(ENETRESET, "Network dropped connection on reset"), - MsgMapping(ECONNABORTED, "Software caused connection abort"), - MsgMapping(ECONNRESET, "Connection reset by peer"), - MsgMapping(ENOBUFS, "No buffer space available"), - MsgMapping(EISCONN, "Transport endpoint is already connected"), - MsgMapping(ENOTCONN, "Transport endpoint is not connected"), - MsgMapping(ESHUTDOWN, "Cannot send after transport endpoint shutdown"), - MsgMapping(ETOOMANYREFS, "Too many references: cannot splice"), - MsgMapping(ETIMEDOUT, "Connection timed out"), - MsgMapping(ECONNREFUSED, "Connection refused"), - MsgMapping(EHOSTDOWN, "Host is down"), - MsgMapping(EHOSTUNREACH, "No route to host"), - MsgMapping(EALREADY, "Operation already in progress"), - MsgMapping(EINPROGRESS, "Operation now in progress"), - MsgMapping(ESTALE, "Stale file handle"), - MsgMapping(EUCLEAN, "Structure needs cleaning"), - MsgMapping(ENOTNAM, "Not a XENIX named type file"), - MsgMapping(ENAVAIL, "No XENIX semaphores available"), - MsgMapping(EISNAM, "Is a named type file"), - MsgMapping(EREMOTEIO, "Remote I/O error"), - MsgMapping(EDQUOT, "Disk quota exceeded"), - MsgMapping(ENOMEDIUM, "No medium found"), - MsgMapping(EMEDIUMTYPE, "Wrong medium type"), - MsgMapping(ECANCELED, "Operation canceled"), - MsgMapping(ENOKEY, "Required key not available"), - MsgMapping(EKEYEXPIRED, "Key has expired"), - MsgMapping(EKEYREVOKED, "Key has been revoked"), - MsgMapping(EKEYREJECTED, "Key was rejected by service"), - MsgMapping(EOWNERDEAD, "Owner died"), - MsgMapping(ENOTRECOVERABLE, "State not recoverable"), - MsgMapping(ERFKILL, "Operation not possible due to RF-kill"), - MsgMapping(EHWPOISON, "Memory page has hardware error"), -}; - -constexpr size_t RAW_ARRAY_LEN = sizeof(raw_err_array) / sizeof(MsgMapping); -constexpr size_t TOTAL_STR_LEN = total_str_len(raw_err_array, RAW_ARRAY_LEN); +// error numbers as indexes. The current linux configuration has 132 values with +// the maximum value being 133 (41 and 58 are skipped). If other platforms use +// negative numbers or discontiguous ranges, then the array should be turned +// into a proper hashmap. +constexpr size_t ERR_ARRAY_SIZE = + max_key_val(PLATFORM_ERRORS.data(), RAW_ARRAY_LEN) + 1; static constexpr MessageMapper - error_mapper(raw_err_array, RAW_ARRAY_LEN); + error_mapper(PLATFORM_ERRORS.data(), RAW_ARRAY_LEN); cpp::string_view build_error_string(int err_num, cpp::span buffer) { // if the buffer can't hold "Unknown error" + ' ' + num_str, then just diff --git a/libc/src/__support/StringUtil/message_mapper.h b/libc/src/__support/StringUtil/message_mapper.h --- a/libc/src/__support/StringUtil/message_mapper.h +++ b/libc/src/__support/StringUtil/message_mapper.h @@ -9,6 +9,7 @@ #ifndef LLVM_LIBC_SRC_SUPPORT_STRING_UTIL_MESSAGE_MAPPER_H #define LLVM_LIBC_SRC_SUPPORT_STRING_UTIL_MESSAGE_MAPPER_H +#include "src/__support/CPP/array.h" #include "src/__support/CPP/optional.h" #include "src/__support/CPP/string_view.h" #include @@ -20,6 +21,8 @@ int num; cpp::string_view msg; + constexpr MsgMapping() : num(0), msg() { ; } + constexpr MsgMapping(int init_num, const char *init_msg) : num(init_num), msg(init_msg) { ; @@ -35,6 +38,18 @@ return total; } +constexpr size_t max_key_val(const MsgMapping *array, size_t len) { + int max = 0; + for (size_t i = 0; i < len; ++i) { + if (array[i].num > max) { + max = array[i].num; + } + } + // max will never be negative since the starting value is 0. This is good, + // since it's used as a length. + return static_cast(max); +} + template class MessageMapper { int msg_offsets[ARR_SIZE] = {-1}; char string_array[TOTAL_STR_LEN] = {'\0'}; @@ -71,6 +86,19 @@ } }; +template using MsgTable = cpp::array; + +template +constexpr MsgTable operator+(const MsgTable &t1, + const MsgTable &t2) { + MsgTable res{}; + for (size_t i = 0; i < N1; ++i) + res[i] = t1[i]; + for (size_t i = 0; i < N2; ++i) + res[N1 + i] = t2[i]; + return res; +} + } // namespace internal } // namespace __llvm_libc diff --git a/libc/src/__support/StringUtil/signal_to_string.cpp b/libc/src/__support/StringUtil/signal_to_string.cpp --- a/libc/src/__support/StringUtil/signal_to_string.cpp +++ b/libc/src/__support/StringUtil/signal_to_string.cpp @@ -12,6 +12,7 @@ #include "src/__support/CPP/string_view.h" #include "src/__support/CPP/stringstream.h" #include "src/__support/StringUtil/message_mapper.h" +#include "src/__support/StringUtil/tables/signal_table.h" #include "src/__support/integer_to_string.h" #include @@ -33,50 +34,15 @@ constexpr size_t SIG_BUFFER_SIZE = max_buff_size(); thread_local char signal_buffer[SIG_BUFFER_SIZE]; -constexpr MsgMapping raw_sig_array[] = { - MsgMapping(SIGHUP, "Hangup"), MsgMapping(SIGINT, "Interrupt"), - MsgMapping(SIGQUIT, "Quit"), MsgMapping(SIGILL, "Illegal instruction"), - MsgMapping(SIGTRAP, "Trace/breakpoint trap"), - MsgMapping(SIGABRT, "Aborted"), MsgMapping(SIGBUS, "Bus error"), - MsgMapping(SIGFPE, "Floating point exception"), - MsgMapping(SIGKILL, "Killed"), MsgMapping(SIGUSR1, "User defined signal 1"), - MsgMapping(SIGSEGV, "Segmentation fault"), - MsgMapping(SIGUSR2, "User defined signal 2"), - MsgMapping(SIGPIPE, "Broken pipe"), MsgMapping(SIGALRM, "Alarm clock"), - MsgMapping(SIGTERM, "Terminated"), - // SIGSTKFLT (may not exist) - MsgMapping(SIGCHLD, "Child exited"), MsgMapping(SIGCONT, "Continued"), - MsgMapping(SIGSTOP, "Stopped (signal)"), MsgMapping(SIGTSTP, "Stopped"), - MsgMapping(SIGTTIN, "Stopped (tty input)"), - MsgMapping(SIGTTOU, "Stopped (tty output)"), - MsgMapping(SIGURG, "Urgent I/O condition"), - MsgMapping(SIGXCPU, "CPU time limit exceeded"), - MsgMapping(SIGXFSZ, "File size limit exceeded"), - MsgMapping(SIGVTALRM, "Virtual timer expired"), - MsgMapping(SIGPROF, "Profiling timer expired"), - MsgMapping(SIGWINCH, "Window changed"), MsgMapping(SIGPOLL, "I/O possible"), - // SIGPWR (may not exist) - MsgMapping(SIGSYS, "Bad system call"), - -#ifdef SIGSTKFLT - MsgMapping(SIGSTKFLT, "Stack fault"), // unused -#endif -#ifdef SIGPWR - MsgMapping(SIGPWR, "Power failure"), // ignored -#endif -}; - -// Since the string_mappings array is a map from signal numbers to their -// corresponding strings, we have to have an array large enough we can use the -// signal numbers as indexes. The highest signal is SIGSYS at 31, so an array of -// 32 elements will be large enough to hold all of them. -constexpr size_t SIG_ARRAY_SIZE = 32; - -constexpr size_t RAW_ARRAY_LEN = sizeof(raw_sig_array) / sizeof(MsgMapping); -constexpr size_t TOTAL_STR_LEN = total_str_len(raw_sig_array, RAW_ARRAY_LEN); +constexpr size_t RAW_ARRAY_LEN = PLATFORM_SIGNALS.size(); +constexpr size_t TOTAL_STR_LEN = + total_str_len(PLATFORM_SIGNALS.data(), RAW_ARRAY_LEN); + +constexpr size_t SIG_ARRAY_SIZE = + max_key_val(PLATFORM_SIGNALS.data(), RAW_ARRAY_LEN) + 1; static constexpr MessageMapper - signal_mapper(raw_sig_array, RAW_ARRAY_LEN); + signal_mapper(PLATFORM_SIGNALS.data(), RAW_ARRAY_LEN); cpp::string_view build_signal_string(int sig_num, cpp::span buffer) { cpp::string_view base_str; diff --git a/libc/src/__support/StringUtil/tables/CMakeLists.txt b/libc/src/__support/StringUtil/tables/CMakeLists.txt new file mode 100644 --- /dev/null +++ b/libc/src/__support/StringUtil/tables/CMakeLists.txt @@ -0,0 +1,35 @@ +if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${LIBC_TARGET_OS}) + add_subdirectory(${LIBC_TARGET_OS}) +endif() + +set(error_to_string_platform_dep "") +if(TARGET libc.src.__support.StringUtil.tables.${LIBC_TARGET_OS}.error_table) + set(error_to_string_platform_dep + libc.src.__support.StringUtil.tables.${LIBC_TARGET_OS}.error_table) +endif() + +add_header_library( + error_table + HDRS + error_table.h + stdc_error_table.h + posix_error_table.h + DEPENDS + ${error_to_string_platform_dep} +) + +set(signal_to_string_platform_dep "") +if(TARGET libc.src.__support.StringUtil.tables.${LIBC_TARGET_OS}.signal_table) + set(signal_to_string_platform_dep + libc.src.__support.StringUtil.tables.${LIBC_TARGET_OS}.signal_table) +endif() + +add_header_library( + signal_table + HDRS + signal_table.h + stdc_signal_table.h + posix_signal_table.h + DEPENDS + ${signal_to_string_platform_dep} +) diff --git a/libc/src/__support/StringUtil/tables/error_table.h b/libc/src/__support/StringUtil/tables/error_table.h new file mode 100644 --- /dev/null +++ b/libc/src/__support/StringUtil/tables/error_table.h @@ -0,0 +1,32 @@ +//===-- Map from error numbers to strings -----------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC_SUPPORT_STRING_UTIL_TABLES_ERROR_TABLE_H +#define LLVM_LIBC_SRC_SUPPORT_STRING_UTIL_TABLES_ERROR_TABLE_H + +#include "src/__support/StringUtil/message_mapper.h" + +#include "posix_error_table.h" +#include "stdc_error_table.h" + +#ifdef __linux__ +#include "linux/error_table.h" +#endif + +namespace __llvm_libc::internal { + +#ifdef __linux__ +inline constexpr auto PLATFORM_ERRORS = + STDC_ERRORS + POSIX_ERRORS + LINUX_ERRORS; +#else +inline constexpr auto PLATFORM_ERRORS = STDC_ERRORS; +#endif + +} // namespace __llvm_libc::internal + +#endif // LLVM_LIBC_SRC_SUPPORT_STRING_UTIL_TABLES_ERROR_TABLE_H diff --git a/libc/src/__support/StringUtil/tables/linux/CMakeLists.txt b/libc/src/__support/StringUtil/tables/linux/CMakeLists.txt new file mode 100644 --- /dev/null +++ b/libc/src/__support/StringUtil/tables/linux/CMakeLists.txt @@ -0,0 +1,17 @@ +add_header_library( + error_table + HDRS + error_table.h + DEPENDS + libc.src.__support.StringUtil.message_mapper + libc.src.errno.errno +) + +add_header_library( + signal_table + HDRS + signal_table.h + DEPENDS + libc.src.__support.StringUtil.message_mapper + libc.include.signal +) diff --git a/libc/src/__support/StringUtil/tables/linux/error_table.h b/libc/src/__support/StringUtil/tables/linux/error_table.h new file mode 100644 --- /dev/null +++ b/libc/src/__support/StringUtil/tables/linux/error_table.h @@ -0,0 +1,76 @@ +//===-- Map from error numbers to strings on linux --------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC_SUPPORT_STRING_UTIL_TABLES_LINUX_ERROR_TABLE_H +#define LLVM_LIBC_SRC_SUPPORT_STRING_UTIL_TABLES_LINUX_ERROR_TABLE_H + +#include "src/errno/libc_errno.h" // For error macros + +#include "src/__support/CPP/array.h" +#include "src/__support/StringUtil/message_mapper.h" + +namespace __llvm_libc::internal { + +constexpr MsgTable<52> LINUX_ERRORS = { + MsgMapping(ENOTBLK, "Block device required"), + MsgMapping(ECHRNG, "Channel number out of range"), + MsgMapping(EL2NSYNC, "Level 2 not synchronized"), + MsgMapping(EL3HLT, "Level 3 halted"), + MsgMapping(EL3RST, "Level 3 reset"), + MsgMapping(ELNRNG, "Link number out of range"), + MsgMapping(EUNATCH, "Protocol driver not attached"), + MsgMapping(ENOCSI, "No CSI structure available"), + MsgMapping(EL2HLT, "Level 2 halted"), + MsgMapping(EBADE, "Invalid exchange"), + MsgMapping(EBADR, "Invalid request descriptor"), + MsgMapping(EXFULL, "Exchange full"), + MsgMapping(ENOANO, "No anode"), + MsgMapping(EBADRQC, "Invalid request code"), + MsgMapping(EBADSLT, "Invalid slot"), + MsgMapping(EBFONT, "Bad font file format"), + MsgMapping(ENONET, "Machine is not on the network"), + MsgMapping(ENOPKG, "Package not installed"), + MsgMapping(EREMOTE, "Object is remote"), + MsgMapping(EADV, "Advertise error"), + MsgMapping(ESRMNT, "Srmount error"), + MsgMapping(ECOMM, "Communication error on send"), + MsgMapping(EDOTDOT, "RFS specific error"), + MsgMapping(ENOTUNIQ, "Name not unique on network"), + MsgMapping(EBADFD, "File descriptor in bad state"), + MsgMapping(EREMCHG, "Remote address changed"), + MsgMapping(ELIBACC, "Can not access a needed shared library"), + MsgMapping(ELIBBAD, "Accessing a corrupted shared library"), + MsgMapping(ELIBSCN, ".lib section in a.out corrupted"), + MsgMapping(ELIBMAX, "Attempting to link in too many shared libraries"), + MsgMapping(ELIBEXEC, "Cannot exec a shared library directly"), + MsgMapping(ERESTART, "Interrupted system call should be restarted"), + MsgMapping(ESTRPIPE, "Streams pipe error"), + MsgMapping(EUSERS, "Too many users"), + MsgMapping(ESOCKTNOSUPPORT, "Socket type not supported"), + MsgMapping(EPFNOSUPPORT, "Protocol family not supported"), + MsgMapping(ESHUTDOWN, "Cannot send after transport endpoint shutdown"), + MsgMapping(ETOOMANYREFS, "Too many references: cannot splice"), + MsgMapping(EHOSTDOWN, "Host is down"), + MsgMapping(EUCLEAN, "Structure needs cleaning"), + MsgMapping(ENOTNAM, "Not a XENIX named type file"), + MsgMapping(ENAVAIL, "No XENIX semaphores available"), + MsgMapping(EISNAM, "Is a named type file"), + MsgMapping(EREMOTEIO, "Remote I/O error"), + MsgMapping(ENOMEDIUM, "No medium found"), + MsgMapping(EMEDIUMTYPE, "Wrong medium type"), + MsgMapping(ENOKEY, "Required key not available"), + MsgMapping(EKEYEXPIRED, "Key has expired"), + MsgMapping(EKEYREVOKED, "Key has been revoked"), + MsgMapping(EKEYREJECTED, "Key was rejected by service"), + MsgMapping(ERFKILL, "Operation not possible due to RF-kill"), + MsgMapping(EHWPOISON, "Memory page has hardware error"), +}; + +} // namespace __llvm_libc::internal + +#endif // LLVM_LIBC_SRC_SUPPORT_STRING_UTIL_TABLES_LINUX_ERROR_TABLE_H diff --git a/libc/src/__support/StringUtil/tables/linux/signal_table.h b/libc/src/__support/StringUtil/tables/linux/signal_table.h new file mode 100644 --- /dev/null +++ b/libc/src/__support/StringUtil/tables/linux/signal_table.h @@ -0,0 +1,33 @@ +//===-- Map from signal numbers to strings on linux -------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC_SUPPORT_STRING_UTIL_TABLES_LINUX_SIGNAL_TABLE_H +#define LLVM_LIBC_SRC_SUPPORT_STRING_UTIL_TABLES_LINUX_SIGNAL_TABLE_H + +#include + +#include "src/__support/StringUtil/message_mapper.h" + +namespace __llvm_libc::internal { + +// The array being larger than necessary isn't a problem. The MsgMappings will +// be set to their default state which maps 0 to an empty string. This will get +// filtered out in the MessageMapper building stage. +inline constexpr const MsgTable<3> LINUX_SIGNALS = { +#ifdef SIGSTKFLT + MsgMapping(SIGSTKFLT, "Stack fault"), // unused +#endif + MsgMapping(SIGWINCH, "Window changed"), +#ifdef SIGPWR + MsgMapping(SIGPWR, "Power failure"), // ignored +#endif +}; + +} // namespace __llvm_libc::internal + +#endif // LLVM_LIBC_SRC_SUPPORT_STRING_UTIL_TABLES_LINUX_SIGNAL_TABLE_H diff --git a/libc/src/__support/StringUtil/tables/posix_error_table.h b/libc/src/__support/StringUtil/tables/posix_error_table.h new file mode 100644 --- /dev/null +++ b/libc/src/__support/StringUtil/tables/posix_error_table.h @@ -0,0 +1,100 @@ +//===-- Map from error numbers to strings in posix --------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC_SUPPORT_STRING_UTIL_TABLES_POSIX_ERROR_TABLE_H +#define LLVM_LIBC_SRC_SUPPORT_STRING_UTIL_TABLES_POSIX_ERROR_TABLE_H + +#include "src/errno/libc_errno.h" // For error macros + +#include "src/__support/CPP/array.h" +#include "src/__support/StringUtil/message_mapper.h" + +namespace __llvm_libc::internal { + +inline constexpr MsgTable<76> POSIX_ERRORS = { + MsgMapping(EPERM, "Operation not permitted"), + MsgMapping(ENOENT, "No such file or directory"), + MsgMapping(ESRCH, "No such process"), + MsgMapping(EINTR, "Interrupted system call"), + MsgMapping(EIO, "Input/output error"), + MsgMapping(ENXIO, "No such device or address"), + MsgMapping(E2BIG, "Argument list too long"), + MsgMapping(ENOEXEC, "Exec format error"), + MsgMapping(EBADF, "Bad file descriptor"), + MsgMapping(ECHILD, "No child processes"), + MsgMapping(EAGAIN, "Resource temporarily unavailable"), + MsgMapping(ENOMEM, "Cannot allocate memory"), + MsgMapping(EACCES, "Permission denied"), + MsgMapping(EFAULT, "Bad address"), + MsgMapping(EBUSY, "Device or resource busy"), + MsgMapping(EEXIST, "File exists"), + MsgMapping(EXDEV, "Invalid cross-device link"), + MsgMapping(ENODEV, "No such device"), + MsgMapping(ENOTDIR, "Not a directory"), + MsgMapping(EISDIR, "Is a directory"), + MsgMapping(EINVAL, "Invalid argument"), + MsgMapping(ENFILE, "Too many open files in system"), + MsgMapping(EMFILE, "Too many open files"), + MsgMapping(ENOTTY, "Inappropriate ioctl for device"), + MsgMapping(ETXTBSY, "Text file busy"), + MsgMapping(EFBIG, "File too large"), + MsgMapping(ENOSPC, "No space left on device"), + MsgMapping(ESPIPE, "Illegal seek"), + MsgMapping(EROFS, "Read-only file system"), + MsgMapping(EMLINK, "Too many links"), + MsgMapping(EPIPE, "Broken pipe"), + MsgMapping(EDEADLK, "Resource deadlock avoided"), + MsgMapping(ENAMETOOLONG, "File name too long"), + MsgMapping(ENOLCK, "No locks available"), + MsgMapping(ENOSYS, "Function not implemented"), + MsgMapping(ENOTEMPTY, "Directory not empty"), + MsgMapping(ELOOP, "Too many levels of symbolic links"), + MsgMapping(ENOMSG, "No message of desired type"), + MsgMapping(EIDRM, "Identifier removed"), + MsgMapping(ENOSTR, "Device not a stream"), + MsgMapping(ENODATA, "No data available"), + MsgMapping(ETIME, "Timer expired"), + MsgMapping(ENOSR, "Out of streams resources"), + MsgMapping(ENOLINK, "Link has been severed"), + MsgMapping(EPROTO, "Protocol error"), + MsgMapping(EMULTIHOP, "Multihop attempted"), + MsgMapping(EBADMSG, "Bad message"), + MsgMapping(EOVERFLOW, "Value too large for defined data type"), + MsgMapping(ENOTSOCK, "Socket operation on non-socket"), + MsgMapping(EDESTADDRREQ, "Destination address required"), + MsgMapping(EMSGSIZE, "Message too long"), + MsgMapping(EPROTOTYPE, "Protocol wrong type for socket"), + MsgMapping(ENOPROTOOPT, "Protocol not available"), + MsgMapping(EPROTONOSUPPORT, "Protocol not supported"), + MsgMapping(ENOTSUP, "Operation not supported"), + MsgMapping(EAFNOSUPPORT, "Address family not supported by protocol"), + MsgMapping(EADDRINUSE, "Address already in use"), + MsgMapping(EADDRNOTAVAIL, "Cannot assign requested address"), + MsgMapping(ENETDOWN, "Network is down"), + MsgMapping(ENETUNREACH, "Network is unreachable"), + MsgMapping(ENETRESET, "Network dropped connection on reset"), + MsgMapping(ECONNABORTED, "Software caused connection abort"), + MsgMapping(ECONNRESET, "Connection reset by peer"), + MsgMapping(ENOBUFS, "No buffer space available"), + MsgMapping(EISCONN, "Transport endpoint is already connected"), + MsgMapping(ENOTCONN, "Transport endpoint is not connected"), + MsgMapping(ETIMEDOUT, "Connection timed out"), + MsgMapping(ECONNREFUSED, "Connection refused"), + MsgMapping(EHOSTUNREACH, "No route to host"), + MsgMapping(EALREADY, "Operation already in progress"), + MsgMapping(EINPROGRESS, "Operation now in progress"), + MsgMapping(ESTALE, "Stale file handle"), + MsgMapping(EDQUOT, "Disk quota exceeded"), + MsgMapping(ECANCELED, "Operation canceled"), + MsgMapping(EOWNERDEAD, "Owner died"), + MsgMapping(ENOTRECOVERABLE, "State not recoverable"), +}; + +} // namespace __llvm_libc::internal + +#endif // LLVM_LIBC_SRC_SUPPORT_STRING_UTIL_TABLES_POSIX_ERROR_TABLE_H diff --git a/libc/src/__support/StringUtil/tables/posix_signal_table.h b/libc/src/__support/StringUtil/tables/posix_signal_table.h new file mode 100644 --- /dev/null +++ b/libc/src/__support/StringUtil/tables/posix_signal_table.h @@ -0,0 +1,46 @@ +//===-- Map from signal numbers to strings in posix -------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC_SUPPORT_STRING_UTIL_TABLES_POSIX_SIGNAL_TABLE_H +#define LLVM_LIBC_SRC_SUPPORT_STRING_UTIL_TABLES_POSIX_SIGNAL_TABLE_H + +#include + +#include "src/__support/CPP/array.h" +#include "src/__support/StringUtil/message_mapper.h" + +namespace __llvm_libc::internal { + +inline constexpr MsgTable<22> POSIX_SIGNALS = { + MsgMapping(SIGHUP, "Hangup"), + MsgMapping(SIGQUIT, "Quit"), + MsgMapping(SIGTRAP, "Trace/breakpoint trap"), + MsgMapping(SIGBUS, "Bus error"), + MsgMapping(SIGKILL, "Killed"), + MsgMapping(SIGUSR1, "User defined signal 1"), + MsgMapping(SIGUSR2, "User defined signal 2"), + MsgMapping(SIGPIPE, "Broken pipe"), + MsgMapping(SIGALRM, "Alarm clock"), + MsgMapping(SIGCHLD, "Child exited"), + MsgMapping(SIGCONT, "Continued"), + MsgMapping(SIGSTOP, "Stopped (signal)"), + MsgMapping(SIGTSTP, "Stopped"), + MsgMapping(SIGTTIN, "Stopped (tty input)"), + MsgMapping(SIGTTOU, "Stopped (tty output)"), + MsgMapping(SIGURG, "Urgent I/O condition"), + MsgMapping(SIGXCPU, "CPU time limit exceeded"), + MsgMapping(SIGXFSZ, "File size limit exceeded"), + MsgMapping(SIGVTALRM, "Virtual timer expired"), + MsgMapping(SIGPROF, "Profiling timer expired"), + MsgMapping(SIGPOLL, "I/O possible"), + MsgMapping(SIGSYS, "Bad system call"), +}; + +} // namespace __llvm_libc::internal + +#endif // LLVM_LIBC_SRC_SUPPORT_STRING_UTIL_TABLES_POSIX_SIGNAL_TABLE_H diff --git a/libc/src/__support/StringUtil/tables/signal_table.h b/libc/src/__support/StringUtil/tables/signal_table.h new file mode 100644 --- /dev/null +++ b/libc/src/__support/StringUtil/tables/signal_table.h @@ -0,0 +1,32 @@ +//===-- Map from signal numbers to strings ----------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC_SUPPORT_STRING_UTIL_TABLES_SIGNAL_TABLE_H +#define LLVM_LIBC_SRC_SUPPORT_STRING_UTIL_TABLES_SIGNAL_TABLE_H + +#include "src/__support/StringUtil/message_mapper.h" + +#include "posix_signal_table.h" +#include "stdc_signal_table.h" + +#ifdef __linux__ +#include "linux/signal_table.h" +#endif + +namespace __llvm_libc::internal { + +#ifdef __linux__ +inline constexpr auto PLATFORM_SIGNALS = + STDC_SIGNALS + POSIX_SIGNALS + LINUX_SIGNALS; +#else +inline constexpr auto PLATFORM_SIGNALS = STDC_SIGNALS; +#endif + +} // namespace __llvm_libc::internal + +#endif // LLVM_LIBC_SRC_SUPPORT_STRING_UTIL_TABLES_SIGNAL_TABLE_H diff --git a/libc/src/__support/StringUtil/tables/stdc_error_table.h b/libc/src/__support/StringUtil/tables/stdc_error_table.h new file mode 100644 --- /dev/null +++ b/libc/src/__support/StringUtil/tables/stdc_error_table.h @@ -0,0 +1,27 @@ +//===-- Map from error numbers to strings in the c std ----------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC_SUPPORT_STRING_UTIL_TABLES_STDC_ERROR_TABLE_H +#define LLVM_LIBC_SRC_SUPPORT_STRING_UTIL_TABLES_STDC_ERROR_TABLE_H + +#include "src/errno/libc_errno.h" // For error macros + +#include "src/__support/StringUtil/message_mapper.h" + +namespace __llvm_libc::internal { + +inline 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 __llvm_libc::internal + +#endif // LLVM_LIBC_SRC_SUPPORT_STRING_UTIL_TABLES_LINUX_ERROR_TABLE_H diff --git a/libc/src/__support/StringUtil/tables/stdc_signal_table.h b/libc/src/__support/StringUtil/tables/stdc_signal_table.h new file mode 100644 --- /dev/null +++ b/libc/src/__support/StringUtil/tables/stdc_signal_table.h @@ -0,0 +1,29 @@ +//===-- Map from signal numbers to strings in the c std ---------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC_SUPPORT_STRING_UTIL_TABLES_STDC_SIGNAL_TABLE_H +#define LLVM_LIBC_SRC_SUPPORT_STRING_UTIL_TABLES_STDC_SIGNAL_TABLE_H + +#include + +#include "src/__support/StringUtil/message_mapper.h" + +namespace __llvm_libc::internal { + +inline constexpr const MsgTable<6> STDC_SIGNALS = { + MsgMapping(SIGINT, "Interrupt"), + MsgMapping(SIGILL, "Illegal instruction"), + MsgMapping(SIGABRT, "Aborted"), + MsgMapping(SIGFPE, "Floating point exception"), + MsgMapping(SIGSEGV, "Segmentation fault"), + MsgMapping(SIGTERM, "Terminated"), +}; + +} // namespace __llvm_libc::internal + +#endif // LLVM_LIBC_SRC_SUPPORT_STRING_UTIL_TABLES_LINUX_SIGNAL_TABLE_H