summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog37
-rw-r--r--manual/llio.texi6
-rw-r--r--string/bits/string2.h68
-rw-r--r--string/strcoll.c6
-rw-r--r--string/strxfrm.c9
-rw-r--r--sysdeps/alpha/Makefile4
-rw-r--r--sysdeps/unix/sysv/linux/configure10
-rw-r--r--sysdeps/unix/sysv/linux/configure.in4
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