diff options
54 files changed, 339 insertions, 997 deletions
diff --git a/ChangeLog b/ChangeLog index 4654e17985..17c9dcdb19 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,43 @@ 2011-09-10 Ulrich Drepper <drepper@gmail.com> + * include/tls.h: Removed. USE___THREAD must always be defined. + * bits/libc-tsd.h: Don't handle !USE___THREAD. + * elf/dl-libc.c: Likewise. + * elf/dl-tsd.c: Likewise. + * include/errno.h: Likewise. + * include/netdb.h: Likewise. + * include/resolv.h: Likewise. + * inet/herrno-loc.c: Likewise. + * inet/herrno.c: Likewise. + * malloc/arena.c: Likewise. + * malloc/hooks.c: Likewise. + * malloc/malloc.c: Likewise. + * resolv/res-state.c: Likewise. + * resolv/res_libc.c: Likewise. + * sysdeps/i386/dl-machine.h: Likewise. + * sysdeps/ia64/dl-machine.h: Likewise. + * sysdeps/powerpc/powerpc32/dl-machine.h: Likewise. + * sysdeps/powerpc/powerpc64/dl-machine.h: Likewise. + * sysdeps/s390/s390-32/dl-machine.h: Likewise. + * sysdeps/s390/s390-64/dl-machine.h: Likewise. + * sysdeps/sh/dl-machine.h: Likewise. + * sysdeps/sparc/sparc32/dl-machine.h: Likewise. + * sysdeps/sparc/sparc64/dl-machine.h: Likewise. + * sysdeps/unix/i386/sysdep.S: Likewise. + * sysdeps/unix/sysv/linux/i386/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/ia64/sysdep.S: Likewise. + * sysdeps/unix/sysv/linux/s390/s390-32/sysdep.S: Likewise. + * sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/s390/s390-64/sysdep.S: Likewise. + * sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/sh/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/x86_64/sysdep.h: Likewise. + * sysdeps/unix/x86_64/sysdep.S: Likewise. + * sysdeps/x86_64/dl-machine.h: Likewise. + * tls.make.c: Likewise. + * configure.in: Remove --with-__thread option. Make tests for --no-whole-archive, __builtin_expect, symbol redirection, __thread, tls_model attribute fail if no support is available. Remove diff --git a/bits/libc-tsd.h b/bits/libc-tsd.h index 1a24b701b9..d1118a5bae 100644 --- a/bits/libc-tsd.h +++ b/bits/libc-tsd.h @@ -1,5 +1,5 @@ /* libc-internal interface for thread-specific data. Stub or TLS version. - Copyright (C) 1998,2001,2002,2008 Free Software Foundation, Inc. + Copyright (C) 1998,2001,2002,2008,2011 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 @@ -24,12 +24,12 @@ set of thread-specific `void *' data used only internally by libc. __libc_tsd_define(CLASS, TYPE, KEY) -- Define or declare a datum with TYPE - for KEY. CLASS can be `static' for + for KEY. CLASS can be `static' for keys used in only one source file, empty for global definitions, or `extern' for global declarations. __libc_tsd_address(TYPE, KEY) -- Return the `TYPE *' pointing to - the current thread's datum for KEY. + the current thread's datum for KEY. __libc_tsd_get(TYPE, KEY) -- Return the `TYPE' datum for KEY. __libc_tsd_set(TYPE, KEY, VALUE) -- Set the datum for KEY to VALUE. @@ -51,20 +51,11 @@ We don't define an enum for the possible key values, because the KEYs translate directly into variables by macro magic. */ -#if USE___THREAD -# define __libc_tsd_define(CLASS, TYPE, KEY) \ +#define __libc_tsd_define(CLASS, TYPE, KEY) \ CLASS __thread TYPE __libc_tsd_##KEY attribute_tls_model_ie; -# define __libc_tsd_address(TYPE, KEY) (&__libc_tsd_##KEY) -# define __libc_tsd_get(TYPE, KEY) (__libc_tsd_##KEY) -# define __libc_tsd_set(TYPE, KEY, VALUE) (__libc_tsd_##KEY = (VALUE)) -#else -# define __libc_tsd_define(CLASS, TYPE, KEY) \ - CLASS TYPE __libc_tsd_##KEY##_data; - -# define __libc_tsd_address(TYPE, KEY) (&__libc_tsd_##KEY##_data) -# define __libc_tsd_get(TYPE, KEY) (__libc_tsd_##KEY##_data) -# define __libc_tsd_set(TYPE, KEY, VALUE) (__libc_tsd_##KEY##_data = (VALUE)) -#endif +#define __libc_tsd_address(TYPE, KEY) (&__libc_tsd_##KEY) +#define __libc_tsd_get(TYPE, KEY) (__libc_tsd_##KEY) +#define __libc_tsd_set(TYPE, KEY, VALUE) (__libc_tsd_##KEY = (VALUE)) #endif /* bits/libc-tsd.h */ diff --git a/csu/errno-loc.c b/csu/errno-loc.c index 633590f4f9..f7de2b7b08 100644 --- a/csu/errno-loc.c +++ b/csu/errno-loc.c @@ -1,6 +1,6 @@ /* MT support function to get address of `errno' variable, non-threaded version. - Copyright (C) 1996, 1998, 2002, 2004 Free Software Foundation, Inc. + Copyright (C) 1996, 1998, 2002, 2004, 2011 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 @@ -21,15 +21,7 @@ #include <errno.h> #include <tls.h> -#if ! USE___THREAD && !RTLD_PRIVATE_ERRNO -#undef errno -extern int errno; -#endif - int * -#if ! USE___THREAD -weak_const_function -#endif __errno_location (void) { return &errno; diff --git a/csu/errno.c b/csu/errno.c index 03d661b717..d5d2c98fb7 100644 --- a/csu/errno.c +++ b/csu/errno.c @@ -1,5 +1,5 @@ /* Definition of `errno' variable. Canonical version. - Copyright (C) 2002, 2004 Free Software Foundation, Inc. + Copyright (C) 2002, 2004, 2011 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 @@ -27,27 +27,10 @@ /* Code compiled for rtld refers only to this name. */ int rtld_errno attribute_hidden; -#elif USE___THREAD +#else __thread int errno; extern __thread int __libc_errno __attribute__ ((alias ("errno"))) attribute_hidden; -#else - -/* This differs from plain `int errno;' in that it doesn't create - a common definition, but a plain symbol that resides in .bss, - which can have an alias. */ -int errno __attribute__ ((nocommon)); -strong_alias (errno, _errno) - -/* We declare these with compat_symbol so that they are not visible at - link time. Programs must use the accessor functions. RTLD is special, - since it's not exported from there at any time. */ -# if defined HAVE_ELF && defined SHARED && defined DO_VERSIONING -# include <shlib-compat.h> -compat_symbol (libc, errno, errno, GLIBC_2_0); -compat_symbol (libc, _errno, _errno, GLIBC_2_0); -# endif - #endif diff --git a/elf/dl-libc.c b/elf/dl-libc.c index 828588a8b1..f44fa10e0e 100644 --- a/elf/dl-libc.c +++ b/elf/dl-libc.c @@ -307,22 +307,19 @@ libc_freeres_fn (free_mem) } } - if (USE___THREAD || GL(dl_tls_dtv_slotinfo_list) != NULL) - { - /* Free the memory allocated for the dtv slotinfo array. We can do - this only if all modules which used this memory are unloaded. */ + /* Free the memory allocated for the dtv slotinfo array. We can do + this only if all modules which used this memory are unloaded. */ #ifdef SHARED - if (GL(dl_initial_dtv) == NULL) - /* There was no initial TLS setup, it was set up later when - it used the normal malloc. */ - free_slotinfo (&GL(dl_tls_dtv_slotinfo_list)); - else + if (GL(dl_initial_dtv) == NULL) + /* There was no initial TLS setup, it was set up later when + it used the normal malloc. */ + free_slotinfo (&GL(dl_tls_dtv_slotinfo_list)); + else #endif - /* The first element of the list does not have to be deallocated. - It was allocated in the dynamic linker (i.e., with a different - malloc), and in the static library it's in .bss space. */ - free_slotinfo (&GL(dl_tls_dtv_slotinfo_list)->next); - } + /* The first element of the list does not have to be deallocated. + It was allocated in the dynamic linker (i.e., with a different + malloc), and in the static library it's in .bss space. */ + free_slotinfo (&GL(dl_tls_dtv_slotinfo_list)->next); void *scope_free_list = GL(dl_scope_free_list); GL(dl_scope_free_list) = NULL; diff --git a/elf/dl-tsd.c b/elf/dl-tsd.c index f01f8d652e..ea0fccd989 100644 --- a/elf/dl-tsd.c +++ b/elf/dl-tsd.c @@ -1,5 +1,5 @@ /* Thread-local data used by error handling for runtime dynamic linker. - Copyright (C) 2002, 2005 Free Software Foundation, Inc. + Copyright (C) 2002, 2005, 2011 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 @@ -30,17 +30,13 @@ void ** __attribute__ ((const)) _dl_initial_error_catch_tsd (void) { -# if USE___THREAD static __thread void *data; -# else - static void *data; -# endif return &data; } void **(*_dl_error_catch_tsd) (void) __attribute__ ((const)) = &_dl_initial_error_catch_tsd; -# elif USE___THREAD +# else /* libpthread sets _dl_error_catch_tsd to point to this function. We define it here instead of in libpthread so that it doesn't diff --git a/include/errno.h b/include/errno.h index 80c7b6ec13..98c6080528 100644 --- a/include/errno.h +++ b/include/errno.h @@ -21,15 +21,13 @@ extern int rtld_errno attribute_hidden; # include <tls.h> -# if USE___THREAD -# undef errno -# ifndef NOT_IN_libc -# define errno __libc_errno -# else -# define errno errno /* For #ifndef errno tests. */ -# endif -extern __thread int errno attribute_tls_model_ie; +# undef errno +# ifndef NOT_IN_libc +# define errno __libc_errno +# else +# define errno errno /* For #ifndef errno tests. */ # endif +extern __thread int errno attribute_tls_model_ie; # endif /* RTLD_PRIVATE_ERRNO */ diff --git a/include/netdb.h b/include/netdb.h index 9bbe31b438..d5154c51d9 100644 --- a/include/netdb.h +++ b/include/netdb.h @@ -2,29 +2,19 @@ #include <resolv/netdb.h> /* Macros for accessing h_errno from inside libc. */ +# undef h_errno # ifdef _LIBC_REENTRANT # include <tls.h> -# if USE___THREAD -# undef h_errno -# ifndef NOT_IN_libc -# define h_errno __libc_h_errno -# else -# define h_errno h_errno /* For #ifndef h_errno tests. */ -# endif -extern __thread int h_errno attribute_tls_model_ie; -# define __set_h_errno(x) (h_errno = (x)) +# ifndef NOT_IN_libc +# define h_errno __libc_h_errno # else -static inline int -__set_h_errno (int __err) -{ - return *__h_errno_location () = __err; -} +# define h_errno h_errno /* For #ifndef h_errno tests. */ # endif +extern __thread int h_errno attribute_tls_model_ie; # else -# undef h_errno -# define __set_h_errno(x) (h_errno = (x)) extern int h_errno; # endif /* _LIBC_REENTRANT */ +# define __set_h_errno(x) (h_errno = (x)) libc_hidden_proto (hstrerror) libc_hidden_proto (innetgr) diff --git a/include/resolv.h b/include/resolv.h index 7ab7f8779d..30ea8776b5 100644 --- a/include/resolv.h +++ b/include/resolv.h @@ -15,14 +15,12 @@ # ifdef _LIBC_REENTRANT # include <tls.h> -# if USE___THREAD -# undef _res -# ifndef NOT_IN_libc -# define __resp __libc_resp -# endif -# define _res (*__resp) -extern __thread struct __res_state *__resp attribute_tls_model_ie; +# undef _res +# ifndef NOT_IN_libc +# define __resp __libc_resp # endif +# define _res (*__resp) +extern __thread struct __res_state *__resp attribute_tls_model_ie; # else # ifndef __BIND_NOSTATIC # undef _res diff --git a/include/tls.h b/include/tls.h deleted file mode 100644 index 8ee2b947be..0000000000 --- a/include/tls.h +++ /dev/null @@ -1,18 +0,0 @@ -/* This file defines USE___THREAD to 1 or 0 to cut down on the #if mess. */ - -#ifndef _include_tls_h -#define _include_tls_h 1 - -#include_next <tls.h> - -#if !defined NOT_IN_libc || defined IS_IN_libpthread - -# define USE___THREAD 1 - -#else - -# define USE___THREAD 0 - -#endif - -#endif diff --git a/inet/herrno-loc.c b/inet/herrno-loc.c index fd6deeb330..1c2002bee4 100644 --- a/inet/herrno-loc.c +++ b/inet/herrno-loc.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996, 97, 98, 2002 Free Software Foundation, Inc. +/* Copyright (C) 1996, 97, 98, 2002, 2011 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 @@ -19,10 +19,6 @@ #include <netdb.h> #include <tls.h> -#if ! USE___THREAD -# undef h_errno -extern int h_errno; -#endif /* When threaded, h_errno may be a per-thread variable. */ int * diff --git a/inet/herrno.c b/inet/herrno.c index 9ff30a191b..59706cdc05 100644 --- a/inet/herrno.c +++ b/inet/herrno.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996,97,98,2002,2003 Free Software Foundation, Inc. +/* Copyright (C) 1996,97,98,2002,2003,2011 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 @@ -25,23 +25,7 @@ /* We need to have the error status variable of the resolver accessible in the libc. */ -#if USE___THREAD __thread int h_errno; extern __thread int __libc_h_errno __attribute__ ((alias ("h_errno"))) attribute_hidden; -# define h_errno __libc_h_errno -#else -/* This differs from plain `int h_errno;' in that it doesn't create - a common definition, but a plain symbol that resides in .bss, - which can have an alias. */ -int h_errno __attribute__((section (".bss"))); -weak_alias (h_errno, _h_errno) - -/* We declare these with compat_symbol so that they are not - visible at link time. Programs must use the accessor functions. */ -# if defined HAVE_ELF && defined SHARED && defined DO_VERSIONING -# include <shlib-compat.h> -compat_symbol (libc, h_errno, h_errno, GLIBC_2_0); -compat_symbol (libc, _h_errno, _h_errno, GLIBC_2_0); -# endif -#endif +#define h_errno __libc_h_errno diff --git a/malloc/arena.c b/malloc/arena.c index 29d8b2da47..aab55352f7 100644 --- a/malloc/arena.c +++ b/malloc/arena.c @@ -173,10 +173,6 @@ int __malloc_initialized = -1; static __malloc_ptr_t (*save_malloc_hook) (size_t __size, __const __malloc_ptr_t); -# if !defined _LIBC || (defined SHARED && !USE___THREAD) -static __malloc_ptr_t (*save_memalign_hook) (size_t __align, size_t __size, - __const __malloc_ptr_t); -# endif static void (*save_free_hook) (__malloc_ptr_t __ptr, __const __malloc_ptr_t); static Void_t* save_arena; @@ -432,34 +428,6 @@ __failing_morecore (ptrdiff_t d) extern struct dl_open_hook *_dl_open_hook; libc_hidden_proto (_dl_open_hook); # endif - -# if defined SHARED && !USE___THREAD -/* This is called by __pthread_initialize_minimal when it needs to use - malloc to set up the TLS state. We cannot do the full work of - ptmalloc_init (below) until __pthread_initialize_minimal has finished, - so it has to switch to using the special startup-time hooks while doing - those allocations. */ -void -__libc_malloc_pthread_startup (bool first_time) -{ - if (first_time) - { - ptmalloc_init_minimal (); - save_malloc_hook = __malloc_hook; - save_memalign_hook = __memalign_hook; - save_free_hook = __free_hook; - __malloc_hook = malloc_starter; - __memalign_hook = memalign_starter; - __free_hook = free_starter; - } - else - { - __malloc_hook = save_malloc_hook; - __memalign_hook = save_memalign_hook; - __free_hook = save_free_hook; - } -} -# endif #endif static void @@ -475,14 +443,7 @@ ptmalloc_init (void) if(__malloc_initialized >= 0) return; __malloc_initialized = 0; -#ifdef _LIBC -# if defined SHARED && !USE___THREAD - /* ptmalloc_init_minimal may already have been called via - __libc_malloc_pthread_startup, above. */ - if (mp_.pagesize == 0) -# endif -#endif - ptmalloc_init_minimal(); + ptmalloc_init_minimal(); mutex_init(&main_arena.mutex); main_arena.next = &main_arena; diff --git a/malloc/hooks.c b/malloc/hooks.c index 4b1a996eb7..403024c416 100644 --- a/malloc/hooks.c +++ b/malloc/hooks.c @@ -417,7 +417,7 @@ memalign_check(alignment, bytes, caller) #ifndef NO_THREADS # ifdef _LIBC -# if USE___THREAD || !defined SHARED +# ifndef SHARED /* These routines are never needed in this configuration. */ # define NO_STARTER # endif diff --git a/malloc/malloc.c b/malloc/malloc.c index dccb6cc4fd..d7af63dae5 100644 --- a/malloc/malloc.c +++ b/malloc/malloc.c @@ -1649,19 +1649,7 @@ static Void_t* realloc_check(Void_t* oldmem, size_t bytes, static Void_t* memalign_check(size_t alignment, size_t bytes, const Void_t *caller); #ifndef NO_THREADS -# ifdef _LIBC -# if USE___THREAD || !defined SHARED - /* These routines are never needed in this configuration. */ -# define NO_STARTER -# endif -# endif -# ifdef NO_STARTER -# undef NO_STARTER -# else -static Void_t* malloc_starter(size_t sz, const Void_t *caller); -static Void_t* memalign_starter(size_t aln, size_t sz, const Void_t *caller); -static void free_starter(Void_t* mem, const Void_t *caller); -# endif +/* These routines are never needed in this configuration. */ static Void_t* malloc_atfork(size_t sz, const Void_t *caller); static void free_atfork(Void_t* mem, const Void_t *caller); #endif diff --git a/nptl/ChangeLog b/nptl/ChangeLog index 3b94006eef..56f4d1dccc 100644 --- a/nptl/ChangeLog +++ b/nptl/ChangeLog @@ -1,5 +1,20 @@ 2011-09-10 Ulrich Drepper <drepper@gmail.com> + * sysdeps/unix/sysv/linux/i386/i486/sem_post.S: Don't handle + !USE___THREAD. + * sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S: Likewise. + * sysdeps/unix/sysv/linux/i386/i486/sem_trywait.S: Likewise. + * sysdeps/unix/sysv/linux/i386/i486/sem_wait.S: Likewise. + * sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/sh/sem_post.S: Likewise. + * sysdeps/unix/sysv/linux/sh/sem_timedwait.S: Likewise. + * sysdeps/unix/sysv/linux/sh/sem_trywait.S: Likewise. + * sysdeps/unix/sysv/linux/sh/sem_wait.S: Likewise. + * sysdeps/unix/sysv/linux/x86_64/sem_post.S: Likewise. + * sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S: Likewise. + * sysdeps/unix/sysv/linux/x86_64/sem_trywait.S: Likewise. + * sysdeps/unix/sysv/linux/x86_64/sem_wait.S: Likewise. + * tst-tls1.c: Support for __thread is now mandatory. * tst-tls2.c: Likewise. * tst-tls3.c: Likewise. diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_post.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_post.S index 86992c877e..9f3e63520f 100644 --- a/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_post.S +++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_post.S @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2003, 2005, 2007, 2008 Free Software Foundation, Inc. +/* Copyright (C) 2002,2003,2005,2007,2008,2011 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. @@ -81,18 +81,13 @@ __new_sem_post: 4: #endif addl $_GLOBAL_OFFSET_TABLE_, %ebx -#if USE___THREAD -# ifdef NO_TLS_DIRECT_SEG_REFS +#ifdef NO_TLS_DIRECT_SEG_REFS movl errno@gotntpoff(%ebx), %edx addl %gs:0, %edx movl $EINVAL, (%edx) -# else +#else movl errno@gotntpoff(%ebx), %edx movl $EINVAL, %gs:(%edx) -# endif -#else - call __errno_location@plt - movl $EINVAL, (%eax) #endif orl $-1, %eax @@ -107,18 +102,13 @@ __new_sem_post: 5: #endif addl $_GLOBAL_OFFSET_TABLE_, %ebx -#if USE___THREAD -# ifdef NO_TLS_DIRECT_SEG_REFS +#ifdef NO_TLS_DIRECT_SEG_REFS movl errno@gotntpoff(%ebx), %edx addl %gs:0, %edx movl $EOVERFLOW, (%edx) -# else +#else movl errno@gotntpoff(%ebx), %edx movl $EOVERFLOW, %gs:(%edx) -# endif -#else - call __errno_location@plt - movl $EOVERFLOW, (%eax) #endif orl $-1, %eax diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S index 18013a8df4..ee46ab9363 100644 --- a/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S +++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_timedwait.S @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2003, 2004, 2005, 2007, 2009 Free Software Foundation, Inc. +/* Copyright (C) 2002-2005, 2007, 2009, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. @@ -154,18 +154,13 @@ sem_timedwait: 4: #endif addl $_GLOBAL_OFFSET_TABLE_, %ebx -#if USE___THREAD -# ifdef NO_TLS_DIRECT_SEG_REFS +#ifdef NO_TLS_DIRECT_SEG_REFS movl errno@gotntpoff(%ebx), %edx addl %gs:0, %edx movl %esi, (%edx) -# else +#else movl errno@gotntpoff(%ebx), %edx movl %esi, %gs:(%edx) -# endif -#else - call __errno_location@plt - movl %esi, (%eax) #endif movl 28(%esp), %ebx /* Load semaphore address. */ diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_trywait.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_trywait.S index 2d49934f02..18adb9a092 100644 --- a/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_trywait.S +++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_trywait.S @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2003, 2005, 2007 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2003, 2005, 2007, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. @@ -49,18 +49,13 @@ __new_sem_trywait: 3: #endif addl $_GLOBAL_OFFSET_TABLE_, %ecx -#if USE___THREAD -# ifdef NO_TLS_DIRECT_SEG_REFS +#ifdef NO_TLS_DIRECT_SEG_REFS movl errno@gotntpoff(%ecx), %edx addl %gs:0, %edx movl $EAGAIN, (%edx) -# else +#else movl errno@gotntpoff(%ecx), %edx movl $EAGAIN, %gs:(%edx) -# endif -#else - call __errno_location@plt - movl $EAGAIN, (%eax) #endif orl $-1, %eax ret diff --git a/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_wait.S b/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_wait.S index 93c0a64a9e..fb8a398430 100644 --- a/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_wait.S +++ b/nptl/sysdeps/unix/sysv/linux/i386/i486/sem_wait.S @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2003, 2005, 2007 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2003, 2005, 2007, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. @@ -114,18 +114,13 @@ __new_sem_wait: 8: #endif addl $_GLOBAL_OFFSET_TABLE_, %ebx -#if USE___THREAD -# ifdef NO_TLS_DIRECT_SEG_REFS +#ifdef NO_TLS_DIRECT_SEG_REFS movl errno@gotntpoff(%ebx), %edx addl %gs:0, %edx movl %esi, (%edx) -# else +#else movl errno@gotntpoff(%ebx), %edx movl %esi, %gs:(%edx) -# endif -#else - call __errno_location@plt - movl %esi, (%eax) #endif orl $-1, %eax @@ -228,13 +223,13 @@ sem_wait_cleanup: .byte 14 # DW_CFA_def_cfa_offset .uleb128 8 .byte 0x83 # DW_CFA_offset %ebx - .uleb128 2 + .uleb128 2 .byte 4 # DW_CFA_advance_loc4 .long .Lpush_esi-.Lpush_ebx .byte 14 # DW_CFA_def_cfa_offset .uleb128 12 .byte 0x86 # DW_CFA_offset %esi - .uleb128 3 + .uleb128 3 .byte 4 # DW_CFA_advance_loc4 .long .Lsub_esp-.Lpush_esi .byte 14 # DW_CFA_def_cfa_offset @@ -250,9 +245,9 @@ sem_wait_cleanup: .byte 14 # DW_CFA_def_cfa_offset .uleb128 16 .byte 0x83 # DW_CFA_offset %ebx - .uleb128 2 + .uleb128 2 .byte 0x86 # DW_CFA_offset %esi - .uleb128 3 + .uleb128 3 .align 4 .LENDFDE: @@ -333,18 +328,13 @@ __old_sem_wait: 4: #endif addl $_GLOBAL_OFFSET_TABLE_, %ebx -#if USE___THREAD -# ifdef NO_TLS_DIRECT_SEG_REFS +#ifdef NO_TLS_DIRECT_SEG_REFS movl errno@gotntpoff(%ebx), %edx addl %gs:0, %edx movl %esi, (%edx) -# else +#else movl errno@gotntpoff(%ebx), %edx movl %esi, %gs:(%edx) -# endif -#else - call __errno_location@plt - movl %esi, (%eax) #endif orl $-1, %eax jmp 5b diff --git a/nptl/sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h b/nptl/sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h index c4d52860dd..8687ba46ab 100644 --- a/nptl/sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h +++ b/nptl/sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2003, 2004, 2006 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2003, 2004, 2006, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Jakub Jelinek <jakub@redhat.com>, 2002. @@ -27,13 +27,12 @@ # undef PSEUDO -# if USE___THREAD -# ifndef NOT_IN_libc -# define SYSDEP_CANCEL_ERRNO __libc_errno -# else -# define SYSDEP_CANCEL_ERRNO errno -# endif -# define SYSDEP_CANCEL_ERROR(args) \ +# ifndef NOT_IN_libc +# define SYSDEP_CANCEL_ERRNO __libc_errno +# else +# define SYSDEP_CANCEL_ERRNO errno +# endif +# define SYSDEP_CANCEL_ERROR(args) \ .section .gnu.linkonce.t.__syscall_error_##args, "ax"; \ .align 32; \ .proc __syscall_error_##args; \ @@ -53,28 +52,6 @@ __syscall_error_##args: \ add loc4 = loc4, r13;; \ st4 [loc4] = loc3; \ mov ar.pfs = loc0 -# else -# define SYSDEP_CANCEL_ERROR(args) \ -.section .gnu.linkonce.t.__syscall_error_##args, "ax"; \ - .align 32; \ - .proc __syscall_error_##args; \ - .global __syscall_error_##args; \ - .hidden __syscall_error_##args; \ - .size __syscall_error_##args, 64; \ -__syscall_error_##args: \ - .prologue; \ - .regstk args, 5, args, 0; \ - .save ar.pfs, loc0; \ - .save rp, loc1; \ - .body; \ - mov loc4 = r1;; \ - br.call.sptk.many b0 = __errno_location;; \ - st4 [r8] = loc3; \ - mov r1 = loc4; \ - mov rp = loc1; \ - mov r8 = -1; \ - mov ar.pfs = loc0 -# endif # ifndef USE_DL_SYSINFO diff --git a/nptl/sysdeps/unix/sysv/linux/sh/sem_post.S b/nptl/sysdeps/unix/sysv/linux/sh/sem_post.S index 4a154fc649..c3dd6825f0 100644 --- a/nptl/sysdeps/unix/sysv/linux/sh/sem_post.S +++ b/nptl/sysdeps/unix/sysv/linux/sh/sem_post.S @@ -1,4 +1,4 @@ -/* Copyright (C) 2003, 2004, 2007, 2008 Free Software Foundation, Inc. +/* Copyright (C) 2003, 2004, 2007, 2008, 2011 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 @@ -65,7 +65,7 @@ __new_sem_post: 3: mov #EOVERFLOW, r2 -4: +4: mov.l r12, @-r15 mov.l r8, @-r15 sts.l pr, @-r15 @@ -73,7 +73,6 @@ __new_sem_post: mov.l .Lgot3, r12 add r0, r12 -#if USE___THREAD mov.l .Lerrno3, r0 stc gbr, r1 mov.l @(r0, r12), r0 @@ -84,14 +83,6 @@ __new_sem_post: .long errno@GOTTPOFF .Lexit: mov.l r2, @r0 -#else - mov r2, r8 - mov.l .Lerrloc3, r1 - bsrf r1 - nop -.Lerrloc3b: - mov r8, @r0 -#endif lds.l @r15+, pr mov.l @r15+, r8 mov.l @r15+, r12 @@ -103,9 +94,5 @@ __new_sem_post: .long SEM_VALUE_MAX .Lgot3: .long _GLOBAL_OFFSET_TABLE_ -#if !USE___THREAD -.Lerrloc3: - .long __errno_location@PLT-(.Lerrloc3b-.) -#endif .size __new_sem_post,.-__new_sem_post versioned_symbol(libpthread, __new_sem_post, sem_post, GLIBC_2_1) diff --git a/nptl/sysdeps/unix/sysv/linux/sh/sem_timedwait.S b/nptl/sysdeps/unix/sysv/linux/sh/sem_timedwait.S index 7924e87594..d57986150c 100644 --- a/nptl/sysdeps/unix/sysv/linux/sh/sem_timedwait.S +++ b/nptl/sysdeps/unix/sysv/linux/sh/sem_timedwait.S @@ -1,4 +1,4 @@ -/* Copyright (C) 2003, 2004, 2007 Free Software Foundation, Inc. +/* Copyright (C) 2003, 2004, 2007, 2011 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 @@ -131,7 +131,7 @@ sem_timedwait: mov r10, r4 bsrf r1 mov r0, r10 -.Ldisable0b: +.Ldisable0b: mov r10, r0 .LcleanupEND: @@ -173,7 +173,6 @@ sem_timedwait: mov.l .Lgot2, r12 add r0, r12 -#if USE___THREAD mov.l .Lerrno2, r0 stc gbr, r1 mov.l @(r0, r12), r0 @@ -181,14 +180,8 @@ sem_timedwait: add r1, r0 .align 2 .Lerrno2: - .long errno@GOTTPOFF + .long errno@GOTTPOFF .Lexit: -#else - mov.l .Lerrloc2, r1 - bsrf r1 - nop -.Lerrloc2b: -#endif mov.l r10, @r0 DEC (@(NWAITERS,r8), r2) bra 10b @@ -201,10 +194,6 @@ sem_timedwait: .long 1000000000 .Lgot2: .long _GLOBAL_OFFSET_TABLE_ -#if !USE___THREAD -.Lerrloc2: - .long __errno_location@PLT-(.Lerrloc2b-.) -#endif .Lenable0: .long __pthread_enable_asynccancel-.Lenable0b .Ldisable0: @@ -213,7 +202,7 @@ sem_timedwait: .type sem_wait_cleanup,@function sem_wait_cleanup: - DEC (@(NWAITERS,r8), r2) + DEC (@(NWAITERS,r8), r2) .LcallUR: mov.l .Lresume, r1 #ifdef PIC @@ -314,25 +303,25 @@ sem_wait_cleanup: .byte 14 ! DW_CFA_def_cfa_offset .uleb128 4 .byte 0x88 ! DW_CFA_offset r8 - .uleb128 1 + .uleb128 1 .byte 4 ! DW_CFA_advance_loc4 .ualong .Lpush_r9-.Lpush_r8 .byte 14 ! DW_CFA_def_cfa_offset .uleb128 8 .byte 0x89 ! DW_CFA_offset r9 - .uleb128 2 + .uleb128 2 .byte 4 ! DW_CFA_advance_loc4 .ualong .Lpush_r10-.Lpush_r9 .byte 14 ! DW_CFA_def_cfa_offset .uleb128 12 .byte 0x8a ! DW_CFA_offset r10 - .uleb128 3 + .uleb128 3 .byte 4 ! DW_CFA_advance_loc4 .ualong .Lpush_r12-.Lpush_r10 .byte 14 ! DW_CFA_def_cfa_offset .uleb128 16 .byte 0x8c ! DW_CFA_offset r12 - .uleb128 4 + .uleb128 4 .byte 4 ! DW_CFA_advance_loc4 .ualong .Lpush_pr-.Lpush_r12 .byte 14 ! DW_CFA_def_cfa_offset diff --git a/nptl/sysdeps/unix/sysv/linux/sh/sem_trywait.S b/nptl/sysdeps/unix/sysv/linux/sh/sem_trywait.S index 835e37db9f..183aac6bc3 100644 --- a/nptl/sysdeps/unix/sysv/linux/sh/sem_trywait.S +++ b/nptl/sysdeps/unix/sysv/linux/sh/sem_trywait.S @@ -1,4 +1,4 @@ -/* Copyright (C) 2003, 2004, 2007 Free Software Foundation, Inc. +/* Copyright (C) 2003, 2004, 2007, 2011 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 @@ -57,7 +57,6 @@ __new_sem_trywait: mov.l .Lgot1, r12 add r0, r12 -#if USE___THREAD mov.l .Lerrno1, r0 stc gbr, r1 mov.l @(r0, r12), r0 @@ -67,12 +66,6 @@ __new_sem_trywait: .Lerrno1: .long errno@GOTTPOFF .Lexit: -#else - mov.l .Lerrloc1, r1 - bsrf r1 - nop -.Lerrloc1b: -#endif mov.l r8, @r0 lds.l @r15+, pr mov.l @r15+, r8 @@ -83,9 +76,5 @@ __new_sem_trywait: .align 2 .Lgot1: .long _GLOBAL_OFFSET_TABLE_ -#if !USE___THREAD -.Lerrloc1: - .long __errno_location@PLT-(.Lerrloc1b-.) -#endif .size __new_sem_trywait,.-__new_sem_trywait versioned_symbol(libpthread, __new_sem_trywait, sem_trywait, GLIBC_2_1) diff --git a/nptl/sysdeps/unix/sysv/linux/sh/sem_wait.S b/nptl/sysdeps/unix/sysv/linux/sh/sem_wait.S index 6ef7fcf0cb..aed8609fd0 100644 --- a/nptl/sysdeps/unix/sysv/linux/sh/sem_wait.S +++ b/nptl/sysdeps/unix/sysv/linux/sh/sem_wait.S @@ -1,4 +1,4 @@ -/* Copyright (C) 2003, 2004, 2007 Free Software Foundation, Inc. +/* Copyright (C) 2003, 2004, 2007, 2011 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 @@ -68,7 +68,7 @@ __new_sem_wait: .Lafter_ret: 1: INC (@(NWAITERS,r8),r2) - + .LcleanupSTART: 6: mov.l .Lenable0, r1 @@ -96,7 +96,7 @@ __new_sem_wait: mov r10, r4 bsrf r1 mov r0, r10 -.Ldisable0b: +.Ldisable0b: mov r10, r0 .LcleanupEND: @@ -131,7 +131,6 @@ __new_sem_wait: mov.l .Lgot0, r12 add r0, r12 -#if USE___THREAD mov.l .Lerrno0, r0 stc gbr, r1 mov.l @(r0, r12), r0 @@ -141,12 +140,6 @@ __new_sem_wait: .Lerrno0: .long errno@GOTTPOFF .Lexit: -#else - mov.l .Lerrloc0, r1 - bsrf r1 - nop -.Lerrloc0b: -#endif mov.l r8, @r0 bra 9b mov #-1, r0 @@ -154,10 +147,6 @@ __new_sem_wait: .align 2 .Lgot0: .long _GLOBAL_OFFSET_TABLE_ -#if !USE___THREAD -.Lerrloc0: - .long __errno_location@PLT-(.Lerrloc0b-.) -#endif .Lenable0: .long __pthread_enable_asynccancel-.Lenable0b .Ldisable0: @@ -168,7 +157,7 @@ __new_sem_wait: .type sem_wait_cleanup,@function sem_wait_cleanup: - DEC (@(NWAITERS,r8), r2) + DEC (@(NWAITERS,r8), r2) .LcallUR: mov.l .Lresume, r1 #ifdef PIC @@ -269,25 +258,25 @@ sem_wait_cleanup: .byte 14 ! DW_CFA_def_cfa_offset .uleb128 4 .byte 0x88 ! DW_CFA_offset r8 - .uleb128 1 + .uleb128 1 .byte 4 ! DW_CFA_advance_loc4 .ualong .Lpush_r10-.Lpush_r8 .byte 14 ! DW_CFA_def_cfa_offset .uleb128 8 .byte 0x8a ! DW_CFA_offset r10 - .uleb128 2 + .uleb128 2 .byte 4 ! DW_CFA_advance_loc4 .ualong .Lpush_r12-.Lpush_r10 .byte 14 ! DW_CFA_def_cfa_offset .uleb128 12 .byte 0x8c ! DW_CFA_offset r12 - .uleb128 3 + .uleb128 3 .byte 4 ! DW_CFA_advance_loc4 .ualong .Lpush_pr-.Lpush_r12 .byte 14 ! DW_CFA_def_cfa_offset .uleb128 16 .byte 0x91 ! DW_CFA_offset pr - .uleb128 4 + .uleb128 4 .align 4 .LENDFDE: diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/sem_post.S b/nptl/sysdeps/unix/sysv/linux/x86_64/sem_post.S index 979b1bf1d6..4691e4d683 100644 --- a/nptl/sysdeps/unix/sysv/linux/x86_64/sem_post.S +++ b/nptl/sysdeps/unix/sysv/linux/x86_64/sem_post.S @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2003, 2005, 2007, 2008 Free Software Foundation, Inc. +/* Copyright (C) 2002,2003,2005,2007,2008,2011 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. @@ -62,29 +62,15 @@ sem_post: retq 1: -#if USE___THREAD movl $EINVAL, %eax -#else - callq __errno_location@plt - movl $EINVAL, %edx -#endif jmp 4f 3: -#if USE___THREAD movl $EOVERFLOW, %eax -#else - callq __errno_location@plt - movl $EOVERFLOW, %edx -#endif 4: -#if USE___THREAD movq errno@gottpoff(%rip), %rdx movl %eax, %fs:(%rdx) -#else - movl %edx, (%rax) -#endif orl $-1, %eax retq .size sem_post,.-sem_post diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S b/nptl/sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S index 2926b36e7b..576a494966 100644 --- a/nptl/sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S +++ b/nptl/sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S @@ -143,39 +143,24 @@ sem_timedwait: cfi_adjust_cfa_offset(8) 3: negq %r9 -#if USE___THREAD movq errno@gottpoff(%rip), %rdx movl %r9d, %fs:(%rdx) -#else - callq __errno_location@plt - movl %r9d, (%rax) -#endif orl $-1, %eax jmp 15b cfi_adjust_cfa_offset(-8) 6: -#if USE___THREAD movq errno@gottpoff(%rip), %rdx movl $EINVAL, %fs:(%rdx) -#else - callq __errno_location@plt - movl $EINVAL, (%rax) -#endif orl $-1, %eax retq 16: -#if USE___THREAD movq errno@gottpoff(%rip), %rdx movl $ETIMEDOUT, %fs:(%rdx) -#else - callq __errno_location@plt - movl $ETIMEDOUT, (%rax) -#endif orl $-1, %eax @@ -303,13 +288,8 @@ sem_timedwait: cfi_rel_offset(%r14, STACKFRAME) 33: negq %r14 36: -#if USE___THREAD movq errno@gottpoff(%rip), %rdx movl %r14d, %fs:(%rdx) -#else - callq __errno_location@plt - movl %r14d, (%rax) -#endif orl $-1, %eax jmp 45b diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/sem_trywait.S b/nptl/sysdeps/unix/sysv/linux/x86_64/sem_trywait.S index a5719cadda..64652c46f8 100644 --- a/nptl/sysdeps/unix/sysv/linux/x86_64/sem_trywait.S +++ b/nptl/sysdeps/unix/sysv/linux/x86_64/sem_trywait.S @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2003, 2005, 2007 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2003, 2005, 2007, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. @@ -41,13 +41,8 @@ sem_trywait: retq 1: -#if USE___THREAD movq errno@gottpoff(%rip), %rdx movl $EAGAIN, %fs:(%rdx) -#else - callq __errno_location@plt - movl $EAGAIN, (%rax) -#endif orl $-1, %eax retq .size sem_trywait,.-sem_trywait diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S b/nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S index 2cf6ec10a4..3ea714a754 100644 --- a/nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S +++ b/nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2003, 2005, 2007, 2009 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2003, 2005, 2007, 2009, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. @@ -125,14 +125,8 @@ sem_wait: cfi_adjust_cfa_offset(8) 4: negq %rcx -#if USE___THREAD movq errno@gottpoff(%rip), %rdx movl %ecx, %fs:(%rdx) -#else -# error "not supported. %rcx and %rdi must be preserved" - callq __errno_location@plt - movl %ecx, (%rax) -#endif orl $-1, %eax jmp 9b diff --git a/resolv/res-state.c b/resolv/res-state.c index e327e34f59..b0aa22cfc2 100644 --- a/resolv/res-state.c +++ b/resolv/res-state.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996, 97, 98, 2002, 2003 Free Software Foundation, Inc. +/* Copyright (C) 1996, 97, 98, 2002, 2003, 2011 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 @@ -19,27 +19,10 @@ #include <resolv.h> #include <tls.h> -#if ! USE___THREAD - -# undef _res -extern struct __res_state _res; - -/* When threaded, _res may be a per-thread variable. */ -struct __res_state * -weak_const_function -__res_state (void) -{ - return &_res; -} - -#else struct __res_state * __res_state (void) { return __resp; } - -#endif - libc_hidden_def (__res_state) diff --git a/resolv/res_libc.c b/resolv/res_libc.c index 810fbc804d..1f6b3a19ef 100644 --- a/resolv/res_libc.c +++ b/resolv/res_libc.c @@ -126,12 +126,10 @@ struct __res_state _res __attribute__((section (".bss"))); #include <tls.h> -#if USE___THREAD #undef __resp __thread struct __res_state *__resp = &_res; extern __thread struct __res_state *__libc_resp __attribute__ ((alias ("__resp"))) attribute_hidden; -#endif /* We declare this with compat_symbol so that it's not visible at link time. Programs must use the accessor functions. */ diff --git a/sysdeps/i386/dl-machine.h b/sysdeps/i386/dl-machine.h index a093d2b151..d1a83ee0f2 100644 --- a/sysdeps/i386/dl-machine.h +++ b/sysdeps/i386/dl-machine.h @@ -1,5 +1,5 @@ /* Machine-dependent ELF dynamic relocation inline functions. i386 version. - Copyright (C) 1995-2005, 2006, 2009 Free Software Foundation, Inc. + Copyright (C) 1995-2005, 2006, 2009, 2011 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 @@ -243,18 +243,12 @@ _dl_start_user:\n\ define the value. ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one of the main executable's symbols, as for a COPY reloc. */ -#if !defined RTLD_BOOTSTRAP || USE___THREAD # define elf_machine_type_class(type) \ ((((type) == R_386_JMP_SLOT || (type) == R_386_TLS_DTPMOD32 \ || (type) == R_386_TLS_DTPOFF32 || (type) == R_386_TLS_TPOFF32 \ || (type) == R_386_TLS_TPOFF || (type) == R_386_TLS_DESC) \ * ELF_RTYPE_CLASS_PLT) \ | (((type) == R_386_COPY) * ELF_RTYPE_CLASS_COPY)) -#else -# define elf_machine_type_class(type) \ - ((((type) == R_386_JMP_SLOT) * ELF_RTYPE_CLASS_PLT) \ - | (((type) == R_386_COPY) * ELF_RTYPE_CLASS_COPY)) -#endif /* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */ #define ELF_MACHINE_JMP_SLOT R_386_JMP_SLOT @@ -357,44 +351,43 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc, *reloc_addr = value; break; -# if !defined RTLD_BOOTSTRAP || USE___THREAD case R_386_TLS_DTPMOD32: -# ifdef RTLD_BOOTSTRAP +# ifdef RTLD_BOOTSTRAP /* During startup the dynamic linker is always the module with index 1. XXX If this relocation is necessary move before RESOLVE call. */ *reloc_addr = 1; -# else +# else /* Get the information from the link map returned by the resolv function. */ if (sym_map != NULL) *reloc_addr = sym_map->l_tls_modid; -# endif +# endif break; case R_386_TLS_DTPOFF32: -# ifndef RTLD_BOOTSTRAP +# ifndef RTLD_BOOTSTRAP /* During relocation all TLS symbols are defined and used. Therefore the offset is already correct. */ if (sym != NULL) *reloc_addr = sym->st_value; -# endif +# endif break; case R_386_TLS_DESC: { struct tlsdesc volatile *td = (struct tlsdesc volatile *)reloc_addr; -# ifndef RTLD_BOOTSTRAP +# ifndef RTLD_BOOTSTRAP if (! sym) td->entry = _dl_tlsdesc_undefweak; else -# endif +# endif { -# ifndef RTLD_BOOTSTRAP -# ifndef SHARED +# ifndef RTLD_BOOTSTRAP +# ifndef SHARED CHECK_STATIC_TLS (map, sym_map); -# else +# else if (!TRY_STATIC_TLS (map, sym_map)) { td->arg = _dl_make_tlsdesc_dynamic @@ -402,8 +395,8 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc, td->entry = _dl_tlsdesc_dynamic; } else -# endif # endif +# endif { td->arg = (void*)(sym->st_value - sym_map->l_tls_offset + (ElfW(Word))td->arg); @@ -426,13 +419,13 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc, CHECK_STATIC_TLS (map, sym_map); *reloc_addr += sym_map->l_tls_offset - sym->st_value; } -# endif +# endif break; case R_386_TLS_TPOFF: /* The offset is negative, forward from the thread pointer. */ -# ifdef RTLD_BOOTSTRAP +# ifdef RTLD_BOOTSTRAP *reloc_addr += sym->st_value - map->l_tls_offset; -# else +# else /* We know the offset of object the symbol is contained in. It is a negative value which will be added to the thread pointer. */ @@ -441,9 +434,8 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc, CHECK_STATIC_TLS (map, sym_map); *reloc_addr += sym->st_value - sym_map->l_tls_offset; } -# endif +# endif break; -# endif /* use TLS */ # ifndef RTLD_BOOTSTRAP case R_386_32: diff --git a/sysdeps/ia64/dl-machine.h b/sysdeps/ia64/dl-machine.h index 61b4ea99a7..6f88005482 100644 --- a/sysdeps/ia64/dl-machine.h +++ b/sysdeps/ia64/dl-machine.h @@ -1,5 +1,5 @@ /* Machine-dependent ELF dynamic relocation inline functions. IA-64 version. - Copyright (C) 1995-1997, 2000-2004, 2005, 2006 Free Software Foundation, Inc. + Copyright (C) 1995-1997, 2000-2006, 2011 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 @@ -311,15 +311,10 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile) of the main executable's symbols, as for a COPY reloc, which we don't use. */ /* ??? Ignore *MSB for now. */ -#if !defined RTLD_BOOTSTRAP || USE___THREAD #define elf_machine_type_class(type) \ (((type) == R_IA64_IPLTLSB || (type) == R_IA64_DTPMOD64LSB \ || (type) == R_IA64_DTPREL64LSB || (type) == R_IA64_TPREL64LSB) \ * ELF_RTYPE_CLASS_PLT) -#else -#define elf_machine_type_class(type) \ - (((type) == R_IA64_IPLTLSB) * ELF_RTYPE_CLASS_PLT) -#endif /* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */ #define ELF_MACHINE_JMP_SLOT R_IA64_IPLTLSB @@ -405,7 +400,7 @@ elf_machine_rela (struct link_map *map, /* Already done in dynamic linker. */ if (map != &GL(dl_rtld_map)) # endif - value += map->l_addr; + value += map->l_addr; } else #endif @@ -417,7 +412,7 @@ elf_machine_rela (struct link_map *map, /* RESOLVE_MAP() will return NULL if it fail to locate the symbol. */ if ((sym_map = RESOLVE_MAP (&sym, version, r_type))) - { + { value = sym_map->l_addr + sym->st_value + reloc->r_addend; if (R_IA64_TYPE (r_type) == R_IA64_TYPE (R_IA64_DIR64LSB)) @@ -432,26 +427,24 @@ elf_machine_rela (struct link_map *map, value = _dl_make_fptr (sym_map, sym, value); else if (R_IA64_TYPE (r_type) == R_IA64_TYPE (R_IA64_PCREL64LSB)) value -= (Elf64_Addr) reloc_addr & -16; -#if !defined RTLD_BOOTSTRAP || defined USE___THREAD else if (R_IA64_TYPE (r_type) == R_IA64_TYPE (R_IA64_DTPMOD64LSB)) -# ifdef RTLD_BOOTSTRAP +#ifdef RTLD_BOOTSTRAP /* During startup the dynamic linker is always index 1. */ value = 1; -# else +#else /* Get the information from the link map returned by the resolv function. */ value = sym_map->l_tls_modid; else if (R_IA64_TYPE (r_type) == R_IA64_TYPE (R_IA64_DTPREL64LSB)) value -= sym_map->l_addr; -# endif +#endif else if (R_IA64_TYPE (r_type) == R_IA64_TYPE (R_IA64_TPREL64LSB)) { -# ifndef RTLD_BOOTSTRAP +#ifndef RTLD_BOOTSTRAP CHECK_STATIC_TLS (map, sym_map); -# endif +#endif value += sym_map->l_tls_offset - sym_map->l_addr; } -#endif else _dl_reloc_bad_type (map, r_type, 0); } diff --git a/sysdeps/powerpc/powerpc32/dl-machine.h b/sysdeps/powerpc/powerpc32/dl-machine.h index 5351d9691d..e7052b69d5 100644 --- a/sysdeps/powerpc/powerpc32/dl-machine.h +++ b/sysdeps/powerpc/powerpc32/dl-machine.h @@ -1,5 +1,5 @@ /* Machine-dependent ELF dynamic relocation inline functions. PowerPC version. - Copyright (C) 1995-2002, 2003, 2005, 2006 Free Software Foundation, Inc. + Copyright (C) 1995-2003, 2005, 2006, 2011 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 @@ -135,7 +135,6 @@ __elf_preferred_address(struct link_map *loader, size_t maplength, /* We never want to use a PLT entry as the destination of a reloc, when what is being relocated is a branch. This is partly for efficiency, but mostly so we avoid loops. */ -#if !defined RTLD_BOOTSTRAP || USE___THREAD #define elf_machine_type_class(type) \ ((((type) == R_PPC_JMP_SLOT \ || (type) == R_PPC_REL24 \ @@ -143,13 +142,6 @@ __elf_preferred_address(struct link_map *loader, size_t maplength, && (type) <= R_PPC_DTPREL32) \ || (type) == R_PPC_ADDR24) * ELF_RTYPE_CLASS_PLT) \ | (((type) == R_PPC_COPY) * ELF_RTYPE_CLASS_COPY)) -#else -#define elf_machine_type_class(type) \ - ((((type) == R_PPC_JMP_SLOT \ - || (type) == R_PPC_REL24 \ - || (type) == R_PPC_ADDR24) * ELF_RTYPE_CLASS_PLT) \ - | (((type) == R_PPC_COPY) * ELF_RTYPE_CLASS_COPY)) -#endif /* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */ #define ELF_MACHINE_JMP_SLOT R_PPC_JMP_SLOT @@ -331,8 +323,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc, *reloc_addr = value; break; -#if (!defined RTLD_BOOTSTRAP || USE___THREAD) \ - && !defined RESOLVE_CONFLICT_FIND_MAP +#ifndef RESOLVE_CONFLICT_FIND_MAP # ifdef RTLD_BOOTSTRAP # define NOT_BOOTSTRAP 0 # else diff --git a/sysdeps/powerpc/powerpc64/dl-machine.h b/sysdeps/powerpc/powerpc64/dl-machine.h index 901a44e4b3..2defc44b19 100644 --- a/sysdeps/powerpc/powerpc64/dl-machine.h +++ b/sysdeps/powerpc/powerpc64/dl-machine.h @@ -1,6 +1,6 @@ /* Machine-dependent ELF dynamic relocation inline functions. PowerPC64 version. - Copyright 1995-2005, 2006, 2008, 2010 Free Software Foundation, Inc. + Copyright 1995-2005, 2006, 2008, 2010, 2011 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 @@ -376,9 +376,9 @@ elf_machine_runtime_setup (struct link_map *map, int lazy, int profile) branch using two instructions; Past that point, glink uses three instructions. */ if (i < 0x8000) - glink_offset += 2; + glink_offset += 2; else - glink_offset += 3; + glink_offset += 3; } /* Now, we've modified data. We need to write the changes from @@ -492,10 +492,10 @@ elf_machine_plt_value (struct link_map *map, const Elf64_Rela *reloc, #define dont_expect(X) __builtin_expect ((X), 0) extern void _dl_reloc_overflow (struct link_map *map, - const char *name, - Elf64_Addr *const reloc_addr, - const Elf64_Sym *refsym) - attribute_hidden; + const char *name, + Elf64_Addr *const reloc_addr, + const Elf64_Sym *refsym) + attribute_hidden; auto inline void __attribute__ ((always_inline)) elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc, @@ -505,7 +505,6 @@ elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc, *reloc_addr = l_addr + reloc->r_addend; } -#if !defined RTLD_BOOTSTRAP || USE___THREAD /* This computes the value used by TPREL* relocs. */ auto inline Elf64_Addr __attribute__ ((always_inline, const)) elf_machine_tprel (struct link_map *map, @@ -513,18 +512,17 @@ elf_machine_tprel (struct link_map *map, const Elf64_Sym *sym, const Elf64_Rela *reloc) { -# ifndef RTLD_BOOTSTRAP +#ifndef RTLD_BOOTSTRAP if (sym_map) { CHECK_STATIC_TLS (map, sym_map); -# endif +#endif return TLS_TPREL_VALUE (sym_map, sym, reloc); -# ifndef RTLD_BOOTSTRAP +#ifndef RTLD_BOOTSTRAP } -# endif +#endif return 0; } -#endif /* Call function at address VALUE (an OPD entry) to resolve ifunc relocs. */ auto inline Elf64_Addr __attribute__ ((always_inline)) @@ -611,26 +609,25 @@ elf_machine_rela (struct link_map *map, #endif return; -#if !defined RTLD_BOOTSTRAP || USE___THREAD case R_PPC64_DTPMOD64: -# ifdef RTLD_BOOTSTRAP +#ifdef RTLD_BOOTSTRAP /* During startup the dynamic linker is always index 1. */ *reloc_addr = 1; -# else +#else /* Get the information from the link map returned by the resolve function. */ if (sym_map != NULL) - *reloc_addr = sym_map->l_tls_modid; -# endif + *reloc_addr = sym_map->l_tls_modid; +#endif return; case R_PPC64_DTPREL64: /* During relocation all TLS symbols are defined and used. - Therefore the offset is already correct. */ -# ifndef RTLD_BOOTSTRAP + Therefore the offset is already correct. */ +#ifndef RTLD_BOOTSTRAP if (sym_map != NULL) *reloc_addr = TLS_DTPREL_VALUE (sym, reloc); -# endif +#endif return; case R_PPC64_TPREL64: @@ -640,21 +637,21 @@ elf_machine_rela (struct link_map *map, case R_PPC64_TPREL16_LO_DS: value = elf_machine_tprel (map, sym_map, sym, reloc); if (dont_expect ((value & 3) != 0)) - _dl_reloc_overflow (map, "R_PPC64_TPREL16_LO_DS", reloc_addr, refsym); + _dl_reloc_overflow (map, "R_PPC64_TPREL16_LO_DS", reloc_addr, refsym); BIT_INSERT (*(Elf64_Half *) reloc_addr, value, 0xfffc); break; case R_PPC64_TPREL16_DS: value = elf_machine_tprel (map, sym_map, sym, reloc); if (dont_expect ((value + 0x8000) >= 0x10000 || (value & 3) != 0)) - _dl_reloc_overflow (map, "R_PPC64_TPREL16_DS", reloc_addr, refsym); + _dl_reloc_overflow (map, "R_PPC64_TPREL16_DS", reloc_addr, refsym); BIT_INSERT (*(Elf64_Half *) reloc_addr, value, 0xfffc); break; case R_PPC64_TPREL16: value = elf_machine_tprel (map, sym_map, sym, reloc); if (dont_expect ((value + 0x8000) >= 0x10000)) - _dl_reloc_overflow (map, "R_PPC64_TPREL16", reloc_addr, refsym); + _dl_reloc_overflow (map, "R_PPC64_TPREL16", reloc_addr, refsym); *(Elf64_Half *) reloc_addr = PPC_LO (value); break; @@ -692,12 +689,11 @@ elf_machine_rela (struct link_map *map, value = elf_machine_tprel (map, sym_map, sym, reloc); *(Elf64_Half *) reloc_addr = PPC_HIGHESTA (value); break; -#endif #ifndef RTLD_BOOTSTRAP /* None of the following appear in ld.so */ case R_PPC64_ADDR16_LO_DS: if (dont_expect ((value & 3) != 0)) - _dl_reloc_overflow (map, "R_PPC64_ADDR16_LO_DS", reloc_addr, refsym); + _dl_reloc_overflow (map, "R_PPC64_ADDR16_LO_DS", reloc_addr, refsym); BIT_INSERT (*(Elf64_Half *) reloc_addr, value, 0xfffc); break; @@ -715,29 +711,29 @@ elf_machine_rela (struct link_map *map, case R_PPC64_ADDR30: { - Elf64_Addr delta = value - (Elf64_Xword) reloc_addr; - if (dont_expect ((delta + 0x80000000) >= 0x10000000 + Elf64_Addr delta = value - (Elf64_Xword) reloc_addr; + if (dont_expect ((delta + 0x80000000) >= 0x10000000 || (delta & 3) != 0)) - _dl_reloc_overflow (map, "R_PPC64_ADDR30", reloc_addr, refsym); - BIT_INSERT (*(Elf64_Word *) reloc_addr, delta, 0xfffffffc); + _dl_reloc_overflow (map, "R_PPC64_ADDR30", reloc_addr, refsym); + BIT_INSERT (*(Elf64_Word *) reloc_addr, delta, 0xfffffffc); } break; case R_PPC64_COPY: if (dont_expect (sym == NULL)) /* This can happen in trace mode when an object could not be found. */ - return; + return; if (dont_expect (sym->st_size > refsym->st_size || (GLRO(dl_verbose) && sym->st_size < refsym->st_size))) { - const char *strtab; + const char *strtab; - strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]); - _dl_error_printf ("%s: Symbol `%s' has different size" \ - " in shared object," \ - " consider re-linking\n", - _dl_argv[0] ?: "<program name unknown>", + strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]); + _dl_error_printf ("%s: Symbol `%s' has different size" \ + " in shared object," \ + " consider re-linking\n", + _dl_argv[0] ?: "<program name unknown>", strtab + refsym->st_name); } memcpy (reloc_addr_arg, (char *) value, @@ -766,25 +762,25 @@ elf_machine_rela (struct link_map *map, case R_PPC64_ADDR32: if (dont_expect ((value + 0x80000000) >= 0x10000000)) - _dl_reloc_overflow (map, "R_PPC64_ADDR32", reloc_addr, refsym); + _dl_reloc_overflow (map, "R_PPC64_ADDR32", reloc_addr, refsym); *(Elf64_Word *) reloc_addr = value; return; case R_PPC64_ADDR24: if (dont_expect ((value + 0x2000000) >= 0x4000000 || (value & 3) != 0)) - _dl_reloc_overflow (map, "R_PPC64_ADDR24", reloc_addr, refsym); + _dl_reloc_overflow (map, "R_PPC64_ADDR24", reloc_addr, refsym); BIT_INSERT (*(Elf64_Word *) reloc_addr, value, 0x3fffffc); break; case R_PPC64_ADDR16: if (dont_expect ((value + 0x8000) >= 0x10000)) - _dl_reloc_overflow (map, "R_PPC64_ADDR16", reloc_addr, refsym); + _dl_reloc_overflow (map, "R_PPC64_ADDR16", reloc_addr, refsym); *(Elf64_Half *) reloc_addr = value; break; case R_PPC64_UADDR16: if (dont_expect ((value + 0x8000) >= 0x10000)) - _dl_reloc_overflow (map, "R_PPC64_UADDR16", reloc_addr, refsym); + _dl_reloc_overflow (map, "R_PPC64_UADDR16", reloc_addr, refsym); /* We are big-endian. */ ((char *) reloc_addr_arg)[0] = (value >> 8) & 0xff; ((char *) reloc_addr_arg)[1] = (value >> 0) & 0xff; @@ -792,7 +788,7 @@ elf_machine_rela (struct link_map *map, case R_PPC64_ADDR16_DS: if (dont_expect ((value + 0x8000) >= 0x10000 || (value & 3) != 0)) - _dl_reloc_overflow (map, "R_PPC64_ADDR16_DS", reloc_addr, refsym); + _dl_reloc_overflow (map, "R_PPC64_ADDR16_DS", reloc_addr, refsym); BIT_INSERT (*(Elf64_Half *) reloc_addr, value, 0xfffc); break; @@ -816,11 +812,11 @@ elf_machine_rela (struct link_map *map, case R_PPC64_ADDR14_BRTAKEN: case R_PPC64_ADDR14_BRNTAKEN: { - if (dont_expect ((value + 0x8000) >= 0x10000 || (value & 3) != 0)) + if (dont_expect ((value + 0x8000) >= 0x10000 || (value & 3) != 0)) _dl_reloc_overflow (map, "R_PPC64_ADDR14", reloc_addr, refsym); - Elf64_Word insn = *(Elf64_Word *) reloc_addr; - BIT_INSERT (insn, value, 0xfffc); - if (r_type != R_PPC64_ADDR14) + Elf64_Word insn = *(Elf64_Word *) reloc_addr; + BIT_INSERT (insn, value, 0xfffc); + if (r_type != R_PPC64_ADDR14) { insn &= ~(1 << 21); if (r_type == R_PPC64_ADDR14_BRTAKEN) @@ -830,7 +826,7 @@ elf_machine_rela (struct link_map *map, else if ((insn & (0x14 << 21)) == (0x10 << 21)) insn |= 0x08 << 21; } - *(Elf64_Word *) reloc_addr = insn; + *(Elf64_Word *) reloc_addr = insn; } break; diff --git a/sysdeps/s390/s390-32/dl-machine.h b/sysdeps/s390/s390-32/dl-machine.h index 415b388012..b1f6f41640 100644 --- a/sysdeps/s390/s390-32/dl-machine.h +++ b/sysdeps/s390/s390-32/dl-machine.h @@ -1,5 +1,5 @@ /* Machine-dependent ELF dynamic relocation inline functions. S390 Version. - Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006 + Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2011 Free Software Foundation, Inc. Contributed by Carl Pederson & Martin Schwidefsky. This file is part of the GNU C Library. @@ -43,7 +43,7 @@ elf_machine_matches_host (const Elf32_Ehdr *ehdr) return 0; return (ehdr->e_machine == EM_S390 || ehdr->e_machine == EM_S390_OLD) - && ehdr->e_ident[EI_CLASS] == ELFCLASS32; + && ehdr->e_ident[EI_CLASS] == ELFCLASS32; } @@ -316,8 +316,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc, *reloc_addr = value + reloc->r_addend; break; -#if (!defined RTLD_BOOTSTRAP || USE___THREAD) \ - && !defined RESOLVE_CONFLICT_FIND_MAP +#ifndef RESOLVE_CONFLICT_FIND_MAP case R_390_TLS_DTPMOD: # ifdef RTLD_BOOTSTRAP /* During startup the dynamic linker is always the module diff --git a/sysdeps/s390/s390-64/dl-machine.h b/sysdeps/s390/s390-64/dl-machine.h index c4df274cdb..913ea0870b 100644 --- a/sysdeps/s390/s390-64/dl-machine.h +++ b/sysdeps/s390/s390-64/dl-machine.h @@ -1,6 +1,6 @@ /* Machine-dependent ELF dynamic relocation inline functions. 64 bit S/390 Version. - Copyright (C) 2001-2005, 2006 Free Software Foundation, Inc. + Copyright (C) 2001-2005, 2006, 2011 Free Software Foundation, Inc. Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). This file is part of the GNU C Library. @@ -288,8 +288,7 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc, *reloc_addr = value + reloc->r_addend; break; -#if (!defined RTLD_BOOTSTRAP || USE___THREAD) \ - && !defined RESOLVE_CONFLICT_FIND_MAP +#ifndef RESOLVE_CONFLICT_FIND_MAP case R_390_TLS_DTPMOD: # ifdef RTLD_BOOTSTRAP /* During startup the dynamic linker is always the module diff --git a/sysdeps/sh/dl-machine.h b/sysdeps/sh/dl-machine.h index 78f70e3880..4e09ea4eb5 100644 --- a/sysdeps/sh/dl-machine.h +++ b/sysdeps/sh/dl-machine.h @@ -1,5 +1,5 @@ /* Machine-dependent ELF dynamic relocation inline functions. SH version. - Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 + Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -208,17 +208,11 @@ __fpscr_values:\n\ define the value. ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one of the main executable's symbols, as for a COPY reloc. */ -#if !defined RTLD_BOOTSTRAP || USE___THREAD -# define elf_machine_type_class(type) \ +#define elf_machine_type_class(type) \ ((((type) == R_SH_JMP_SLOT || (type) == R_SH_TLS_DTPMOD32 \ || (type) == R_SH_TLS_DTPOFF32 || (type) == R_SH_TLS_TPOFF32) \ * ELF_RTYPE_CLASS_PLT) \ | (((type) == R_SH_COPY) * ELF_RTYPE_CLASS_COPY)) -#else -#define elf_machine_type_class(type) \ - ((((type) == R_SH_JMP_SLOT) * ELF_RTYPE_CLASS_PLT) \ - | (((type) == R_SH_COPY) * ELF_RTYPE_CLASS_COPY)) -#endif /* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */ #define ELF_MACHINE_JMP_SLOT R_SH_JMP_SLOT @@ -354,35 +348,34 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc, /* These addresses are always aligned. */ *reloc_addr = value; break; -#if !defined RTLD_BOOTSTRAP || USE___THREAD /* XXX Remove TLS relocations which are not needed. */ case R_SH_TLS_DTPMOD32: -# ifdef RTLD_BOOTSTRAP +#ifdef RTLD_BOOTSTRAP /* During startup the dynamic linker is always the module with index 1. XXX If this relocation is necessary move before RESOLVE call. */ *reloc_addr = 1; -# else +#else /* Get the information from the link map returned by the resolv function. */ if (sym_map != NULL) *reloc_addr = sym_map->l_tls_modid; -# endif +#endif break; case R_SH_TLS_DTPOFF32: -# ifndef RTLD_BOOTSTRAP +#ifndef RTLD_BOOTSTRAP /* During relocation all TLS symbols are defined and used. Therefore the offset is already correct. */ if (sym != NULL) *reloc_addr = sym->st_value; -# endif +#endif break; case R_SH_TLS_TPOFF32: /* The offset is positive, afterward from the thread pointer. */ -# ifdef RTLD_BOOTSTRAP +#ifdef RTLD_BOOTSTRAP *reloc_addr = map->l_tls_offset + sym->st_value + reloc->r_addend; -# else +#else /* We know the offset of object the symbol is contained in. It is a positive value which will be added to the thread pointer. To get the variable position in the TLS block @@ -393,9 +386,8 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc, *reloc_addr = sym_map->l_tls_offset + sym->st_value + reloc->r_addend; } -# endif +#endif break; -#endif /* use TLS */ case R_SH_DIR32: { #ifndef RTLD_BOOTSTRAP diff --git a/sysdeps/sparc/sparc32/dl-machine.h b/sysdeps/sparc/sparc32/dl-machine.h index f2bc94a07d..8f54f7e3ef 100644 --- a/sysdeps/sparc/sparc32/dl-machine.h +++ b/sysdeps/sparc/sparc32/dl-machine.h @@ -139,7 +139,7 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile) nop .word MAP - The PC value (pltpc) saved in %g2 by the jmpl points near the + The PC value (pltpc) saved in %g2 by the jmpl points near the location where we store the link_map pointer for this object. */ plt[0] = 0x05000000 | ((rfunc >> 10) & 0x003fffff); @@ -193,17 +193,11 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile) PLT entries should not be allowed to define the value. ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one of the main executable's symbols, as for a COPY reloc. */ -#if !defined RTLD_BOOTSTRAP || USE___THREAD -# define elf_machine_type_class(type) \ +#define elf_machine_type_class(type) \ ((((type) == R_SPARC_JMP_SLOT \ || ((type) >= R_SPARC_TLS_GD_HI22 && (type) <= R_SPARC_TLS_TPOFF64)) \ * ELF_RTYPE_CLASS_PLT) \ | (((type) == R_SPARC_COPY) * ELF_RTYPE_CLASS_COPY)) -#else -# define elf_machine_type_class(type) \ - ((((type) == R_SPARC_JMP_SLOT) * ELF_RTYPE_CLASS_PLT) \ - | (((type) == R_SPARC_COPY) * ELF_RTYPE_CLASS_COPY)) -#endif /* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */ #define ELF_MACHINE_JMP_SLOT R_SPARC_JMP_SLOT @@ -454,8 +448,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc, sparc_fixup_plt (reloc, reloc_addr, value, 0, do_flush); } break; -#if (!defined RTLD_BOOTSTRAP || USE___THREAD) \ - && !defined RESOLVE_CONFLICT_FIND_MAP +#ifndef RESOLVE_CONFLICT_FIND_MAP case R_SPARC_TLS_DTPMOD32: /* Get the information from the link map returned by the resolv function. */ diff --git a/sysdeps/sparc/sparc64/dl-machine.h b/sysdeps/sparc/sparc64/dl-machine.h index 3f71a66774..47579cd05f 100644 --- a/sysdeps/sparc/sparc64/dl-machine.h +++ b/sysdeps/sparc/sparc64/dl-machine.h @@ -1,6 +1,5 @@ /* Machine-dependent ELF dynamic relocation inline functions. Sparc64 version. - Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, - 2009, 2010 Free Software Foundation, Inc. + Copyright (C) 1997-2006, 2009, 2010, 2011 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 @@ -77,11 +76,11 @@ elf_machine_load_address (void) register Elf64_Addr *got __asm ("%l7"); __asm ("sethi %%hi(_GLOBAL_OFFSET_TABLE_-4), %1\n\t" - "call 1f\n\t" - " add %1, %%lo(_GLOBAL_OFFSET_TABLE_+4), %1\n\t" - "call _DYNAMIC\n\t" - "call _GLOBAL_OFFSET_TABLE_\n" - "1:\tadd %1, %0, %1\n\t" : "=r" (pc), "=r" (got)); + "call 1f\n\t" + " add %1, %%lo(_GLOBAL_OFFSET_TABLE_+4), %1\n\t" + "call _DYNAMIC\n\t" + "call _GLOBAL_OFFSET_TABLE_\n" + "1:\tadd %1, %0, %1\n\t" : "=r" (pc), "=r" (got)); /* got is now l_addr + _GLOBAL_OFFSET_TABLE_ *got is _DYNAMIC @@ -115,17 +114,11 @@ elf_machine_plt_value (struct link_map *map, const Elf64_Rela *reloc, PLT entries should not be allowed to define the value. ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one of the main executable's symbols, as for a COPY reloc. */ -#if !defined RTLD_BOOTSTRAP || USE___THREAD -# define elf_machine_type_class(type) \ +#define elf_machine_type_class(type) \ ((((type) == R_SPARC_JMP_SLOT \ || ((type) >= R_SPARC_TLS_GD_HI22 && (type) <= R_SPARC_TLS_TPOFF64)) \ * ELF_RTYPE_CLASS_PLT) \ | (((type) == R_SPARC_COPY) * ELF_RTYPE_CLASS_COPY)) -#else -# define elf_machine_type_class(type) \ - ((((type) == R_SPARC_JMP_SLOT) * ELF_RTYPE_CLASS_PLT) \ - | (((type) == R_SPARC_COPY) * ELF_RTYPE_CLASS_COPY)) -#endif /* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */ #define ELF_MACHINE_JMP_SLOT R_SPARC_JMP_SLOT @@ -168,7 +161,7 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile) /* PLT0 looks like: - sethi %uhi(_dl_runtime_{resolve,profile}_0), %g4 + sethi %uhi(_dl_runtime_{resolve,profile}_0), %g4 sethi %hi(_dl_runtime_{resolve,profile}_0), %g5 or %g4, %ulo(_dl_runtime_{resolve,profile}_0), %g4 or %g5, %lo(_dl_runtime_{resolve,profile}_0), %g5 @@ -189,7 +182,7 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile) /* PLT1 looks like: - sethi %uhi(_dl_runtime_{resolve,profile}_1), %g4 + sethi %uhi(_dl_runtime_{resolve,profile}_1), %g4 sethi %hi(_dl_runtime_{resolve,profile}_1), %g5 or %g4, %ulo(_dl_runtime_{resolve,profile}_1), %g4 or %g5, %lo(_dl_runtime_{resolve,profile}_1), %g5 @@ -479,8 +472,7 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc, sparc64_fixup_plt (map, reloc, reloc_addr, value, reloc->r_addend, 0); #endif break; -#if (!defined RTLD_BOOTSTRAP || USE___THREAD) \ - && !defined RESOLVE_CONFLICT_FIND_MAP +#ifndef RESOLVE_CONFLICT_FIND_MAP case R_SPARC_TLS_DTPMOD64: /* Get the information from the link map returned by the resolv function. */ diff --git a/sysdeps/unix/i386/sysdep.S b/sysdeps/unix/i386/sysdep.S index 3bc872add8..9f279e15b1 100644 --- a/sysdeps/unix/i386/sysdep.S +++ b/sysdeps/unix/i386/sysdep.S @@ -1,4 +1,4 @@ -/* Copyright (C) 1991,1992,1993,1994,1995,1996,1997,2000,2002,2004,2005 +/* Copyright (C) 1991-1997,2000,2002,2004,2005,2011 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -46,57 +46,24 @@ syscall_error: notb: #endif #ifndef PIC -# if USE___THREAD -# ifndef NO_TLS_DIRECT_SEG_REFS +# ifndef NO_TLS_DIRECT_SEG_REFS movl %eax, %gs:C_SYMBOL_NAME(errno@NTPOFF) -# else +# else movl %gs:0, %ecx movl %eax, C_SYMBOL_NAME(errno@NTPOFF)(%ecx) -# endif -# elif !defined _LIBC_REENTRANT - movl %eax, C_SYMBOL_NAME(errno) -# else - pushl %eax - PUSH_ERRNO_LOCATION_RETURN - call BP_SYM (__errno_location) - POP_ERRNO_LOCATION_RETURN - popl %ecx - movl %ecx, (%eax) # endif #else /* The caller has pushed %ebx and then set it up to point to the GOT before calling us through the PLT. */ -# if USE___THREAD movl C_SYMBOL_NAME(errno@GOTNTPOFF)(%ebx), %ecx /* Pop %ebx value saved before jumping here. */ popl %ebx -# ifndef NO_TLS_DIRECT_SEG_REFS +# ifndef NO_TLS_DIRECT_SEG_REFS addl %gs:0, %ecx movl %eax, (%ecx) -# else - movl %eax, %gs:0(%ecx) -# endif -# elif RTLD_PRIVATE_ERRNO - movl %eax, C_SYMBOL_NAME(rtld_errno@GOTOFF)(%ebx) - - /* Pop %ebx value saved before jumping here. */ - popl %ebx -# elif !defined _LIBC_REENTRANT - movl C_SYMBOL_NAME(errno@GOT)(%ebx), %ecx - - /* Pop %ebx value saved before jumping here. */ - popl %ebx - movl %eax, (%ecx) # else - pushl %eax - PUSH_ERRNO_LOCATION_RETURN - call C_SYMBOL_NAME (BP_SYM (__errno_location)@PLT) - POP_ERRNO_LOCATION_RETURN - popl %ecx - /* Pop %ebx value saved before jumping here. */ - popl %ebx - movl %ecx, (%eax) + movl %eax, %gs:0(%ecx) # endif #endif movl $-1, %eax diff --git a/sysdeps/unix/sysv/linux/i386/sysdep.h b/sysdeps/unix/sysv/linux/i386/sysdep.h index 77e6bad105..64ef4008bc 100644 --- a/sysdeps/unix/sysv/linux/i386/sysdep.h +++ b/sysdeps/unix/sysv/linux/i386/sysdep.h @@ -1,5 +1,5 @@ -/* Copyright (C) 1992,1993,1995-2000,2002-2006,2007 - Free Software Foundation, Inc. +/* Copyright (C) 1992,1993,1995-2000,2002-2006,2007,2011 + Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper, <drepper@gnu.org>, August 1995. @@ -121,13 +121,12 @@ # elif defined _LIBC_REENTRANT -# if USE___THREAD -# ifndef NOT_IN_libc -# define SYSCALL_ERROR_ERRNO __libc_errno -# else -# define SYSCALL_ERROR_ERRNO errno -# endif -# define SYSCALL_ERROR_HANDLER \ +# ifndef NOT_IN_libc +# define SYSCALL_ERROR_ERRNO __libc_errno +# else +# define SYSCALL_ERROR_ERRNO errno +# endif +# define SYSCALL_ERROR_HANDLER \ 0:SETUP_PIC_REG (cx); \ addl $_GLOBAL_OFFSET_TABLE_, %ecx; \ movl SYSCALL_ERROR_ERRNO@GOTNTPOFF(%ecx), %ecx; \ @@ -136,38 +135,13 @@ SYSCALL_ERROR_HANDLER_TLS_STORE (%edx, %ecx); \ orl $-1, %eax; \ jmp L(pseudo_end); -# ifndef NO_TLS_DIRECT_SEG_REFS -# define SYSCALL_ERROR_HANDLER_TLS_STORE(src, destoff) \ +# ifndef NO_TLS_DIRECT_SEG_REFS +# define SYSCALL_ERROR_HANDLER_TLS_STORE(src, destoff) \ movl src, %gs:(destoff) -# else -# define SYSCALL_ERROR_HANDLER_TLS_STORE(src, destoff) \ +# else +# define SYSCALL_ERROR_HANDLER_TLS_STORE(src, destoff) \ addl %gs:0, destoff; \ movl src, (destoff) -# endif -# else -# define SYSCALL_ERROR_HANDLER \ -0:pushl %ebx; \ - cfi_adjust_cfa_offset (4); \ - cfi_rel_offset (ebx, 0); \ - SETUP_PIC_REG (bx); \ - addl $_GLOBAL_OFFSET_TABLE_, %ebx; \ - xorl %edx, %edx; \ - subl %eax, %edx; \ - pushl %edx; \ - cfi_adjust_cfa_offset (4); \ - PUSH_ERRNO_LOCATION_RETURN; \ - call BP_SYM (__errno_location)@PLT; \ - POP_ERRNO_LOCATION_RETURN; \ - popl %ecx; \ - cfi_adjust_cfa_offset (-4); \ - popl %ebx; \ - cfi_adjust_cfa_offset (-4); \ - cfi_restore (ebx); \ - movl %ecx, (%eax); \ - orl $-1, %eax; \ - jmp L(pseudo_end); -/* A quick note: it is assumed that the call to `__errno_location' does - not modify the stack! */ # endif # else /* Store (- %eax) into errno through the GOT. */ diff --git a/sysdeps/unix/sysv/linux/ia64/sysdep.S b/sysdeps/unix/sysv/linux/ia64/sysdep.S index 3633dd4b78..3271857d61 100644 --- a/sysdeps/unix/sysv/linux/ia64/sysdep.S +++ b/sysdeps/unix/sysv/linux/ia64/sysdep.S @@ -1,4 +1,4 @@ -/* Copyright (C) 1999, 2000, 2001, 2003, 2004 Free Software Foundation, Inc. +/* Copyright (C) 1999-2001, 2003, 2004, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by David Mosberger-Tang <davidm@hpl.hp.com>. @@ -34,7 +34,7 @@ ENTRY(__syscall_error) ;; st4 [r2]=r8 mov r8=-1 -#elif USE___THREAD +#else # ifndef NOT_IN_libc # define SYSCALL_ERROR_ERRNO __libc_errno # else @@ -46,37 +46,7 @@ ENTRY(__syscall_error) mov r8=-1 add r2=r2,r13;; st4 [r2]=r3 -#elif defined _LIBC_REENTRANT - .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(0) - alloc r33=ar.pfs, 0, 4, 0, 0 - mov r32=rp - .body - mov r35=r8 - mov r34=r1 - ;; - br.call.sptk.many b0 = __errno_location -.Lret0: /* force new bundle */ - st4 [r8]=r35 - mov r1=r34 - mov rp=r32 - mov r8=-1 - mov ar.pfs=r33 -#else /* _LIBC_REENTRANT */ - /* - * Note that the gp has to be set properly for this to work. - * As long as all syscalls are in the same load unit - * (executable or shared library) as this routine, we should - * be fine. Otherwise, we would have to first load the global - * pointer register from __gp. - */ - addl r2=@ltoff(errno),gp - ;; - ld8 r2=[r2] - mov r3=r8 - mov r8=-1 - ;; - st4 [r2]=r3 -#endif /* _LIBC_REENTRANT */ +#endif ret // ret is #define'd in syscall.h! END(__syscall_error) diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.S b/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.S index 2a1dad0695..5a24fdc2e7 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.S +++ b/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.S @@ -1,4 +1,4 @@ -/* Copyright (C) 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. +/* Copyright (C) 2000, 2001, 2002, 2003, 2004, 2011 Free Software Foundation, Inc. Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). This file is part of the GNU C Library. @@ -32,12 +32,11 @@ .text ENTRY(__syscall_error) #ifndef PIC -# if USE___THREAD -# ifndef NOT_IN_libc -# define SYSCALL_ERROR_ERRNO __libc_errno -# else -# define SYSCALL_ERROR_ERRNO errno -# endif +# ifndef NOT_IN_libc +# define SYSCALL_ERROR_ERRNO __libc_errno +# else +# define SYSCALL_ERROR_ERRNO errno +# endif basr %r1,0 0: l %r1,1f-0b(%r1) ear %r3,%a0 @@ -46,34 +45,6 @@ ENTRY(__syscall_error) lhi %r2,-1 br %r14 1: .long SYSCALL_ERROR_ERRNO@ntpoff -# elif !defined _LIBC_REENTRANT - basr %r1,0 -0: l %r1,1f-0b(%r1) - lcr %r2,%r2 - st %r2,0(%r1) - lhi %r2,-1 - br %r14 -1: .long errno -# else - stm %r13,%r15,52(%r15) - cfi_offset (%r15, -36) - cfi_offset (%r14, -40) - cfi_offset (%r13, -44) - lr %r0,%r15 - ahi %r15,-96 - cfi_adjust_cfa_offset (96) - lcr %r13,%r2 - st %r0,0(%r15) - basr %r1,0 -0: l %r1,1f-0b(%r1) - basr %r14,%r1 - st %r13,0(%r2) - lm %r13,%r15,148(%r15) - cfi_adjust_cfa_offset (-96) - lhi %r2,-1 - br %r14 -1: .long __errno_location -#endif #else # if RTLD_PRIVATE_ERRNO basr %r1,0 @@ -83,7 +54,7 @@ ENTRY(__syscall_error) lhi %r2,-1 br %r14 1: .long rtld_errno - 0b -# elif USE___THREAD +# else # ifndef NOT_IN_libc # define SYSCALL_ERROR_ERRNO __libc_errno # else @@ -98,39 +69,6 @@ ENTRY(__syscall_error) lhi %r2,-1 br %r14 1: .long _GLOBAL_OFFSET_TABLE_-0b -# elif !defined _LIBC_REENTRANT - basr %r1,0 -0: al %r1,1f-0b(%r1) - l %r1,errno@GOT(%r1) - lcr %r2,%r2 - st %r2,0(0,%r1) - lhi %r2,-1 - br %r14 -1: .long _GLOBAL_OFFSET_TABLE_-0b -# else - stm %r11,%r15,44(%r15) - cfi_offset (%r15, -36) - cfi_offset (%r14, -40) - cfi_offset (%r13, -44) - cfi_offset (%r12, -48) - cfi_offset (%r11, -52) - lr %r0,%r15 - ahi %r15,-96 - cfi_adjust_cfa_offset (96) - lcr %r11,%r2 - st %r0,0(%r15) - basr %r13,0 -0: l %r12,1f-0b(%r13) - l %r1,2f-0b(%r13) - la %r12,0(%r12,%r13) - bas %r14,0(%r1,%r13) - st %r11,0(%r2) - lm %r11,%r15,140(%r15) - cfi_adjust_cfa_offset (-96) - lhi %r2,-1 - br %r14 -1: .long _GLOBAL_OFFSET_TABLE_-0b -2: .long __errno_location@PLT-0b # endif #endif diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h b/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h index 13ce9ab748..435eaabb17 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h +++ b/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2008 +/* Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2008, 2011 Free Software Foundation, Inc. Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). This file is part of the GNU C Library. @@ -56,10 +56,10 @@ #undef PSEUDO #define PSEUDO(name, syscall_name, args) \ .text; \ - ENTRY (name) \ + ENTRY (name) \ DO_CALL (syscall_name, args); \ lhi %r4,-4095 ; \ - clr %r2,%r4 ; \ + clr %r2,%r4 ; \ jnl SYSCALL_ERROR_LABEL #undef PSEUDO_END @@ -70,7 +70,7 @@ #undef PSEUDO_NOERRNO #define PSEUDO_NOERRNO(name, syscall_name, args) \ .text; \ - ENTRY (name) \ + ENTRY (name) \ DO_CALL (syscall_name, args) #undef PSEUDO_END_NOERRNO @@ -80,7 +80,7 @@ #undef PSEUDO_ERRVAL #define PSEUDO_ERRVAL(name, syscall_name, args) \ .text; \ - ENTRY (name) \ + ENTRY (name) \ DO_CALL (syscall_name, args); \ lcr %r2,%r2 @@ -107,14 +107,13 @@ br %r14; \ 2: .long rtld_errno-1b # elif defined _LIBC_REENTRANT -# if USE___THREAD -# ifndef NOT_IN_libc -# define SYSCALL_ERROR_ERRNO __libc_errno -# else -# define SYSCALL_ERROR_ERRNO errno -# endif -# define SYSCALL_ERROR_LABEL 0f -# define SYSCALL_ERROR_HANDLER \ +# ifndef NOT_IN_libc +# define SYSCALL_ERROR_ERRNO __libc_errno +# else +# define SYSCALL_ERROR_ERRNO errno +# endif +# define SYSCALL_ERROR_LABEL 0f +# define SYSCALL_ERROR_HANDLER \ 0: lcr %r0,%r2; \ basr %r1,0; \ 1: al %r1,2f-1b(%r1); \ @@ -124,14 +123,6 @@ lhi %r2,-1; \ br %r14; \ 2: .long _GLOBAL_OFFSET_TABLE_-1b -# else -# define SYSCALL_ERROR_LABEL 0f -# define SYSCALL_ERROR_HANDLER \ -0: basr %r1,0; \ -1: al %r1,2f-1b(%r1); \ - br %r1; \ -2: .long syscall_error@plt-1b -# endif # else # define SYSCALL_ERROR_LABEL 0f # define SYSCALL_ERROR_HANDLER \ @@ -317,8 +308,8 @@ if (INTERNAL_SYSCALL_ERROR_P (_ret, )) \ { \ iserr: \ - __set_errno (INTERNAL_SYSCALL_ERRNO (_ret, )); \ - _ret = -1L; \ + __set_errno (INTERNAL_SYSCALL_ERRNO (_ret, )); \ + _ret = -1L; \ } \ out: \ (int) _ret; \ diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.S b/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.S index bb61e894f1..41d8143896 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.S +++ b/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.S @@ -1,4 +1,4 @@ -/* Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. +/* Copyright (C) 2001, 2002, 2003, 2004, 2011 Free Software Foundation, Inc. Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). This file is part of the GNU C Library. @@ -33,12 +33,11 @@ .text ENTRY(__syscall_error) #ifndef PIC -# if USE___THREAD -# ifndef NOT_IN_libc -# define SYSCALL_ERROR_ERRNO __libc_errno -# else -# define SYSCALL_ERROR_ERRNO errno -# endif +# ifndef NOT_IN_libc +# define SYSCALL_ERROR_ERRNO __libc_errno +# else +# define SYSCALL_ERROR_ERRNO errno +# endif basr %r1,0 0: lg %r1,1f-0b(%r1) ear %r3,%a0 @@ -49,29 +48,6 @@ ENTRY(__syscall_error) lghi %r2,-1 br %r14 1: .quad SYSCALL_ERROR_ERRNO@ntpoff -# elif !defined _LIBC_REENTRANT - larl %r1,errno - lcr %r2,%r2 - st %r2,0(%r1) - lghi %r2,-1 - br %r14 -# else - stmg %r13,%r15,104(%r15) - cfi_offset (%r15,-40) - cfi_offset (%r14,-48) - cfi_offset (%r13,-56) - lgr %r0,%r15 - aghi %r15,-160 - cfi_adjust_cfa_offset (160) - lcr %r13,%r2 - stg %r0,0(%r15) - brasl %r14,__errno_location - st %r13,0(%r2) - lmg %r13,%r15,264(%r15) - cfi_adjust_cfa_offset (-160) - lghi %r2,-1 - br %r14 -#endif #else # if RTLD_PRIVATE_ERRNO larl %r1,rtld_errno @@ -79,7 +55,7 @@ ENTRY(__syscall_error) st %r2,0(%r1) lghi %r2,-1 br %r14 -# elif USE___THREAD +# else # ifndef NOT_IN_libc # define SYSCALL_ERROR_ERRNO __libc_errno # else @@ -94,29 +70,6 @@ ENTRY(__syscall_error) st %r2,0(%r1,%r3) lghi %r2,-1 br %r14 -# elif !defined _LIBC_REENTRANT - larl %r1,_GLOBAL_OFFSET_TABLE_ - lg %r1,errno@GOT(%r1) - lcr %r2,%r2 - st %r2,0(%r1) - lghi %r2,-1 - br %r14 -# else - stmg %r13,%r15,104(%r15) - cfi_offset (%r15,-40) - cfi_offset (%r14,-48) - cfi_offset (%r13,-56) - lgr %r0,%r15 - aghi %r15,-160 - cfi_adjust_cfa_offset (160) - lcr %r13,%r2 - stg %r0,0(%r15) - brasl %r14,__errno_location@PLT - st %r13,0(%r2) - lmg %r13,%r15,264(%r15) - cfi_adjust_cfa_offset (-160) - lghi %r2,-1 - br %r14 # endif #endif diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h b/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h index 4d45417639..598fb86529 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h +++ b/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h @@ -1,5 +1,5 @@ /* Assembler macros for 64 bit S/390. - Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2008 + Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2008, 2011 Free Software Foundation, Inc. Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). This file is part of the GNU C Library. @@ -115,14 +115,13 @@ lghi %r2,-1; \ br %r14 # elif defined _LIBC_REENTRANT -# if USE___THREAD -# ifndef NOT_IN_libc -# define SYSCALL_ERROR_ERRNO __libc_errno -# else -# define SYSCALL_ERROR_ERRNO errno -# endif -# define SYSCALL_ERROR_LABEL 0f -# define SYSCALL_ERROR_HANDLER \ +# ifndef NOT_IN_libc +# define SYSCALL_ERROR_ERRNO __libc_errno +# else +# define SYSCALL_ERROR_ERRNO errno +# endif +# define SYSCALL_ERROR_LABEL 0f +# define SYSCALL_ERROR_HANDLER \ 0: lcr %r0,%r2; \ larl %r1,SYSCALL_ERROR_ERRNO@indntpoff; \ lg %r1,0(%r1); \ @@ -132,10 +131,6 @@ st %r0,0(%r1,%r2); \ lghi %r2,-1; \ br %r14 -# else -# define SYSCALL_ERROR_LABEL syscall_error@plt -# define SYSCALL_ERROR_HANDLER -# endif # else # define SYSCALL_ERROR_LABEL 0f # define SYSCALL_ERROR_HANDLER \ @@ -319,8 +314,8 @@ if (INTERNAL_SYSCALL_ERROR_P (_ret, )) \ { \ iserr: \ - __set_errno (INTERNAL_SYSCALL_ERRNO (_ret, )); \ - _ret = -1L; \ + __set_errno (INTERNAL_SYSCALL_ERRNO (_ret, )); \ + _ret = -1L; \ } \ out: \ (int) _ret; \ diff --git a/sysdeps/unix/sysv/linux/sh/sysdep.h b/sysdeps/unix/sysv/linux/sh/sysdep.h index 0fc2c4f1ee..4ba0def0ed 100644 --- a/sysdeps/unix/sysv/linux/sh/sysdep.h +++ b/sysdeps/unix/sysv/linux/sh/sysdep.h @@ -1,5 +1,5 @@ -/* Copyright (C) 1992,1993,1995,1996,1997,1998,1999,2000,2002,2003,2004, - 2005,2006,2009 Free Software Foundation, Inc. +/* Copyright (C) 1992,1993,1995-2000,2002-2006,2009,2011 + Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>, August 1995. Changed by Kaz Kojima, <kkojima@rr.iij4u.or.jp>. @@ -114,13 +114,12 @@ # elif defined _LIBC_REENTRANT -# if USE___THREAD -# ifndef NOT_IN_libc -# define SYSCALL_ERROR_ERRNO __libc_errno -# else -# define SYSCALL_ERROR_ERRNO errno -# endif -# define SYSCALL_ERROR_HANDLER \ +# ifndef NOT_IN_libc +# define SYSCALL_ERROR_ERRNO __libc_errno +# else +# define SYSCALL_ERROR_ERRNO errno +# endif +# define SYSCALL_ERROR_HANDLER \ neg r0,r1; \ mov r12,r2; \ mov.l 0f,r12; \ @@ -137,43 +136,6 @@ .align 2; \ 0: .long _GLOBAL_OFFSET_TABLE_; \ 1: .long SYSCALL_ERROR_ERRNO@GOTTPOFF -# else -# define SYSCALL_ERROR_HANDLER \ - neg r0,r1; \ - mov.l r14,@-r15; \ - cfi_adjust_cfa_offset (4); \ - cfi_rel_offset (r14, 0); \ - mov.l r12,@-r15; \ - cfi_adjust_cfa_offset (4); \ - cfi_rel_offset (r12, 0); \ - mov.l r1,@-r15; \ - cfi_adjust_cfa_offset (4); \ - cfi_rel_offset (r1, 0); \ - mov.l 0f,r12; \ - mova 0f,r0; \ - add r0,r12; \ - sts.l pr,@-r15; \ - cfi_adjust_cfa_offset (4); \ - cfi_rel_offset (pr, 0); \ - mov r15,r14; \ - cfi_def_cfa_register (r14); \ - mov.l 1f,r1; \ - bsrf r1; \ - nop; \ - 2: mov r14,r15; \ - lds.l @r15+,pr; \ - mov.l @r15+,r1; \ - mov.l r1,@r0; \ - mov.l @r15+,r12; \ - mov.l @r15+,r14; \ - bra .Lpseudo_end; \ - mov _IMM1,r0; \ - .align 2; \ - 0: .long _GLOBAL_OFFSET_TABLE_; \ - 1: .long PLTJMP(C_SYMBOL_NAME(__errno_location))-(2b-.) -/* A quick note: it is assumed that the call to `__errno_location' does - not modify the stack! */ -# endif # else /* Store (-r0) into errno through the GOT. */ # define SYSCALL_ERROR_HANDLER \ @@ -324,8 +286,8 @@ unsigned int resultvar = INTERNAL_SYSCALL (name, , nr, args); \ if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (resultvar, ), 0)) \ { \ - __set_errno (INTERNAL_SYSCALL_ERRNO (resultvar, )); \ - resultvar = 0xffffffff; \ + __set_errno (INTERNAL_SYSCALL_ERRNO (resultvar, )); \ + resultvar = 0xffffffff; \ } \ (int) resultvar; }) @@ -347,7 +309,7 @@ #define INTERNAL_SYSCALL_NCS(name, err, nr, args...) \ ({ \ unsigned long int resultvar; \ - register long int r3 asm ("%r3") = (name); \ + register long int r3 asm ("%r3") = (name); \ SUBSTITUTE_ARGS_##nr(args); \ \ asm volatile (SYSCALL_INST_STR##nr SYSCALL_INST_PAD \ diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h b/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h index 8af045dc2b..161f431078 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1997, 2002, 2003, 2004, 2006, 2008 +/* Copyright (C) 1997, 2002, 2003, 2004, 2006, 2008, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Miguel de Icaza <miguel@gnu.ai.mit.edu>, January 1997. @@ -99,32 +99,19 @@ ENTRY(name); \ mov -1, %o0; # elif defined _LIBC_REENTRANT -# if USE___THREAD -# ifndef NOT_IN_libc -# define SYSCALL_ERROR_ERRNO __libc_errno -# else -# define SYSCALL_ERROR_ERRNO errno -# endif -# define SYSCALL_ERROR_HANDLER \ +# ifndef NOT_IN_libc +# define SYSCALL_ERROR_ERRNO __libc_errno +# else +# define SYSCALL_ERROR_ERRNO errno +# endif +# define SYSCALL_ERROR_HANDLER \ 0: SETUP_PIC_REG(o2,g1) \ sethi %tie_hi22(SYSCALL_ERROR_ERRNO), %g1; \ add %g1, %tie_lo10(SYSCALL_ERROR_ERRNO), %g1; \ ld [%o2 + %g1], %g1, %tie_ld(SYSCALL_ERROR_ERRNO); \ - st %o0, [%g7 + %g1]; \ - jmp %o7 + 8; \ + st %o0, [%g7 + %g1]; \ + jmp %o7 + 8; \ mov -1, %o0; -# else -# define SYSCALL_ERROR_HANDLER \ -0: save %sp, -96, %sp; \ - cfi_def_cfa_register(%fp); \ - cfi_window_save; \ - cfi_register (%o7, %i7); \ - call __errno_location; \ - nop; \ - st %i0, [%o0]; \ - jmp %i7 + 8; \ - restore %g0, -1, %o0; -# endif # else # define SYSCALL_ERROR_HANDLER \ 0: SETUP_PIC_REG(o2,g1) \ diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h b/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h index bdd1d45bd7..bc8a0b0e3a 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1997, 2000, 2002, 2003, 2004, 2006, 2008 +/* Copyright (C) 1997, 2000, 2002, 2003, 2004, 2006, 2008, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Richard Henderson <richard@gnu.ai.mit.edu>, 1997. @@ -106,32 +106,19 @@ ENTRY(name); \ mov -1, %o0; # elif defined _LIBC_REENTRANT -# if USE___THREAD -# ifndef NOT_IN_libc -# define SYSCALL_ERROR_ERRNO __libc_errno -# else -# define SYSCALL_ERROR_ERRNO errno -# endif -# define SYSCALL_ERROR_HANDLER \ +# ifndef NOT_IN_libc +# define SYSCALL_ERROR_ERRNO __libc_errno +# else +# define SYSCALL_ERROR_ERRNO errno +# endif +# define SYSCALL_ERROR_HANDLER \ 0: SETUP_PIC_REG(o2,g1) \ sethi %tie_hi22(SYSCALL_ERROR_ERRNO), %g1; \ add %g1, %tie_lo10(SYSCALL_ERROR_ERRNO), %g1; \ ldx [%o2 + %g1], %g1, %tie_ldx(SYSCALL_ERROR_ERRNO);\ - st %o0, [%g7 + %g1]; \ - jmp %o7 + 8; \ + st %o0, [%g7 + %g1]; \ + jmp %o7 + 8; \ mov -1, %o0; -# else -# define SYSCALL_ERROR_HANDLER \ -0: save %sp, -176, %sp; \ - cfi_def_cfa_register(%fp); \ - cfi_window_save; \ - cfi_register (%o7, %i7); \ - call __errno_location; \ - nop; \ - st %i0, [%o0]; \ - jmp %i7 + 8; \ - restore %g0, -1, %o0; -# endif # else # define SYSCALL_ERROR_HANDLER \ 0: SETUP_PIC_REG(o2,g1) \ diff --git a/sysdeps/unix/sysv/linux/x86_64/sysdep.h b/sysdeps/unix/sysv/linux/x86_64/sysdep.h index a9821dc0a8..64362300ae 100644 --- a/sysdeps/unix/sysv/linux/x86_64/sysdep.h +++ b/sysdeps/unix/sysv/linux/x86_64/sysdep.h @@ -124,7 +124,7 @@ movl %edx, (%rcx); \ orq $-1, %rax; \ jmp L(pseudo_end); -# elif USE___THREAD +# else # ifndef NOT_IN_libc # define SYSCALL_ERROR_ERRNO __libc_errno # else @@ -138,34 +138,6 @@ movl %edx, %fs:(%rcx); \ orq $-1, %rax; \ jmp L(pseudo_end); -# elif defined _LIBC_REENTRANT -/* Store (- %rax) into errno through the GOT. - Note that errno occupies only 4 bytes. */ -# define SYSCALL_ERROR_HANDLER \ -0: \ - xorl %edx, %edx; \ - subq %rax, %rdx; \ - pushq %rdx; \ - cfi_adjust_cfa_offset(8); \ - PUSH_ERRNO_LOCATION_RETURN; \ - call BP_SYM (__errno_location)@PLT; \ - POP_ERRNO_LOCATION_RETURN; \ - popq %rdx; \ - cfi_adjust_cfa_offset(-8); \ - movl %edx, (%rax); \ - orq $-1, %rax; \ - jmp L(pseudo_end); - -/* A quick note: it is assumed that the call to `__errno_location' does - not modify the stack! */ -# else /* Not _LIBC_REENTRANT. */ -# define SYSCALL_ERROR_HANDLER \ -0:movq errno@GOTPCREL(%RIP), %rcx; \ - xorl %edx, %edx; \ - subq %rax, %rdx; \ - movl %edx, (%rcx); \ - orq $-1, %rax; \ - jmp L(pseudo_end); # endif /* PIC */ /* The Linux/x86-64 kernel expects the system call parameters in diff --git a/sysdeps/unix/x86_64/sysdep.S b/sysdeps/unix/x86_64/sysdep.S index aca81fef2f..908da3c3d5 100644 --- a/sysdeps/unix/x86_64/sysdep.S +++ b/sysdeps/unix/x86_64/sysdep.S @@ -1,4 +1,4 @@ -/* Copyright (C) 2001, 2002, 2004, 2005 Free Software Foundation, Inc. +/* Copyright (C) 2001, 2002, 2004, 2005, 2011 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,43 +45,11 @@ syscall_error: movl $EAGAIN, %eax /* Yes; translate it to EAGAIN. */ notb: #endif -#if USE___THREAD -# ifdef PIC +#ifdef PIC movq C_SYMBOL_NAME(errno@GOTTPOFF)(%rip), %rcx movl %eax, %fs:0(%rcx) -# else - movl %eax, %fs:C_SYMBOL_NAME(errno@TPOFF) -# endif -#elif !defined PIC -# ifndef _LIBC_REENTRANT - movl %eax, C_SYMBOL_NAME(errno) -# else - pushq %rax - cfi_adjust_cfa_offset(8) - PUSH_ERRNO_LOCATION_RETURN - call BP_SYM (__errno_location) - POP_ERRNO_LOCATION_RETURN - popq %rcx - cfi_adjust_cfa_offset(-8) - movl %ecx, (%rax) -# endif #else -# if RTLD_PRIVATE_ERRNO - leaq rtld_errno(%rip), %rcx - movl %eax, (%rcx) -# elif !defined _LIBC_REENTRANT - movq C_SYMBOL_NAME(errno)@GOTPCREL(%rip), %rcx - movl %eax, (%rcx) -# else - pushq %rax - cfi_adjust_cfa_offset(8) - PUSH_ERRNO_LOCATION_RETURN - call C_SYMBOL_NAME (BP_SYM (__errno_location)@PLT) - POP_ERRNO_LOCATION_RETURN - popq %rcx - cfi_adjust_cfa_offset(-8) - movl %ecx, (%rax) -# endif + movl %eax, %fs:C_SYMBOL_NAME(errno@TPOFF) #endif movq $-1, %rax ret diff --git a/sysdeps/x86_64/dl-machine.h b/sysdeps/x86_64/dl-machine.h index f615e9591f..4c31ac5da8 100644 --- a/sysdeps/x86_64/dl-machine.h +++ b/sysdeps/x86_64/dl-machine.h @@ -1,5 +1,5 @@ /* Machine-dependent ELF dynamic relocation inline functions. x86-64 version. - Copyright (C) 2001-2006, 2008, 2009, 2010 Free Software Foundation, Inc. + Copyright (C) 2001-2006, 2008-2010, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Andreas Jaeger <aj@suse.de>. @@ -195,8 +195,7 @@ _dl_start_user:\n\ define the value. ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one of the main executable's symbols, as for a COPY reloc. */ -#if !defined RTLD_BOOTSTRAP || USE___THREAD -# define elf_machine_type_class(type) \ +#define elf_machine_type_class(type) \ ((((type) == R_X86_64_JUMP_SLOT \ || (type) == R_X86_64_DTPMOD64 \ || (type) == R_X86_64_DTPOFF64 \ @@ -204,11 +203,6 @@ _dl_start_user:\n\ || (type) == R_X86_64_TLSDESC) \ * ELF_RTYPE_CLASS_PLT) \ | (((type) == R_X86_64_COPY) * ELF_RTYPE_CLASS_COPY)) -#else -# define elf_machine_type_class(type) \ - ((((type) == R_X86_64_JUMP_SLOT) * ELF_RTYPE_CLASS_PLT) \ - | (((type) == R_X86_64_COPY) * ELF_RTYPE_CLASS_COPY)) -#endif /* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */ #define ELF_MACHINE_JMP_SLOT R_X86_64_JUMP_SLOT @@ -302,10 +296,6 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc, && __builtin_expect (sym->st_shndx != SHN_UNDEF, 1)) value = ((Elf64_Addr (*) (void)) value) (); -# if defined RTLD_BOOTSTRAP && !USE___THREAD - assert (r_type == R_X86_64_GLOB_DAT || r_type == R_X86_64_JUMP_SLOT); - *reloc_addr = value + reloc->r_addend; -# else switch (r_type) { case R_X86_64_GLOB_DAT: @@ -453,7 +443,6 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc, break; # endif } -#endif } } diff --git a/tls.make.c b/tls.make.c index 6bcd2479c6..4627aa37e0 100644 --- a/tls.make.c +++ b/tls.make.c @@ -2,8 +2,4 @@ #include <tls.h> -#if USE___THREAD @@@ use-thread = yes @@@ -#else -@@@ use-thread = no @@@ -#endif |