mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-29 11:41:21 +03:00
Remove the str(n)dup inlines from string/bits/string2.h. Although inlining
calls with constant strings shows a small (~10%) performance gain, strdup is typically used in error reporting code, so not performance critical. Remove the now unused __need_malloc_and_calloc related defines from stdlib.h. Rename existing uses of str(n)dup to __str(n)dup so it no longer needs to be redirected to a builtin. Also building GLIBC with -Os now no longer shows localplt or linkname space failures (partial fix for BZ #15105 and BZ #19463). [BZ #15105] [BZ #19463] * elf/dl-cache.c (_dl_load_cache_lookup): Use __strdup. * inet/rcmd.c (rcmd_af): Likewise. * inet/rexec.c (rexec_af): Likewise. * intl/dcigettext.c (_LIBC): Likewise. * intl/finddomain.c (_nl_find_domain): Use strdup expansion. * locale/loadarchive.c (_nl_load_locale_from_archive): Use __strdup. * locale/setlocale.c (setlocale): Likewise. * posix/spawn_faction_addopen.c (posix_spawn_file_actions_addopen): Likewise. * stdlib/putenv.c (putenv): Use __strndup. * sunrpc/svc_simple.c (__registerrpc): Use __strdup. * sysdeps/posix/getaddrinfo.c (gaih_inet): Use __strdup/__strndup. * include/stdlib.h (__need_malloc_and_calloc): Remove uses. (__Need_M_And_C) Remove define/undef. * stdlib/stdlib.h (__need_malloc_and_calloc): Remove uses. (__malloc_and_calloc_defined): Remove define. * string/bits/string2.h (__strdup): Remove define. (strdup): Likewise. (__strndup): Likewise. (strndup): Likewise.
This commit is contained in:
25
ChangeLog
25
ChangeLog
@ -1,3 +1,28 @@
|
|||||||
|
2017-03-13 Wilco Dijkstra <wdijkstr@arm.com>
|
||||||
|
|
||||||
|
[BZ #15105]
|
||||||
|
[BZ #19463]
|
||||||
|
* elf/dl-cache.c (_dl_load_cache_lookup): Use __strdup.
|
||||||
|
* inet/rcmd.c (rcmd_af): Likewise.
|
||||||
|
* inet/rexec.c (rexec_af): Likewise.
|
||||||
|
* intl/dcigettext.c (_LIBC): Likewise.
|
||||||
|
* intl/finddomain.c (_nl_find_domain): Use strdup expansion.
|
||||||
|
* locale/loadarchive.c (_nl_load_locale_from_archive): Use __strdup.
|
||||||
|
* locale/setlocale.c (setlocale): Likewise.
|
||||||
|
* posix/spawn_faction_addopen.c
|
||||||
|
(posix_spawn_file_actions_addopen): Likewise.
|
||||||
|
* stdlib/putenv.c (putenv): Use __strndup.
|
||||||
|
* sunrpc/svc_simple.c (__registerrpc): Use __strdup.
|
||||||
|
* sysdeps/posix/getaddrinfo.c (gaih_inet): Use __strdup/__strndup.
|
||||||
|
* include/stdlib.h (__need_malloc_and_calloc): Remove uses.
|
||||||
|
(__Need_M_And_C) Remove define/undef.
|
||||||
|
* stdlib/stdlib.h (__need_malloc_and_calloc): Remove uses.
|
||||||
|
(__malloc_and_calloc_defined): Remove define.
|
||||||
|
* string/bits/string2.h (__strdup): Remove define.
|
||||||
|
(strdup): Likewise.
|
||||||
|
(__strndup): Likewise.
|
||||||
|
(strndup): Likewise.
|
||||||
|
|
||||||
2017-03-13 Joseph Myers <joseph@codesourcery.com>
|
2017-03-13 Joseph Myers <joseph@codesourcery.com>
|
||||||
|
|
||||||
* sysdeps/unix/sysv/linux/bits/in.h (IPV6_AUTOFLOWLABEL): New
|
* sysdeps/unix/sysv/linux/bits/in.h (IPV6_AUTOFLOWLABEL): New
|
||||||
|
@ -302,7 +302,7 @@ _dl_load_cache_lookup (const char *name)
|
|||||||
char *temp;
|
char *temp;
|
||||||
temp = alloca (strlen (best) + 1);
|
temp = alloca (strlen (best) + 1);
|
||||||
strcpy (temp, best);
|
strcpy (temp, best);
|
||||||
return strdup (temp);
|
return __strdup (temp);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef MAP_COPY
|
#ifndef MAP_COPY
|
||||||
|
@ -1,16 +1,12 @@
|
|||||||
#ifndef _STDLIB_H
|
#ifndef _STDLIB_H
|
||||||
|
|
||||||
#ifdef __need_malloc_and_calloc
|
|
||||||
#define __Need_M_And_C
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef _ISOMAC
|
#ifndef _ISOMAC
|
||||||
# include <stddef.h>
|
# include <stddef.h>
|
||||||
#endif
|
#endif
|
||||||
#include <stdlib/stdlib.h>
|
#include <stdlib/stdlib.h>
|
||||||
|
|
||||||
/* Now define the internal interfaces. */
|
/* Now define the internal interfaces. */
|
||||||
#if !defined __Need_M_And_C && !defined _ISOMAC
|
#if !defined _ISOMAC
|
||||||
# include <sys/stat.h>
|
# include <sys/stat.h>
|
||||||
|
|
||||||
__BEGIN_DECLS
|
__BEGIN_DECLS
|
||||||
@ -269,6 +265,4 @@ __END_DECLS
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#undef __Need_M_And_C
|
|
||||||
|
|
||||||
#endif /* include/stdlib.h */
|
#endif /* include/stdlib.h */
|
||||||
|
@ -149,7 +149,7 @@ rcmd_af (char **ahost, u_short rport, const char *locuser, const char *remuser,
|
|||||||
|
|
||||||
if (res->ai_canonname){
|
if (res->ai_canonname){
|
||||||
free (ahostbuf);
|
free (ahostbuf);
|
||||||
ahostbuf = strdup (res->ai_canonname);
|
ahostbuf = __strdup (res->ai_canonname);
|
||||||
if (ahostbuf == NULL) {
|
if (ahostbuf == NULL) {
|
||||||
__fxprintf(NULL, "%s",
|
__fxprintf(NULL, "%s",
|
||||||
_("rcmd: Cannot allocate memory\n"));
|
_("rcmd: Cannot allocate memory\n"));
|
||||||
|
@ -73,7 +73,7 @@ rexec_af (char **ahost, int rport, const char *name, const char *pass,
|
|||||||
|
|
||||||
if (res0->ai_canonname){
|
if (res0->ai_canonname){
|
||||||
free (ahostbuf);
|
free (ahostbuf);
|
||||||
ahostbuf = strdup (res0->ai_canonname);
|
ahostbuf = __strdup (res0->ai_canonname);
|
||||||
if (ahostbuf == NULL) {
|
if (ahostbuf == NULL) {
|
||||||
perror ("rexec: strdup");
|
perror ("rexec: strdup");
|
||||||
return (-1);
|
return (-1);
|
||||||
|
@ -131,6 +131,7 @@ extern int errno;
|
|||||||
/* Rename the non ANSI C functions. This is required by the standard
|
/* Rename the non ANSI C functions. This is required by the standard
|
||||||
because some ANSI C functions will require linking with this object
|
because some ANSI C functions will require linking with this object
|
||||||
file and the name space must not be polluted. */
|
file and the name space must not be polluted. */
|
||||||
|
# define strdup __strdup
|
||||||
# define getcwd __getcwd
|
# define getcwd __getcwd
|
||||||
# ifndef stpcpy
|
# ifndef stpcpy
|
||||||
# define stpcpy __stpcpy
|
# define stpcpy __stpcpy
|
||||||
|
@ -124,18 +124,12 @@ _nl_find_domain (const char *dirname, char *locale,
|
|||||||
alias_value = _nl_expand_alias (locale);
|
alias_value = _nl_expand_alias (locale);
|
||||||
if (alias_value != NULL)
|
if (alias_value != NULL)
|
||||||
{
|
{
|
||||||
#if defined _LIBC || defined HAVE_STRDUP
|
|
||||||
locale = strdup (alias_value);
|
|
||||||
if (locale == NULL)
|
|
||||||
return NULL;
|
|
||||||
#else
|
|
||||||
size_t len = strlen (alias_value) + 1;
|
size_t len = strlen (alias_value) + 1;
|
||||||
locale = (char *) malloc (len);
|
locale = (char *) malloc (len);
|
||||||
if (locale == NULL)
|
if (locale == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
memcpy (locale, alias_value, len);
|
memcpy (locale, alias_value, len);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now we determine the single parts of the locale name. First
|
/* Now we determine the single parts of the locale name. First
|
||||||
|
@ -462,7 +462,7 @@ _nl_load_locale_from_archive (int category, const char **namep)
|
|||||||
if (__glibc_unlikely (lia == NULL))
|
if (__glibc_unlikely (lia == NULL))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
lia->name = strdup (*namep);
|
lia->name = __strdup (*namep);
|
||||||
if (__glibc_unlikely (lia->name == NULL))
|
if (__glibc_unlikely (lia->name == NULL))
|
||||||
{
|
{
|
||||||
free (lia);
|
free (lia);
|
||||||
|
@ -283,7 +283,7 @@ setlocale (int category, const char *locale)
|
|||||||
if (__glibc_unlikely (strchr (locale, ';') != NULL))
|
if (__glibc_unlikely (strchr (locale, ';') != NULL))
|
||||||
{
|
{
|
||||||
/* This is a composite name. Make a copy and split it up. */
|
/* This is a composite name. Make a copy and split it up. */
|
||||||
locale_copy = strdup (locale);
|
locale_copy = __strdup (locale);
|
||||||
if (__glibc_unlikely (locale_copy == NULL))
|
if (__glibc_unlikely (locale_copy == NULL))
|
||||||
{
|
{
|
||||||
__libc_rwlock_unlock (__libc_setlocale_lock);
|
__libc_rwlock_unlock (__libc_setlocale_lock);
|
||||||
|
@ -34,7 +34,7 @@ posix_spawn_file_actions_addopen (posix_spawn_file_actions_t *file_actions,
|
|||||||
if (!__spawn_valid_fd (fd))
|
if (!__spawn_valid_fd (fd))
|
||||||
return EBADF;
|
return EBADF;
|
||||||
|
|
||||||
char *path_copy = strdup (path);
|
char *path_copy = __strdup (path);
|
||||||
if (path_copy == NULL)
|
if (path_copy == NULL)
|
||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
|
|
||||||
|
@ -60,7 +60,7 @@ putenv (char *string)
|
|||||||
int use_malloc = !__libc_use_alloca (name_end - string + 1);
|
int use_malloc = !__libc_use_alloca (name_end - string + 1);
|
||||||
if (__builtin_expect (use_malloc, 0))
|
if (__builtin_expect (use_malloc, 0))
|
||||||
{
|
{
|
||||||
name = strndup (string, name_end - string);
|
name = __strndup (string, name_end - string);
|
||||||
if (name == NULL)
|
if (name == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -26,15 +26,12 @@
|
|||||||
|
|
||||||
/* Get size_t, wchar_t and NULL from <stddef.h>. */
|
/* Get size_t, wchar_t and NULL from <stddef.h>. */
|
||||||
#define __need_size_t
|
#define __need_size_t
|
||||||
#ifndef __need_malloc_and_calloc
|
|
||||||
#define __need_wchar_t
|
#define __need_wchar_t
|
||||||
#define __need_NULL
|
#define __need_NULL
|
||||||
#endif
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
__BEGIN_DECLS
|
__BEGIN_DECLS
|
||||||
|
|
||||||
#ifndef __need_malloc_and_calloc
|
|
||||||
#define _STDLIB_H 1
|
#define _STDLIB_H 1
|
||||||
|
|
||||||
#if (defined __USE_XOPEN || defined __USE_XOPEN2K8) && !defined _SYS_WAIT_H
|
#if (defined __USE_XOPEN || defined __USE_XOPEN2K8) && !defined _SYS_WAIT_H
|
||||||
@ -434,10 +431,6 @@ extern int lcong48_r (unsigned short int __param[7],
|
|||||||
# endif /* Use misc. */
|
# endif /* Use misc. */
|
||||||
#endif /* Use misc or X/Open. */
|
#endif /* Use misc or X/Open. */
|
||||||
|
|
||||||
#endif /* don't just need malloc and calloc */
|
|
||||||
|
|
||||||
#ifndef __malloc_and_calloc_defined
|
|
||||||
# define __malloc_and_calloc_defined
|
|
||||||
__BEGIN_NAMESPACE_STD
|
__BEGIN_NAMESPACE_STD
|
||||||
/* Allocate SIZE bytes of memory. */
|
/* Allocate SIZE bytes of memory. */
|
||||||
extern void *malloc (size_t __size) __THROW __attribute_malloc__ __wur;
|
extern void *malloc (size_t __size) __THROW __attribute_malloc__ __wur;
|
||||||
@ -445,9 +438,7 @@ extern void *malloc (size_t __size) __THROW __attribute_malloc__ __wur;
|
|||||||
extern void *calloc (size_t __nmemb, size_t __size)
|
extern void *calloc (size_t __nmemb, size_t __size)
|
||||||
__THROW __attribute_malloc__ __wur;
|
__THROW __attribute_malloc__ __wur;
|
||||||
__END_NAMESPACE_STD
|
__END_NAMESPACE_STD
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef __need_malloc_and_calloc
|
|
||||||
__BEGIN_NAMESPACE_STD
|
__BEGIN_NAMESPACE_STD
|
||||||
/* Re-allocate the previously allocated block
|
/* Re-allocate the previously allocated block
|
||||||
in PTR, making the new block SIZE bytes long. */
|
in PTR, making the new block SIZE bytes long. */
|
||||||
@ -944,9 +935,6 @@ extern int ttyslot (void) __THROW;
|
|||||||
# include <bits/stdlib-ldbl.h>
|
# include <bits/stdlib-ldbl.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* don't just need malloc and calloc */
|
|
||||||
#undef __need_malloc_and_calloc
|
|
||||||
|
|
||||||
__END_DECLS
|
__END_DECLS
|
||||||
|
|
||||||
#endif /* stdlib.h */
|
#endif /* stdlib.h */
|
||||||
|
@ -112,65 +112,6 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* We need the memory allocation functions for inline strdup().
|
|
||||||
Referring to stdlib.h (even minimally) is not allowed
|
|
||||||
in any of the tight standards compliant modes. */
|
|
||||||
#ifdef __USE_MISC
|
|
||||||
|
|
||||||
# if !defined _HAVE_STRING_ARCH_strdup || !defined _HAVE_STRING_ARCH_strndup
|
|
||||||
# define __need_malloc_and_calloc
|
|
||||||
# include <stdlib.h>
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# ifndef _HAVE_STRING_ARCH_strdup
|
|
||||||
|
|
||||||
extern char *__strdup (const char *__string) __THROW __attribute_malloc__;
|
|
||||||
# define __strdup(s) \
|
|
||||||
(__extension__ (__builtin_constant_p (s) && __string2_1bptr_p (s) \
|
|
||||||
? (((const char *) (s))[0] == '\0' \
|
|
||||||
? (char *) calloc ((size_t) 1, (size_t) 1) \
|
|
||||||
: ({ size_t __len = strlen (s) + 1; \
|
|
||||||
char *__retval = (char *) malloc (__len); \
|
|
||||||
if (__retval != NULL) \
|
|
||||||
__retval = (char *) memcpy (__retval, s, __len); \
|
|
||||||
__retval; })) \
|
|
||||||
: __strdup (s)))
|
|
||||||
|
|
||||||
# if defined __USE_XOPEN_EXTENDED || defined __USE_XOPEN2K8
|
|
||||||
# define strdup(s) __strdup (s)
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# ifndef _HAVE_STRING_ARCH_strndup
|
|
||||||
|
|
||||||
extern char *__strndup (const char *__string, size_t __n)
|
|
||||||
__THROW __attribute_malloc__;
|
|
||||||
# define __strndup(s, n) \
|
|
||||||
(__extension__ (__builtin_constant_p (s) && __string2_1bptr_p (s) \
|
|
||||||
? (((const char *) (s))[0] == '\0' \
|
|
||||||
? (char *) calloc ((size_t) 1, (size_t) 1) \
|
|
||||||
: ({ size_t __len = strlen (s) + 1; \
|
|
||||||
size_t __n = (n); \
|
|
||||||
char *__retval; \
|
|
||||||
if (__n < __len) \
|
|
||||||
__len = __n + 1; \
|
|
||||||
__retval = (char *) malloc (__len); \
|
|
||||||
if (__retval != NULL) \
|
|
||||||
{ \
|
|
||||||
__retval[__len - 1] = '\0'; \
|
|
||||||
__retval = (char *) memcpy (__retval, s, \
|
|
||||||
__len - 1); \
|
|
||||||
} \
|
|
||||||
__retval; })) \
|
|
||||||
: __strndup (s, n)))
|
|
||||||
|
|
||||||
# ifdef __USE_XOPEN2K8
|
|
||||||
# define strndup(s, n) __strndup (s, n)
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
|
|
||||||
#endif /* Use misc. or use GNU. */
|
|
||||||
|
|
||||||
#ifndef _FORCE_INLINES
|
#ifndef _FORCE_INLINES
|
||||||
# undef __STRING_INLINE
|
# undef __STRING_INLINE
|
||||||
#endif
|
#endif
|
||||||
|
@ -87,7 +87,7 @@ __registerrpc (u_long prognum, u_long versnum, u_long procnum,
|
|||||||
transp = svcudp_create (RPC_ANYSOCK);
|
transp = svcudp_create (RPC_ANYSOCK);
|
||||||
if (transp == NULL)
|
if (transp == NULL)
|
||||||
{
|
{
|
||||||
buf = strdup (_("couldn't create an rpc server\n"));
|
buf = __strdup (_("couldn't create an rpc server\n"));
|
||||||
goto err_out;
|
goto err_out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -103,7 +103,7 @@ __registerrpc (u_long prognum, u_long versnum, u_long procnum,
|
|||||||
pl = (struct proglst_ *) malloc (sizeof (struct proglst_));
|
pl = (struct proglst_ *) malloc (sizeof (struct proglst_));
|
||||||
if (pl == NULL)
|
if (pl == NULL)
|
||||||
{
|
{
|
||||||
buf = strdup (_("registerrpc: out of memory\n"));
|
buf = __strdup (_("registerrpc: out of memory\n"));
|
||||||
goto err_out;
|
goto err_out;
|
||||||
}
|
}
|
||||||
pl->p_progname = progname;
|
pl->p_progname = progname;
|
||||||
|
@ -536,7 +536,7 @@ gaih_inet (const char *name, const struct gaih_service *service,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
namebuf = strndup (name, scope_delim - name);
|
namebuf = __strndup (name, scope_delim - name);
|
||||||
if (namebuf == NULL)
|
if (namebuf == NULL)
|
||||||
{
|
{
|
||||||
assert (!malloc_name);
|
assert (!malloc_name);
|
||||||
@ -1141,7 +1141,7 @@ gaih_inet (const char *name, const struct gaih_service *service,
|
|||||||
malloc_canonbuf = false;
|
malloc_canonbuf = false;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
canon = strdup (canon);
|
canon = __strdup (canon);
|
||||||
if (canon == NULL)
|
if (canon == NULL)
|
||||||
{
|
{
|
||||||
result = -EAI_MEMORY;
|
result = -EAI_MEMORY;
|
||||||
|
Reference in New Issue
Block a user