summaryrefslogtreecommitdiffstats
path: root/libc/include/string.h
diff options
context:
space:
mode:
Diffstat (limited to 'libc/include/string.h')
-rw-r--r--libc/include/string.h27
1 files changed, 18 insertions, 9 deletions
diff --git a/libc/include/string.h b/libc/include/string.h
index 6643d28..70e0042 100644
--- a/libc/include/string.h
+++ b/libc/include/string.h
@@ -201,8 +201,6 @@ size_t strlcat(char *dest, const char *src, size_t size) {
return __strlcat_chk(dest, src, size, bos);
}
-__purefunc extern size_t __strlen_real(const char *)
- __asm__(__USER_LABEL_PREFIX__ "strlen");
extern size_t __strlen_chk(const char *, size_t);
__BIONIC_FORTIFY_INLINE
@@ -211,14 +209,17 @@ size_t strlen(const char *s) {
// Compiler doesn't know destination size. Don't call __strlen_chk
if (bos == __BIONIC_FORTIFY_UNKNOWN_SIZE) {
- return __strlen_real(s);
+ return __builtin_strlen(s);
+ }
+
+ size_t slen = __builtin_strlen(s);
+ if (__builtin_constant_p(slen)) {
+ return slen;
}
return __strlen_chk(s, bos);
}
-__purefunc extern char* __strchr_real(const char *, int)
- __asm__(__USER_LABEL_PREFIX__ "strchr");
extern char* __strchr_chk(const char *, int, size_t);
__BIONIC_FORTIFY_INLINE
@@ -227,14 +228,17 @@ char* strchr(const char *s, int c) {
// Compiler doesn't know destination size. Don't call __strchr_chk
if (bos == __BIONIC_FORTIFY_UNKNOWN_SIZE) {
- return __strchr_real(s, c);
+ return __builtin_strchr(s, c);
+ }
+
+ size_t slen = __builtin_strlen(s);
+ if (__builtin_constant_p(slen) && (slen < bos)) {
+ return __builtin_strchr(s, c);
}
return __strchr_chk(s, c, bos);
}
-__purefunc extern char* __strrchr_real(const char *, int)
- __asm__(__USER_LABEL_PREFIX__ "strrchr");
extern char* __strrchr_chk(const char *, int, size_t);
__BIONIC_FORTIFY_INLINE
@@ -243,7 +247,12 @@ char* strrchr(const char *s, int c) {
// Compiler doesn't know destination size. Don't call __strrchr_chk
if (bos == __BIONIC_FORTIFY_UNKNOWN_SIZE) {
- return __strrchr_real(s, c);
+ return __builtin_strrchr(s, c);
+ }
+
+ size_t slen = __builtin_strlen(s);
+ if (__builtin_constant_p(slen) && (slen < bos)) {
+ return __builtin_strrchr(s, c);
}
return __strrchr_chk(s, c, bos);