1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-30 22:43:12 +03:00
2002-07-19  Ulrich Drepper  <drepper@redhat.com>

	* configure.in: Add test for __thread support in compiler.
	* config.h.in: Add HAVE___THREAD.
	* Makefile (headers): Remove errno.h, sys/errno.h, and bits/errno.h.
	* include/sys/errno.h: Moved to...
	* stdlib/sys/errno.h: ...here.  New file.
	* stdlib/errno.h: New file.  Moved from...
	* include/errno.h: ...here.  Changed into an internal header defining
	libc-local things like __set_errno.
	* stdlib/Makefile (headers): Add errno.h, sys/errno.h, and
	bits/errno.h.
	* elf/dl-minimal.c: Include <tls.h>.  Define errno as thread-local
	variable if USE_TLS && HAVE___THREAD.  Don't define __errno_location
	either.
	* elf/rtld.c (_dl_start): Add code to initialize TLS for ld.so
	from...
	(_dl_start_final): ...here.  Add code to initialize tls elements from
	bootstrap_map.
	* sysdeps/generic/errno-loc.c: Define errno as thread-local variable
	if USE_TLS && HAVE___THREAD.
	* sysdeps/generic/bits/errno.h: Remove __set_errno definition.
	* sysdeps/mach/hurd/bits/errno.h: Likewise.
	* sysdeps/standalone/arm/bits/errno.h: Likewise.
	* sysdeps/standalone/bits/errno.h: Likewise.
	* sysdeps/unix/bsd/bsd4.4/bits/errno.h: Likewise.
	* sysdeps/unix/sysv/aix/bits/errno.h: Likewise.
	* sysdeps/unix/sysv/hpux/bits/errno.h: Likewise.
	* sysdeps/unix/sysv/linux/bits/errno.h: Likewise.
	* sysdeps/unix/sysv/linux/hppa/bits/errno.h: Likewise.
	* sysdeps/unix/sysv/linux/mips/bits/errno.h: Likewise.
	* sysdeps/unix/sysv/sysv4/solaris2/bits/errno.h: Likewise.
	* sysdeps/i386/dl-machine.c (elf_machine_rel) [RTLD_BOOTSTRAP]: Don't
	use GL(dl_rtld_map), use map parameter.
	* sysdeps/sh/dl-machine.h (elf_machine_rela): Likewise.
	* sysdeps/unix/sysv/linux/i386/sysdep.S: Define errno in .tbss if
	USE_TLS && HAVE___THREAD.
	* sysdeps/unix/sysv/linux/i386/sysdep.h: Unify SETUP_PIC_REG
	definitions.  If USE_TLS && HAVE___THREAD store errooor value using
	TLS code sequence.
	* sysdeps/unix/sysv/linux/i386/i686/sysdep.h: Likewise.

	* sysdeps/unix/sysv/linux/getcwd.c: No real need to restore errno.
	* sysdeps/unix/sysv/linux/grantpt.c: Likewise.
	* sysdeps/unix/sysv/linux/internal_statvfs.c: Likewise.
	* sysdeps/unix/sysv/linux/msgctl.c: Likewise.
	* sysdeps/unix/sysv/linux/readv.c: Likewise.
	* sysdeps/unix/sysv/linux/writev.c: Likewise.
This commit is contained in:
Ulrich Drepper
2002-07-20 01:14:41 +00:00
parent 9df63767d4
commit 739d440d2a
41 changed files with 447 additions and 350 deletions

View File

@ -32,17 +32,9 @@
# define ECANCELED 125
# ifndef __ASSEMBLER__
/* We now need a declaration of the `errno' variable. */
extern int errno;
/* Function to get address of global `errno' variable. */
extern int *__errno_location (void) __THROW __attribute__ ((__const__));
# if defined _LIBC
/* We wouldn't need a special macro anymore but it is history. */
# define __set_errno(val) (*__errno_location ()) = (val)
# endif /* _LIBC */
# if !defined _LIBC || defined _LIBC_REENTRANT
/* When using threads, errno is a per-thread value. */
# define errno (*__errno_location ())

View File

