The logic for strsignal and strerror is very similar, so I've moved them
both to use a shared utility (MessageMapper) for the basic
functionality.
Details
Diff Detail
- Repository
- rG LLVM Github Monorepo
Event Timeline
The new MsgMapper LGTM but I have comments about other parts of the design.
libc/src/__support/StringUtil/error_to_string.cpp | ||
---|---|---|
195 | It seems to me like we should not have this overload in the stringutil at all because the actual libc functions need to set errno. Instead, provide a function like: bool fill_unknown_error_msg(int err_num, cpp::span<char> buffer) { ... // return true if buffer was big enough, else false. // This will help strerror_r set errno to ERANGE based on the return value. } So, strerror should be implemented like this: LLVM_LIBC_FUNCTION(... strerror ...) { auto err_str = get_error_string(num); if (num) return const_cast<char *>(num.data()); errno = EINVAL; // unknown_err_buffer is declared in strerror.cpp. // In case of strerror_r, it is instantiated from the buffer argument. fill_unknown_err_msg(num, unknown_err_buffer); return unknown_err_buffer.data(); } | |
libc/src/__support/StringUtil/message_mapper.h | ||
24 | This is a struct so public is default. | |
69 | Why is the const_cast required? | |
libc/src/__support/StringUtil/signal_to_string.cpp | ||
120 | Delete the commented out blocks above? |
libc/src/__support/StringUtil/error_to_string.cpp | ||
---|---|---|
195 | For comments on the strerror_r design you should comment on this patch instead: https://reviews.llvm.org/D135227 but overall I think the idea makes sense. |
libc/src/__support/StringUtil/error_to_string.cpp | ||
---|---|---|
195 | after further testing, it appears that strerror and strerror_r don't actually set errno in existing implementations. Given that information, I don't think this is necessary. |
libc/src/__support/StringUtil/error_to_string.cpp | ||
---|---|---|
195 | I do not know what the existing implementations do, but https://pubs.opengroup.org/onlinepubs/9699919799/functions/strerror.html seems to indicate that errno "may be set" to indicate error. So, existing implementations have probably chosen to not set errno. Couple of things still:
|
libc/src/__support/StringUtil/error_to_string.cpp | ||
---|---|---|
195 | The buffer type can't be span because we're not always copying the data into the provided pointer. Most of the time we're returning a static pointer, and span doesn't support changing its underlying pointer. |
It seems to me like we should not have this overload in the stringutil at all because the actual libc functions need to set errno. Instead, provide a function like:
So, strerror should be implemented like this: