diff options
-rw-r--r-- | ChangeLog | 37 | ||||
-rw-r--r-- | manual/llio.texi | 6 | ||||
-rw-r--r-- | string/bits/string2.h | 68 | ||||
-rw-r--r-- | string/strcoll.c | 6 | ||||
-rw-r--r-- | string/strxfrm.c | 9 | ||||
-rw-r--r-- | sysdeps/alpha/Makefile | 4 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/configure | 10 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/configure.in | 4 |
8 files changed, 113 insertions, 31 deletions
diff --git a/ChangeLog b/ChangeLog index dc7887f51f..7ef1f84e8b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,40 @@ +2002-01-23 Richard Henderson <rth@redhat.com> + + * sysdeps/alpha/Makefile (pic-ccflag): New variable. + +2002-01-28 Ulrich Drepper <drepper@redhat.com> + + * string/strxfrm.c: Allocate one more byte for rulearr and clear + this element [PR libc/2855]. + + * string/strcoll.c: Handle zero-length arguments specially + [PR libc/2856]. + +2002-01-23 Jakub Jelinek <jakub@redhat.com> + + * string/bits/string2.h (__mempcpy): For gcc 3.0+, don't use + __mempcpy_small but instead use __builtin_memcpy ( , , n) + n for + short lengths and constant src. + (strcpy): Don't optimize for gcc 3.0+. + (__stpcpy): For gcc 3.0+, don't use + __stpcpy_small but instead use __builtin_strcpy (, src) + strlen (src) + for short string literal src. + +2002-01-23 Jeroen Dobbelaere <jeroen.dobbelaere@acunia.com> + + * sysdeps/unix/sysv/linux/configure.in (libc_cv_gcc_unwind_find_fde): + Set for arm, too. + +2001-01-22 Paul Eggert <eggert@twinsun.com> + + * manual/llio.texi (Linked Channels, Cleaning Streams): + Make it clearer that a just-opened input stream might need cleaning. + +2002-01-21 H.J. Lu <hjl@gnu.org> + + * sysdeps/mips/dl-machine.h (ELF_MACHINE_BEFORE_RTLD_RELOC): + Don't use label at end of compound statement. + 2002-01-28 Stephen L Moshier <moshier@mediaone.net> * sysdeps/ieee754/ldbl-96/e_lgammal_r.c (__ieee754_lgammal_r): diff --git a/manual/llio.texi b/manual/llio.texi index c196119956..259d11de96 100644 --- a/manual/llio.texi +++ b/manual/llio.texi @@ -935,7 +935,8 @@ random-access files, all append-type output streams are effectively linked to each other. @cindex cleaning up a stream -If you have been using a stream for I/O, and you want to do I/O using +If you have been using a stream for I/O (or have just opened the stream), +and you want to do I/O using another channel (either a stream or a descriptor) that is linked to it, you must first @dfn{clean up} the stream that you have been using. @xref{Cleaning Streams}. @@ -1007,7 +1008,8 @@ You can skip the @code{fclean} or @code{fflush} if you know the stream is already clean. A stream is clean whenever its buffer is empty. For example, an unbuffered stream is always clean. An input stream that is at end-of-file is clean. A line-buffered stream is clean when the last -character output was a newline. +character output was a newline. However, a just-opened input stream +might not be clean, as its input buffer might not be empty. There is one case in which cleaning a stream is impossible on most systems. This is when the stream is doing input from a file that is not diff --git a/string/bits/string2.h b/string/bits/string2.h index e8ac063e03..fa847771fe 100644 --- a/string/bits/string2.h +++ b/string/bits/string2.h @@ -1,5 +1,5 @@ /* Machine-independant string function optimizations. - Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. + Copyright (C) 1997,1998,1999,2000,2001,2002 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. @@ -198,26 +198,35 @@ __STRING2_COPY_TYPE (8); #ifdef __USE_GNU # if !defined _HAVE_STRING_ARCH_mempcpy || defined _FORCE_INLINES # ifndef _HAVE_STRING_ARCH_mempcpy -# define __mempcpy(dest, src, n) \ +# if __GNUC_PREREQ (3, 0) +# define __mempcpy(dest, src, n) \ + (__extension__ (__builtin_constant_p (src) && __builtin_constant_p (n) \ + && __string2_1bptr_p (src) && n <= 8 \ + ? __builtin_memcpy (dest, src, n) + n \ + : __mempcpy (dest, src, n))) +# else +# define __mempcpy(dest, src, n) \ (__extension__ (__builtin_constant_p (src) && __builtin_constant_p (n) \ && __string2_1bptr_p (src) && n <= 8 \ ? __mempcpy_small (dest, __mempcpy_args (src), n) \ : __mempcpy (dest, src, n))) +# endif /* In glibc we use this function frequently but for namespace reasons we have to use the name `__mempcpy'. */ # define mempcpy(dest, src, n) __mempcpy (dest, src, n) # endif -# if _STRING_ARCH_unaligned -# ifndef _FORCE_INLINES -# define __mempcpy_args(src) \ +# if !__GNUC_PREREQ (3, 0) || defined _FORCE_INLINES +# if _STRING_ARCH_unaligned +# ifndef _FORCE_INLINES +# define __mempcpy_args(src) \ ((__const char *) (src))[0], ((__const char *) (src))[2], \ ((__const char *) (src))[4], ((__const char *) (src))[6], \ __extension__ __STRING2_SMALL_GET16 (src, 0), \ __extension__ __STRING2_SMALL_GET16 (src, 4), \ __extension__ __STRING2_SMALL_GET32 (src, 0), \ __extension__ __STRING2_SMALL_GET32 (src, 4) -# endif +# endif __STRING_INLINE void *__mempcpy_small (void *, char, char, char, char, __uint16_t, __uint16_t, __uint32_t, __uint32_t, size_t); @@ -283,9 +292,9 @@ __mempcpy_small (void *__dest1, } return (void *) __u; } -# else -# ifndef _FORCE_INLINES -# define __mempcpy_args(src) \ +# else +# ifndef _FORCE_INLINES +# define __mempcpy_args(src) \ ((__const char *) (src))[0], \ __extension__ ((__STRING2_COPY_ARR2) \ { { ((__const char *) (src))[0], ((__const char *) (src))[1] } }), \ @@ -313,7 +322,7 @@ __mempcpy_small (void *__dest1, ((__const char *) (src))[2], ((__const char *) (src))[3], \ ((__const char *) (src))[4], ((__const char *) (src))[5], \ ((__const char *) (src))[6], ((__const char *) (src))[7] } }) -# endif +# endif __STRING_INLINE void *__mempcpy_small (void *, char, __STRING2_COPY_ARR2, __STRING2_COPY_ARR3, __STRING2_COPY_ARR4, @@ -367,6 +376,7 @@ __mempcpy_small (void *__dest, char __src1, } return __extension__ ((void *) __u + __srclen); } +# endif # endif # endif #endif @@ -383,8 +393,9 @@ extern void *__rawmemchr (const void *__s, int __c); /* Copy SRC to DEST. */ -#if !defined _HAVE_STRING_ARCH_strcpy || defined _FORCE_INLINES -# ifndef _HAVE_STRING_ARCH_strcpy +#if (!defined _HAVE_STRING_ARCH_strcpy && !__GNUC_PREREQ (3, 0)) \ + || defined _FORCE_INLINES +# if !defined _HAVE_STRING_ARCH_strcpy && !__GNUC_PREREQ (3, 0) # define strcpy(dest, src) \ (__extension__ (__builtin_constant_p (src) \ ? (__string2_1bptr_p (src) && strlen (src) + 1 <= 8 \ @@ -547,26 +558,38 @@ __strcpy_small (char *__dest, #ifdef __USE_GNU # if !defined _HAVE_STRING_ARCH_stpcpy || defined _FORCE_INLINES # ifndef _HAVE_STRING_ARCH_stpcpy -# define __stpcpy(dest, src) \ +# if __GNUC_PREREQ (3, 0) +# define __stpcpy(dest, src) \ + (__extension__ (__builtin_constant_p (src) \ + ? (__string2_1bptr_p (src) && strlen (src) + 1 <= 8 \ + ? __builtin_strcpy (dest, src) + strlen (src) \ + : ((char *) (__mempcpy) (dest, src, strlen (src) + 1) \ + - 1)) \ + : __stpcpy (dest, src))) +# else +# define __stpcpy(dest, src) \ (__extension__ (__builtin_constant_p (src) \ ? (__string2_1bptr_p (src) && strlen (src) + 1 <= 8 \ ? __stpcpy_small (dest, __stpcpy_args (src), \ strlen (src) + 1) \ - : ((char *) __mempcpy (dest, src, strlen (src) + 1) - 1))\ + : ((char *) (__mempcpy) (dest, src, strlen (src) + 1) \ + - 1)) \ : __stpcpy (dest, src))) +# endif /* In glibc we use this function frequently but for namespace reasons we have to use the name `__stpcpy'. */ # define stpcpy(dest, src) __stpcpy (dest, src) # endif -# if _STRING_ARCH_unaligned -# ifndef _FORCE_INLINES -# define __stpcpy_args(src) \ +# if !__GNUC_PREREQ (3, 0) || _FORCE_INLINES +# if _STRING_ARCH_unaligned +# ifndef _FORCE_INLINES +# define __stpcpy_args(src) \ __extension__ __STRING2_SMALL_GET16 (src, 0), \ __extension__ __STRING2_SMALL_GET16 (src, 4), \ __extension__ __STRING2_SMALL_GET32 (src, 0), \ __extension__ __STRING2_SMALL_GET32 (src, 4) -# endif +# endif __STRING_INLINE char *__stpcpy_small (char *, __uint16_t, __uint16_t, __uint32_t, __uint32_t, size_t); __STRING_INLINE char * @@ -626,9 +649,9 @@ __stpcpy_small (char *__dest, } return &__u->__c; } -# else -# ifndef _FORCE_INLINES -# define __stpcpy_args(src) \ +# else +# ifndef _FORCE_INLINES +# define __stpcpy_args(src) \ __extension__ ((__STRING2_COPY_ARR2) \ { { ((__const char *) (src))[0], '\0' } }), \ __extension__ ((__STRING2_COPY_ARR3) \ @@ -655,7 +678,7 @@ __stpcpy_small (char *__dest, ((__const char *) (src))[2], ((__const char *) (src))[3], \ ((__const char *) (src))[4], ((__const char *) (src))[5], \ ((__const char *) (src))[6], '\0' } }) -# endif +# endif __STRING_INLINE char *__stpcpy_small (char *, __STRING2_COPY_ARR2, __STRING2_COPY_ARR3, __STRING2_COPY_ARR4, @@ -709,6 +732,7 @@ __stpcpy_small (char *__dest, } return __dest + __srclen - 1; } +# endif # endif # endif #endif diff --git a/string/strcoll.c b/string/strcoll.c index f22bd101b2..0f3bd20a79 100644 --- a/string/strcoll.c +++ b/string/strcoll.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995,96,97,98,99,2000,2001 Free Software Foundation, Inc. +/* Copyright (C) 1995,96,97,98,99,2000,2001,2002 Free Software Foundation, Inc. This file is part of the GNU C Library. Written by Ulrich Drepper <drepper@cygnus.com>, 1995. @@ -137,6 +137,10 @@ STRCOLL (s1, s2, l) s1len = STRLEN (s1); s2len = STRLEN (s2); + /* Catch empty strings. */ + if (__builtin_expect (s1len == 0, 0) || __builtin_expect (s2len == 0, 0)) + return (s1len != 0) - (s2len != 0); + /* We need the elements of the strings as unsigned values since they are used as indeces. */ us1 = (const USTRING_TYPE *) s1; diff --git a/string/strxfrm.c b/string/strxfrm.c index 257ce495db..c53dad5555 100644 --- a/string/strxfrm.c +++ b/string/strxfrm.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995-1999,2000,2001 Free Software Foundation, Inc. +/* Copyright (C) 1995-1999,2000,2001,2002 Free Software Foundation, Inc. This file is part of the GNU C Library. Written by Ulrich Drepper <drepper@cygnus.com>, 1995. @@ -177,7 +177,7 @@ STRXFRM (STRING_TYPE *dest, const STRING_TYPE *src, size_t n, __locale_t l) very conservative here. */ if (srclen >= 16384) { - idxarr = (int32_t *) malloc (srclen * (sizeof (int32_t) + 1)); + idxarr = (int32_t *) malloc ((srclen + 1) * (sizeof (int32_t) + 1)); rulearr = (unsigned char *) &idxarr[srclen]; if (idxarr == NULL) @@ -194,8 +194,11 @@ STRXFRM (STRING_TYPE *dest, const STRING_TYPE *src, size_t n, __locale_t l) { try_stack: idxarr = (int32_t *) alloca (srclen * sizeof (int32_t)); - rulearr = (unsigned char *) alloca (srclen); + rulearr = (unsigned char *) alloca (srclen + 1); } + /* This element is only read, the value never used but to determine + another value which then is ignored. */ + rulearr[srclen] = '\0'; idxmax = 0; do diff --git a/sysdeps/alpha/Makefile b/sysdeps/alpha/Makefile index 49659844aa..ce8f9b3fef 100644 --- a/sysdeps/alpha/Makefile +++ b/sysdeps/alpha/Makefile @@ -43,3 +43,7 @@ divrem := divl divq reml remq # For now, build everything with full IEEE math support. # TODO: build separate libm and libm-ieee. sysdep-CFLAGS += -mieee + +# libc.so requires about 16k for the small data area, which is well +# below the 64k maximum. +pic-ccflag = -fpic diff --git a/sysdeps/unix/sysv/linux/configure b/sysdeps/unix/sysv/linux/configure index eb94cb0948..843ccc1c54 100644 --- a/sysdeps/unix/sysv/linux/configure +++ b/sysdeps/unix/sysv/linux/configure @@ -56,6 +56,10 @@ case "$machine" in arch_minimum_kernel=2.1.100 libc_cv_gcc_unwind_find_fde=yes ;; + arm*) + arch_minimum_kernel=2.0.10 + libc_cv_gcc_unwind_find_fde=yes + ;; i386*) libc_cv_gcc_unwind_find_fde=yes arch_minimum_kernel=2.0.10 @@ -118,11 +122,11 @@ fi if test -n "$minimum_kernel"; then echo $ac_n "checking for kernel header at least $minimum_kernel""... $ac_c" 1>&6 -echo "configure:122: checking for kernel header at least $minimum_kernel" >&5 +echo "configure:126: checking for kernel header at least $minimum_kernel" >&5 decnum=`echo "$minimum_kernel.0.0.0" | sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/(\1 * 65536 + \2 * 256 + \3)/'`; abinum=`echo "$minimum_kernel.0.0.0" | sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\1,\2,\3/'`; cat > conftest.$ac_ext <<EOF -#line 126 "configure" +#line 130 "configure" #include "confdefs.h" #include <linux/version.h> #if LINUX_VERSION_CODE < $decnum @@ -252,7 +256,7 @@ if test $host = $build; then ac_prefix=$ac_default_prefix fi echo $ac_n "checking for symlinks in ${ac_prefix}/include""... $ac_c" 1>&6 -echo "configure:256: checking for symlinks in ${ac_prefix}/include" >&5 +echo "configure:260: checking for symlinks in ${ac_prefix}/include" >&5 ac_message= if test -L ${ac_prefix}/include/net; then ac_message="$ac_message diff --git a/sysdeps/unix/sysv/linux/configure.in b/sysdeps/unix/sysv/linux/configure.in index 6fa59a6881..d1d0d32747 100644 --- a/sysdeps/unix/sysv/linux/configure.in +++ b/sysdeps/unix/sysv/linux/configure.in @@ -43,6 +43,10 @@ case "$machine" in arch_minimum_kernel=2.1.100 libc_cv_gcc_unwind_find_fde=yes ;; + arm*) + arch_minimum_kernel=2.0.10 + libc_cv_gcc_unwind_find_fde=yes + ;; i386*) libc_cv_gcc_unwind_find_fde=yes arch_minimum_kernel=2.0.10 |