@ -1,5 +1,5 @@
/* Determine current working directory. Linux version.
Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
Copyright (C) 1997, 1998, 1999, 2000, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@ -64,7 +64,6 @@ static int have_new_dcache = 1;
char *
__getcwd (char *buf, size_t size)
{
int save_errno;
char *path;
int n;
char *result;
@ -93,8 +92,6 @@ __getcwd (char *buf, size_t size)
return NULL;
}
save_errno = errno;
#if defined __NR_getcwd || __LINUX_GETCWD_SYSCALL > 0
if (!no_syscall_getcwd)
{
@ -137,8 +134,6 @@ __getcwd (char *buf, size_t size)
free (path);
return NULL;
}
__set_errno (save_errno);
# endif
}
#endif
@ -179,10 +174,6 @@ __getcwd (char *buf, size_t size)
have_new_dcache = 0;
#endif
/* Something went wrong. Restore the error number and use the generic
version. */
__set_errno (save_errno);
/* Don't put restrictions on the length of the path unless the user does. */
if (size == 0)
{

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc.
/* Copyright (C) 1998, 1999, 2001, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -56,12 +56,13 @@ grantpt (int fd)
if (__libc_fcntl (fd, F_GETFD) == -1 && errno == EBADF)
return -1;
__set_errno (save_errno);
/* If the filedescriptor is no TTY, grantpt has to set errno
to EINVAL. */
if (errno == ENOTTY)
if (save_errno == ENOTTY)
__set_errno (EINVAL);
else
__set_errno (save_errno);
return -1;
}

View File

@ -29,17 +29,9 @@
# define ECANCELED 125
# ifndef __ASSEMBLER__
/* We now need a declaration of the `errno' variable. */
extern int errno;
/* Function to get address of global `errno' variable. */
extern int *__errno_location (void) __THROW __attribute__ ((__const__));
# if defined _LIBC
/* We wouldn't need a special macro anymore but it is history. */
# define __set_errno(val) (*__errno_location ()) = (val)
# endif /* _LIBC */
# if !defined _LIBC || defined _LIBC_REENTRANT
/* When using threads, errno is a per-thread value. */
# define errno (*__errno_location ())

View File

