2004-05-26  Jakub Jelinek  <jakub@redhat.com>

	* include/string.h (mempcpy, stpcpy): Add libc_hidden_builtin_proto.
	* string/bits/string2.h (memset): Disable macro for GCC 3.0+.
	(__mempcpy): Use __builtin_mempcpy for GCC 3.4+.
	(strchr): For GCC 3.2+, only use __rawmemchr if second argument is
	constant '\0' and first argument is not constant.
	(__stpcpy): Use __builtin_stpcpy for GCC 3.4+.
	(strncpy): Remove #ifdef _USE_STRING_ARCH_mempcpy variant.
	For GCC 3.2+ use __builtin_strncpy.
	(strncat): For GCC 3.2+ use __builtin_strncat.
	(strcmp): For GCC 3.2+ use __builtin_strcmp if both arguments are
	constant.
	(strcspn, strspn, strpbrk): For GCC 3.2+, use builtin function
	if both arguments are constant.

2004-05-26  Ulrich Drepper  <drepper@redhat.com>

	* nss/nss_files/files-hosts.c: Fix condition for looking up IPv4
	mapped addresses in gethostbyaddr.
This commit is contained in:
Ulrich Drepper 2004-05-26 17:27:20 +00:00
parent 1773d1ba5f
commit 4a691b0639
4 changed files with 135 additions and 24 deletions

View File

@ -1,3 +1,24 @@
2004-05-26 Jakub Jelinek <jakub@redhat.com>
* include/string.h (mempcpy, stpcpy): Add libc_hidden_builtin_proto.
* string/bits/string2.h (memset): Disable macro for GCC 3.0+.
(__mempcpy): Use __builtin_mempcpy for GCC 3.4+.
(strchr): For GCC 3.2+, only use __rawmemchr if second argument is
constant '\0' and first argument is not constant.
(__stpcpy): Use __builtin_stpcpy for GCC 3.4+.
(strncpy): Remove #ifdef _USE_STRING_ARCH_mempcpy variant.
For GCC 3.2+ use __builtin_strncpy.
(strncat): For GCC 3.2+ use __builtin_strncat.
(strcmp): For GCC 3.2+ use __builtin_strcmp if both arguments are
constant.
(strcspn, strspn, strpbrk): For GCC 3.2+, use builtin function
if both arguments are constant.
2004-05-26 Ulrich Drepper <drepper@redhat.com>
* nss/nss_files/files-hosts.c: Fix condition for looking up IPv4
mapped addresses in gethostbyaddr.
2004-05-25 Ulrich Drepper <drepper@redhat.com> 2004-05-25 Ulrich Drepper <drepper@redhat.com>
* nss/digits_dots.c (__nss_hostname_digits_dots): Remove typep and * nss/digits_dots.c (__nss_hostname_digits_dots): Remove typep and

View File

@ -83,6 +83,7 @@ libc_hidden_proto (__strxfrm_l)
libc_hidden_builtin_proto (memchr) libc_hidden_builtin_proto (memchr)
libc_hidden_builtin_proto (memcpy) libc_hidden_builtin_proto (memcpy)
libc_hidden_builtin_proto (mempcpy)
libc_hidden_builtin_proto (memcmp) libc_hidden_builtin_proto (memcmp)
libc_hidden_builtin_proto (memmove) libc_hidden_builtin_proto (memmove)
libc_hidden_builtin_proto (memset) libc_hidden_builtin_proto (memset)
@ -95,6 +96,7 @@ libc_hidden_builtin_proto (strlen)
libc_hidden_builtin_proto (strncmp) libc_hidden_builtin_proto (strncmp)
libc_hidden_builtin_proto (strncpy) libc_hidden_builtin_proto (strncpy)
libc_hidden_builtin_proto (strpbrk) libc_hidden_builtin_proto (strpbrk)
libc_hidden_builtin_proto (stpcpy)
libc_hidden_builtin_proto (strrchr) libc_hidden_builtin_proto (strrchr)
libc_hidden_builtin_proto (strspn) libc_hidden_builtin_proto (strspn)
libc_hidden_builtin_proto (strstr) libc_hidden_builtin_proto (strstr)

View File

