diff options
Diffstat (limited to 'libc/include/string.h')
-rw-r--r-- | libc/include/string.h | 27 |
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); |