1998-09-21 10:00  Ulrich Drepper  <drepper@cygnus.com>

	* string/bits/string2.h: Add mempcpy optimization.
	* sysdeps/generic/mempcpy.c: Undefined __mempcpy.
	* intl/localealias.c: Define mempcpy only if not already defined.

	* sysdeps/i386/i486/bits/string.h: Define ffsl only if not already
	defined.

1998-09-20 10:48 -0400  Zack Weinberg  <zack@rabi.phys.columbia.edu>

	* csu/abi-note.S: Emit the note directly instead of defining
	a preprocessor macro that's only used once.  Don't include sysdep.h.
	* abi-tags: Generalize Solaris entry.

1998-09-18  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* sysdeps/unix/bsd/getpt.c (__libc_ptyname1, __libc_ptyname2):
	Change to array to avoid runtime relocation.
	* sysdeps/unix/sysv/linux/ptsname.c: Update declarations.

1998-09-21 12:22  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* malloc/Makefile ($(objpfx)libmcheck.a): Fix use of $(LN_S).
	* math/Makefile ($(objpfx)libieee.a): Likewise.

1998-09-21  Ulrich Drepper  <drepper@cygnus.com>

	* sysdeps/generic/getpt.c: Fix order of argument to weak_alias.
	Patch by John Tobey <jtobey@banta-im.com>.
This commit is contained in:
Ulrich Drepper 1998-09-21 14:34:13 +00:00
parent b0fd6165c7
commit e7c5513dcd
12 changed files with 249 additions and 65 deletions

View File

@ -1,3 +1,34 @@
1998-09-21 10:00 Ulrich Drepper <drepper@cygnus.com>
* string/bits/string2.h: Add mempcpy optimization.
* sysdeps/generic/mempcpy.c: Undefined __mempcpy.
* intl/localealias.c: Define mempcpy only if not already defined.
* sysdeps/i386/i486/bits/string.h: Define ffsl only if not already
defined.
1998-09-20 10:48 -0400 Zack Weinberg <zack@rabi.phys.columbia.edu>
* csu/abi-note.S: Emit the note directly instead of defining
a preprocessor macro that's only used once. Don't include sysdep.h.
* abi-tags: Generalize Solaris entry.
1998-09-18 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* sysdeps/unix/bsd/getpt.c (__libc_ptyname1, __libc_ptyname2):
Change to array to avoid runtime relocation.
* sysdeps/unix/sysv/linux/ptsname.c: Update declarations.
1998-09-21 12:22 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* malloc/Makefile ($(objpfx)libmcheck.a): Fix use of $(LN_S).
* math/Makefile ($(objpfx)libieee.a): Likewise.
1998-09-21 Ulrich Drepper <drepper@cygnus.com>
* sysdeps/generic/getpt.c: Fix order of argument to weak_alias.
Patch by John Tobey <jtobey@banta-im.com>.
1998-09-20 Ulrich Drepper <drepper@cygnus.com> 1998-09-20 Ulrich Drepper <drepper@cygnus.com>
* login/Makefile (distribute): Remove pty-internal.h, add * login/Makefile (distribute): Remove pty-internal.h, add

View File

@ -6,9 +6,9 @@
# earlier entries taking precedence over later entries. So loose patterns # earlier entries taking precedence over later entries. So loose patterns
# at the end of the list can give defaults. # at the end of the list can give defaults.
# The ABI tag values we use are 32-bit quantities stored in machine byte order. # The ABI tags we use are four 32-bit integers. The first of these
# Conventionally the high-order byte indicates the OS and the low three # is the operating-system number, the next three are the revision number
# bytes form a version number associated with a particular ABI version. # of the first compatible kernel.
# After the configuration regexp, four integers in C syntax appear # After the configuration regexp, four integers in C syntax appear
# surrounded by any whitespace or punctuation, one for each byte, MSB first. # surrounded by any whitespace or punctuation, one for each byte, MSB first.
@ -20,7 +20,7 @@
.*-.*-gnu-gnu.* 1 0.0.0 .*-.*-gnu-gnu.* 1 0.0.0
sparc-sun-solaris2.* 2 2.0.0 # just an arbitrary value .*-sun-solaris2.* 2 2.0.0 # just an arbitrary value
# There is no catch-all default here because every supported OS that uses # There is no catch-all default here because every supported OS that uses
# ELF must have its own unique ABI tag. # ELF must have its own unique ABI tag.

