[libc-commits] [PATCH] D147967: [libc] move strerror and strsignal to OS msg maps

Siva Chandra via Phabricator via libc-commits libc-commits at lists.llvm.org
Tue Apr 18 00:39:46 PDT 2023


sivachandra added a comment.

Mostly LGTM but I suggested some rearrangement of what you already have to improve modularity.



================
Comment at: libc/src/__support/StringUtil/error_to_string.cpp:18
+#ifdef __unix__
+#include "src/__support/StringUtil/linux/strerror_map.h"
+#else
----------------
sivachandra wrote:
> Instead of expecting everything to be listed in a platform specific table, we can have three kinds of tables:
> 
> 1. Table of errors specified by the C standard - this will be the fallback table instead of the `#error` you have below.
> 2. Table of POSIX extension errors.
> 3. Table of Linux extension errors.
> 
> To get the full Linux table for example, you will have to merge all the above three tables. You likely have to use `cpp::array` for the tables to get this to work at compile-time.
I prefer an organization like this:

1. `stdc_error_table.h` contains:
```
inline constexpr ErrorTable<...> STDC_ERRORS = {
  ...
};
```
2. `posix_error_table.h` contains:
```
inline constexpr ErrorTable<...> POSIX_EXTENSION_ERRORS = {
  ...
};
```
3. `linux/error_table.h` contains:
```
#include "stdc_errors.h"
#include "posix_errros.h"

namespace __llvm_libc {
inline constexpr ErrorTable<...> LINUX_EXTENSION_ERRORS = {
  ...
};
} // namespace __llvm_libc
```
4. `error_table.h` contains:
```
#ifdef __linux__
#include "linux/error_table.h"
inline constexpr ErrorTable<...> PLATFORM_ERRORS = STDC_ERRORS + POSIX_EXTENSION_ERRORS + LINUX_EXTENSION_ERRORS;
#else
#include "stdc_error_table.h"
inline constexpr ErrorTable<...> PLATFORM_ERRORS = STDC_ERRORS;
#endif
```

In this file, all you have to do is include `error_table.h` and operate on `PLATFORM_ERRORS`.


================
Comment at: libc/src/__support/StringUtil/message_mapper.h:31
 
+template <class T, size_t N> class ArrayConcat {
+  T Data[N];
----------------
Do we need a special class? Can this work:

```
template <size_t N>
using ErrorTable = cpp::array<MsgMapping, N>;

template <size_t N1, size_t N2>
constexpr ErrorTable<N1 + N2> operator+(const ErrorTable &t1, const ErrorTable &t2) {
  ErrorTable<N1 + N2> res{};
  for (std::size_t i = 0; i < N1; ++i)
    res[i] = t1[i];
  for (std::size_t i = 0; i < N2; ++i)
    res[N1 + i] = t2[i];
  return res;
}
```


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D147967/new/

https://reviews.llvm.org/D147967



More information about the libc-commits mailing list