* string/bits/string2.h: Fix aliasing problems.
	* sysdeps/i386/i486/bits/string.h: Likewise.
	* sysdeps/i386/bits/string.h: Likewise.

1998-12-28  Geoff Keating  <geoffk@ozemail.com.au>

	* sysdeps/powerpc/dl-machine.c: Handle shared library profiling.
	* elf/rtld.c (dl_main): Don't call malloc() between
	re-relocating the dynamic linker and running the application's crt0.

1999-07-21  Paul D. Smith  <psmith@gnu.org>

	* sysdeps/generic/glob.c: Move getlogin{,_r} prototypes below
	glob.h to get __P() macro.

	* posix/fnmatch.c (internal_fnmatch): Use K&R definition syntax,
	not ANSI.
	(__strchrnul): This won't exist outside GLIBC, so create one.

1999-07-25  Jakub Jelinek   <jj@ultra.linux.cz>

	* sysdeps/unix/sysv/linux/sparc/bits/types.h: Always define __qaddr_t.
	__ino64_t should be 32bit unsigned type on sparc32.
	Define __off64_t to __quad_t instead of __int64_t.
	Make __pic_pid_t unsigned on sparc32.

1999-07-25  Andreas Jaeger  <aj@arthur.rhein-neckar.de>

	* localedata/tst-rpmatch.sh: Use "&" instead of "" to avoid a bug
	in bash 2.03.

1999-07-25  Ulrich Drepper  <drepper@cygnus.com>
This commit is contained in:
Ulrich Drepper 1999-07-25 23:21:20 +00:00
parent 788e8e7c22
commit 722c33bbb6
8 changed files with 417 additions and 240 deletions

View File

@ -1,3 +1,36 @@
1999-07-25 Ulrich Drepper <drepper@cygnus.com>
* string/bits/string2.h: Fix aliasing problems.
* sysdeps/i386/i486/bits/string.h: Likewise.
* sysdeps/i386/bits/string.h: Likewise.
1998-12-28 Geoff Keating <geoffk@ozemail.com.au>
* sysdeps/powerpc/dl-machine.c: Handle shared library profiling.
* elf/rtld.c (dl_main): Don't call malloc() between
re-relocating the dynamic linker and running the application's crt0.
1999-07-21 Paul D. Smith <psmith@gnu.org>
* sysdeps/generic/glob.c: Move getlogin{,_r} prototypes below
glob.h to get __P() macro.
* posix/fnmatch.c (internal_fnmatch): Use K&R definition syntax,
not ANSI.
(__strchrnul): This won't exist outside GLIBC, so create one.
1999-07-25 Jakub Jelinek <jj@ultra.linux.cz>
* sysdeps/unix/sysv/linux/sparc/bits/types.h: Always define __qaddr_t.
__ino64_t should be 32bit unsigned type on sparc32.
Define __off64_t to __quad_t instead of __int64_t.
Make __pic_pid_t unsigned on sparc32.
1999-07-25 Andreas Jaeger <aj@arthur.rhein-neckar.de>
* localedata/tst-rpmatch.sh: Use "&" instead of "§" to avoid a bug
in bash 2.03.
1999-07-25 Ulrich Drepper <drepper@cygnus.com>
* iconvdata/euc-kr.c (euckr_from_ucs4): Set cp[0] to '\0' in case

View File