View File

@ -26,44 +26,46 @@
write to the Free Software Foundation, 59 Temple Place - Suite 330, write to the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */ Boston, MA 02111-1307, USA. */
#include <sysdep.h> /* Define an ELF note identifying the operating-system ABI that the
executable was created for. The ELF note information identifies a
particular OS or coordinated development effort within which the
ELF header's e_machine value plus (for dynamically linked programs)
the PT_INTERP dynamic linker name and DT_NEEDED shared library
names fully identify the runtime environment required by an
executable.
/* The basic layout of note sections is specified by the ELF format. */ The general format of ELF notes is as follows.
Offsets and lengths are bytes or (parenthetical references) to the
values in other fields.
#define ELF_NOTE_BEGIN(sectname, sectflags, type, name) \ offset length contents
.section sectname, sectflags; \ 0 4 length of name
.align 4; /* Notes are 4-byte aligned. */ \ 4 4 length of data
.long 1f - 0f; /* 32-bit word: length of name field */ \ 8 4 note type
.long 3f - 2f; /* 32-bit word: length of desc field */ \ 12 (0) vendor name
.long (type); /* 32-bit word: vendor-defined type field */ \ - null-terminated ASCII string, padded to 4-byte alignment
0: .asciz name; /* null-terminated string, any length: name */\ 12+(0) (4) note data,
1: .align 4; /* Name data padded to 4-byte alignment. */ \
2: /* Here follows the "note descriptor" data, whose format \
is not specified by ELF. The vendor name and type field \
indicate what sort of data is found here. */
#define ELF_NOTE_END \ The GNU project and cooperating development efforts (including the
3: .align 4 /* Pad to 4-byte align the next note. */ Linux community) use note type 1 and a vendor name string of "GNU"
for a note descriptor that indicates ABI requirements. The note data
is four 32-bit words. The first of these is an operating system
/* The linker (GNU ld 2.8 and later) recognize an allocated section whose number (0=Hurd, 1=Linux, 2=Solaris, ...) and the remaining three
name begins with `.note' and creates a PT_NOTE program header entry identify the earliest release of that OS that supports this ABI.
pointing at it. See abi-tags (top level) for details. */
Such a program header is the canonical way (at least in the free OS
community) to identify the OS environment ABI that the executable was
created for. The ELF note information identifies a particular OS or
coordinated development effort within which the ELF header's e_machine
value plus (for dynamically linked programs) the PT_INTERP dynamic
linker name and DT_NEEDED shared library names fully identify the
runtime environment required by an executable.
The GNU project and cooperating development efforts (including the Linux
community) use a vendor name string of "GNU", and a note type field with
value 1 for a note descriptor that indicates ABI requirements. */
#include <abi-tag.h> /* OS-specific ABI tag value */ #include <abi-tag.h> /* OS-specific ABI tag value */
/* The linker (GNU ld 2.8 and later) recognizes an allocated section whose
name begins with `.note' and creates a PT_NOTE program header entry
pointing at it. */
ELF_NOTE_BEGIN(".note.ABI-tag", "a", 1, "GNU") .section ".note.ABI-tag", "a"
.long ABI_TAG .align 4
ELF_NOTE_END .long 1f - 0f /* name length */
.long 3f - 2f /* data length */
.long 1 /* note type */
0: .asciz "GNU" /* vendor name */
1: .align 4
2: .long ABI_TAG /* note data: the ABI tag */
3: .align 4 /* pad out section */

View File

@ -83,7 +83,9 @@ void free ();
file and the name space must not be polluted. */ file and the name space must not be polluted. */
# define strcasecmp __strcasecmp # define strcasecmp __strcasecmp
# define mempcpy __mempcpy # ifndef mempcpy
# define mempcpy __mempcpy
# endif
# define HAVE_MEMPCPY 1 # define HAVE_MEMPCPY 1
/* We need locking here since we can be called from different places. */ /* We need locking here since we can be called from different places. */