@ -1,5 +1,5 @@
/* Hosts file parser in nss_files module. /* Hosts file parser in nss_files module.
Copyright (C) 1996-2001, 2003 Free Software Foundation, Inc. Copyright (C) 1996-2001, 2003, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -278,6 +278,11 @@ HOST_DB_LOOKUP (hostbyname2, ,,
LOOKUP_NAME_CASE (h_name, h_aliases) LOOKUP_NAME_CASE (h_name, h_aliases)
}, const char *name, int af) }, const char *name, int af)
#undef EXTRA_ARGS_VALUE
/* We only need to consider IPv4 mapped addresses if the input to the
gethostbyaddr() function is an IPv6 address. */
#define EXTRA_ARGS_VALUE \
, af, (len == IN6ADDRSZ ? AI_V4MAPPED : 0)
DB_LOOKUP (hostbyaddr, ,, DB_LOOKUP (hostbyaddr, ,,
{ {
if (result->h_length == (int) len if (result->h_length == (int) len

View File

@ -30,7 +30,7 @@
means the code size increases a lot. Instead the definitions here means the code size increases a lot. Instead the definitions here
optimize some functions in a way which do not dramatically optimize some functions in a way which do not dramatically
increase the code size and which do not use assembler. The main increase the code size and which do not use assembler. The main
trick is to use GNU CC's `__builtin_constant_p' function. trick is to use GCC's `__builtin_constant_p' function.
Every function XXX which has a defined version in Every function XXX which has a defined version in
<bits/string.h> must be accompanied by a symbol _HAVE_STRING_ARCH_XXX <bits/string.h> must be accompanied by a symbol _HAVE_STRING_ARCH_XXX
@ -94,7 +94,7 @@ __STRING2_COPY_TYPE (8);
((size_t)(const void *)((__x) + 1) - (size_t)(const void *)(__x) == 1) ((size_t)(const void *)((__x) + 1) - (size_t)(const void *)(__x) == 1)
/* Set N bytes of S to C. */ /* Set N bytes of S to C. */
#ifndef _HAVE_STRING_ARCH_memset #if !defined _HAVE_STRING_ARCH_memset && ! __GNUC_PREREQ (3, 0)
# if _STRING_ARCH_unaligned # if _STRING_ARCH_unaligned
# define memset(s, c, n) \ # define memset(s, c, n) \
(__extension__ (__builtin_constant_p (n) && (n) <= 16 \ (__extension__ (__builtin_constant_p (n) && (n) <= 16 \
@ -178,12 +178,10 @@ __STRING2_COPY_TYPE (8);
\ \
__s; }) __s; })
# else # else
# if ! __GNUC_PREREQ (3, 0) # define memset(s, c, n) \
# define memset(s, c, n) \
(__extension__ (__builtin_constant_p (c) && (c) == '\0' \ (__extension__ (__builtin_constant_p (c) && (c) == '\0' \
? ({ void *__s = (s); __bzero (__s, n); __s; }) \ ? ({ void *__s = (s); __bzero (__s, n); __s; }) \
: memset (s, c, n))) : memset (s, c, n)))
# endif
# endif # endif
/* GCC optimizes memset(s, 0, n) but not bzero(s, n). /* GCC optimizes memset(s, 0, n) but not bzero(s, n).
@ -200,7 +198,9 @@ __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
# if __GNUC_PREREQ (3, 0) # if __GNUC_PREREQ (3, 4)
# define __mempcpy(dest, src, n) __builtin_mempcpy (dest, src, n)
# elif __GNUC_PREREQ (3, 0)
# define __mempcpy(dest, src, n) \ # 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 \
@ -387,10 +387,18 @@ __mempcpy_small (void *__dest, char __src1,
/* Return pointer to C in S. */ /* Return pointer to C in S. */
#ifndef _HAVE_STRING_ARCH_strchr #ifndef _HAVE_STRING_ARCH_strchr
extern void *__rawmemchr (const void *__s, int __c); extern void *__rawmemchr (const void *__s, int __c);
# define strchr(s, c) \ # if __GNUC_PREREQ (3, 2)
# define strchr(s, c) \
(__extension__ (__builtin_constant_p (c) && !__builtin_constant_p (s) \
&& (c) == '\0' \
? (char *) __rawmemchr (s, c) \
: __builtin_strchr (s, c)))
# else
# define strchr(s, c) \
(__extension__ (__builtin_constant_p (c) && (c) == '\0' \ (__extension__ (__builtin_constant_p (c) && (c) == '\0' \
? (char *) __rawmemchr (s, c) \ ? (char *) __rawmemchr (s, c) \
: strchr (s, c))) : strchr (s, c)))
# endif
#endif #endif
@ -560,7 +568,9 @@ __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
# if __GNUC_PREREQ (3, 0) # if __GNUC_PREREQ (3, 4)
# define __stpcpy(dest, src) __builtin_stpcpy (dest, src)
# elif __GNUC_PREREQ (3, 0)
# define __stpcpy(dest, src) \ # 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 \
@ -742,16 +752,8 @@ __stpcpy_small (char *__dest,
/* Copy no more than N characters of SRC to DEST. */ /* Copy no more than N characters of SRC to DEST. */
#ifndef _HAVE_STRING_ARCH_strncpy #ifndef _HAVE_STRING_ARCH_strncpy
# if defined _USE_STRING_ARCH_memset && defined _USE_STRING_ARCH_mempcpy # if __GNUC_PREREQ (3, 2)
# define strncpy(dest, src, n) \ # define strncpy(dest, src, n) __builtin_strncpy (dest, src, n)
(__extension__ ({ char *__dest = (dest); \
__builtin_constant_p (src) && __builtin_constant_p (n) \
? (strlen (src) + 1 >= ((size_t) (n)) \
? (char *) memcpy (__dest, src, n) \
: (memset (__mempcpy (__dest, src, strlen (src)), \
'\0', n - strlen (src)), \
__dest)) \
: strncpy (__dest, src, n); }))
# else # else
# define strncpy(dest, src, n) \ # define strncpy(dest, src, n) \
(__extension__ (__builtin_constant_p (src) && __builtin_constant_p (n) \ (__extension__ (__builtin_constant_p (src) && __builtin_constant_p (n) \
@ -774,6 +776,8 @@ __stpcpy_small (char *__dest,
: (*((char *) __mempcpy (strchr (__dest, '\0'), \ : (*((char *) __mempcpy (strchr (__dest, '\0'), \
src, n)) = '\0', __dest)) \ src, n)) = '\0', __dest)) \
: strncat (dest, src, n); })) : strncat (dest, src, n); }))
# elif __GNUC_PREREQ (3, 2)
# define strncat(dest, src, n) __builtin_strncat (dest, src, n)
# else # else
# define strncat(dest, src, n) \ # define strncat(dest, src, n) \
(__extension__ (__builtin_constant_p (src) && __builtin_constant_p (n) \ (__extension__ (__builtin_constant_p (src) && __builtin_constant_p (n) \
@ -787,7 +791,28 @@ __stpcpy_small (char *__dest,
/* Compare characters of S1 and S2. */ /* Compare characters of S1 and S2. */
#ifndef _HAVE_STRING_ARCH_strcmp #ifndef _HAVE_STRING_ARCH_strcmp
# define strcmp(s1, s2) \ # if __GNUC_PREREQ (3, 2)
# define strcmp(s1, s2) \
__extension__ \
({ size_t __s1_len, __s2_len; \
(__builtin_constant_p (s1) && __builtin_constant_p (s2) \
&& (__s1_len = strlen (s1), __s2_len = strlen (s2), \
(!__string2_1bptr_p (s1) || __s1_len >= 4) \
&& (!__string2_1bptr_p (s2) || __s2_len >= 4)) \
? __builtin_strcmp (s1, s2) \
: (__builtin_constant_p (s1) && __string2_1bptr_p (s1) \
&& (__s1_len = strlen (s1), __s1_len < 4) \
? (__builtin_constant_p (s2) && __string2_1bptr_p (s2) \
? __builtin_strcmp (s1, s2) \
: __strcmp_cg (s1, s2, __s1_len)) \
: (__builtin_constant_p (s2) && __string2_1bptr_p (s2) \
&& (__s2_len = strlen (s2), __s2_len < 4) \
? (__builtin_constant_p (s1) && __string2_1bptr_p (s1) \
? __builtin_strcmp (s1, s2) \
: __strcmp_gc (s1, s2, __s2_len)) \
: __builtin_strcmp (s1, s2)))); })
# else
# define strcmp(s1, s2) \
__extension__ \ __extension__ \
({ size_t __s1_len, __s2_len; \ ({ size_t __s1_len, __s2_len; \
(__builtin_constant_p (s1) && __builtin_constant_p (s2) \ (__builtin_constant_p (s1) && __builtin_constant_p (s2) \
@ -807,6 +832,7 @@ __stpcpy_small (char *__dest,
? __strcmp_cc (s1, s2, __s2_len) \ ? __strcmp_cc (s1, s2, __s2_len) \
: __strcmp_gc (s1, s2, __s2_len)) \ : __strcmp_gc (s1, s2, __s2_len)) \
: strcmp (s1, s2)))); }) : strcmp (s1, s2)))); })
# endif
# define __strcmp_cc(s1, s2, l) \ # define __strcmp_cc(s1, s2, l) \
(__extension__ ({ register int __result = \ (__extension__ ({ register int __result = \
@ -900,7 +926,25 @@ __stpcpy_small (char *__dest,
consists entirely of characters not in REJECT. */ consists entirely of characters not in REJECT. */
#if !defined _HAVE_STRING_ARCH_strcspn || defined _FORCE_INLINES #if !defined _HAVE_STRING_ARCH_strcspn || defined _FORCE_INLINES
# ifndef _HAVE_STRING_ARCH_strcspn # ifndef _HAVE_STRING_ARCH_strcspn
# define strcspn(s, reject) \ # if __GNUC_PREREQ (3, 2)
# define strcspn(s, reject) \
__extension__ \
({ char __r0, __r1, __r2; \
(__builtin_constant_p (reject) && __string2_1bptr_p (reject) \
? ((__builtin_constant_p (s) && __string2_1bptr_p (s)) \
? __builtin_strcspn (s, reject) \
: ((__r0 = ((__const char *) (reject))[0], __r0 == '\0') \
? strlen (s) \
: ((__r1 = ((__const char *) (reject))[1], __r1 == '\0') \
? __strcspn_c1 (s, __r0) \
: ((__r2 = ((__const char *) (reject))[2], __r2 == '\0') \
? __strcspn_c2 (s, __r0, __r1) \
: (((__const char *) (reject))[3] == '\0' \
? __strcspn_c3 (s, __r0, __r1, __r2) \
: __builtin_strcspn (s, reject)))))) \
: __builtin_strcspn (s, reject)); })
# else
# define strcspn(s, reject) \
__extension__ \ __extension__ \
({ char __r0, __r1, __r2; \ ({ char __r0, __r1, __r2; \
(__builtin_constant_p (reject) && __string2_1bptr_p (reject) \ (__builtin_constant_p (reject) && __string2_1bptr_p (reject) \
@ -913,7 +957,8 @@ __stpcpy_small (char *__dest,
: (((__const char *) (reject))[3] == '\0' \ : (((__const char *) (reject))[3] == '\0' \
? __strcspn_c3 (s, __r0, __r1, __r2) \ ? __strcspn_c3 (s, __r0, __r1, __r2) \
: strcspn (s, reject))))) \ : strcspn (s, reject))))) \
: strcspn (s, reject)); }) : strcspn (s, reject)); })
# endif
# endif # endif
__STRING_INLINE size_t __strcspn_c1 (__const char *__s, int __reject); __STRING_INLINE size_t __strcspn_c1 (__const char *__s, int __reject);
@ -957,7 +1002,25 @@ __strcspn_c3 (__const char *__s, int __reject1, int __reject2,
consists entirely of characters in ACCEPT. */ consists entirely of characters in ACCEPT. */
#if !defined _HAVE_STRING_ARCH_strspn || defined _FORCE_INLINES #if !defined _HAVE_STRING_ARCH_strspn || defined _FORCE_INLINES
# ifndef _HAVE_STRING_ARCH_strspn # ifndef _HAVE_STRING_ARCH_strspn
# define strspn(s, accept) \ # if __GNUC_PREREQ (3, 2)
# define strspn(s, accept) \
__extension__ \
({ char __a0, __a1, __a2; \
(__builtin_constant_p (accept) && __string2_1bptr_p (accept) \
? ((__builtin_constant_p (s) && __string2_1bptr_p (s)) \
? __builtin_strspn (s, accept) \
: ((__a0 = ((__const char *) (accept))[0], __a0 == '\0') \
? ((void) (s), 0) \
: ((__a1 = ((__const char *) (accept))[1], __a1 == '\0') \
? __strspn_c1 (s, __a0) \
: ((__a2 = ((__const char *) (accept))[2], __a2 == '\0') \
? __strspn_c2 (s, __a0, __a1) \
: (((__const char *) (accept))[3] == '\0' \
? __strspn_c3 (s, __a0, __a1, __a2) \
: __builtin_strspn (s, accept)))))) \
: __builtin_strspn (s, accept)); })
# else
# define strspn(s, accept) \
__extension__ \ __extension__ \
({ char __a0, __a1, __a2; \ ({ char __a0, __a1, __a2; \
(__builtin_constant_p (accept) && __string2_1bptr_p (accept) \ (__builtin_constant_p (accept) && __string2_1bptr_p (accept) \
@ -971,6 +1034,7 @@ __strcspn_c3 (__const char *__s, int __reject1, int __reject2,
? __strspn_c3 (s, __a0, __a1, __a2) \ ? __strspn_c3 (s, __a0, __a1, __a2) \
: strspn (s, accept))))) \ : strspn (s, accept))))) \
: strspn (s, accept)); }) : strspn (s, accept)); })
# endif
# endif # endif
__STRING_INLINE size_t __strspn_c1 (__const char *__s, int __accept); __STRING_INLINE size_t __strspn_c1 (__const char *__s, int __accept);
@ -1014,7 +1078,25 @@ __strspn_c3 (__const char *__s, int __accept1, int __accept2, int __accept3)
/* Find the first occurrence in S of any character in ACCEPT. */ /* Find the first occurrence in S of any character in ACCEPT. */
#if !defined _HAVE_STRING_ARCH_strpbrk || defined _FORCE_INLINES #if !defined _HAVE_STRING_ARCH_strpbrk || defined _FORCE_INLINES
# ifndef _HAVE_STRING_ARCH_strpbrk # ifndef _HAVE_STRING_ARCH_strpbrk
# define strpbrk(s, accept) \ # if __GNUC_PREREQ (3, 2)
# define strpbrk(s, accept) \
__extension__ \
({ char __a0, __a1, __a2; \
(__builtin_constant_p (accept) && __string2_1bptr_p (accept) \
? ((__builtin_constant_p (s) && __string2_1bptr_p (s)) \
? __builtin_strpbrk (s, accept) \
: ((__a0 = ((__const char *) (accept))[0], __a0 == '\0') \
? ((void) (s), (char *) NULL) \
: ((__a1 = ((__const char *) (accept))[1], __a1 == '\0') \
? __builtin_strchr (s, __a0) \
: ((__a2 = ((__const char *) (accept))[2], __a2 == '\0') \
? __strpbrk_c2 (s, __a0, __a1) \
: (((__const char *) (accept))[3] == '\0' \
? __strpbrk_c3 (s, __a0, __a1, __a2) \
: __builtin_strpbrk (s, accept)))))) \
: __builtin_strpbrk (s, accept)); })
# else
# define strpbrk(s, accept) \
__extension__ \ __extension__ \
({ char __a0, __a1, __a2; \ ({ char __a0, __a1, __a2; \
(__builtin_constant_p (accept) && __string2_1bptr_p (accept) \ (__builtin_constant_p (accept) && __string2_1bptr_p (accept) \
@ -1028,6 +1110,7 @@ __strspn_c3 (__const char *__s, int __accept1, int __accept2, int __accept3)
? __strpbrk_c3 (s, __a0, __a1, __a2) \ ? __strpbrk_c3 (s, __a0, __a1, __a2) \
: strpbrk (s, accept))))) \ : strpbrk (s, accept))))) \
: strpbrk (s, accept)); }) : strpbrk (s, accept)); })
# endif
# endif # endif
__STRING_INLINE char *__strpbrk_c2 (__const char *__s, int __accept1, __STRING_INLINE char *__strpbrk_c2 (__const char *__s, int __accept1,