[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