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>
* login/Makefile (distribute): Remove pty-internal.h, add

View File

@ -6,9 +6,9 @@
# earlier entries taking precedence over later entries. So loose patterns
# at the end of the list can give defaults.
# The ABI tag values we use are 32-bit quantities stored in machine byte order.
# Conventionally the high-order byte indicates the OS and the low three
# bytes form a version number associated with a particular ABI version.
# The ABI tags we use are four 32-bit integers. The first of these
# is the operating-system number, the next three are the revision number
# of the first compatible kernel.
# After the configuration regexp, four integers in C syntax appear
# surrounded by any whitespace or punctuation, one for each byte, MSB first.
@ -20,7 +20,7 @@
.*-.*-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
# 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,
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) \
.section sectname, sectflags; \
.align 4; /* Notes are 4-byte aligned. */ \
.long 1f - 0f; /* 32-bit word: length of name field */ \
.long 3f - 2f; /* 32-bit word: length of desc field */ \
.long (type); /* 32-bit word: vendor-defined type field */ \
0: .asciz name; /* null-terminated string, any length: name */\
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. */
offset length contents
0 4 length of name
4 4 length of data
8 4 note type
12 (0) vendor name
- null-terminated ASCII string, padded to 4-byte alignment
12+(0) (4) note data,
#define ELF_NOTE_END \
3: .align 4 /* Pad to 4-byte align the next note. */
/* The linker (GNU ld 2.8 and later) recognize an allocated section whose
name begins with `.note' and creates a PT_NOTE program header entry
pointing at it.
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. */
The GNU project and cooperating development efforts (including the
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
number (0=Hurd, 1=Linux, 2=Solaris, ...) and the remaining three
identify the earliest release of that OS that supports this ABI.
See abi-tags (top level) for details. */
#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")
.long ABI_TAG
ELF_NOTE_END
.section ".note.ABI-tag", "a"
.align 4
.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. */
# define strcasecmp __strcasecmp
# define mempcpy __mempcpy
# ifndef mempcpy
# define mempcpy __mempcpy
# endif
# define HAVE_MEMPCPY 1
/* 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
-rm -f $@
$(LN_S) $< $@
$(patsubst %/,cd % &&,$(objpfx)) \
$(LN_S) $(<F) $(@F)
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.
$(objpfx)libieee.a: $(objpfx)ieee-math.o
rm -f $@
$(LN_S) $< $@
$(patsubst %/,cd % &&,$(objpfx)) \
$(LN_S) $(<F) $(@F)
ifeq ($(build-shared),yes)
$(addprefix $(objpfx),$(tests)): $(objpfx)libm.so$(libm.so-version)

View File

@ -101,6 +101,151 @@ __STRING2_COPY_TYPE (8);
#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. */
#ifndef _HAVE_STRING_ARCH_strcpy
# define strcpy(dest, src) \
@ -274,7 +419,7 @@ __STRING2_COPY_TYPE (8);
case 5: \
*((__uint32_t *) __dest) = \
__STRING2_SMALL_GET32 (src, 0); \
__dest += sizeof (__uint32_t); \
__dest += 4; \
*__dest = '\0'; \
break; \
case 6: \

View File

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

View File

@ -1,7 +1,7 @@
/* Copy memory to memory until the specified number of bytes
has been copied, return pointer to following byte.
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.
Contributed by Torbjorn Granlund (tege@sics.se).
@ -25,6 +25,7 @@
#include <pagecopy.h>
#undef mempcpy
#undef __mempcpy
void *
__mempcpy (dstpp, srcpp, len)

View File

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

View File

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

View File

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