string.h: add __attribute__ ((pure)) to string functions
cdefs.h: Introduce the __purefunc attribute, which allows us to mark
certain functions as being "pure".
http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html
Many functions have no effects except the return value and their
return value depends only on the parameters and/or global variables.
Such a function can be subject to common subexpression elimination
and loop optimization just as an arithmetic operator would be.
string.h: Mark many commently used string functions as "pure", to
allow for additional compiler optimizations.
Change-Id: I42961f90f822b6dbcbc3fd72cdbe774a7adc8785
diff --git a/libc/include/string.h b/libc/include/string.h
index 613dcd7..6e6c8e6 100644
--- a/libc/include/string.h
+++ b/libc/include/string.h
@@ -35,54 +35,54 @@
__BEGIN_DECLS
extern void* memccpy(void *, const void *, int, size_t);
-extern void* memchr(const void *, int, size_t);
-extern void* memrchr(const void *, int, size_t);
-extern int memcmp(const void *, const void *, size_t);
+extern void* memchr(const void *, int, size_t) __purefunc;
+extern void* memrchr(const void *, int, size_t) __purefunc;
+extern int memcmp(const void *, const void *, size_t) __purefunc;
extern void* memcpy(void *, const void *, size_t);
extern void* memmove(void *, const void *, size_t);
extern void* memset(void *, int, size_t);
-extern void* memmem(const void *, size_t, const void *, size_t);
+extern void* memmem(const void *, size_t, const void *, size_t) __purefunc;
extern void memswap(void *, void *, size_t);
-extern char* index(const char *, int);
-extern char* rindex(const char *, int);
-extern char* strchr(const char *, int);
-extern char* strrchr(const char *, int);
+extern char* index(const char *, int) __purefunc;
+extern char* rindex(const char *, int) __purefunc;
+extern char* strchr(const char *, int) __purefunc;
+extern char* strrchr(const char *, int) __purefunc;
-extern size_t strlen(const char *);
-extern int strcmp(const char *, const char *);
+extern size_t strlen(const char *) __purefunc;
+extern int strcmp(const char *, const char *) __purefunc;
extern char* strcpy(char *, const char *);
extern char* strcat(char *, const char *);
-extern int strcasecmp(const char *, const char *);
-extern int strncasecmp(const char *, const char *, size_t);
+extern int strcasecmp(const char *, const char *) __purefunc;
+extern int strncasecmp(const char *, const char *, size_t) __purefunc;
extern char* strdup(const char *);
-extern char* strstr(const char *, const char *);
-extern char* strcasestr(const char *haystack, const char *needle);
+extern char* strstr(const char *, const char *) __purefunc;
+extern char* strcasestr(const char *haystack, const char *needle) __purefunc;
extern char* strtok(char *, const char *);
extern char* strtok_r(char *, const char *, char**);
extern char* strerror(int);
extern int strerror_r(int errnum, char *buf, size_t n);
-extern size_t strnlen(const char *, size_t);
+extern size_t strnlen(const char *, size_t) __purefunc;
extern char* strncat(char *, const char *, size_t);
extern char* strndup(const char *, size_t);
-extern int strncmp(const char *, const char *, size_t);
+extern int strncmp(const char *, const char *, size_t) __purefunc;
extern char* strncpy(char *, const char *, size_t);
extern size_t strlcat(char *, const char *, size_t);
extern size_t strlcpy(char *, const char *, size_t);
-extern size_t strcspn(const char *, const char *);
-extern char* strpbrk(const char *, const char *);
+extern size_t strcspn(const char *, const char *) __purefunc;
+extern char* strpbrk(const char *, const char *) __purefunc;
extern char* strsep(char **, const char *);
extern size_t strspn(const char *, const char *);
extern char* strsignal(int sig);
-extern int strcoll(const char *, const char *);
+extern int strcoll(const char *, const char *) __purefunc;
extern size_t strxfrm(char *, const char *, size_t);
__END_DECLS
diff --git a/libc/include/sys/cdefs.h b/libc/include/sys/cdefs.h
index 92035d4..71b419c 100644
--- a/libc/include/sys/cdefs.h
+++ b/libc/include/sys/cdefs.h
@@ -306,9 +306,11 @@
#if __GNUC_PREREQ__(2, 96)
#define __noreturn __attribute__((__noreturn__))
#define __mallocfunc __attribute__((malloc))
+#define __purefunc __attribute__((pure))
#else
#define __noreturn
#define __mallocfunc
+#define __purefunc
#endif
/*