View File

@ -64,7 +64,8 @@ include ../Rules
$(objpfx)libmcheck.a: $(objpfx)mcheck-init.o $(objpfx)libmcheck.a: $(objpfx)mcheck-init.o
-rm -f $@ -rm -f $@
$(LN_S) $< $@ $(patsubst %/,cd % &&,$(objpfx)) \
$(LN_S) $(<F) $(@F)
lib: $(objpfx)libmcheck.a lib: $(objpfx)libmcheck.a

View File

@ -140,7 +140,8 @@ override CFLAGS += -Wno-uninitialized -Wno-write-strings
# It's not a library to make sure it is linked in instead of s_lib_version.o. # It's not a library to make sure it is linked in instead of s_lib_version.o.
$(objpfx)libieee.a: $(objpfx)ieee-math.o $(objpfx)libieee.a: $(objpfx)ieee-math.o
rm -f $@ rm -f $@
$(LN_S) $< $@ $(patsubst %/,cd % &&,$(objpfx)) \
$(LN_S) $(<F) $(@F)
ifeq ($(build-shared),yes) ifeq ($(build-shared),yes)
$(addprefix $(objpfx),$(tests)): $(objpfx)libm.so$(libm.so-version) $(addprefix $(objpfx),$(tests)): $(objpfx)libm.so$(libm.so-version)

View File

@ -101,6 +101,151 @@ __STRING2_COPY_TYPE (8);
#endif #endif
/* Copy N bytes from SRC to DEST, returning pointer to byte following the
last copied. */
#ifdef __USE_GNU
# ifndef _HAVE_STRING_ARCH_mempcpy
# define __mempcpy(dest, src, n) \
(__extension__ (__builtin_constant_p (src) && __builtin_constant_p (n) \
&& __string2_1bptr_p (src) && n <= 8 \
? __mempcpy_small (dest, src, n) \
: __mempcpy (dest, src, n)))
/* 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)
# if _STRING_ARCH_unaligned
# define __mempcpy_small(dest, src, srclen) \
(__extension__ ({ char *__dest = (char *) (dest); \
switch (srclen) \
{ \
case 1: \
*__dest++ = *(char *) src; \
break; \
case 2: \
*((__uint16_t *) __dest) = \
__STRING2_SMALL_GET16 (src, 0); \
__dest += 2; \
break; \
case 3: \
*((__uint16_t *) __dest) = \
__STRING2_SMALL_GET16 (src, 0); \
__dest += sizeof (__uint16_t); \
*__dest++ = ((char *) src)[2]; \
break; \
case 4: \
*((__uint32_t *) __dest) = \
__STRING2_SMALL_GET32 (src, 0); \
__dest += 4; \
break; \
case 5: \
*((__uint32_t *) __dest) = \
__STRING2_SMALL_GET32 (src, 0); \
__dest += 4; \
*__dest++ = ((char *) src)[4]; \
break; \
case 6: \
*((__uint32_t *) __dest) = \
__STRING2_SMALL_GET32 (src, 0); \
*((__uint16_t *) (__dest + 4)) = \
__STRING2_SMALL_GET16 (src, 4); \
__dest += 6; \
break; \
case 7: \
*((__uint32_t *) __dest) = \
__STRING2_SMALL_GET32 (src, 0); \
*((__uint16_t *) (__dest + 4)) = \
__STRING2_SMALL_GET16 (src, 4); \
__dest += 6; \
*__dest++ = ((char *) src)[6]; \
break; \
case 8: \
*((__uint32_t *) __dest) = \
__STRING2_SMALL_GET32 (src, 0); \
*((__uint32_t *) (__dest + 4)) = \
__STRING2_SMALL_GET32 (src, 4); \
__dest += 8; \
break; \
} \
__dest; }))
# else
# define __mempcpy_small(dest, src, srclen) \
(__extension__ ({ char *__dest = (char *) (dest); \
switch (srclen) \
{ \
case 1: \
*__dest = '\0'; \
break; \
case 2: \
*((__STRING2_COPY_ARR2 *) __dest) = \
((__STRING2_COPY_ARR2) \
{ { ((__const char *) (src))[0], \
((__const char *) (src))[1] } }); \
break; \
case 3: \
*((__STRING2_COPY_ARR3 *) __dest) = \
((__STRING2_COPY_ARR3) \
{ { ((__const char *) (src))[0], \
((__const char *) (src))[1], \
((__const char *) (src))[2] } }); \
break; \
case 4: \
*((__STRING2_COPY_ARR4 *) __dest) = \
((__STRING2_COPY_ARR4) \
{ { ((__const char *) (src))[0], \
((__const char *) (src))[1], \
((__const char *) (src))[2], \
((__const char *) (src))[3] } }); \
break; \
case 5: \
*((__STRING2_COPY_ARR5 *) __dest) = \
((__STRING2_COPY_ARR5) \
{ { ((__const char *) (src))[0], \
((__const char *) (src))[1], \
((__const char *) (src))[2], \
((__const char *) (src))[3], \
((__const char *) (src))[4] } }); \
break; \
case 6: \
*((__STRING2_COPY_ARR6 *) __dest) = \
((__STRING2_COPY_ARR6) \
{ { ((__const char *) (src))[0], \
((__const char *) (src))[1], \
((__const char *) (src))[2], \
((__const char *) (src))[3], \
((__const char *) (src))[4], \
((__const char *) (src))[5] } }); \
break; \
case 7: \
*((__STRING2_COPY_ARR7 *) __dest) = \
((__STRING2_COPY_ARR7) \
{ { ((__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] } }); \
break; \
case 8: \
*((__STRING2_COPY_ARR8 *) __dest) = \
((__STRING2_COPY_ARR8) \
{ { ((__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] } }); \
break; \
} \
__dest + (srclen); }))
# endif
# endif
#endif
/* Copy SRC to DEST. */ /* Copy SRC to DEST. */
#ifndef _HAVE_STRING_ARCH_strcpy #ifndef _HAVE_STRING_ARCH_strcpy
# define strcpy(dest, src) \ # define strcpy(dest, src) \
@ -274,7 +419,7 @@ __STRING2_COPY_TYPE (8);
case 5: \ case 5: \
*((__uint32_t *) __dest) = \ *((__uint32_t *) __dest) = \
__STRING2_SMALL_GET32 (src, 0); \ __STRING2_SMALL_GET32 (src, 0); \
__dest += sizeof (__uint32_t); \ __dest += 4; \
*__dest = '\0'; \ *__dest = '\0'; \
break; \ break; \
case 6: \ case 6: \

