https://github.com/AtariDreams updated https://github.com/llvm/llvm-project/pull/78061
>From c76bc8254724e313191d402ec2f8b65a09daaeb3 Mon Sep 17 00:00:00 2001 From: Rose <83477269+ataridre...@users.noreply.github.com> Date: Sat, 13 Jan 2024 14:09:17 -0500 Subject: [PATCH] [Libc] Give more functions restrict qualifiers strsep has restrict qualifiers, as well as strtok_r. Add the restrict qualifiers to them. Source: https://man7.org/linux/man-pages/man3/strsep.3.html --- clang/lib/Headers/llvm_libc_wrappers/string.h | 4 +- .../Analysis/Inputs/system-header-simulator.h | 6 +-- clang/test/Analysis/bsd-string.c | 4 +- clang/test/Analysis/cstring-syntax-weird.c | 2 +- clang/test/Analysis/cstring-syntax-weird2.c | 2 +- clang/test/Analysis/cstring-syntax.c | 6 +-- clang/test/Analysis/string.c | 4 +- libc/spec/bsd_ext.td | 4 +- libc/src/string/strsep.cpp | 3 +- libc/src/string/strsep.h | 2 +- llvm/lib/Support/regex_impl.h | 3 +- llvm/lib/Support/regstrlcpy.c | 41 +++++++++---------- 12 files changed, 41 insertions(+), 40 deletions(-) diff --git a/clang/lib/Headers/llvm_libc_wrappers/string.h b/clang/lib/Headers/llvm_libc_wrappers/string.h index b4fbf17c7e421f..0ea49cb137606c 100644 --- a/clang/lib/Headers/llvm_libc_wrappers/string.h +++ b/clang/lib/Headers/llvm_libc_wrappers/string.h @@ -51,13 +51,13 @@ char *strcpy(char *__restrict, const char *__restrict) __LIBC_ATTRS; size_t strcspn(const char *, const char *) __LIBC_ATTRS; char *strdup(const char *) __LIBC_ATTRS; size_t strlen(const char *) __LIBC_ATTRS; -char *strncat(char *, const char *, size_t) __LIBC_ATTRS; +char *strncat(char *__restrict, const char *__restrict, size_t) __LIBC_ATTRS; int strncmp(const char *, const char *, size_t) __LIBC_ATTRS; char *strncpy(char *__restrict, const char *__restrict, size_t) __LIBC_ATTRS; char *strndup(const char *, size_t) __LIBC_ATTRS; size_t strnlen(const char *, size_t) __LIBC_ATTRS; size_t strspn(const char *, const char *) __LIBC_ATTRS; -char *strtok(char *__restrict, const char *) __LIBC_ATTRS; +char *strtok(char *__restrict, const char *__restrict) __LIBC_ATTRS; char *strtok_r(char *__restrict, const char *__restrict, char **__restrict) __LIBC_ATTRS; size_t strxfrm(char *__restrict, const char *__restrict, size_t) __LIBC_ATTRS; diff --git a/clang/test/Analysis/Inputs/system-header-simulator.h b/clang/test/Analysis/Inputs/system-header-simulator.h index cd7ac616bcc67f..5f969adfdd92cd 100644 --- a/clang/test/Analysis/Inputs/system-header-simulator.h +++ b/clang/test/Analysis/Inputs/system-header-simulator.h @@ -71,9 +71,9 @@ int fflush(FILE *stream); size_t strlen(const char *); char *strcpy(char *restrict, const char *restrict); -char *strncpy(char *dst, const char *src, size_t n); -char *strsep(char **stringp, const char *delim); -void *memcpy(void *dst, const void *src, size_t n); +char *strncpy(char *restrict dst, const char * restrict src, size_t n); +char *strsep(char ** restrict stringp, const char * restrict delim); +void *memcpy(void * restrict dst, const void * restrict src, size_t n); void *memset(void *s, int c, size_t n); typedef unsigned long __darwin_pthread_key_t; diff --git a/clang/test/Analysis/bsd-string.c b/clang/test/Analysis/bsd-string.c index 1c7b28198dff26..ad5fee7da914bd 100644 --- a/clang/test/Analysis/bsd-string.c +++ b/clang/test/Analysis/bsd-string.c @@ -7,8 +7,8 @@ #define NULL ((void *)0) typedef __typeof(sizeof(int)) size_t; -size_t strlcpy(char *dst, const char *src, size_t n); -size_t strlcat(char *dst, const char *src, size_t n); +size_t strlcpy(char * restrict dst, const char * restrict src, size_t n); +size_t strlcat(char *restrict dst, const char *restrict src, size_t n); size_t strlen(const char *s); void clang_analyzer_eval(int); diff --git a/clang/test/Analysis/cstring-syntax-weird.c b/clang/test/Analysis/cstring-syntax-weird.c index 9a58f1609f7ae0..d736a08842fc5b 100644 --- a/clang/test/Analysis/cstring-syntax-weird.c +++ b/clang/test/Analysis/cstring-syntax-weird.c @@ -6,7 +6,7 @@ typedef __SIZE_TYPE__ size_t; // The last parameter is normally size_t but the test is about the abnormal // situation when it's not a size_t. -size_t strlcpy(char *, const char *, int); +size_t strlcpy(char * restrict, const char *restrict, int); enum WeirdDecl { AStrangeWayToSpecifyStringLengthCorrectly = 10UL, diff --git a/clang/test/Analysis/cstring-syntax-weird2.c b/clang/test/Analysis/cstring-syntax-weird2.c index 0250d69d994ef5..3fe0d63f76130c 100644 --- a/clang/test/Analysis/cstring-syntax-weird2.c +++ b/clang/test/Analysis/cstring-syntax-weird2.c @@ -6,7 +6,7 @@ typedef __SIZE_TYPE__ size_t; // The last parameter is normally size_t but the test is about the abnormal // situation when it's not a size_t. -size_t strlcpy(char *, const char *, void (*)(void)); +size_t strlcpy(char *restrict, const char *restrict, void (*)(void)); void foo(void); diff --git a/clang/test/Analysis/cstring-syntax.c b/clang/test/Analysis/cstring-syntax.c index 8ac971fe24127e..db1c69764f973b 100644 --- a/clang/test/Analysis/cstring-syntax.c +++ b/clang/test/Analysis/cstring-syntax.c @@ -15,10 +15,10 @@ // RUN: -triple i386-apple-darwin10 typedef __SIZE_TYPE__ size_t; -char *strncat(char *, const char *, size_t); +char *strncat(char *restrict, const char *restrict, size_t); size_t strlen (const char *s); -size_t strlcpy(char *, const char *, size_t); -size_t strlcat(char *, const char *, size_t); +size_t strlcpy(char *restrict, const char *restrict, size_t); +size_t strlcat(char *restrict, const char *restrict, size_t); void testStrncat(const char *src) { char dest[10]; diff --git a/clang/test/Analysis/string.c b/clang/test/Analysis/string.c index d47de9db8228e5..85232624160c06 100644 --- a/clang/test/Analysis/string.c +++ b/clang/test/Analysis/string.c @@ -71,7 +71,7 @@ void clang_analyzer_eval(int); int scanf(const char *restrict format, ...); void *malloc(size_t); void free(void *); -void *memcpy(void *dest, const void *src, size_t n); +void *memcpy(void *restrict dest, const void *restrict src, size_t n); //===----------------------------------------------------------------------=== // strlen() @@ -1252,7 +1252,7 @@ int strncasecmp_null_argument(char *a, size_t n) { // strsep() //===----------------------------------------------------------------------=== -char *strsep(char **stringp, const char *delim); +char *strsep(char ** restrict stringp, const char * restrict delim); void strsep_null_delim(char *s) { strsep(&s, NULL); // expected-warning{{Null pointer passed as 2nd argument to strsep()}} diff --git a/libc/spec/bsd_ext.td b/libc/spec/bsd_ext.td index 3829e57e9765a9..c52d5bf10c80a8 100644 --- a/libc/spec/bsd_ext.td +++ b/libc/spec/bsd_ext.td @@ -8,12 +8,12 @@ def BsdExtensions : StandardSpec<"BSDExtensions"> { FunctionSpec< "strlcat", RetValSpec<SizeTType>, - [ArgSpec<CharPtr>, ArgSpec<ConstCharPtr>, ArgSpec<SizeTType>] + [ArgSpec<ConstCharRestrictedPtr>, ArgSpec<ConstCharRestrictedPtr>, ArgSpec<SizeTType>] >, FunctionSpec< "strlcpy", RetValSpec<SizeTType>, - [ArgSpec<CharPtr>, ArgSpec<ConstCharPtr>, ArgSpec<SizeTType>] + [ArgSpec<ConstCharRestrictedPtr>, ArgSpec<ConstCharRestrictedPtr>, ArgSpec<SizeTType>] >, FunctionSpec< "strsep", diff --git a/libc/src/string/strsep.cpp b/libc/src/string/strsep.cpp index edd2cf07e20a45..5ebf2550744c30 100644 --- a/libc/src/string/strsep.cpp +++ b/libc/src/string/strsep.cpp @@ -12,7 +12,8 @@ namespace LIBC_NAMESPACE { -LLVM_LIBC_FUNCTION(char *, strsep, (char **stringp, const char *delim)) { +LLVM_LIBC_FUNCTION(char *, strsep, + (char **__restrict stringp, const char *__restrict delim)) { if (!*stringp) return nullptr; return internal::string_token<false>(*stringp, delim, stringp); diff --git a/libc/src/string/strsep.h b/libc/src/string/strsep.h index 48f55a899d7f33..7b85202d30b2b9 100644 --- a/libc/src/string/strsep.h +++ b/libc/src/string/strsep.h @@ -11,7 +11,7 @@ namespace LIBC_NAMESPACE { -char *strsep(char **stringp, const char *delim); +char *strsep(char **__restrict stringp, const char *__restrict delim); } // namespace LIBC_NAMESPACE diff --git a/llvm/lib/Support/regex_impl.h b/llvm/lib/Support/regex_impl.h index 8f0c532205edc3..1d98964b9f40e2 100644 --- a/llvm/lib/Support/regex_impl.h +++ b/llvm/lib/Support/regex_impl.h @@ -99,7 +99,8 @@ size_t llvm_regerror(int, const llvm_regex_t *, char *, size_t); int llvm_regexec(const llvm_regex_t *, const char *, size_t, llvm_regmatch_t [], int); void llvm_regfree(llvm_regex_t *); -size_t llvm_strlcpy(char *dst, const char *src, size_t siz); +size_t llvm_strlcpy(char *__restrict dst, const char *__restrict src, + size_t siz); #ifdef __cplusplus } diff --git a/llvm/lib/Support/regstrlcpy.c b/llvm/lib/Support/regstrlcpy.c index 8b68afdf75f16a..0f3b5e65172cf3 100644 --- a/llvm/lib/Support/regstrlcpy.c +++ b/llvm/lib/Support/regstrlcpy.c @@ -25,28 +25,27 @@ * will be copied. Always NUL terminates (unless siz == 0). * Returns strlen(src); if retval >= siz, truncation occurred. */ -size_t -llvm_strlcpy(char *dst, const char *src, size_t siz) -{ - char *d = dst; - const char *s = src; - size_t n = siz; +size_t llvm_strlcpy(char *__restrict dst, const char *__restrict src, + size_t siz) { + char *d = dst; + const char *s = src; + size_t n = siz; - /* Copy as many bytes as will fit */ - if (n != 0) { - while (--n != 0) { - if ((*d++ = *s++) == '\0') - break; - } - } + /* Copy as many bytes as will fit */ + if (n != 0) { + while (--n != 0) { + if ((*d++ = *s++) == '\0') + break; + } + } - /* Not enough room in dst, add NUL and traverse rest of src */ - if (n == 0) { - if (siz != 0) - *d = '\0'; /* NUL-terminate dst */ - while (*s++) - ; - } + /* Not enough room in dst, add NUL and traverse rest of src */ + if (n == 0) { + if (siz != 0) + *d = '\0'; /* NUL-terminate dst */ + while (*s++) + ; + } - return(s - src - 1); /* count does not include NUL */ + return (s - src - 1); /* count does not include NUL */ } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits