[llvm] [libc] [clang] [Libc] Give more functions restrict qualifiers (PR #78061)
via cfe-commits
cfe-commits at lists.llvm.org
Sun Jan 14 16:07:21 PST 2024
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+AtariDreams at 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 */
}
More information about the cfe-commits
mailing list