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.
This commit is contained in:
Ulrich Drepper 2002-01-29 03:56:50 +00:00
parent 2e8fb40225
commit 0295d2666c
8 changed files with 113 additions and 31 deletions

View File

@ -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> 2002-01-28 Stephen L Moshier <moshier@mediaone.net>
* sysdeps/ieee754/ldbl-96/e_lgammal_r.c (__ieee754_lgammal_r): * sysdeps/ieee754/ldbl-96/e_lgammal_r.c (__ieee754_lgammal_r):

View File

@ -935,7 +935,8 @@ random-access files, all append-type output streams are effectively
linked to each other. linked to each other.
@cindex cleaning up a stream @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, 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. you must first @dfn{clean up} the stream that you have been using.
@xref{Cleaning Streams}. @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 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 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 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 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 systems. This is when the stream is doing input from a file that is not

View File

@ -1,5 +1,5 @@
/* Machine-independant string function optimizations. /* 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. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@ -198,26 +198,35 @@ __STRING2_COPY_TYPE (8);
#ifdef __USE_GNU #ifdef __USE_GNU
# if !defined _HAVE_STRING_ARCH_mempcpy || defined _FORCE_INLINES # if !defined _HAVE_STRING_ARCH_mempcpy || defined _FORCE_INLINES
# ifndef _HAVE_STRING_ARCH_mempcpy # 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) \ (__extension__ (__builtin_constant_p (src) && __builtin_constant_p (n) \
&& __string2_1bptr_p (src) && n <= 8 \ && __string2_1bptr_p (src) && n <= 8 \
? __mempcpy_small (dest, __mempcpy_args (src), n) \ ? __mempcpy_small (dest, __mempcpy_args (src), n) \
: __mempcpy (dest, src, n))) : __mempcpy (dest, src, n)))
# endif
/* In glibc we use this function frequently but for namespace reasons /* In glibc we use this function frequently but for namespace reasons
we have to use the name `__mempcpy'. */ we have to use the name `__mempcpy'. */
# define mempcpy(dest, src, n) __mempcpy (dest, src, n) # define mempcpy(dest, src, n) __mempcpy (dest, src, n)
# endif # endif
# if _STRING_ARCH_unaligned # if !__GNUC_PREREQ (3, 0) || defined _FORCE_INLINES
# ifndef _FORCE_INLINES # if _STRING_ARCH_unaligned
# define __mempcpy_args(src) \ # ifndef _FORCE_INLINES
# define __mempcpy_args(src) \
((__const char *) (src))[0], ((__const char *) (src))[2], \ ((__const char *) (src))[0], ((__const char *) (src))[2], \
((__const char *) (src))[4], ((__const char *) (src))[6], \ ((__const char *) (src))[4], ((__const char *) (src))[6], \
__extension__ __STRING2_SMALL_GET16 (src, 0), \ __extension__ __STRING2_SMALL_GET16 (src, 0), \
__extension__ __STRING2_SMALL_GET16 (src, 4), \ __extension__ __STRING2_SMALL_GET16 (src, 4), \
__extension__ __STRING2_SMALL_GET32 (src, 0), \ __extension__ __STRING2_SMALL_GET32 (src, 0), \
__extension__ __STRING2_SMALL_GET32 (src, 4) __extension__ __STRING2_SMALL_GET32 (src, 4)
# endif # endif
__STRING_INLINE void *__mempcpy_small (void *, char, char, char, char, __STRING_INLINE void *__mempcpy_small (void *, char, char, char, char,
__uint16_t, __uint16_t, __uint32_t, __uint16_t, __uint16_t, __uint32_t,
__uint32_t, size_t); __uint32_t, size_t);
@ -283,9 +292,9 @@ __mempcpy_small (void *__dest1,
} }
return (void *) __u; return (void *) __u;
} }
# else # else
# ifndef _FORCE_INLINES # ifndef _FORCE_INLINES
# define __mempcpy_args(src) \ # define __mempcpy_args(src) \
((__const char *) (src))[0], \ ((__const char *) (src))[0], \
__extension__ ((__STRING2_COPY_ARR2) \ __extension__ ((__STRING2_COPY_ARR2) \
{ { ((__const char *) (src))[0], ((__const char *) (src))[1] } }), \ { { ((__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))[2], ((__const char *) (src))[3], \
((__const char *) (src))[4], ((__const char *) (src))[5], \ ((__const char *) (src))[4], ((__const char *) (src))[5], \
((__const char *) (src))[6], ((__const char *) (src))[7] } }) ((__const char *) (src))[6], ((__const char *) (src))[7] } })
# endif # endif
__STRING_INLINE void *__mempcpy_small (void *, char, __STRING2_COPY_ARR2, __STRING_INLINE void *__mempcpy_small (void *, char, __STRING2_COPY_ARR2,
__STRING2_COPY_ARR3, __STRING2_COPY_ARR3,
__STRING2_COPY_ARR4, __STRING2_COPY_ARR4,
@ -367,6 +376,7 @@ __mempcpy_small (void *__dest, char __src1,
} }
return __extension__ ((void *) __u + __srclen); return __extension__ ((void *) __u + __srclen);
} }
# endif
# endif # endif
# endif # endif
#endif #endif
@ -383,8 +393,9 @@ extern void *__rawmemchr (const void *__s, int __c);
/* Copy SRC to DEST. */ /* Copy SRC to DEST. */
#if !defined _HAVE_STRING_ARCH_strcpy || defined _FORCE_INLINES #if (!defined _HAVE_STRING_ARCH_strcpy && !__GNUC_PREREQ (3, 0)) \
# ifndef _HAVE_STRING_ARCH_strcpy || defined _FORCE_INLINES
# if !defined _HAVE_STRING_ARCH_strcpy && !__GNUC_PREREQ (3, 0)
# define strcpy(dest, src) \ # define strcpy(dest, src) \
(__extension__ (__builtin_constant_p (src) \ (__extension__ (__builtin_constant_p (src) \
? (__string2_1bptr_p (src) && strlen (src) + 1 <= 8 \ ? (__string2_1bptr_p (src) && strlen (src) + 1 <= 8 \
@ -547,26 +558,38 @@ __strcpy_small (char *__dest,
#ifdef __USE_GNU #ifdef __USE_GNU
# if !defined _HAVE_STRING_ARCH_stpcpy || defined _FORCE_INLINES # if !defined _HAVE_STRING_ARCH_stpcpy || defined _FORCE_INLINES
# ifndef _HAVE_STRING_ARCH_stpcpy # 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) \ (__extension__ (__builtin_constant_p (src) \
? (__string2_1bptr_p (src) && strlen (src) + 1 <= 8 \ ? (__string2_1bptr_p (src) && strlen (src) + 1 <= 8 \
? __stpcpy_small (dest, __stpcpy_args (src), \ ? __stpcpy_small (dest, __stpcpy_args (src), \
strlen (src) + 1) \ strlen (src) + 1) \
: ((char *) __mempcpy (dest, src, strlen (src) + 1) - 1))\ : ((char *) (__mempcpy) (dest, src, strlen (src) + 1) \
- 1)) \
: __stpcpy (dest, src))) : __stpcpy (dest, src)))
# endif
/* In glibc we use this function frequently but for namespace reasons /* In glibc we use this function frequently but for namespace reasons
we have to use the name `__stpcpy'. */ we have to use the name `__stpcpy'. */
# define stpcpy(dest, src) __stpcpy (dest, src) # define stpcpy(dest, src) __stpcpy (dest, src)
# endif # endif
# if _STRING_ARCH_unaligned # if !__GNUC_PREREQ (3, 0) || _FORCE_INLINES
# ifndef _FORCE_INLINES # if _STRING_ARCH_unaligned
# define __stpcpy_args(src) \ # ifndef _FORCE_INLINES
# define __stpcpy_args(src) \
__extension__ __STRING2_SMALL_GET16 (src, 0), \ __extension__ __STRING2_SMALL_GET16 (src, 0), \
__extension__ __STRING2_SMALL_GET16 (src, 4), \ __extension__ __STRING2_SMALL_GET16 (src, 4), \
__extension__ __STRING2_SMALL_GET32 (src, 0), \ __extension__ __STRING2_SMALL_GET32 (src, 0), \
__extension__ __STRING2_SMALL_GET32 (src, 4) __extension__ __STRING2_SMALL_GET32 (src, 4)
# endif # endif
__STRING_INLINE char *__stpcpy_small (char *, __uint16_t, __uint16_t, __STRING_INLINE char *__stpcpy_small (char *, __uint16_t, __uint16_t,
__uint32_t, __uint32_t, size_t); __uint32_t, __uint32_t, size_t);
__STRING_INLINE char * __STRING_INLINE char *
@ -626,9 +649,9 @@ __stpcpy_small (char *__dest,
} }
return &__u->__c; return &__u->__c;
} }
# else # else
# ifndef _FORCE_INLINES # ifndef _FORCE_INLINES
# define __stpcpy_args(src) \ # define __stpcpy_args(src) \
__extension__ ((__STRING2_COPY_ARR2) \ __extension__ ((__STRING2_COPY_ARR2) \
{ { ((__const char *) (src))[0], '\0' } }), \ { { ((__const char *) (src))[0], '\0' } }), \
__extension__ ((__STRING2_COPY_ARR3) \ __extension__ ((__STRING2_COPY_ARR3) \
@ -655,7 +678,7 @@ __stpcpy_small (char *__dest,
((__const char *) (src))[2], ((__const char *) (src))[3], \ ((__const char *) (src))[2], ((__const char *) (src))[3], \
((__const char *) (src))[4], ((__const char *) (src))[5], \ ((__const char *) (src))[4], ((__const char *) (src))[5], \
((__const char *) (src))[6], '\0' } }) ((__const char *) (src))[6], '\0' } })
# endif # endif
__STRING_INLINE char *__stpcpy_small (char *, __STRING2_COPY_ARR2, __STRING_INLINE char *__stpcpy_small (char *, __STRING2_COPY_ARR2,
__STRING2_COPY_ARR3, __STRING2_COPY_ARR3,
__STRING2_COPY_ARR4, __STRING2_COPY_ARR4,
@ -709,6 +732,7 @@ __stpcpy_small (char *__dest,
} }
return __dest + __srclen - 1; return __dest + __srclen - 1;
} }
# endif
# endif # endif
# endif # endif
#endif #endif

