mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-16 08:00:05 +00:00
Update.
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:
parent
b0fd6165c7
commit
e7c5513dcd
31
ChangeLog
31
ChangeLog
@ -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
|
||||
|
8
abi-tags
8
abi-tags
@ -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.
|
||||
|
@ -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 */
|
||||
|
@ -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. */
|
||||
|
@ -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
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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: \
|
||||
|
@ -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>
|
||||
|
@ -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)
|
||||
|
@ -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 */
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user