View File

@ -28,7 +28,7 @@ __getpt ()
__set_errno (ENOSYS); __set_errno (ENOSYS);
return -1; return -1;
} }
weak_alias (getpt, __getpt) weak_alias (__getpt, getpt)
stub_warning (getpt) stub_warning (getpt)
#include <stub-tag.h> #include <stub-tag.h>

View File

@ -1,7 +1,7 @@
/* Copy memory to memory until the specified number of bytes /* Copy memory to memory until the specified number of bytes
has been copied, return pointer to following byte. has been copied, return pointer to following byte.
Overlap is NOT handled correctly. Overlap is NOT handled correctly.
Copyright (C) 1991, 1997 Free Software Foundation, Inc. Copyright (C) 1991, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Torbjorn Granlund (tege@sics.se). Contributed by Torbjorn Granlund (tege@sics.se).
@ -25,6 +25,7 @@
#include <pagecopy.h> #include <pagecopy.h>
#undef mempcpy #undef mempcpy
#undef __mempcpy
void * void *
__mempcpy (dstpp, srcpp, len) __mempcpy (dstpp, srcpp, len)

View File

@ -1582,7 +1582,9 @@ __strstr_g (__const char *__haystack, __const char *__needle)
: "rm" (word), "1" (-1)); \ : "rm" (word), "1" (-1)); \
__cnt + 1; })) __cnt + 1; }))
# define ffsl(word) ffs(word) # ifndef ffsl
# define ffsl(word) ffs(word)
# endif
# endif /* i686 */ # endif /* i686 */
#endif /* BSD || X/Open */ #endif /* BSD || X/Open */

View File