@ -30,32 +30,44 @@
#ifdef PIC
# undef SYSCALL_ERROR_HANDLER
/* Store (- %eax) into errno through the GOT. */
# ifdef _LIBC_REENTRANT
# ifndef HAVE_HIDDEN
# define SETUP_PIC_REG \
# undef SETUP_PIC_REG
# ifndef HAVE_HIDDEN
# define SETUP_PIC_REG(reg) \
call 1f; \
.subsection 1; \
1:movl (%esp), %ebx; \
1:movl (%esp), %e##reg; \
ret; \
.previous
# else
# define SETUP_PIC_REG \
.section .gnu.linkonce.t.__i686.get_pc_thunk.bx,"ax",@progbits; \
.globl __i686.get_pc_thunk.bx; \
.hidden __i686.get_pc_thunk.bx; \
.type __i686.get_pc_thunk.bx,@function; \
__i686.get_pc_thunk.bx: \
movl (%esp), %ebx; \
# else
# define SETUP_PIC_REG(reg) \
.section .gnu.linkonce.t.__i686.get_pc_thunk.reg,"ax",@progbits; \
.globl __i686.get_pc_thunk.reg; \
.hidden __i686.get_pc_thunk.reg; \
.type __i686.get_pc_thunk.reg,@function; \
__i686.get_pc_thunk.reg: \
movl (%esp), %e##reg; \
ret; \
.previous; \
call __i686.get_pc_thunk.bx
# endif
call __i686.get_pc_thunk.reg
# endif
# define SYSCALL_ERROR_HANDLER \
/* Store (- %eax) into errno through the GOT. */
# ifdef _LIBC_REENTRANT
# if USE_TLS && HAVE___THREAD
# define SYSCALL_ERROR_HANDLER \
0:SETUP_PIC_REG (cx); \
addl $_GLOBAL_OFFSET_TABLE_, %ecx; \
xorl %edx, %edx; \
subl %eax, %edx; \
movl %gs:0, %eax; \
subl errno@gottpoff(%ecx), %eax; \
movl %edx, (%eax); \
orl $-1, %eax; \
jmp L(pseudo_end);
# else
# define SYSCALL_ERROR_HANDLER \
0:pushl %ebx; \
SETUP_PIC_REG; \
SETUP_PIC_REG(bx); \
addl $_GLOBAL_OFFSET_TABLE_, %ebx; \
xorl %edx, %edx; \
subl %eax, %edx; \
@ -70,30 +82,10 @@ __i686.get_pc_thunk.bx: \
jmp L(pseudo_end);
/* A quick note: it is assumed that the call to `__errno_location' does
not modify the stack! */
# else
# ifndef HAVE_HIDDEN
# define SETUP_PIC_REG \
call 1f; \
.subsection 1; \
1:movl (%esp), %ecx; \
ret; \
.previous
# else
# define SETUP_PIC_REG \
.section .gnu.linkonce.t.__i686.get_pc_thunk.cx,"ax",@progbits; \
.globl __i686.get_pc_thunk.cx; \
.hidden __i686.get_pc_thunk.cx; \
.type __i686.get_pc_thunk.cx,@function; \
__i686.get_pc_thunk.cx: \
movl (%esp), %ecx; \
ret; \
.previous; \
call __i686.get_pc_thunk.cx
# endif
# else
# define SYSCALL_ERROR_HANDLER \
0:SETUP_PIC_REG; \
0:SETUP_PIC_REG(cx); \
addl $_GLOBAL_OFFSET_TABLE_, %ecx; \
xorl %edx, %edx; \
subl %eax, %edx; \

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
/* Copyright (C) 1995, 1996, 1997, 1998, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -17,6 +17,7 @@
02111-1307 USA. */
#include <sysdep.h>
#include <tls.h>
/* Because the Linux version is in fact i386/ELF and the start.? file
for this system (sysdeps/i386/elf/start.S) is also used by The Hurd
@ -25,13 +26,21 @@
it somewhere else.
...and this place is here. */
#if USE_TLS && HAVE___THREAD
.section .tbss
#else
.bss
#endif
.globl errno
.type errno,@object
.size errno,4
.globl _errno
.type _errno,@object
.size _errno,4
.align 4
errno:
_errno:
.space 4
weak_alias (errno, _errno)
/* The following code is only used in the shared library when we
compile the reentrant version. Otherwise each system call defines

View File

@ -24,6 +24,7 @@
#include <sysdeps/unix/i386/sysdep.h>
#include <bp-sym.h>
#include <bp-asm.h>
#include <tls.h>
/* For Linux we can use the system call table in the header file
/usr/include/asm/unistd.h
@ -72,34 +73,47 @@
END (name)
#ifndef PIC
#define SYSCALL_ERROR_HANDLER /* Nothing here; code in sysdep.S is used. */
# define SYSCALL_ERROR_HANDLER /* Nothing here; code in sysdep.S is used. */
#else
/* Store (- %eax) into errno through the GOT. */
#ifdef _LIBC_REENTRANT
# ifndef HAVE_HIDDEN
# define SETUP_PIC_REG \
# define SETUP_PIC_REG(reg) \
call 1f; \
.subsection 1; \
1:movl (%esp), %ebx; \
1:movl (%esp), %e##reg; \
ret; \
.previous
# else
# define SETUP_PIC_REG \
.section .gnu.linkonce.t.__i686.get_pc_thunk.bx,"ax",@progbits; \
.globl __i686.get_pc_thunk.bx; \
.hidden __i686.get_pc_thunk.bx; \
.type __i686.get_pc_thunk.bx,@function; \
__i686.get_pc_thunk.bx: \
movl (%esp), %ebx; \
# define SETUP_PIC_REG(reg) \
.section .gnu.linkonce.t.__i686.get_pc_thunk.reg,"ax",@progbits; \
.globl __i686.get_pc_thunk.reg; \
.hidden __i686.get_pc_thunk.reg; \
.type __i686.get_pc_thunk.reg,@function; \
__i686.get_pc_thunk.reg: \
movl (%esp), %e##reg; \
ret; \
.previous; \
call __i686.get_pc_thunk.bx
call __i686.get_pc_thunk.reg
# endif
#define SYSCALL_ERROR_HANDLER \
/* Store (- %eax) into errno through the GOT. */
# ifdef _LIBC_REENTRANT
# if USE_TLS && HAVE___THREAD
# define SYSCALL_ERROR_HANDLER \
0:SETUP_PIC_REG (cx); \
addl $_GLOBAL_OFFSET_TABLE_, %ecx; \
xorl %edx, %edx; \
subl %eax, %edx; \
movl %gs:0, %eax; \
subl errno@gottpoff(%ecx), %eax; \
movl %edx, (%eax); \
orl $-1, %eax; \
jmp L(pseudo_end);
# else
# define SYSCALL_ERROR_HANDLER \
0:pushl %ebx; \
SETUP_PIC_REG; \
SETUP_PIC_REG (bx); \
addl $_GLOBAL_OFFSET_TABLE_, %ebx; \
xorl %edx, %edx; \
subl %eax, %edx; \
@ -114,30 +128,10 @@ __i686.get_pc_thunk.bx: \
jmp L(pseudo_end);
/* A quick note: it is assumed that the call to `__errno_location' does
not modify the stack! */
#else
# ifndef HAVE_HIDDEN
# define SETUP_PIC_REG \
call 1f; \
.subsection 1; \
1:movl (%esp), %ecx; \
ret; \
.previous
# endif
# else
# define SETUP_PIC_REG \
.section .gnu.linkonce.t.__i686.get_pc_thunk.cx,"ax",@progbits; \
.globl __i686.get_pc_thunk.cx; \
.hidden __i686.get_pc_thunk.cx; \
.type __i686.get_pc_thunk.cx,@function; \
__i686.get_pc_thunk.cx: \
movl (%esp), %ecx; \
ret; \
.previous; \
call __i686.get_pc_thunk.cx
# endif
#define SYSCALL_ERROR_HANDLER \
0:define SETUP_PIC_REG; \
# define SYSCALL_ERROR_HANDLER \
0:define SETUP_PIC_REG(cx); \
addl $_GLOBAL_OFFSET_TABLE_, %ecx; \
xorl %edx, %edx; \
subl %eax, %edx; \
@ -145,7 +139,7 @@ __i686.get_pc_thunk.cx: \
movl %edx, (%ecx); \
orl $-1, %eax; \
jmp L(pseudo_end);
#endif /* _LIBC_REENTRANT */
# endif /* _LIBC_REENTRANT */
#endif /* PIC */
/* Linux takes system call arguments in registers:

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
/* Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
@ -53,7 +53,6 @@
buf->f_flag = 0;
if (STAT (&st) >= 0)
{
int save_errno = errno;
struct mntent mntbuf;
FILE *mtab;
@ -104,6 +103,4 @@
/* Close the file. */
__endmntent (mtab);
}
__set_errno (save_errno);
}