@ -1024,6 +1024,14 @@ of this helper program; chances are you did not intend to run this program.\n\
_dl_relocate_object might need to call `mprotect' for DT_TEXTREL. */
_dl_sysdep_start_cleanup ();
/* Now enable profiling if needed. Like the previous call,
this has to go here because the calls it makes should use the
rtld versions of the functions (particularly calloc()), but it
needs to have _dl_profile_map set up by the relocator. */
if (_dl_profile_map != NULL)
/* We must prepare the profiling. */
_dl_start_profile (_dl_profile_map, _dl_profile_output);
if (_dl_rtld_map.l_opencount > 0)
{
/* There was an explicit ref to the dynamic linker as a shared lib.
@ -1082,11 +1090,6 @@ of this helper program; chances are you did not intend to run this program.\n\
_dl_unload_cache ();
#endif
/* Now enable profiling if needed. */
if (_dl_profile_map != NULL)
/* We must prepare the profiling. */
_dl_start_profile (_dl_profile_map, _dl_profile_output);
/* Once we return, _dl_sysdep_start will invoke
the DT_INIT functions and then *USER_ENTRY. */
}
@ -1299,11 +1302,7 @@ process_envvars (enum mode *modep, int *lazyp)
/* Which shared object shall be profiled. */
if (memcmp (&envline[3], "PROFILE", 7) == 0)
{
_dl_profile = &envline[11];
if (*_dl_profile == '\0')
_dl_profile = NULL;
}
break;
case 8:
@ -1388,6 +1387,12 @@ process_envvars (enum mode *modep, int *lazyp)
unsetenv ("LD_PRELOAD");
if (library_path != NULL)
unsetenv ("LD_LIBRARY_PATH");
if (_dl_origin_path != NULL)
unsetenv ("LD_ORIGIN_PATH");
if (debug_output != NULL)
unsetenv ("LD_DEBUG_OUTPUT");
if (_dl_profile != NULL)
unsetenv ("LD_PROFILE");
for (cnt = 0;
cnt < sizeof (unsecure_envvars) / sizeof (unsecure_envvars[0]);
@ -1395,6 +1400,10 @@ process_envvars (enum mode *modep, int *lazyp)
unsetenv (unsecure_envvars[cnt]);
}
/* The name of the object to profile cannot be empty. */
if (_dl_profile != NULL && *_dl_profile == '\0')
_dl_profile = NULL;
/* If we have to run the dynamic linker in debugging mode and the
LD_DEBUG_OUTPUT environment variable is given, we write the debug
messages to this file. */

View File

@ -127,14 +127,35 @@ extern char *getenv ();
extern int errno;
# endif
/* This function doesn't exist on most systems. */
# if !defined HAVE___STRCHRNUL && !defined _LIBC
static char *
__strchrnul (s, c)
const char *s;
int c;
{
char *result = strchr (s, c);
if (result == NULL)
result = strchr (s, '\0');
return result;
}
# endif
/* Match STRING against the filename pattern PATTERN, returning zero if
it matches, nonzero if not. */
static int internal_fnmatch __P ((const char *pattern, const char *string,
int no_leading_period, int flags))
internal_function;
static int
#ifdef _LIBC
internal_function
#endif
internal_fnmatch (const char *pattern, const char *string,
int no_leading_period, int flags)
internal_fnmatch (pattern, string, no_leading_period, flags)
const char *pattern;
const char *string;
int no_leading_period;
int flags;
{
register const char *p = pattern, *n = string;
register unsigned char c;

View File

@ -110,51 +110,68 @@ __STRING2_COPY_TYPE (8);
# define __memset_gc(s, c, n) \
({ void *__s = (s); \
__uint32_t *__ts = (__uint32_t *) __s; \
union { \
unsigned int __ui; \
unsigned short int __usi; \
unsigned char __uc; \
} *__u = __s; \
__uint8_t __c = (__uint8_t) (c); \
\
/* This `switch' statement will be removed at compile-time. */ \
switch (n) \
{ \
case 15: \
*__ts++ = __c * 0x01010101; \
__u->__ui = __c * 0x01010101; \
__u = (void *) __u + 4; \
case 11: \
*__ts++ = __c * 0x01010101; \
__u->__ui = __c * 0x01010101; \
__u = (void *) __u + 4; \
case 7: \
*__ts++ = __c * 0x01010101; \
__u->__ui = __c * 0x01010101; \
__u = (void *) __u + 4; \
case 3: \
*((__uint16_t *) __ts)++ = __c * 0x0101; \
*((__uint8_t *) __ts) = __c; \
__u->__usi = (unsigned short int) __c * 0x0101; \
__u = (void *) __u + 2; \
__u->__uc = (unsigned char) __c; \
break; \
\
case 14: \
*__ts++ = __c * 0x01010101; \
__u->__ui = __c * 0x01010101; \
__u = (void *) __u + 4; \
case 10: \
*__ts++ = __c * 0x01010101; \
__u->__ui = __c * 0x01010101; \
__u = (void *) __u + 4; \
case 6: \
*__ts++ = __c * 0x01010101; \
__u->__ui = __c * 0x01010101; \
__u = (void *) __u + 4; \
case 2: \
*((__uint16_t *) __ts) = __c * 0x0101; \
__u->__usi = (unsigned short int) __c * 0x0101; \
break; \
\
case 13: \
*__ts++ = __c * 0x01010101; \
__u->__ui = __c * 0x01010101; \
__u = (void *) __u + 4; \
case 9: \
*__ts++ = __c * 0x01010101; \
__u->__ui = __c * 0x01010101; \
__u = (void *) __u + 4; \
case 5: \
*__ts++ = __c * 0x01010101; \
__u->__ui = __c * 0x01010101; \
__u = (void *) __u + 4; \
case 1: \
*((__uint8_t *) __ts) = __c; \
__u->__uc = (unsigned char) __c; \
break; \
\
case 16: \
*__ts++ = __c * 0x01010101; \
__u->__ui = __c * 0x01010101; \
__u = (void *) __u + 4; \
case 12: \
*__ts++ = __c * 0x01010101; \
__u->__ui = __c * 0x01010101; \
__u = (void *) __u + 4; \
case 8: \
*__ts++ = __c * 0x01010101; \
__u->__ui = __c * 0x01010101; \
__u = (void *) __u + 4; \
case 4: \
*__ts = __c * 0x01010101; \
__u->__ui = __c * 0x01010101; \
case 0: \
break; \
} \
@ -169,7 +186,7 @@ __STRING2_COPY_TYPE (8);
/* GCC optimizes memset(s, 0, n) but not bzero(s, n).
The optimization is broken before EGCS 1.1. */
#if __GNUC_PREREQ (2, 91)
# if __GNUC_PREREQ (2, 91)
# define __bzero(s, n) __builtin_memset (s, '\0', n)
# endif
@ -207,48 +224,60 @@ __mempcpy_small (void *__dest1,
__uint32_t __src0_4, __uint32_t __src4_4,
size_t __srclen)
{
char *__dest = (char *) __dest1;
union {
__uint32_t __ui;
__uint16_t __usi;
unsigned char __uc;
unsigned char __c;
} *__u = __dest1;
switch (__srclen)
{
case 1:
*__dest++ = __src0_1;
__u->__c = __src0_1;
__u = (void *) __u + 1;
break;
case 2:
*((__uint16_t *) __dest) = __src0_2;
__dest += 2;
__u->__usi = __src0_2;
__u = (void *) __u + 2;
break;
case 3:
*((__uint16_t *) __dest) = __src0_2;
__dest += 2;
*__dest++ = __src2_1;
__u->__usi = __src0_2;
__u = (void *) __u + 2;
__u->__c = __src2_1;
__u = (void *) __u + 1;
break;
case 4:
*((__uint32_t *) __dest) = __src0_4;
__dest += 4;
__u->__ui = __src0_4;
__u = (void *) __u + 4;
break;
case 5:
*((__uint32_t *) __dest) = __src0_4;
__dest += 4;
*__dest++ = __src4_1;
__u->__ui = __src0_4;
__u = (void *) __u + 4;
__u->__c = __src4_1;
__u = (void *) __u + 1;
break;
case 6:
*((__uint32_t *) __dest) = __src0_4;
*((__uint16_t *) (__dest + 4)) = __src4_2;
__dest += 6;
__u->__ui = __src0_4;
__u = (void *) __u + 4;
__u->__usi = __src4_2;
__u = (void *) __u + 2;
break;
case 7:
*((__uint32_t *) __dest) = __src0_4;
*((__uint16_t *) (__dest + 4)) = __src4_2;
__dest += 6;
*__dest++ = __src6_1;
__u->__ui = __src0_4;
__u = (void *) __u + 4;
__u->__usi = __src4_2;
__u = (void *) __u + 2;
__u->__c = __src6_1;
__u = (void *) __u + 1;
break;
case 8:
*((__uint32_t *) __dest) = __src0_4;
*((__uint32_t *) (__dest + 4)) = __src4_4;
__dest += 8;
__u->__ui = __src0_4;
__u = (void *) __u + 4;
__u->__ui = __src4_4;
__u = (void *) __u + 4;
break;
}
return (void *) __dest;
return (void *) __u;
}
# else
# define __mempcpy_args(src) \
@ -287,41 +316,50 @@ __STRING_INLINE void *__mempcpy_small (void *, char, __STRING2_COPY_ARR2,
__STRING2_COPY_ARR7,
__STRING2_COPY_ARR8, size_t);
__STRING_INLINE void *
__mempcpy_small (void *__dest1, char __src1,
__mempcpy_small (void *__dest, char __src1,
__STRING2_COPY_ARR2 __src2, __STRING2_COPY_ARR3 __src3,
__STRING2_COPY_ARR4 __src4, __STRING2_COPY_ARR5 __src5,
__STRING2_COPY_ARR6 __src6, __STRING2_COPY_ARR7 __src7,
__STRING2_COPY_ARR8 __src8, size_t __srclen)
{
char *__dest = (char *) __dest1;
union {
char __c;
__STRING2_COPY_ARR2 __sca2;
__STRING2_COPY_ARR3 __sca3;
__STRING2_COPY_ARR4 __sca4;
__STRING2_COPY_ARR5 __sca5;
__STRING2_COPY_ARR6 __sca6;
__STRING2_COPY_ARR7 __sca7;
__STRING2_COPY_ARR8 __sca8;
} *__u = __dest;
switch (__srclen)
{
case 1:
*__dest = __src1;
__u->__c = __src1;
break;
case 2:
__extension__ *((__STRING2_COPY_ARR2 *) __dest) = __src2;
__extension__ __u->__sca2 = __src2;
break;
case 3:
__extension__ *((__STRING2_COPY_ARR3 *) __dest) = __src3;
__extension__ __u->__sca3 = __src3;
break;
case 4:
__extension__ *((__STRING2_COPY_ARR4 *) __dest) = __src4;
__extension__ __u->__sca4 = __src4;
break;
case 5:
__extension__ *((__STRING2_COPY_ARR5 *) __dest) = __src5;
__extension__ __u->__sca5 = __src5;
break;
case 6:
__extension__ *((__STRING2_COPY_ARR6 *) __dest) = __src6;
__extension__ __u->__sca6 = __src6;
break;
case 7:
__extension__ *((__STRING2_COPY_ARR7 *) __dest) = __src7;
__extension__ __u->__sca7 = __src7;
break;
case 8:
__extension__ *((__STRING2_COPY_ARR8 *) __dest) = __src8;
__extension__ __u->__sca8 = __src8;
break;
}
return (void *) (__dest + __srclen);
return __extension__ ((void *) __u + __srclen);
}
# endif
# endif
@ -362,37 +400,48 @@ __strcpy_small (char *__dest,
__uint32_t __src0_4, __uint32_t __src4_4,
size_t __srclen)
{
union {
__uint32_t __ui;
__uint16_t __usi;
unsigned char __uc;
} *__u = (void *) __dest;
switch (__srclen)
{
case 1:
*__dest = '\0';
__u->__uc = '\0';
break;
case 2:
*((__uint16_t *) __dest) = __src0_2;
__u->__usi = __src0_2;
break;
case 3:
*((__uint16_t *) __dest) = __src0_2;
*(__dest + 2) = '\0';
__u->__usi = __src0_2;
__u = (void *) __u + 2;
__u->__uc = '\0';
break;
case 4:
*((__uint32_t *) __dest) = __src0_4;
__u->__ui = __src0_4;
break;
case 5:
*((__uint32_t *) __dest) = __src0_4;
*(__dest + 4) = '\0';
__u->__ui = __src0_4;
__u = (void *) __u + 4;
__u->__uc = '\0';
break;
case 6:
*((__uint32_t *) __dest) = __src0_4;
*((__uint16_t *) (__dest + 4)) = __src4_2;
__u->__ui = __src0_4;
__u = (void *) __u + 4;
__u->__usi = __src4_2;
break;
case 7:
*((__uint32_t *) __dest) = __src0_4;
*((__uint16_t *) (__dest + 4)) = __src4_2;
*(__dest + 6) = '\0';
__u->__ui = __src0_4;
__u = (void *) __u + 4;
__u->__usi = __src4_2;
__u = (void *) __u + 2;
__u->__uc = '\0';
break;
case 8:
*((__uint32_t *) __dest) = __src0_4;
*((__uint32_t *) (__dest + 4)) = __src4_4;
__u->__ui = __src0_4;
__u = (void *) __u + 4;
__u->__usi = __src4_4;
break;
}
return __dest;
@ -439,31 +488,41 @@ __strcpy_small (char *__dest,
__STRING2_COPY_ARR6 __src6, __STRING2_COPY_ARR7 __src7,
__STRING2_COPY_ARR8 __src8, size_t __srclen)
{
union {
char __c;
__STRING2_COPY_ARR2 __sca2;
__STRING2_COPY_ARR3 __sca3;
__STRING2_COPY_ARR4 __sca4;
__STRING2_COPY_ARR5 __sca5;
__STRING2_COPY_ARR6 __sca6;
__STRING2_COPY_ARR7 __sca7;
__STRING2_COPY_ARR8 __sca8;
} *__u = __dest;
switch (__srclen)
{
case 1:
*__dest = '\0';
__u->__c = '\0';
break;
case 2:
__extension__ *((__STRING2_COPY_ARR2 *) __dest) = __src2;
__extension__ __u->__sca2 = __src2;
break;
case 3:
__extension__ *((__STRING2_COPY_ARR3 *) __dest) = __src3;
__extension__ __u->__sca3 = __src3;
break;
case 4:
__extension__ *((__STRING2_COPY_ARR4 *) __dest) = __src4;
__extension__ __u->__sca4 = __src4;
break;
case 5:
__extension__ *((__STRING2_COPY_ARR5 *) __dest) = __src5;
__extension__ __u->__sca5 = __src5;
break;
case 6:
__extension__ *((__STRING2_COPY_ARR6 *) __dest) = __src6;
__extension__ __u->__sca6 = __src6;
break;
case 7:
__extension__ *((__STRING2_COPY_ARR7 *) __dest) = __src7;
__extension__ __u->__sca7 = __src7;
break;
case 8:
__extension__ *((__STRING2_COPY_ARR8 *) __dest) = __src8;
__extension__ __u->__sca8 = __src8;
break;
}
return __dest;
@ -500,47 +559,55 @@ __stpcpy_small (char *__dest,
__uint32_t __src0_4, __uint32_t __src4_4,
size_t __srclen)
{
union {
unsigned int __ui;
unsigned short int __usi;
unsigned char __uc;
} *__u = (void *) __dest;
switch (__srclen)
{
case 1:
*__dest = '\0';
__u->__uc = '\0';
break;
case 2:
*((__uint16_t *) __dest) = __src0_2;
++__dest;
__u->__usi = __src0_2;
__u = (void *) __u + 1;
break;
case 3:
*((__uint16_t *) __dest) = __src0_2;
__dest += sizeof (__uint16_t);
*__dest = '\0';
__u->__usi = __src0_2;
__u = (void *) __u + 2;
__u->__uc = '\0';
break;
case 4:
*((__uint32_t *) __dest) = __src0_4;
__dest += 3;
__u->__ui = __src0_4;
__u = (void *) __u + 3;
break;
case 5:
*((__uint32_t *) __dest) = __src0_4;
__dest += 4;
*__dest = '\0';
__u->__ui = __src0_4;
__u = (void *) __u + 4;
__u->__uc = '\0';
break;
case 6:
*((__uint32_t *) __dest) = __src0_4;
*((__uint16_t *) (__dest + 4)) = __src4_2;
__dest += 5;
__u->__ui = __src0_4;
__u = (void *) __u + 4;
__u->__usi = __src4_2;
__u = (void *) __u + 1;
break;
case 7:
*((__uint32_t *) __dest) = __src0_4;
*((__uint16_t *) (__dest + 4)) = __src4_2;
__dest += 6;
*__dest = '\0';
__u->__ui = __src0_4;
__u = (void *) __u + 4;
__u->__usi = __src4_2;
__u = (void *) __u + 2;
__u->__uc = '\0';
break;
case 8:
*((__uint32_t *) __dest) = __src0_4;
*((__uint32_t *) (__dest + 4)) = __src4_4;
__dest += 7;
__u->__ui = __src0_4;
__u = (void *) __u + 4;
__u->__ui = __src4_4;
__u = (void *) __u + 3;
break;
}
return __dest;
return &__u->__uc;
}
# else
# define __stpcpy_args(src) \
@ -584,31 +651,41 @@ __stpcpy_small (char *__dest,
__STRING2_COPY_ARR6 __src6, __STRING2_COPY_ARR7 __src7,
__STRING2_COPY_ARR8 __src8, size_t __srclen)
{
union {
char __c;
__STRING2_COPY_ARR2 __sca2;
__STRING2_COPY_ARR3 __sca3;
__STRING2_COPY_ARR4 __sca4;
__STRING2_COPY_ARR5 __sca5;
__STRING2_COPY_ARR6 __sca6;
__STRING2_COPY_ARR7 __sca7;
__STRING2_COPY_ARR8 __sca8;
} *__u = __dest;
switch (__srclen)
{
case 1:
*__dest = '\0';
__u->__uc = '\0';
break;
case 2:
__extension__ *((__STRING2_COPY_ARR2 *) __dest) = __src2;
__extension__ __u->__sca2 = __src2;
break;
case 3:
__extension__ *((__STRING2_COPY_ARR3 *) __dest) = __src3;
__extension__ __u->__sca3 = __src3;
break;
case 4:
__extension__ *((__STRING2_COPY_ARR4 *) __dest) = __src4;
__extension__ __u->__sca4 = __src4;
break;
case 5:
__extension__ *((__STRING2_COPY_ARR5 *) __dest) = __src5;
__extension__ __u->__sca5 = __src5;
break;
case 6:
__extension__ *((__STRING2_COPY_ARR6 *) __dest) = __src6;
__extension__ __u->__sca6 = __src6;
break;
case 7:
__extension__ *((__STRING2_COPY_ARR7 *) __dest) = __src7;
__extension__ __u->__sca7 = __src7;
break;
case 8:
__extension__ *((__STRING2_COPY_ARR8 *) __dest) = __src8;
__extension__ __u->__sca8 = __src8;
break;
}
return __dest + __srclen - 1;

View File

@ -155,12 +155,6 @@ extern void abort (), exit ();
#endif /* Standard headers. */
#ifdef HAVE_GETLOGIN_R
extern int getlogin_r __P ((char *, size_t));
#else
extern char *getlogin __P ((void));
#endif
#ifndef ANSI_STRING
# ifndef bzero
@ -286,6 +280,12 @@ extern char *alloca ();
# undef GLOB_PERIOD
#endif
#include <glob.h>
#ifdef HAVE_GETLOGIN_R
extern int getlogin_r __P ((char *, size_t));
#else
extern char *getlogin __P ((void));
#endif
static
#if __GNUC__ - 0 >= 2

View File

@ -54,59 +54,65 @@ __STRING_INLINE void *
__memcpy_c (void *__dest, __const void *__src, size_t __n)
{
register unsigned long int __d0, __d1, __d2;
union {
unsigned int __ui;
unsigned short int __usi;
unsigned char __uc;
} *__u = __dest;
switch (__n)
{
case 0:
return __dest;
case 1:
*(unsigned char *) __dest = *(const unsigned char *) __src;
__u->__uc = *(const unsigned char *) __src;
return __dest;
case 2:
*(unsigned short int *) __dest = *(const unsigned short int *) __src;
__u->__usi = *(const unsigned short int *) __src;
return __dest;
case 3:
*(unsigned short int *) __dest = *(const unsigned short int *) __src;
*(2 + (unsigned char *) __dest) = *(2 + (const unsigned char *) __src);
__u->__usi = *(const unsigned short int *) __src;
__u = (void *) __u + 2;
__u->__uc = *(2 + (const unsigned char *) __src);
return __dest;
case 4:
*(unsigned long int *) __dest = *(const unsigned long int *) __src;
__u->__ui = *(const unsigned int *) __src;
return __dest;
case 6: /* for ethernet addresses */
*(unsigned long int *) __dest = *(const unsigned long int *) __src;
*(2 + (unsigned short int *) __dest) =
*(2 + (const unsigned short int *) __src);
case 6:
__u->__ui = *(const unsigned int *) __src;
__u = (void *) __u + 4;
__u->__usi = *(2 + (const unsigned short int *) __src);
return __dest;
case 8:
*(unsigned long int *) __dest = *(const unsigned long int *) __src;
*(1 + (unsigned long int *) __dest) =
*(1 + (const unsigned long int *) __src);
__u->__ui = *(const unsigned int *) __src;
__u = (void *) __u + 4;
__u->__ui = *(1 + (const unsigned int *) __src);
return __dest;
case 12:
*(unsigned long int *) __dest = *(const unsigned long int *) __src;
*(1 + (unsigned long int *) __dest) =
*(1 + (const unsigned long int *) __src);
*(2 + (unsigned long int *) __dest) =
*(2 + (const unsigned long int *) __src);
__u->__ui = *(const unsigned int *) __src;
__u = (void *) __u + 4;
__u->__ui = *(1 + (const unsigned int *) __src);
__u = (void *) __u + 4;
__u->__ui = *(2 + (const unsigned int *) __src);
return __dest;
case 16:
*(unsigned long int *) __dest = *(const unsigned long int *) __src;
*(1 + (unsigned long int *) __dest) =
*(1 + (const unsigned long int *) __src);
*(2 + (unsigned long int *) __dest) =
*(2 + (const unsigned long int *) __src);
*(3 + (unsigned long int *) __dest) =
*(3 + (const unsigned long int *) __src);
__u->__ui = *(const unsigned int *) __src;
__u = (void *) __u + 4;
__u->__ui = *(1 + (const unsigned int *) __src);
__u = (void *) __u + 4;
__u->__ui = *(2 + (const unsigned int *) __src);
__u = (void *) __u + 4;
__u->__ui = *(3 + (const unsigned int *) __src);
return __dest;
case 20:
*(unsigned long int *) __dest = *(const unsigned long int *) __src;
*(1 + (unsigned long int *) __dest) =
*(1 + (const unsigned long int *) __src);
*(2 + (unsigned long int *) __dest) =
*(2 + (const unsigned long int *) __src);
*(3 + (unsigned long int *) __dest) =
*(3 + (const unsigned long int *) __src);
*(4 + (unsigned long int *) __dest) =
*(4 + (const unsigned long int *) __src);
__u->__ui = *(const unsigned int *) __src;
__u = (void *) __u + 4;
__u->__ui = *(1 + (const unsigned int *) __src);
__u = (void *) __u + 4;
__u->__ui = *(2 + (const unsigned int *) __src);
__u = (void *) __u + 4;
__u->__ui = *(3 + (const unsigned int *) __src);
__u = (void *) __u + 4;
__u->__ui = *(4 + (const unsigned int *) __src);
return __dest;
}
#define __COMMON_CODE(x) \
@ -115,7 +121,7 @@ __memcpy_c (void *__dest, __const void *__src, size_t __n)
"rep; movsl" \
x \
: "=&c" (__d0), "=&D" (__d1), "=&S" (__d2) \
: "0" (__n / 4), "1" (__dest), "2" (__src) \
: "0" (__n / 4), "1" (&__u->__uc), "2" (__src) \
: "memory");
switch (__n % 4)
@ -184,22 +190,28 @@ __STRING_INLINE void *
__memset_cc (void *__s, unsigned long int __pattern, size_t __n)
{
register unsigned long int __d0, __d1;
union {
unsigned int __ui;
unsigned short int __usi;
unsigned char __uc;
} *__u = __s;
switch (__n)
{
case 0:
return __s;
case 1:
*(unsigned char *) __s = __pattern;
__u->__uc = __pattern;
return __s;
case 2:
*(unsigned short int *) __s = __pattern;
__u->__usi = __pattern;
return __s;
case 3:
*(unsigned short int *) __s = __pattern;
*(2 + (unsigned char *) __s) = __pattern;
__u->__usi = __pattern;
__u = __extension__ ((void *) __u + 1);
__u->__uc = __pattern;
return __s;
case 4:
*(unsigned long *) __s = __pattern;
__u->__ui = __pattern;
return __s;
}
#define __COMMON_CODE(x) \
@ -208,7 +220,7 @@ __memset_cc (void *__s, unsigned long int __pattern, size_t __n)
"rep; stosl" \
x \
: "=&c" (__d0), "=&D" (__d1) \
: "a" (__pattern), "0" (__n / 4), "1" (__s) \
: "a" (__pattern), "0" (__n / 4), "1" (&__u->__uc) \
: "memory")
switch (__n % 4)

View File

@ -211,12 +211,17 @@ memcmp (__const void *__s1, __const void *__s2, size_t __n)
#define __memset_gc(s, c, n) \
({ void *__s = (s); \
unsigned int *__ts = (unsigned int *) __s; \
union { \
unsigned int __ui; \
unsigned short int __usi; \
unsigned char __uc; \
} *__u = __s; \
unsigned int __c = ((unsigned int) ((unsigned char) (c))) * 0x01010101; \
\
/* We apply a trick here. `gcc' would implement the following \
assignments using absolute operands. But this uses to much \
memory (7, instead of 4 bytes). */ \
assignments using immediate operands. But this uses to much \
memory (7, instead of 4 bytes). So we force the value in a \
registers. */ \
if (n == 3 || n >= 5) \
__asm__ __volatile__ ("" : "=r" (__c) : "0" (__c)); \
\
@ -224,44 +229,57 @@ memcmp (__const void *__s1, __const void *__s2, size_t __n)
switch (n) \
{ \
case 15: \
*__ts++ = __c; \
__u->__ui = __c; \
__u = (void *) __u + 4; \
case 11: \
*__ts++ = __c; \
__u->__ui = __c; \
__u = (void *) __u + 4; \
case 7: \
*__ts++ = __c; \
__u->__ui = __c; \
__u = (void *) __u + 4; \
case 3: \
*((unsigned short int *) __ts)++ = (unsigned short int) __c; \
*((unsigned char *) __ts) = (unsigned char) __c; \
__u->__usi = (unsigned short int) __c; \
__u = (void *) __u + 2; \
__u->__uc = (unsigned char) __c; \
break; \
\
case 14: \
*__ts++ = __c; \
__u->__ui = __c; \
__u = (void *) __u + 4; \
case 10: \
*__ts++ = __c; \
__u->__ui = __c; \
__u = (void *) __u + 4; \
case 6: \
*__ts++ = __c; \
__u->__ui = __c; \
__u = (void *) __u + 4; \
case 2: \
*((unsigned short int *) __ts) = (unsigned short int) __c; \
__u->__usi = (unsigned short int) __c; \
break; \
\
case 13: \
*__ts++ = __c; \
__u->__ui = __c; \
__u = (void *) __u + 4; \
case 9: \
*__ts++ = __c; \
__u->__ui = __c; \
__u = (void *) __u + 4; \
case 5: \
*__ts++ = __c; \
__u->__ui = __c; \
__u = (void *) __u + 4; \
case 1: \
*((unsigned char *) __ts) = (unsigned char) __c; \
__u->__uc = (unsigned char) __c; \
break; \
\
case 16: \
*__ts++ = __c; \
__u->__ui = __c; \
__u = (void *) __u + 4; \
case 12: \
*__ts++ = __c; \
__u->__ui = __c; \
__u = (void *) __u + 4; \
case 8: \
*__ts++ = __c; \
__u->__ui = __c; \
__u = (void *) __u + 4; \
case 4: \
*__ts = __c; \
__u->__ui = __c; \
case 0: \
break; \
} \
@ -494,48 +512,50 @@ __strlen_g (__const char *__str)
: __strcpy_g (dest, src)))
#define __strcpy_small(dest, src, srclen) \
(__extension__ ({ unsigned char *__dest = (unsigned char *) (dest); \
(__extension__ ({ char *__dest = (dest); \
union { \
unsigned int __ui; \
unsigned short int __usi; \
unsigned char __uc; \
char __c; \
} *__u = (void *) __dest; \
switch (srclen) \
{ \
case 1: \
*__dest = '\0'; \
__u->__uc = '\0'; \
break; \
case 2: \
*((unsigned short int *) __dest) = \
__STRING_SMALL_GET16 (src, 0); \
__u->__usi = __STRING_SMALL_GET16 (src, 0); \
break; \
case 3: \
*((unsigned short int *) __dest) = \
__STRING_SMALL_GET16 (src, 0); \
*(__dest + 2) = '\0'; \
__u->__usi = __STRING_SMALL_GET16 (src, 0); \
__u = (void *) __u + 2; \
__u->__uc = '\0'; \
break; \
case 4: \
*((unsigned int *) __dest) = \
__STRING_SMALL_GET32 (src, 0); \
__u->__ui = __STRING_SMALL_GET32 (src, 0); \
break; \
case 5: \
*((unsigned int *) __dest) = \
__STRING_SMALL_GET32 (src, 0); \
*(__dest + 4) = '\0'; \
__u->__ui = __STRING_SMALL_GET32 (src, 0); \
__u = (void *) __u + 4; \
__u->__uc = '\0'; \
break; \
case 6: \
*((unsigned int *) __dest) = \
__STRING_SMALL_GET32 (src, 0); \
*((unsigned short int *) (__dest + 4)) = \
__STRING_SMALL_GET16 (src, 4); \
__u->__ui = __STRING_SMALL_GET32 (src, 0); \
__u = (void *) __u + 4; \
__u->__usi = __STRING_SMALL_GET16 (src, 4); \
break; \
case 7: \
*((unsigned int *) __dest) = \
__STRING_SMALL_GET32 (src, 0); \
*((unsigned short int *) (__dest + 4)) = \
__STRING_SMALL_GET16 (src, 4); \
*(__dest + 6) = '\0'; \
__u->__ui = __STRING_SMALL_GET32 (src, 0); \
__u = (void *) __u + 4; \
__u->__usi = __STRING_SMALL_GET16 (src, 4); \
__u = (void *) __u + 2; \
__u->__uc = '\0'; \
break; \
case 8: \
*((unsigned int *) __dest) = \
__STRING_SMALL_GET32 (src, 0); \
*((unsigned int *) (__dest + 4)) = \
__STRING_SMALL_GET32 (src, 4); \
__u->__ui = __STRING_SMALL_GET32 (src, 0); \
__u = (void *) __u + 4; \
__u->__ui = __STRING_SMALL_GET32 (src, 4); \
break; \
} \
(char *) __dest; }))
@ -583,56 +603,56 @@ __strcpy_g (char *__dest, __const char *__src)
# define stpcpy(dest, src) __stpcpy (dest, src)
# define __stpcpy_small(dest, src, srclen) \
(__extension__ ({ unsigned char *__dest = (unsigned char *) (dest); \
(__extension__ ({ union { \
unsigned int __ui; \
unsigned short int __usi; \
unsigned char __uc; \
char __c; \
} *__u = (void *) (dest); \
switch (srclen) \
{ \
case 1: \
*__dest = '\0'; \
__u->__uc = '\0'; \
break; \
case 2: \
*((unsigned short int *) __dest) = \
__STRING_SMALL_GET16 (src, 0); \
++__dest; \
__u->__usi = __STRING_SMALL_GET16 (src, 0); \
__u = (void *) __u + 1; \
break; \
case 3: \
*((unsigned short int *) __dest)++ = \
__STRING_SMALL_GET16 (src, 0); \
*__dest = '\0'; \
__u->__usi = __STRING_SMALL_GET16 (src, 0); \
__u = (void *) __u + 2; \
__u->__uc = '\0'; \
break; \
case 4: \
*((unsigned int *) __dest) = \
__STRING_SMALL_GET32 (src, 0); \
__dest += 3; \
__u->__ui = __STRING_SMALL_GET32 (src, 0); \
__u = (void *) __u + 3; \
break; \
case 5: \
*((unsigned int *) __dest)++ = \
__STRING_SMALL_GET32 (src, 0); \
*__dest = '\0'; \
__u->__ui = __STRING_SMALL_GET32 (src, 0); \
__u = (void *) __u + 4; \
__u->__uc = '\0'; \
break; \
case 6: \
*((unsigned int *) __dest) = \
__STRING_SMALL_GET32 (src, 0); \
*((unsigned short int *) (__dest + 4)) = \
__STRING_SMALL_GET16 (src, 4); \
__dest += 5; \
__u->__ui = __STRING_SMALL_GET32 (src, 0); \
__u = (void *) __u + 4; \
__u->__usi = __STRING_SMALL_GET16 (src, 4); \
__u = (void *) __u + 1; \
break; \
case 7: \
*((unsigned int *) __dest) = \
__STRING_SMALL_GET32 (src, 0); \
*((unsigned short int *) (__dest + 4)) = \
__STRING_SMALL_GET16 (src, 4); \
__dest += 6; \
*__dest = '\0'; \
__u->__ui = __STRING_SMALL_GET32 (src, 0); \
__u = (void *) __u + 4; \
__u->__usi = __STRING_SMALL_GET16 (src, 4); \
__u = (void *) __u + 2; \
__u->__uc = '\0'; \
break; \
case 8: \
*((unsigned int *) __dest) = \
__STRING_SMALL_GET32 (src, 0); \
*((unsigned int *) (__dest + 4)) = \
__STRING_SMALL_GET32 (src, 4); \
__dest += 7; \
__u->__ui = __STRING_SMALL_GET32 (src, 0); \
__u = (void *) __u + 4; \
__u->__ui = __STRING_SMALL_GET32 (src, 4); \
__u = (void *) __u + 3; \
break; \
} \
(char *) __dest; }))
(char *) __u; }))
__STRING_INLINE char *__mempcpy_by4 (char *__dest, __const char *__src,
size_t __srclen);

View File

@ -176,6 +176,11 @@ __elf_machine_runtime_setup (struct link_map *map, int lazy, int profile)
? _dl_prof_resolve
: _dl_runtime_resolve);
if (profile && _dl_name_match_p (_dl_profile, map))
/* This is the object we are looking for. Say that we really
want profiling and the timers are started. */
_dl_profile_map = map;
if (lazy)
for (i = 0; i < num_plt_entries; i++)
{