[PATCH] D154036: [libc] Add support for creating wrapper headers for offloading in clang
Joseph Huber via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Jun 28 18:27:59 PDT 2023
jhuber6 added a comment.
For reference, here is what one of the newly generated headers looks like that is used.
#ifndef __LLVM_LIBC_DECLARATIONS_STDIO_H
#define __LLVM_LIBC_DECLARATIONS_STDIO_H
#ifndef __LIBC_ATTRS
#define __LIBC_ATTRS
#endif
#ifdef __cplusplus
extern "C" {
#endif
int puts(const char *__restrict) __LIBC_ATTRS;
int fputs(const char *__restrict, FILE *__restrict) __LIBC_ATTRS;
extern FILE * stdin __LIBC_ATTRS;
extern FILE * stdout __LIBC_ATTRS;
extern FILE * stderr __LIBC_ATTRS;
#ifdef __cplusplus
}
#endif
Unfortunately I have already run into a few problems with the re-declarations given the GNU `libc` headers. Here is the error message when including `string.h` now,
/home/jhuber/Documents/llvm/clang/lib/clang/17/include/llvm_libc_wrappers/llvm-libc-decls/string.h:54:8: error: 'strstr' is missing exception specification 'noexcept(true)'
54 | char * strstr(const char *, const char *) __LIBC_ATTRS;
| ^
/usr/include/string.h:343:1: note: previous declaration is here
343 | strstr (const char *__haystack, const char *__needle) __THROW
| ^
5 errors generated.
This occurs for `memchr`, `strchr`, `strpbrk`, `strchr`, and `strstr`. If you define `__LIBC_ATTRS` to the `noexcept(true)` you get a different error,
/home/jhuber/Documents/llvm/clang/lib/clang/17/include/llvm_libc_wrappers/llvm-libc-decls/string.h:54:8: error: functions that differ only in their return type cannot be overloaded
54 | char * strstr(const char *, const char *) __LIBC_ATTRS;
| ~~~~~~ ^
/usr/include/string.h:343:1: note: previous definition is here
343 | __extern_always_inline const char *
| ~~~~~~
344 | strstr (const char *__haystack, const char *__needle) __THROW
| ^
Looking at the definitions, they look like this in the GNU headers,
extern char *strstr (char *__haystack, const char *__needle)
__THROW __asm ("strstr") __attribute_pure__ __nonnull ((1, 2));
extern const char *strstr (const char *__haystack, const char *__needle)
__THROW __asm ("strstr") __attribute_pure__ __nonnull ((1, 2));
Does anyone have any suggestions on working around this? The other supported headers work as far as I can tell.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D154036/new/
https://reviews.llvm.org/D154036
More information about the cfe-commits
mailing list