View File

@ -28,17 +28,9 @@
# define ENOTSUP EOPNOTSUPP
# ifndef __ASSEMBLER__
/* We now need a declaration of the `errno' variable. */
extern int errno;
/* Function to get address of global `errno' variable. */
extern int *__errno_location (void) __THROW __attribute__ ((__const__));
# if defined _LIBC
/* We wouldn't need a special macro anymore but it is history. */
# define __set_errno(val) (*__errno_location ()) = (val)
# endif /* _LIBC */
# if !defined _LIBC || defined _LIBC_REENTRANT
/* When using threads, errno is a per-thread value. */
# define errno (*__errno_location ())

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1995, 1997, 1998, 2000 Free Software Foundation, Inc.
/* Copyright (C) 1995, 1997, 1998, 2000, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
@ -80,7 +80,7 @@ __new_msgctl (int msqid, int cmd, struct msqid_ds *buf)
}
{
int save_errno = errno, result;
int result;
struct __old_msqid_ds old;
/* Unfortunately there is no way how to find out for sure whether
@ -90,7 +90,6 @@ __new_msgctl (int msqid, int cmd, struct msqid_ds *buf)
if (result != -1 || errno != EINVAL)
return result;
__set_errno(save_errno);
if (cmd == IPC_SET)
{
old.msg_perm.uid = buf->msg_perm.uid;

View File

@ -1,5 +1,5 @@
/* readv supports all Linux kernels >= 2.0.
Copyright (C) 1997, 1998, 2000 Free Software Foundation, Inc.
Copyright (C) 1997, 1998, 2000, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -45,7 +45,6 @@ __readv (fd, vector, count)
const struct iovec *vector;
int count;
{
int errno_saved = errno;
ssize_t bytes_read;
bytes_read = INLINE_SYSCALL (readv, 3, fd, CHECK_N (vector, count), count);
@ -53,9 +52,6 @@ __readv (fd, vector, count)
if (bytes_read >= 0 || errno != EINVAL || count <= UIO_FASTIOV)
return bytes_read;
/* Restore the old error value as if nothing happened. */
__set_errno (errno_saved);
return __atomic_readv_replacement (fd, vector, count);
}
weak_alias (__readv, readv)

View File

@ -1,5 +1,5 @@
/* writev supports all Linux kernels >= 2.0.
Copyright (C) 1997, 1998, 2000 Free Software Foundation, Inc.
Copyright (C) 1997, 1998, 2000, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -45,7 +45,6 @@ __writev (fd, vector, count)
const struct iovec *vector;
int count;
{
int errno_saved = errno;
ssize_t bytes_written;
bytes_written = INLINE_SYSCALL (writev, 3, fd, CHECK_N (vector, count), count);
@ -53,9 +52,6 @@ __writev (fd, vector, count)
if (bytes_written >= 0 || errno != EINVAL || count <= UIO_FASTIOV)
return bytes_written;
/* Restore the old error value as if nothing happened. */
__set_errno (errno_saved);
return __atomic_writev_replacement (fd, vector, count);
}
weak_alias (__writev, writev)