+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):
/* 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.
#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);
}
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] } }), \
((__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,
}
return __extension__ ((void *) __u + __srclen);
}
+# endif
# endif
# endif
#endif
/* 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 \
#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 *
}
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) \
((__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,
}
return __dest + __srclen - 1;
}
+# endif
# endif
# endif
#endif