@ -31,13 +31,13 @@
#ifndef PTYNAME1 #ifndef PTYNAME1
#define PTYNAME1 "pqrsPQRS" #define PTYNAME1 "pqrsPQRS"
#endif #endif
const char *__libc_ptyname1 = PTYNAME1; const char __libc_ptyname1[] = PTYNAME1;
/* Letters indicating the position within a series. */ /* Letters indicating the position within a series. */
#ifndef PTYNAME2 #ifndef PTYNAME2
#define PTYNAME2 "0123456789abcdefghijklmnopqrstuv"; #define PTYNAME2 "0123456789abcdefghijklmnopqrstuv";
#endif #endif
const char *__libc_ptyname2 = PTYNAME2; const char __libc_ptyname2[] = PTYNAME2;
/* Open a master pseudo terminal and return its file descriptor. */ /* Open a master pseudo terminal and return its file descriptor. */
@ -47,32 +47,31 @@ __getpt (void)
char buf[sizeof (_PATH_PTY) + 2]; char buf[sizeof (_PATH_PTY) + 2];
const char *p, *q; const char *p, *q;
char *s; char *s;
s = __stpcpy (buf, _PATH_PTY);
s[0] = '?';
s[1] = '?';
s[2] = 0;
for (p = __libc_ptyname1; *p; p++) s = __mempcpy (buf, _PATH_PTY, sizeof (_PATH_PTY) - 1);
/* s[0] and s[1] will be filled in the loop. */
s[2] = '\0';
for (p = __libc_ptyname1; *p != '\0'; ++p)
{ {
s[0] = *p; s[0] = *p;
for (q = __libc_ptyname2; *q; q++) for (q = __libc_ptyname2; *q != '\0'; ++q)
{ {
int fd; int fd;
s[1] = *q; s[1] = *q;
fd = __open (buf, O_RDWR); fd = __open (buf, O_RDWR);
if (fd != -1) if (fd != -1)
{ {
if (__isatty (fd)) if (__isatty (fd))
return fd; return fd;
__close (fd); __close (fd);
continue; continue;
} }
if (errno != EIO) if (errno != EIO)
return -1; return -1;
} }

View File

@ -33,8 +33,8 @@
#define _PATH_DEVPTS "/dev/pts/" #define _PATH_DEVPTS "/dev/pts/"
/* The are declared in getpt.c. */ /* The are declared in getpt.c. */
extern const char *__libc_ptyname1; extern const char __libc_ptyname1[];
extern const char *__libc_ptyname2; extern const char __libc_ptyname2[];
/* Static buffer for `ptsname'. */ /* Static buffer for `ptsname'. */
static char buffer[sizeof (_PATH_DEVPTS) + 20]; static char buffer[sizeof (_PATH_DEVPTS) + 20];
@ -59,7 +59,7 @@ __ptsname_r (int fd, char *buf, size_t buflen)
int save_errno = errno; int save_errno = errno;
struct stat st; struct stat st;
int ptyno; int ptyno;
if (buf == NULL) if (buf == NULL)
{ {
__set_errno (EINVAL); __set_errno (EINVAL);
@ -97,7 +97,7 @@ __ptsname_r (int fd, char *buf, size_t buflen)
#endif #endif
{ {
char *p; char *p;
if (buflen < strlen (_PATH_TTY) + 3) if (buflen < strlen (_PATH_TTY) + 3)
{ {
__set_errno (ERANGE); __set_errno (ERANGE);
@ -116,13 +116,13 @@ __ptsname_r (int fd, char *buf, size_t buflen)
__set_errno (ENOTTY); __set_errno (ENOTTY);
return ENOTTY; return ENOTTY;
} }
p = __stpcpy (buf, _PATH_TTY); p = __stpcpy (buf, _PATH_TTY);
p[0] = __libc_ptyname1[ptyno / 16]; p[0] = __libc_ptyname1[ptyno / 16];
p[1] = __libc_ptyname2[ptyno % 16]; p[1] = __libc_ptyname2[ptyno % 16];
p[2] = '\0'; p[2] = '\0';
} }
if (__stat (buf, &st) < 0) if (__stat (buf, &st) < 0)
return errno; return errno;