View File

@ -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. This file is part of the GNU C Library.
Written by Ulrich Drepper <drepper@cygnus.com>, 1995. Written by Ulrich Drepper <drepper@cygnus.com>, 1995.
@ -137,6 +137,10 @@ STRCOLL (s1, s2, l)
s1len = STRLEN (s1); s1len = STRLEN (s1);
s2len = STRLEN (s2); 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 /* We need the elements of the strings as unsigned values since they
are used as indeces. */ are used as indeces. */
us1 = (const USTRING_TYPE *) s1; us1 = (const USTRING_TYPE *) s1;

View File

@ -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. This file is part of the GNU C Library.
Written by Ulrich Drepper <drepper@cygnus.com>, 1995. 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. */ very conservative here. */
if (srclen >= 16384) 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]; rulearr = (unsigned char *) &idxarr[srclen];
if (idxarr == NULL) if (idxarr == NULL)
@ -194,8 +194,11 @@ STRXFRM (STRING_TYPE *dest, const STRING_TYPE *src, size_t n, __locale_t l)
{ {
try_stack: try_stack:
idxarr = (int32_t *) alloca (srclen * sizeof (int32_t)); 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; idxmax = 0;
do do

View File

@ -43,3 +43,7 @@ divrem := divl divq reml remq
# For now, build everything with full IEEE math support. # For now, build everything with full IEEE math support.
# TODO: build separate libm and libm-ieee. # TODO: build separate libm and libm-ieee.
sysdep-CFLAGS += -mieee sysdep-CFLAGS += -mieee
# libc.so requires about 16k for the small data area, which is well
# below the 64k maximum.
pic-ccflag = -fpic

View File

@ -56,6 +56,10 @@ case "$machine" in
arch_minimum_kernel=2.1.100 arch_minimum_kernel=2.1.100
libc_cv_gcc_unwind_find_fde=yes libc_cv_gcc_unwind_find_fde=yes
;; ;;
arm*)
arch_minimum_kernel=2.0.10
libc_cv_gcc_unwind_find_fde=yes
;;
i386*) i386*)
libc_cv_gcc_unwind_find_fde=yes libc_cv_gcc_unwind_find_fde=yes
arch_minimum_kernel=2.0.10 arch_minimum_kernel=2.0.10
@ -118,11 +122,11 @@ fi
if test -n "$minimum_kernel"; then if test -n "$minimum_kernel"; then
echo $ac_n "checking for kernel header at least $minimum_kernel""... $ac_c" 1>&6 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)/'`; 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/'`; abinum=`echo "$minimum_kernel.0.0.0" | sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\1,\2,\3/'`;
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 126 "configure" #line 130 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <linux/version.h> #include <linux/version.h>
#if LINUX_VERSION_CODE < $decnum #if LINUX_VERSION_CODE < $decnum
@ -252,7 +256,7 @@ if test $host = $build; then
ac_prefix=$ac_default_prefix ac_prefix=$ac_default_prefix
fi fi
echo $ac_n "checking for symlinks in ${ac_prefix}/include""... $ac_c" 1>&6 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= ac_message=
if test -L ${ac_prefix}/include/net; then if test -L ${ac_prefix}/include/net; then
ac_message="$ac_message ac_message="$ac_message

View File

@ -43,6 +43,10 @@ case "$machine" in
arch_minimum_kernel=2.1.100 arch_minimum_kernel=2.1.100
libc_cv_gcc_unwind_find_fde=yes libc_cv_gcc_unwind_find_fde=yes
;; ;;
arm*)
arch_minimum_kernel=2.0.10
libc_cv_gcc_unwind_find_fde=yes
;;
i386*) i386*)
libc_cv_gcc_unwind_find_fde=yes libc_cv_gcc_unwind_find_fde=yes
arch_minimum_kernel=2.0.10 arch_minimum_kernel=2.0.10