mirror of https://gitee.com/Nocallback/glibc.git
Browse Source
These machine-dependent inline string functions have never been on by default, and even if they were a good idea at the time they were introduced, they haven't really been touched in ten to fifteen years and probably aren't a good idea on current-gen processors. Current thinking is that this class of optimization is best left to the compiler. * bits/string.h, string/bits/string.h * sysdeps/aarch64/bits/string.h * sysdeps/m68k/m680x0/m68020/bits/string.h * sysdeps/s390/bits/string.h, sysdeps/sparc/bits/string.h * sysdeps/x86/bits/string.h: Delete file. * string/string.h: Don't include bits/string.h. * string/bits/string3.h: Rename to bits/string_fortified.h. No need to undef various symbols that the removed headers might have defined as macros. * string/Makefile (headers): Remove bits/string.h, change bits/string3.h to bits/string_fortified.h. * string/string-inlines.c: Update commentary. Remove definitions of various macros that nothing looks at anymore. Don't directly include bits/string.h. Set _STRING_INLINE_unaligned here, based on compiler-predefined macros. * string/strncat.c: If STRNCAT is not defined, or STRNCAT_PRIMARY _is_ defined, provide internal hidden alias __strncat. * include/string.h: Declare internal hidden alias __strncat. Only forward __stpcpy to __builtin_stpcpy if __NO_STRING_INLINES is not defined. * include/bits/string3.h: Rename to bits/string_fortified.h, update to match above. * sysdeps/i386/string-inlines.c: Define compat symbols for everything formerly defined by sysdeps/x86/bits/string.h. Make existing definitions into compat symbols as well. Remove some no-longer-necessary messing around with macros. * sysdeps/powerpc/powerpc32/power4/multiarch/mempcpy.c * sysdeps/powerpc/powerpc64/multiarch/mempcpy.c * sysdeps/powerpc/powerpc64/multiarch/stpcpy.c * sysdeps/s390/multiarch/mempcpy.c No need to define _HAVE_STRING_ARCH_mempcpy. Do define __NO_STRING_INLINES and NO_MEMPCPY_STPCPY_REDIRECT. * sysdeps/i386/i686/multiarch/strncat-c.c * sysdeps/s390/multiarch/strncat-c.c * sysdeps/x86_64/multiarch/strncat-c.c Define STRNCAT_PRIMARY. Don't change definition of libc_hidden_def.zack/errno-prettyprint
23 changed files with 264 additions and 2452 deletions
@ -1,18 +0,0 @@ |
|||
/* This file should provide inline versions of string functions.
|
|||
|
|||
Surround GCC-specific parts with #ifdef __GNUC__, and use `__extern_inline'. |
|||
|
|||
This file should define __STRING_INLINES if functions are actually defined |
|||
as inlines. */ |
|||
|
|||
#ifndef _BITS_STRING_H |
|||
#define _BITS_STRING_H 1 |
|||
|
|||
/* Define whether to use the unaligned string inline ABI.
|
|||
The string inline functions are an external ABI, thus cannot be changed |
|||
after the first release of a new target (unlike _STRING_ARCH_unaligned |
|||
which may be changed from release to release). Targets must support |
|||
unaligned accesses in hardware if either define is set to true. */ |
|||
#define _STRING_INLINE_unaligned 0 |
|||
|
|||
#endif /* bits/string.h */ |
|||
@ -1 +0,0 @@ |
|||
#include <string/bits/string3.h> |
|||
@ -0,0 +1 @@ |
|||
#include <string/bits/string_fortified.h> |
|||
@ -1,24 +0,0 @@ |
|||
/* Optimized, inlined string functions. AArch64 version.
|
|||
Copyright (C) 2015-2017 Free Software Foundation, Inc. |
|||
This file is part of the GNU C Library. |
|||
|
|||
The GNU C Library is free software; you can redistribute it and/or |
|||
modify it under the terms of the GNU Lesser General Public |
|||
License as published by the Free Software Foundation; either |
|||
version 2.1 of the License, or (at your option) any later version. |
|||
|
|||
The GNU C Library is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
Lesser General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU Lesser General Public |
|||
License along with the GNU C Library; if not, see |
|||
<http://www.gnu.org/licenses/>. */
|
|||
|
|||
#ifndef _STRING_H |
|||
# error "Never use <bits/string.h> directly; include <string.h> instead." |
|||
#endif |
|||
|
|||
/* AArch64 uses the aligned string inline ABI. */ |
|||
#define _STRING_INLINE_unaligned 0 |
|||
@ -1,8 +1,3 @@ |
|||
#define STRNCAT __strncat_ia32 |
|||
#ifdef SHARED |
|||
#undef libc_hidden_def |
|||
#define libc_hidden_def(name) \ |
|||
__hidden_ver1 (__strncat_ia32, __GI___strncat, __strncat_ia32); |
|||
#endif |
|||
|
|||
#define STRNCAT_PRIMARY |
|||
#include "string/strncat.c" |
|||
|
|||
@ -1,24 +0,0 @@ |
|||
/* Optimized, inlined string functions. m680x0 version, x >= 2.
|
|||
Copyright (C) 1997-2017 Free Software Foundation, Inc. |
|||
This file is part of the GNU C Library. |
|||
|
|||
The GNU C Library is free software; you can redistribute it and/or |
|||
modify it under the terms of the GNU Lesser General Public |
|||
License as published by the Free Software Foundation; either |
|||
version 2.1 of the License, or (at your option) any later version. |
|||
|
|||
The GNU C Library is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
Lesser General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU Lesser General Public |
|||
License along with the GNU C Library. If not, see |
|||
<http://www.gnu.org/licenses/>. */
|
|||
|
|||
#ifndef _STRING_H |
|||
# error "Never use <bits/string.h> directly; include <string.h> instead." |
|||
#endif |
|||
|
|||
/* Use the unaligned string inline ABI. */ |
|||
#define _STRING_INLINE_unaligned 1 |
|||
@ -1,252 +0,0 @@ |
|||
/* Optimized, inlined string functions. S/390 version.
|
|||
Copyright (C) 2000-2017 Free Software Foundation, Inc. |
|||
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). |
|||
This file is part of the GNU C Library. |
|||
|
|||
The GNU C Library is free software; you can redistribute it and/or |
|||
modify it under the terms of the GNU Lesser General Public |
|||
License as published by the Free Software Foundation; either |
|||
version 2.1 of the License, or (at your option) any later version. |
|||
|
|||
The GNU C Library is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
Lesser General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU Lesser General Public |
|||
License along with the GNU C Library; if not, see |
|||
<http://www.gnu.org/licenses/>. */
|
|||
|
|||
#ifndef _STRING_H |
|||
# error "Never use <bits/string.h> directly; include <string.h> instead." |
|||
#endif |
|||
|
|||
/* Use the unaligned string inline ABI. */ |
|||
#define _STRING_INLINE_unaligned 1 |
|||
|
|||
/* We only provide optimizations if the user selects them and if
|
|||
GNU CC is used. */ |
|||
#if !defined __NO_STRING_INLINES && defined __USE_STRING_INLINES \ |
|||
&& defined __GNUC__ && __GNUC__ >= 2 |
|||
|
|||
#ifndef __STRING_INLINE |
|||
# ifndef __extern_inline |
|||
# define __STRING_INLINE inline |
|||
# else |
|||
# define __STRING_INLINE __extern_inline |
|||
# endif |
|||
#endif |
|||
|
|||
#define _HAVE_STRING_ARCH_strlen 1 |
|||
#ifndef _FORCE_INLINES |
|||
#define strlen(str) __strlen_g ((str)) |
|||
|
|||
__STRING_INLINE size_t __strlen_g (const char *) __asm__ ("strlen"); |
|||
|
|||
__STRING_INLINE size_t |
|||
__strlen_g (const char *__str) |
|||
{ |
|||
char *__ptr, *__tmp; |
|||
|
|||
__ptr = (char *) 0; |
|||
__tmp = (char *) __str; |
|||
__asm__ __volatile__ (" la 0,0\n" |
|||
"0: srst %0,%1\n" |
|||
" jo 0b\n" |
|||
: "+&a" (__ptr), "+&a" (__tmp) : |
|||
: "cc", "memory", "0" ); |
|||
return (size_t) (__ptr - __str); |
|||
} |
|||
#endif |
|||
|
|||
/* Copy SRC to DEST. */ |
|||
#define _HAVE_STRING_ARCH_strcpy 1 |
|||
#ifndef _FORCE_INLINES |
|||
#define strcpy(dest, src) __strcpy_g ((dest), (src)) |
|||
|
|||
__STRING_INLINE char *__strcpy_g (char *, const char *) __asm__ ("strcpy"); |
|||
|
|||
__STRING_INLINE char * |
|||
__strcpy_g (char *__dest, const char *__src) |
|||
{ |
|||
char *tmp = __dest; |
|||
|
|||
__asm__ __volatile__ (" la 0,0\n" |
|||
"0: mvst %0,%1\n" |
|||
" jo 0b" |
|||
: "+&a" (__dest), "+&a" (__src) : |
|||
: "cc", "memory", "0" ); |
|||
return tmp; |
|||
} |
|||
#endif |
|||
|
|||
#define _HAVE_STRING_ARCH_strncpy 1 |
|||
#ifndef _FORCE_INLINES |
|||
#define strncpy(dest, src, n) __strncpy_g ((dest), (src), (n)) |
|||
|
|||
__STRING_INLINE char *__strncpy_g (char *, const char *, size_t) |
|||
__asm__ ("strncpy"); |
|||
|
|||
__STRING_INLINE char * |
|||
__strncpy_g (char *__dest, const char *__src, size_t __n) |
|||
{ |
|||
char *__ret = __dest; |
|||
char *__ptr; |
|||
size_t __diff; |
|||
|
|||
if (__n > 0) { |
|||
__diff = (size_t) (__dest - __src); |
|||
__ptr = (char *) __src; |
|||
__asm__ __volatile__ (" j 1f\n" |
|||
"0: la %0,1(%0)\n" |
|||
"1: icm 0,1,0(%0)\n" |
|||
" stc 0,0(%2,%0)\n" |
|||
" jz 3f\n" |
|||
#if defined(__s390x__) |
|||
" brctg %1,0b\n" |
|||
#else |
|||
" brct %1,0b\n" |
|||
#endif |
|||
" j 4f\n" |
|||
"2: la %0,1(%0)\n" |
|||
" stc 0,0(%2,%0)\n" |
|||
#if defined(__s390x__) |
|||
"3: brctg %1,2b\n" |
|||
#else |
|||
"3: brct %1,2b\n" |
|||
#endif |
|||
"4:" |
|||
: "+&a" (__ptr), "+&a" (__n) : "a" (__diff) |
|||
: "cc", "memory", "0" ); |
|||
} |
|||
return __ret; |
|||
} |
|||
#endif |
|||
|
|||
/* Append SRC onto DEST. */ |
|||
#define _HAVE_STRING_ARCH_strcat 1 |
|||
#ifndef _FORCE_INLINES |
|||
#define strcat(dest, src) __strcat_g ((dest), (src)) |
|||
|
|||
__STRING_INLINE char *__strcat_g (char *, const char *) __asm__ ("strcat"); |
|||
|
|||
__STRING_INLINE char * |
|||
__strcat_g (char *__dest, const char *__src) |
|||
{ |
|||
char *__ret = __dest; |
|||
char *__ptr, *__tmp; |
|||
|
|||
/* Move __ptr to the end of __dest. */ |
|||
__ptr = (char *) 0; |
|||
__tmp = __dest; |
|||
__asm__ __volatile__ (" la 0,0\n" |
|||
"0: srst %0,%1\n" |
|||
" jo 0b\n" |
|||
: "+&a" (__ptr), "+&a" (__tmp) : |
|||
: "cc", "0" ); |
|||
|
|||
/* Now do the copy. */ |
|||
__asm__ __volatile__ (" la 0,0\n" |
|||
"0: mvst %0,%1\n" |
|||
" jo 0b" |
|||
: "+&a" (__ptr), "+&a" (__src) : |
|||
: "cc", "memory", "0" ); |
|||
return __ret; |
|||
} |
|||
#endif |
|||
|
|||
/* Append no more than N characters from SRC onto DEST. */ |
|||
#define _HAVE_STRING_ARCH_strncat 1 |
|||
#ifndef _FORCE_INLINES |
|||
#define strncat(dest, src, n) __strncat_g ((dest), (src), (n)) |
|||
|
|||
__STRING_INLINE char *__strncat_g (char *, const char *, size_t) |
|||
__asm__ ("strncat"); |
|||
|
|||
__STRING_INLINE char * |
|||
__strncat_g (char *__dest, const char *__src, size_t __n) |
|||
{ |
|||
char *__ret = __dest; |
|||
char *__ptr, *__tmp; |
|||
size_t __diff; |
|||
|
|||
if (__n > 0) { |
|||
/* Move __ptr to the end of __dest. */ |
|||
__ptr = (char *) 0; |
|||
__tmp = __dest; |
|||
__asm__ __volatile__ (" la 0,0\n" |
|||
"0: srst %0,%1\n" |
|||
" jo 0b\n" |
|||
: "+&a" (__ptr), "+&a" (__tmp) : |
|||
: "cc", "memory", "0" ); |
|||
|
|||
__diff = (size_t) (__ptr - __src); |
|||
__tmp = (char *) __src; |
|||
__asm__ __volatile__ (" j 1f\n" |
|||
"0: la %0,1(%0)\n" |
|||
"1: icm 0,1,0(%0)\n" |
|||
" stc 0,0(%2,%0)\n" |
|||
" jz 2f\n" |
|||
#if defined(__s390x__) |
|||
" brctg %1,0b\n" |
|||
#else |
|||
" brct %1,0b\n" |
|||
#endif |
|||
" slr 0,0\n" |
|||
" stc 0,1(%2,%0)\n" |
|||
"2:" |
|||
: "+&a" (__tmp), "+&a" (__n) : "a" (__diff) |
|||
: "cc", "memory", "0" ); |
|||
|
|||
} |
|||
return __ret; |
|||
} |
|||
#endif |
|||
|
|||
/* Search N bytes of S for C. */ |
|||
#define _HAVE_STRING_ARCH_memchr 1 |
|||
#ifndef _FORCE_INLINES |
|||
__STRING_INLINE void * |
|||
memchr (const void *__str, int __c, size_t __n) |
|||
{ |
|||
char *__ptr, *__tmp; |
|||
|
|||
__tmp = (char *) __str; |
|||
__ptr = (char *) __tmp + __n; |
|||
__asm__ __volatile__ (" lhi 0,0xff\n" |
|||
" nr 0,%2\n" |
|||
"0: srst %0,%1\n" |
|||
" jo 0b\n" |
|||
" brc 13,1f\n" |
|||
" la %0,0\n" |
|||
"1:" |
|||
: "+&a" (__ptr), "+&a" (__tmp) : "d" (__c) |
|||
: "cc", "memory", "0" ); |
|||
return __ptr; |
|||
} |
|||
#endif |
|||
|
|||
/* Compare S1 and S2. */ |
|||
#define _HAVE_STRING_ARCH_strcmp 1 |
|||
#ifndef _FORCE_INLINES |
|||
__STRING_INLINE int |
|||
strcmp (const char *__s1, const char *__s2) |
|||
{ |
|||
char *__p1, *__p2; |
|||
int __ret; |
|||
|
|||
__p1 = (char *) __s1; |
|||
__p2 = (char *) __s2; |
|||
__asm__ __volatile__ (" slr 0,0\n" |
|||
"0: clst %1,%2\n" |
|||
" jo 0b\n" |
|||
" ipm %0\n" |
|||
" srl %0,28" |
|||
: "=d" (__ret), "+&a" (__p1), "+&a" (__p2) : |
|||
: "cc", "memory", "0" ); |
|||
__ret = (__ret == 0) ? 0 : (__ret == 1) ? -1 : 1; |
|||
return __ret; |
|||
} |
|||
#endif |
|||
|
|||
#endif /* Use string inlines && GNU CC. */ |
|||
@ -1,31 +0,0 @@ |
|||
/* Optimized, inlined string functions. SPARC version.
|
|||
Copyright (C) 2000-2017 Free Software Foundation, Inc. |
|||
This file is part of the GNU C Library. |
|||
|
|||
The GNU C Library is free software; you can redistribute it and/or |
|||
modify it under the terms of the GNU Lesser General Public |
|||
License as published by the Free Software Foundation; either |
|||
version 2.1 of the License, or (at your option) any later version. |
|||
|
|||
The GNU C Library is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|||
Lesser General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU Lesser General Public |
|||
License along with the GNU C Library; if not, see |
|||
<http://www.gnu.org/licenses/>. */
|
|||
|
|||
#ifndef _STRING_H |
|||
# error "Never use <bits/string.h> directly; include <string.h> instead." |
|||
#endif |
|||
|
|||
/* sparc uses the aligned string inline ABI. */ |
|||
#define _STRING_INLINE_unaligned 0 |
|||
|
|||
/* sparc32 and sparc64 strchr(x, '\0') perform better than
|
|||
__rawmemchr(x, '\0'). */ |
|||
#define _HAVE_STRING_ARCH_strchr 1 |
|||
|
|||
/* Don't inline mempcpy into memcpy as sparc has an optimized mempcpy. */ |
|||
#define _HAVE_STRING_ARCH_mempcpy 1 |
|||
File diff suppressed because it is too large
@ -1,8 +1,3 @@ |
|||
#define STRNCAT __strncat_sse2 |
|||
#ifdef SHARED |
|||
#undef libc_hidden_def |
|||
#define libc_hidden_def(name) \ |
|||
__hidden_ver1 (__strncat_sse2, __GI___strncat, __strncat_sse2); |
|||
#endif |
|||
|
|||
#define STRNCAT_PRIMARY |
|||
#include "string/strncat.c" |
|||
|
|||
Loading…
Reference in new issue