1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-28 00:21:52 +03:00

Remove support for !USE___THREAD

This commit is contained in:
Ulrich Drepper
2011-09-10 16:50:28 -04:00
parent 3ce1f29594
commit d063d16433
54 changed files with 339 additions and 997 deletions

View File

@ -1,5 +1,43 @@
2011-09-10 Ulrich Drepper <drepper@gmail.com> 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 * configure.in: Remove --with-__thread option. Make tests for
--no-whole-archive, __builtin_expect, symbol redirection, __thread, --no-whole-archive, __builtin_expect, symbol redirection, __thread,
tls_model attribute fail if no support is available. Remove tls_model attribute fail if no support is available. Remove

View File

@ -1,5 +1,5 @@
/* libc-internal interface for thread-specific data. Stub or TLS version. /* 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. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or 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. set of thread-specific `void *' data used only internally by libc.
__libc_tsd_define(CLASS, TYPE, KEY) -- Define or declare a datum with TYPE __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, keys used in only one source file,
empty for global definitions, or empty for global definitions, or
`extern' for global declarations. `extern' for global declarations.
__libc_tsd_address(TYPE, KEY) -- Return the `TYPE *' pointing to __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_get(TYPE, KEY) -- Return the `TYPE' datum for KEY.
__libc_tsd_set(TYPE, KEY, VALUE) -- Set the datum for KEY to VALUE. __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 We don't define an enum for the possible key values, because the KEYs
translate directly into variables by macro magic. */ 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; CLASS __thread TYPE __libc_tsd_##KEY attribute_tls_model_ie;
# define __libc_tsd_address(TYPE, KEY) (&__libc_tsd_##KEY) #define __libc_tsd_address(TYPE, KEY) (&__libc_tsd_##KEY)
# define __libc_tsd_get(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)) #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
#endif /* bits/libc-tsd.h */ #endif /* bits/libc-tsd.h */

View File

@ -1,6 +1,6 @@
/* MT support function to get address of `errno' variable, non-threaded /* MT support function to get address of `errno' variable, non-threaded
version. 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. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -21,15 +21,7 @@
#include <errno.h> #include <errno.h>
#include <tls.h> #include <tls.h>
#if ! USE___THREAD && !RTLD_PRIVATE_ERRNO
#undef errno
extern int errno;
#endif
int * int *
#if ! USE___THREAD
weak_const_function
#endif
__errno_location (void) __errno_location (void)
{ {
return &errno; return &errno;

View File

@ -1,5 +1,5 @@
/* Definition of `errno' variable. Canonical version. /* 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. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or 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. */ /* Code compiled for rtld refers only to this name. */
int rtld_errno attribute_hidden; int rtld_errno attribute_hidden;
#elif USE___THREAD #else
__thread int errno; __thread int errno;
extern __thread int __libc_errno __attribute__ ((alias ("errno"))) extern __thread int __libc_errno __attribute__ ((alias ("errno")))
attribute_hidden; 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 #endif

View File

@ -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 #ifdef SHARED
if (GL(dl_initial_dtv) == NULL) if (GL(dl_initial_dtv) == NULL)
/* There was no initial TLS setup, it was set up later when /* There was no initial TLS setup, it was set up later when
it used the normal malloc. */ it used the normal malloc. */
free_slotinfo (&GL(dl_tls_dtv_slotinfo_list)); free_slotinfo (&GL(dl_tls_dtv_slotinfo_list));
else else
#endif #endif
/* The first element of the list does not have to be deallocated. /* The first element of the list does not have to be deallocated.
It was allocated in the dynamic linker (i.e., with a different It was allocated in the dynamic linker (i.e., with a different
malloc), and in the static library it's in .bss space. */ malloc), and in the static library it's in .bss space. */
free_slotinfo (&GL(dl_tls_dtv_slotinfo_list)->next); free_slotinfo (&GL(dl_tls_dtv_slotinfo_list)->next);
}
void *scope_free_list = GL(dl_scope_free_list); void *scope_free_list = GL(dl_scope_free_list);
GL(dl_scope_free_list) = NULL; GL(dl_scope_free_list) = NULL;

View File

@ -1,5 +1,5 @@
/* Thread-local data used by error handling for runtime dynamic linker. /* 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. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -30,17 +30,13 @@
void ** __attribute__ ((const)) void ** __attribute__ ((const))
_dl_initial_error_catch_tsd (void) _dl_initial_error_catch_tsd (void)
{ {
# if USE___THREAD
static __thread void *data; static __thread void *data;
# else
static void *data;
# endif
return &data; return &data;
} }
void **(*_dl_error_catch_tsd) (void) __attribute__ ((const)) void **(*_dl_error_catch_tsd) (void) __attribute__ ((const))
= &_dl_initial_error_catch_tsd; = &_dl_initial_error_catch_tsd;
# elif USE___THREAD # else
/* libpthread sets _dl_error_catch_tsd to point to this function. /* libpthread sets _dl_error_catch_tsd to point to this function.
We define it here instead of in libpthread so that it doesn't We define it here instead of in libpthread so that it doesn't

View File

@ -21,15 +21,13 @@ extern int rtld_errno attribute_hidden;
# include <tls.h> # include <tls.h>
# if USE___THREAD # undef errno
# undef errno # ifndef NOT_IN_libc
# ifndef NOT_IN_libc # define errno __libc_errno
# define errno __libc_errno # else
# else # define errno errno /* For #ifndef errno tests. */
# define errno errno /* For #ifndef errno tests. */
# endif
extern __thread int errno attribute_tls_model_ie;
# endif # endif
extern __thread int errno attribute_tls_model_ie;
# endif /* RTLD_PRIVATE_ERRNO */ # endif /* RTLD_PRIVATE_ERRNO */

View File

@ -2,29 +2,19 @@
#include <resolv/netdb.h> #include <resolv/netdb.h>
/* Macros for accessing h_errno from inside libc. */ /* Macros for accessing h_errno from inside libc. */
# undef h_errno
# ifdef _LIBC_REENTRANT # ifdef _LIBC_REENTRANT
# include <tls.h> # include <tls.h>
# if USE___THREAD # ifndef NOT_IN_libc
# undef h_errno # define h_errno __libc_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))
# else # else
static inline int # define h_errno h_errno /* For #ifndef h_errno tests. */
__set_h_errno (int __err)
{
return *__h_errno_location () = __err;
}
# endif # endif
extern __thread int h_errno attribute_tls_model_ie;
# else # else
# undef h_errno
# define __set_h_errno(x) (h_errno = (x))
extern int h_errno; extern int h_errno;
# endif /* _LIBC_REENTRANT */ # endif /* _LIBC_REENTRANT */
# define __set_h_errno(x) (h_errno = (x))
libc_hidden_proto (hstrerror) libc_hidden_proto (hstrerror)
libc_hidden_proto (innetgr) libc_hidden_proto (innetgr)

View File

@ -15,14 +15,12 @@
# ifdef _LIBC_REENTRANT # ifdef _LIBC_REENTRANT
# include <tls.h> # include <tls.h>
# if USE___THREAD # undef _res
# undef _res # ifndef NOT_IN_libc
# ifndef NOT_IN_libc # define __resp __libc_resp
# define __resp __libc_resp
# endif
# define _res (*__resp)
extern __thread struct __res_state *__resp attribute_tls_model_ie;
# endif # endif
# define _res (*__resp)
extern __thread struct __res_state *__resp attribute_tls_model_ie;
# else # else
# ifndef __BIND_NOSTATIC # ifndef __BIND_NOSTATIC
# undef _res # undef _res

View File

@ -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

View File

@ -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. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -19,10 +19,6 @@
#include <netdb.h> #include <netdb.h>
#include <tls.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. */ /* When threaded, h_errno may be a per-thread variable. */
int * int *

View File

@ -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. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or 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 /* We need to have the error status variable of the resolver
accessible in the libc. */ accessible in the libc. */
#if USE___THREAD
__thread int h_errno; __thread int h_errno;
extern __thread int __libc_h_errno __attribute__ ((alias ("h_errno"))) extern __thread int __libc_h_errno __attribute__ ((alias ("h_errno")))
attribute_hidden; attribute_hidden;
# define h_errno __libc_h_errno #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

View File

@ -173,10 +173,6 @@ int __malloc_initialized = -1;
static __malloc_ptr_t (*save_malloc_hook) (size_t __size, static __malloc_ptr_t (*save_malloc_hook) (size_t __size,
__const __malloc_ptr_t); __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, static void (*save_free_hook) (__malloc_ptr_t __ptr,
__const __malloc_ptr_t); __const __malloc_ptr_t);
static Void_t* save_arena; static Void_t* save_arena;
@ -432,34 +428,6 @@ __failing_morecore (ptrdiff_t d)
extern struct dl_open_hook *_dl_open_hook; extern struct dl_open_hook *_dl_open_hook;
libc_hidden_proto (_dl_open_hook); libc_hidden_proto (_dl_open_hook);
# endif # 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 #endif
static void static void
@ -475,14 +443,7 @@ ptmalloc_init (void)
if(__malloc_initialized >= 0) return; if(__malloc_initialized >= 0) return;
__malloc_initialized = 0; __malloc_initialized = 0;
#ifdef _LIBC ptmalloc_init_minimal();
# 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();
mutex_init(&main_arena.mutex); mutex_init(&main_arena.mutex);
main_arena.next = &main_arena; main_arena.next = &main_arena;

View File

@ -417,7 +417,7 @@ memalign_check(alignment, bytes, caller)
#ifndef NO_THREADS #ifndef NO_THREADS
# ifdef _LIBC # ifdef _LIBC
# if USE___THREAD || !defined SHARED # ifndef SHARED
/* These routines are never needed in this configuration. */ /* These routines are never needed in this configuration. */
# define NO_STARTER # define NO_STARTER
# endif # endif

View File

@ -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, static Void_t* memalign_check(size_t alignment, size_t bytes,
const Void_t *caller); const Void_t *caller);
#ifndef NO_THREADS #ifndef NO_THREADS
# ifdef _LIBC /* These routines are never needed in this configuration. */
# 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
static Void_t* malloc_atfork(size_t sz, const Void_t *caller); static Void_t* malloc_atfork(size_t sz, const Void_t *caller);
static void free_atfork(Void_t* mem, const Void_t *caller); static void free_atfork(Void_t* mem, const Void_t *caller);
#endif #endif

View File

@ -1,5 +1,20 @@
2011-09-10 Ulrich Drepper <drepper@gmail.com> 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-tls1.c: Support for __thread is now mandatory.
* tst-tls2.c: Likewise. * tst-tls2.c: Likewise.
* tst-tls3.c: Likewise. * tst-tls3.c: Likewise.

View File

@ -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. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
@ -81,18 +81,13 @@ __new_sem_post:
4: 4:
#endif #endif
addl $_GLOBAL_OFFSET_TABLE_, %ebx 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 movl errno@gotntpoff(%ebx), %edx
addl %gs:0, %edx addl %gs:0, %edx
movl $EINVAL, (%edx) movl $EINVAL, (%edx)
# else #else
movl errno@gotntpoff(%ebx), %edx movl errno@gotntpoff(%ebx), %edx
movl $EINVAL, %gs:(%edx) movl $EINVAL, %gs:(%edx)
# endif
#else
call __errno_location@plt
movl $EINVAL, (%eax)
#endif #endif
orl $-1, %eax orl $-1, %eax
@ -107,18 +102,13 @@ __new_sem_post:
5: 5:
#endif #endif
addl $_GLOBAL_OFFSET_TABLE_, %ebx 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 movl errno@gotntpoff(%ebx), %edx
addl %gs:0, %edx addl %gs:0, %edx
movl $EOVERFLOW, (%edx) movl $EOVERFLOW, (%edx)
# else #else
movl errno@gotntpoff(%ebx), %edx movl errno@gotntpoff(%ebx), %edx
movl $EOVERFLOW, %gs:(%edx) movl $EOVERFLOW, %gs:(%edx)
# endif
#else
call __errno_location@plt
movl $EOVERFLOW, (%eax)
#endif #endif
orl $-1, %eax orl $-1, %eax

View File

@ -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. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
@ -154,18 +154,13 @@ sem_timedwait:
4: 4:
#endif #endif
addl $_GLOBAL_OFFSET_TABLE_, %ebx 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 movl errno@gotntpoff(%ebx), %edx
addl %gs:0, %edx addl %gs:0, %edx
movl %esi, (%edx) movl %esi, (%edx)
# else #else
movl errno@gotntpoff(%ebx), %edx movl errno@gotntpoff(%ebx), %edx
movl %esi, %gs:(%edx) movl %esi, %gs:(%edx)
# endif
#else
call __errno_location@plt
movl %esi, (%eax)
#endif #endif
movl 28(%esp), %ebx /* Load semaphore address. */ movl 28(%esp), %ebx /* Load semaphore address. */

View File

@ -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. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
@ -49,18 +49,13 @@ __new_sem_trywait:
3: 3:
#endif #endif
addl $_GLOBAL_OFFSET_TABLE_, %ecx 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 movl errno@gotntpoff(%ecx), %edx
addl %gs:0, %edx addl %gs:0, %edx
movl $EAGAIN, (%edx) movl $EAGAIN, (%edx)
# else #else
movl errno@gotntpoff(%ecx), %edx movl errno@gotntpoff(%ecx), %edx
movl $EAGAIN, %gs:(%edx) movl $EAGAIN, %gs:(%edx)
# endif
#else
call __errno_location@plt
movl $EAGAIN, (%eax)
#endif #endif
orl $-1, %eax orl $-1, %eax
ret ret

View File

@ -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. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
@ -114,18 +114,13 @@ __new_sem_wait:
8: 8:
#endif #endif
addl $_GLOBAL_OFFSET_TABLE_, %ebx 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 movl errno@gotntpoff(%ebx), %edx
addl %gs:0, %edx addl %gs:0, %edx
movl %esi, (%edx) movl %esi, (%edx)
# else #else
movl errno@gotntpoff(%ebx), %edx movl errno@gotntpoff(%ebx), %edx
movl %esi, %gs:(%edx) movl %esi, %gs:(%edx)
# endif
#else
call __errno_location@plt
movl %esi, (%eax)
#endif #endif
orl $-1, %eax orl $-1, %eax
@ -228,13 +223,13 @@ sem_wait_cleanup:
.byte 14 # DW_CFA_def_cfa_offset .byte 14 # DW_CFA_def_cfa_offset
.uleb128 8 .uleb128 8
.byte 0x83 # DW_CFA_offset %ebx .byte 0x83 # DW_CFA_offset %ebx
.uleb128 2 .uleb128 2
.byte 4 # DW_CFA_advance_loc4 .byte 4 # DW_CFA_advance_loc4
.long .Lpush_esi-.Lpush_ebx .long .Lpush_esi-.Lpush_ebx
.byte 14 # DW_CFA_def_cfa_offset .byte 14 # DW_CFA_def_cfa_offset
.uleb128 12 .uleb128 12
.byte 0x86 # DW_CFA_offset %esi .byte 0x86 # DW_CFA_offset %esi
.uleb128 3 .uleb128 3
.byte 4 # DW_CFA_advance_loc4 .byte 4 # DW_CFA_advance_loc4
.long .Lsub_esp-.Lpush_esi .long .Lsub_esp-.Lpush_esi
.byte 14 # DW_CFA_def_cfa_offset .byte 14 # DW_CFA_def_cfa_offset
@ -250,9 +245,9 @@ sem_wait_cleanup:
.byte 14 # DW_CFA_def_cfa_offset .byte 14 # DW_CFA_def_cfa_offset
.uleb128 16 .uleb128 16
.byte 0x83 # DW_CFA_offset %ebx .byte 0x83 # DW_CFA_offset %ebx
.uleb128 2 .uleb128 2
.byte 0x86 # DW_CFA_offset %esi .byte 0x86 # DW_CFA_offset %esi
.uleb128 3 .uleb128 3
.align 4 .align 4
.LENDFDE: .LENDFDE:
@ -333,18 +328,13 @@ __old_sem_wait:
4: 4:
#endif #endif
addl $_GLOBAL_OFFSET_TABLE_, %ebx 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 movl errno@gotntpoff(%ebx), %edx
addl %gs:0, %edx addl %gs:0, %edx
movl %esi, (%edx) movl %esi, (%edx)
# else #else
movl errno@gotntpoff(%ebx), %edx movl errno@gotntpoff(%ebx), %edx
movl %esi, %gs:(%edx) movl %esi, %gs:(%edx)
# endif
#else
call __errno_location@plt
movl %esi, (%eax)
#endif #endif
orl $-1, %eax orl $-1, %eax
jmp 5b jmp 5b

View File

@ -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. This file is part of the GNU C Library.
Contributed by Jakub Jelinek <jakub@redhat.com>, 2002. Contributed by Jakub Jelinek <jakub@redhat.com>, 2002.
@ -27,13 +27,12 @@
# undef PSEUDO # undef PSEUDO
# if USE___THREAD # ifndef NOT_IN_libc
# ifndef NOT_IN_libc # define SYSDEP_CANCEL_ERRNO __libc_errno
# define SYSDEP_CANCEL_ERRNO __libc_errno # else
# else # define SYSDEP_CANCEL_ERRNO errno
# define SYSDEP_CANCEL_ERRNO errno # endif
# endif # define SYSDEP_CANCEL_ERROR(args) \
# define SYSDEP_CANCEL_ERROR(args) \
.section .gnu.linkonce.t.__syscall_error_##args, "ax"; \ .section .gnu.linkonce.t.__syscall_error_##args, "ax"; \
.align 32; \ .align 32; \
.proc __syscall_error_##args; \ .proc __syscall_error_##args; \
@ -53,28 +52,6 @@ __syscall_error_##args: \
add loc4 = loc4, r13;; \ add loc4 = loc4, r13;; \
st4 [loc4] = loc3; \ st4 [loc4] = loc3; \
mov ar.pfs = loc0 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 # ifndef USE_DL_SYSINFO

View File

@ -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. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -65,7 +65,7 @@ __new_sem_post:
3: 3:
mov #EOVERFLOW, r2 mov #EOVERFLOW, r2
4: 4:
mov.l r12, @-r15 mov.l r12, @-r15
mov.l r8, @-r15 mov.l r8, @-r15
sts.l pr, @-r15 sts.l pr, @-r15
@ -73,7 +73,6 @@ __new_sem_post:
mov.l .Lgot3, r12 mov.l .Lgot3, r12
add r0, r12 add r0, r12
#if USE___THREAD
mov.l .Lerrno3, r0 mov.l .Lerrno3, r0
stc gbr, r1 stc gbr, r1
mov.l @(r0, r12), r0 mov.l @(r0, r12), r0
@ -84,14 +83,6 @@ __new_sem_post:
.long errno@GOTTPOFF .long errno@GOTTPOFF
.Lexit: .Lexit:
mov.l r2, @r0 mov.l r2, @r0
#else
mov r2, r8
mov.l .Lerrloc3, r1
bsrf r1
nop
.Lerrloc3b:
mov r8, @r0
#endif
lds.l @r15+, pr lds.l @r15+, pr
mov.l @r15+, r8 mov.l @r15+, r8
mov.l @r15+, r12 mov.l @r15+, r12
@ -103,9 +94,5 @@ __new_sem_post:
.long SEM_VALUE_MAX .long SEM_VALUE_MAX
.Lgot3: .Lgot3:
.long _GLOBAL_OFFSET_TABLE_ .long _GLOBAL_OFFSET_TABLE_
#if !USE___THREAD
.Lerrloc3:
.long __errno_location@PLT-(.Lerrloc3b-.)
#endif
.size __new_sem_post,.-__new_sem_post .size __new_sem_post,.-__new_sem_post
versioned_symbol(libpthread, __new_sem_post, sem_post, GLIBC_2_1) versioned_symbol(libpthread, __new_sem_post, sem_post, GLIBC_2_1)

View File

@ -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. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -131,7 +131,7 @@ sem_timedwait:
mov r10, r4 mov r10, r4
bsrf r1 bsrf r1
mov r0, r10 mov r0, r10
.Ldisable0b: .Ldisable0b:
mov r10, r0 mov r10, r0
.LcleanupEND: .LcleanupEND:
@ -173,7 +173,6 @@ sem_timedwait:
mov.l .Lgot2, r12 mov.l .Lgot2, r12
add r0, r12 add r0, r12
#if USE___THREAD
mov.l .Lerrno2, r0 mov.l .Lerrno2, r0
stc gbr, r1 stc gbr, r1
mov.l @(r0, r12), r0 mov.l @(r0, r12), r0
@ -181,14 +180,8 @@ sem_timedwait:
add r1, r0 add r1, r0
.align 2 .align 2
.Lerrno2: .Lerrno2:
.long errno@GOTTPOFF .long errno@GOTTPOFF
.Lexit: .Lexit:
#else
mov.l .Lerrloc2, r1
bsrf r1
nop
.Lerrloc2b:
#endif
mov.l r10, @r0 mov.l r10, @r0
DEC (@(NWAITERS,r8), r2) DEC (@(NWAITERS,r8), r2)
bra 10b bra 10b
@ -201,10 +194,6 @@ sem_timedwait:
.long 1000000000 .long 1000000000
.Lgot2: .Lgot2:
.long _GLOBAL_OFFSET_TABLE_ .long _GLOBAL_OFFSET_TABLE_
#if !USE___THREAD
.Lerrloc2:
.long __errno_location@PLT-(.Lerrloc2b-.)
#endif
.Lenable0: .Lenable0:
.long __pthread_enable_asynccancel-.Lenable0b .long __pthread_enable_asynccancel-.Lenable0b
.Ldisable0: .Ldisable0:
@ -213,7 +202,7 @@ sem_timedwait:
.type sem_wait_cleanup,@function .type sem_wait_cleanup,@function
sem_wait_cleanup: sem_wait_cleanup:
DEC (@(NWAITERS,r8), r2) DEC (@(NWAITERS,r8), r2)
.LcallUR: .LcallUR:
mov.l .Lresume, r1 mov.l .Lresume, r1
#ifdef PIC #ifdef PIC
@ -314,25 +303,25 @@ sem_wait_cleanup:
.byte 14 ! DW_CFA_def_cfa_offset .byte 14 ! DW_CFA_def_cfa_offset
.uleb128 4 .uleb128 4
.byte 0x88 ! DW_CFA_offset r8 .byte 0x88 ! DW_CFA_offset r8
.uleb128 1 .uleb128 1
.byte 4 ! DW_CFA_advance_loc4 .byte 4 ! DW_CFA_advance_loc4
.ualong .Lpush_r9-.Lpush_r8 .ualong .Lpush_r9-.Lpush_r8
.byte 14 ! DW_CFA_def_cfa_offset .byte 14 ! DW_CFA_def_cfa_offset
.uleb128 8 .uleb128 8
.byte 0x89 ! DW_CFA_offset r9 .byte 0x89 ! DW_CFA_offset r9
.uleb128 2 .uleb128 2
.byte 4 ! DW_CFA_advance_loc4 .byte 4 ! DW_CFA_advance_loc4
.ualong .Lpush_r10-.Lpush_r9 .ualong .Lpush_r10-.Lpush_r9
.byte 14 ! DW_CFA_def_cfa_offset .byte 14 ! DW_CFA_def_cfa_offset
.uleb128 12 .uleb128 12
.byte 0x8a ! DW_CFA_offset r10 .byte 0x8a ! DW_CFA_offset r10
.uleb128 3 .uleb128 3
.byte 4 ! DW_CFA_advance_loc4 .byte 4 ! DW_CFA_advance_loc4
.ualong .Lpush_r12-.Lpush_r10 .ualong .Lpush_r12-.Lpush_r10
.byte 14 ! DW_CFA_def_cfa_offset .byte 14 ! DW_CFA_def_cfa_offset
.uleb128 16 .uleb128 16
.byte 0x8c ! DW_CFA_offset r12 .byte 0x8c ! DW_CFA_offset r12
.uleb128 4 .uleb128 4
.byte 4 ! DW_CFA_advance_loc4 .byte 4 ! DW_CFA_advance_loc4
.ualong .Lpush_pr-.Lpush_r12 .ualong .Lpush_pr-.Lpush_r12
.byte 14 ! DW_CFA_def_cfa_offset .byte 14 ! DW_CFA_def_cfa_offset

View File

@ -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. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -57,7 +57,6 @@ __new_sem_trywait:
mov.l .Lgot1, r12 mov.l .Lgot1, r12
add r0, r12 add r0, r12
#if USE___THREAD
mov.l .Lerrno1, r0 mov.l .Lerrno1, r0
stc gbr, r1 stc gbr, r1
mov.l @(r0, r12), r0 mov.l @(r0, r12), r0
@ -67,12 +66,6 @@ __new_sem_trywait:
.Lerrno1: .Lerrno1:
.long errno@GOTTPOFF .long errno@GOTTPOFF
.Lexit: .Lexit:
#else
mov.l .Lerrloc1, r1
bsrf r1
nop
.Lerrloc1b:
#endif
mov.l r8, @r0 mov.l r8, @r0
lds.l @r15+, pr lds.l @r15+, pr
mov.l @r15+, r8 mov.l @r15+, r8
@ -83,9 +76,5 @@ __new_sem_trywait:
.align 2 .align 2
.Lgot1: .Lgot1:
.long _GLOBAL_OFFSET_TABLE_ .long _GLOBAL_OFFSET_TABLE_
#if !USE___THREAD
.Lerrloc1:
.long __errno_location@PLT-(.Lerrloc1b-.)
#endif
.size __new_sem_trywait,.-__new_sem_trywait .size __new_sem_trywait,.-__new_sem_trywait
versioned_symbol(libpthread, __new_sem_trywait, sem_trywait, GLIBC_2_1) versioned_symbol(libpthread, __new_sem_trywait, sem_trywait, GLIBC_2_1)

View File

@ -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. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -68,7 +68,7 @@ __new_sem_wait:
.Lafter_ret: .Lafter_ret:
1: 1:
INC (@(NWAITERS,r8),r2) INC (@(NWAITERS,r8),r2)
.LcleanupSTART: .LcleanupSTART:
6: 6:
mov.l .Lenable0, r1 mov.l .Lenable0, r1
@ -96,7 +96,7 @@ __new_sem_wait:
mov r10, r4 mov r10, r4
bsrf r1 bsrf r1
mov r0, r10 mov r0, r10
.Ldisable0b: .Ldisable0b:
mov r10, r0 mov r10, r0
.LcleanupEND: .LcleanupEND:
@ -131,7 +131,6 @@ __new_sem_wait:
mov.l .Lgot0, r12 mov.l .Lgot0, r12
add r0, r12 add r0, r12
#if USE___THREAD
mov.l .Lerrno0, r0 mov.l .Lerrno0, r0
stc gbr, r1 stc gbr, r1
mov.l @(r0, r12), r0 mov.l @(r0, r12), r0
@ -141,12 +140,6 @@ __new_sem_wait:
.Lerrno0: .Lerrno0:
.long errno@GOTTPOFF .long errno@GOTTPOFF
.Lexit: .Lexit:
#else
mov.l .Lerrloc0, r1
bsrf r1
nop
.Lerrloc0b:
#endif
mov.l r8, @r0 mov.l r8, @r0
bra 9b bra 9b
mov #-1, r0 mov #-1, r0
@ -154,10 +147,6 @@ __new_sem_wait:
.align 2 .align 2
.Lgot0: .Lgot0:
.long _GLOBAL_OFFSET_TABLE_ .long _GLOBAL_OFFSET_TABLE_
#if !USE___THREAD
.Lerrloc0:
.long __errno_location@PLT-(.Lerrloc0b-.)
#endif
.Lenable0: .Lenable0:
.long __pthread_enable_asynccancel-.Lenable0b .long __pthread_enable_asynccancel-.Lenable0b
.Ldisable0: .Ldisable0:
@ -168,7 +157,7 @@ __new_sem_wait:
.type sem_wait_cleanup,@function .type sem_wait_cleanup,@function
sem_wait_cleanup: sem_wait_cleanup:
DEC (@(NWAITERS,r8), r2) DEC (@(NWAITERS,r8), r2)
.LcallUR: .LcallUR:
mov.l .Lresume, r1 mov.l .Lresume, r1
#ifdef PIC #ifdef PIC
@ -269,25 +258,25 @@ sem_wait_cleanup:
.byte 14 ! DW_CFA_def_cfa_offset .byte 14 ! DW_CFA_def_cfa_offset
.uleb128 4 .uleb128 4
.byte 0x88 ! DW_CFA_offset r8 .byte 0x88 ! DW_CFA_offset r8
.uleb128 1 .uleb128 1
.byte 4 ! DW_CFA_advance_loc4 .byte 4 ! DW_CFA_advance_loc4
.ualong .Lpush_r10-.Lpush_r8 .ualong .Lpush_r10-.Lpush_r8
.byte 14 ! DW_CFA_def_cfa_offset .byte 14 ! DW_CFA_def_cfa_offset
.uleb128 8 .uleb128 8
.byte 0x8a ! DW_CFA_offset r10 .byte 0x8a ! DW_CFA_offset r10
.uleb128 2 .uleb128 2
.byte 4 ! DW_CFA_advance_loc4 .byte 4 ! DW_CFA_advance_loc4
.ualong .Lpush_r12-.Lpush_r10 .ualong .Lpush_r12-.Lpush_r10
.byte 14 ! DW_CFA_def_cfa_offset .byte 14 ! DW_CFA_def_cfa_offset
.uleb128 12 .uleb128 12
.byte 0x8c ! DW_CFA_offset r12 .byte 0x8c ! DW_CFA_offset r12
.uleb128 3 .uleb128 3
.byte 4 ! DW_CFA_advance_loc4 .byte 4 ! DW_CFA_advance_loc4
.ualong .Lpush_pr-.Lpush_r12 .ualong .Lpush_pr-.Lpush_r12
.byte 14 ! DW_CFA_def_cfa_offset .byte 14 ! DW_CFA_def_cfa_offset
.uleb128 16 .uleb128 16
.byte 0x91 ! DW_CFA_offset pr .byte 0x91 ! DW_CFA_offset pr
.uleb128 4 .uleb128 4
.align 4 .align 4
.LENDFDE: .LENDFDE:

View File

@ -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. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
@ -62,29 +62,15 @@ sem_post:
retq retq
1: 1:
#if USE___THREAD
movl $EINVAL, %eax movl $EINVAL, %eax
#else
callq __errno_location@plt
movl $EINVAL, %edx
#endif
jmp 4f jmp 4f
3: 3:
#if USE___THREAD
movl $EOVERFLOW, %eax movl $EOVERFLOW, %eax
#else
callq __errno_location@plt
movl $EOVERFLOW, %edx
#endif
4: 4:
#if USE___THREAD
movq errno@gottpoff(%rip), %rdx movq errno@gottpoff(%rip), %rdx
movl %eax, %fs:(%rdx) movl %eax, %fs:(%rdx)
#else
movl %edx, (%rax)
#endif
orl $-1, %eax orl $-1, %eax
retq retq
.size sem_post,.-sem_post .size sem_post,.-sem_post

View File

@ -143,39 +143,24 @@ sem_timedwait:
cfi_adjust_cfa_offset(8) cfi_adjust_cfa_offset(8)
3: negq %r9 3: negq %r9
#if USE___THREAD
movq errno@gottpoff(%rip), %rdx movq errno@gottpoff(%rip), %rdx
movl %r9d, %fs:(%rdx) movl %r9d, %fs:(%rdx)
#else
callq __errno_location@plt
movl %r9d, (%rax)
#endif
orl $-1, %eax orl $-1, %eax
jmp 15b jmp 15b
cfi_adjust_cfa_offset(-8) cfi_adjust_cfa_offset(-8)
6: 6:
#if USE___THREAD
movq errno@gottpoff(%rip), %rdx movq errno@gottpoff(%rip), %rdx
movl $EINVAL, %fs:(%rdx) movl $EINVAL, %fs:(%rdx)
#else
callq __errno_location@plt
movl $EINVAL, (%rax)
#endif
orl $-1, %eax orl $-1, %eax
retq retq
16: 16:
#if USE___THREAD
movq errno@gottpoff(%rip), %rdx movq errno@gottpoff(%rip), %rdx
movl $ETIMEDOUT, %fs:(%rdx) movl $ETIMEDOUT, %fs:(%rdx)
#else
callq __errno_location@plt
movl $ETIMEDOUT, (%rax)
#endif
orl $-1, %eax orl $-1, %eax
@ -303,13 +288,8 @@ sem_timedwait:
cfi_rel_offset(%r14, STACKFRAME) cfi_rel_offset(%r14, STACKFRAME)
33: negq %r14 33: negq %r14
36: 36:
#if USE___THREAD
movq errno@gottpoff(%rip), %rdx movq errno@gottpoff(%rip), %rdx
movl %r14d, %fs:(%rdx) movl %r14d, %fs:(%rdx)
#else
callq __errno_location@plt
movl %r14d, (%rax)
#endif
orl $-1, %eax orl $-1, %eax
jmp 45b jmp 45b

View File

@ -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. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
@ -41,13 +41,8 @@ sem_trywait:
retq retq
1: 1:
#if USE___THREAD
movq errno@gottpoff(%rip), %rdx movq errno@gottpoff(%rip), %rdx
movl $EAGAIN, %fs:(%rdx) movl $EAGAIN, %fs:(%rdx)
#else
callq __errno_location@plt
movl $EAGAIN, (%rax)
#endif
orl $-1, %eax orl $-1, %eax
retq retq
.size sem_trywait,.-sem_trywait .size sem_trywait,.-sem_trywait

View File

@ -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. This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
@ -125,14 +125,8 @@ sem_wait:
cfi_adjust_cfa_offset(8) cfi_adjust_cfa_offset(8)
4: negq %rcx 4: negq %rcx
#if USE___THREAD
movq errno@gottpoff(%rip), %rdx movq errno@gottpoff(%rip), %rdx
movl %ecx, %fs:(%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 orl $-1, %eax
jmp 9b jmp 9b

View File

@ -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. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -19,27 +19,10 @@
#include <resolv.h> #include <resolv.h>
#include <tls.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 * struct __res_state *
__res_state (void) __res_state (void)
{ {
return __resp; return __resp;
} }
#endif
libc_hidden_def (__res_state) libc_hidden_def (__res_state)

View File

@ -126,12 +126,10 @@ struct __res_state _res __attribute__((section (".bss")));
#include <tls.h> #include <tls.h>
#if USE___THREAD
#undef __resp #undef __resp
__thread struct __res_state *__resp = &_res; __thread struct __res_state *__resp = &_res;
extern __thread struct __res_state *__libc_resp extern __thread struct __res_state *__libc_resp
__attribute__ ((alias ("__resp"))) attribute_hidden; __attribute__ ((alias ("__resp"))) attribute_hidden;
#endif
/* We declare this with compat_symbol so that it's not /* We declare this with compat_symbol so that it's not
visible at link time. Programs must use the accessor functions. */ visible at link time. Programs must use the accessor functions. */

View File

@ -1,5 +1,5 @@
/* Machine-dependent ELF dynamic relocation inline functions. i386 version. /* 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. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -243,18 +243,12 @@ _dl_start_user:\n\
define the value. define the value.
ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one 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. */ 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_386_JMP_SLOT || (type) == R_386_TLS_DTPMOD32 \ ((((type) == R_386_JMP_SLOT || (type) == R_386_TLS_DTPMOD32 \
|| (type) == R_386_TLS_DTPOFF32 || (type) == R_386_TLS_TPOFF32 \ || (type) == R_386_TLS_DTPOFF32 || (type) == R_386_TLS_TPOFF32 \
|| (type) == R_386_TLS_TPOFF || (type) == R_386_TLS_DESC) \ || (type) == R_386_TLS_TPOFF || (type) == R_386_TLS_DESC) \
* ELF_RTYPE_CLASS_PLT) \ * ELF_RTYPE_CLASS_PLT) \
| (((type) == R_386_COPY) * ELF_RTYPE_CLASS_COPY)) | (((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. */ /* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */
#define ELF_MACHINE_JMP_SLOT R_386_JMP_SLOT #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; *reloc_addr = value;
break; break;
# if !defined RTLD_BOOTSTRAP || USE___THREAD
case R_386_TLS_DTPMOD32: case R_386_TLS_DTPMOD32:
# ifdef RTLD_BOOTSTRAP # ifdef RTLD_BOOTSTRAP
/* During startup the dynamic linker is always the module /* During startup the dynamic linker is always the module
with index 1. with index 1.
XXX If this relocation is necessary move before RESOLVE XXX If this relocation is necessary move before RESOLVE
call. */ call. */
*reloc_addr = 1; *reloc_addr = 1;
# else # else
/* Get the information from the link map returned by the /* Get the information from the link map returned by the
resolv function. */ resolv function. */
if (sym_map != NULL) if (sym_map != NULL)
*reloc_addr = sym_map->l_tls_modid; *reloc_addr = sym_map->l_tls_modid;
# endif # endif
break; break;
case R_386_TLS_DTPOFF32: case R_386_TLS_DTPOFF32:
# ifndef RTLD_BOOTSTRAP # ifndef RTLD_BOOTSTRAP
/* During relocation all TLS symbols are defined and used. /* During relocation all TLS symbols are defined and used.
Therefore the offset is already correct. */ Therefore the offset is already correct. */
if (sym != NULL) if (sym != NULL)
*reloc_addr = sym->st_value; *reloc_addr = sym->st_value;
# endif # endif
break; break;
case R_386_TLS_DESC: case R_386_TLS_DESC:
{ {
struct tlsdesc volatile *td = struct tlsdesc volatile *td =
(struct tlsdesc volatile *)reloc_addr; (struct tlsdesc volatile *)reloc_addr;
# ifndef RTLD_BOOTSTRAP # ifndef RTLD_BOOTSTRAP
if (! sym) if (! sym)
td->entry = _dl_tlsdesc_undefweak; td->entry = _dl_tlsdesc_undefweak;
else else
# endif # endif
{ {
# ifndef RTLD_BOOTSTRAP # ifndef RTLD_BOOTSTRAP
# ifndef SHARED # ifndef SHARED
CHECK_STATIC_TLS (map, sym_map); CHECK_STATIC_TLS (map, sym_map);
# else # else
if (!TRY_STATIC_TLS (map, sym_map)) if (!TRY_STATIC_TLS (map, sym_map))
{ {
td->arg = _dl_make_tlsdesc_dynamic 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; td->entry = _dl_tlsdesc_dynamic;
} }
else else
# endif
# endif # endif
# endif
{ {
td->arg = (void*)(sym->st_value - sym_map->l_tls_offset td->arg = (void*)(sym->st_value - sym_map->l_tls_offset
+ (ElfW(Word))td->arg); + (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); CHECK_STATIC_TLS (map, sym_map);
*reloc_addr += sym_map->l_tls_offset - sym->st_value; *reloc_addr += sym_map->l_tls_offset - sym->st_value;
} }
# endif # endif
break; break;
case R_386_TLS_TPOFF: case R_386_TLS_TPOFF:
/* The offset is negative, forward from the thread pointer. */ /* The offset is negative, forward from the thread pointer. */
# ifdef RTLD_BOOTSTRAP # ifdef RTLD_BOOTSTRAP
*reloc_addr += sym->st_value - map->l_tls_offset; *reloc_addr += sym->st_value - map->l_tls_offset;
# else # else
/* We know the offset of object the symbol is contained in. /* We know the offset of object the symbol is contained in.
It is a negative value which will be added to the It is a negative value which will be added to the
thread pointer. */ thread pointer. */
@ -441,9 +434,8 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
CHECK_STATIC_TLS (map, sym_map); CHECK_STATIC_TLS (map, sym_map);
*reloc_addr += sym->st_value - sym_map->l_tls_offset; *reloc_addr += sym->st_value - sym_map->l_tls_offset;
} }
# endif # endif
break; break;
# endif /* use TLS */
# ifndef RTLD_BOOTSTRAP # ifndef RTLD_BOOTSTRAP
case R_386_32: case R_386_32:

View File

@ -1,5 +1,5 @@
/* Machine-dependent ELF dynamic relocation inline functions. IA-64 version. /* 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. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or 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 of the main executable's symbols, as for a COPY reloc, which we don't
use. */ use. */
/* ??? Ignore *MSB for now. */ /* ??? Ignore *MSB for now. */
#if !defined RTLD_BOOTSTRAP || USE___THREAD
#define elf_machine_type_class(type) \ #define elf_machine_type_class(type) \
(((type) == R_IA64_IPLTLSB || (type) == R_IA64_DTPMOD64LSB \ (((type) == R_IA64_IPLTLSB || (type) == R_IA64_DTPMOD64LSB \
|| (type) == R_IA64_DTPREL64LSB || (type) == R_IA64_TPREL64LSB) \ || (type) == R_IA64_DTPREL64LSB || (type) == R_IA64_TPREL64LSB) \
* ELF_RTYPE_CLASS_PLT) * 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. */ /* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */
#define ELF_MACHINE_JMP_SLOT R_IA64_IPLTLSB #define ELF_MACHINE_JMP_SLOT R_IA64_IPLTLSB
@ -405,7 +400,7 @@ elf_machine_rela (struct link_map *map,
/* Already done in dynamic linker. */ /* Already done in dynamic linker. */
if (map != &GL(dl_rtld_map)) if (map != &GL(dl_rtld_map))
# endif # endif
value += map->l_addr; value += map->l_addr;
} }
else else
#endif #endif
@ -417,7 +412,7 @@ elf_machine_rela (struct link_map *map,
/* RESOLVE_MAP() will return NULL if it fail to locate the symbol. */ /* RESOLVE_MAP() will return NULL if it fail to locate the symbol. */
if ((sym_map = RESOLVE_MAP (&sym, version, r_type))) if ((sym_map = RESOLVE_MAP (&sym, version, r_type)))
{ {
value = sym_map->l_addr + sym->st_value + reloc->r_addend; value = sym_map->l_addr + sym->st_value + reloc->r_addend;
if (R_IA64_TYPE (r_type) == R_IA64_TYPE (R_IA64_DIR64LSB)) 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); value = _dl_make_fptr (sym_map, sym, value);
else if (R_IA64_TYPE (r_type) == R_IA64_TYPE (R_IA64_PCREL64LSB)) else if (R_IA64_TYPE (r_type) == R_IA64_TYPE (R_IA64_PCREL64LSB))
value -= (Elf64_Addr) reloc_addr & -16; 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)) 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. */ /* During startup the dynamic linker is always index 1. */
value = 1; value = 1;
# else #else
/* Get the information from the link map returned by the /* Get the information from the link map returned by the
resolv function. */ resolv function. */
value = sym_map->l_tls_modid; value = sym_map->l_tls_modid;
else if (R_IA64_TYPE (r_type) == R_IA64_TYPE (R_IA64_DTPREL64LSB)) else if (R_IA64_TYPE (r_type) == R_IA64_TYPE (R_IA64_DTPREL64LSB))
value -= sym_map->l_addr; value -= sym_map->l_addr;
# endif #endif
else if (R_IA64_TYPE (r_type) == R_IA64_TYPE (R_IA64_TPREL64LSB)) 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); CHECK_STATIC_TLS (map, sym_map);
# endif #endif
value += sym_map->l_tls_offset - sym_map->l_addr; value += sym_map->l_tls_offset - sym_map->l_addr;
} }
#endif
else else
_dl_reloc_bad_type (map, r_type, 0); _dl_reloc_bad_type (map, r_type, 0);
} }

View File

@ -1,5 +1,5 @@
/* Machine-dependent ELF dynamic relocation inline functions. PowerPC version. /* 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. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or 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 /* We never want to use a PLT entry as the destination of a
reloc, when what is being relocated is a branch. This is reloc, when what is being relocated is a branch. This is
partly for efficiency, but mostly so we avoid loops. */ partly for efficiency, but mostly so we avoid loops. */
#if !defined RTLD_BOOTSTRAP || USE___THREAD
#define elf_machine_type_class(type) \ #define elf_machine_type_class(type) \
((((type) == R_PPC_JMP_SLOT \ ((((type) == R_PPC_JMP_SLOT \
|| (type) == R_PPC_REL24 \ || (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_DTPREL32) \
|| (type) == R_PPC_ADDR24) * ELF_RTYPE_CLASS_PLT) \ || (type) == R_PPC_ADDR24) * ELF_RTYPE_CLASS_PLT) \
| (((type) == R_PPC_COPY) * ELF_RTYPE_CLASS_COPY)) | (((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. */ /* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */
#define ELF_MACHINE_JMP_SLOT R_PPC_JMP_SLOT #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; *reloc_addr = value;
break; break;
#if (!defined RTLD_BOOTSTRAP || USE___THREAD) \ #ifndef RESOLVE_CONFLICT_FIND_MAP
&& !defined RESOLVE_CONFLICT_FIND_MAP
# ifdef RTLD_BOOTSTRAP # ifdef RTLD_BOOTSTRAP
# define NOT_BOOTSTRAP 0 # define NOT_BOOTSTRAP 0
# else # else

View File

@ -1,6 +1,6 @@
/* Machine-dependent ELF dynamic relocation inline functions. /* Machine-dependent ELF dynamic relocation inline functions.
PowerPC64 version. 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. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or 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, branch using two instructions; Past that point,
glink uses three instructions. */ glink uses three instructions. */
if (i < 0x8000) if (i < 0x8000)
glink_offset += 2; glink_offset += 2;
else else
glink_offset += 3; glink_offset += 3;
} }
/* Now, we've modified data. We need to write the changes from /* 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) #define dont_expect(X) __builtin_expect ((X), 0)
extern void _dl_reloc_overflow (struct link_map *map, extern void _dl_reloc_overflow (struct link_map *map,
const char *name, const char *name,
Elf64_Addr *const reloc_addr, Elf64_Addr *const reloc_addr,
const Elf64_Sym *refsym) const Elf64_Sym *refsym)
attribute_hidden; attribute_hidden;
auto inline void __attribute__ ((always_inline)) auto inline void __attribute__ ((always_inline))
elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc, 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; *reloc_addr = l_addr + reloc->r_addend;
} }
#if !defined RTLD_BOOTSTRAP || USE___THREAD
/* This computes the value used by TPREL* relocs. */ /* This computes the value used by TPREL* relocs. */
auto inline Elf64_Addr __attribute__ ((always_inline, const)) auto inline Elf64_Addr __attribute__ ((always_inline, const))
elf_machine_tprel (struct link_map *map, elf_machine_tprel (struct link_map *map,
@ -513,18 +512,17 @@ elf_machine_tprel (struct link_map *map,
const Elf64_Sym *sym, const Elf64_Sym *sym,
const Elf64_Rela *reloc) const Elf64_Rela *reloc)
{ {
# ifndef RTLD_BOOTSTRAP #ifndef RTLD_BOOTSTRAP
if (sym_map) if (sym_map)
{ {
CHECK_STATIC_TLS (map, sym_map); CHECK_STATIC_TLS (map, sym_map);
# endif #endif
return TLS_TPREL_VALUE (sym_map, sym, reloc); return TLS_TPREL_VALUE (sym_map, sym, reloc);
# ifndef RTLD_BOOTSTRAP #ifndef RTLD_BOOTSTRAP
} }
# endif #endif
return 0; return 0;
} }
#endif
/* Call function at address VALUE (an OPD entry) to resolve ifunc relocs. */ /* Call function at address VALUE (an OPD entry) to resolve ifunc relocs. */
auto inline Elf64_Addr __attribute__ ((always_inline)) auto inline Elf64_Addr __attribute__ ((always_inline))
@ -611,26 +609,25 @@ elf_machine_rela (struct link_map *map,
#endif #endif
return; return;
#if !defined RTLD_BOOTSTRAP || USE___THREAD
case R_PPC64_DTPMOD64: case R_PPC64_DTPMOD64:
# ifdef RTLD_BOOTSTRAP #ifdef RTLD_BOOTSTRAP
/* During startup the dynamic linker is always index 1. */ /* During startup the dynamic linker is always index 1. */
*reloc_addr = 1; *reloc_addr = 1;
# else #else
/* Get the information from the link map returned by the /* Get the information from the link map returned by the
resolve function. */ resolve function. */
if (sym_map != NULL) if (sym_map != NULL)
*reloc_addr = sym_map->l_tls_modid; *reloc_addr = sym_map->l_tls_modid;
# endif #endif
return; return;
case R_PPC64_DTPREL64: case R_PPC64_DTPREL64:
/* During relocation all TLS symbols are defined and used. /* During relocation all TLS symbols are defined and used.
Therefore the offset is already correct. */ Therefore the offset is already correct. */
# ifndef RTLD_BOOTSTRAP #ifndef RTLD_BOOTSTRAP
if (sym_map != NULL) if (sym_map != NULL)
*reloc_addr = TLS_DTPREL_VALUE (sym, reloc); *reloc_addr = TLS_DTPREL_VALUE (sym, reloc);
# endif #endif
return; return;
case R_PPC64_TPREL64: case R_PPC64_TPREL64:
@ -640,21 +637,21 @@ elf_machine_rela (struct link_map *map,
case R_PPC64_TPREL16_LO_DS: case R_PPC64_TPREL16_LO_DS:
value = elf_machine_tprel (map, sym_map, sym, reloc); value = elf_machine_tprel (map, sym_map, sym, reloc);
if (dont_expect ((value & 3) != 0)) 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); BIT_INSERT (*(Elf64_Half *) reloc_addr, value, 0xfffc);
break; break;
case R_PPC64_TPREL16_DS: case R_PPC64_TPREL16_DS:
value = elf_machine_tprel (map, sym_map, sym, reloc); value = elf_machine_tprel (map, sym_map, sym, reloc);
if (dont_expect ((value + 0x8000) >= 0x10000 || (value & 3) != 0)) 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); BIT_INSERT (*(Elf64_Half *) reloc_addr, value, 0xfffc);
break; break;
case R_PPC64_TPREL16: case R_PPC64_TPREL16:
value = elf_machine_tprel (map, sym_map, sym, reloc); value = elf_machine_tprel (map, sym_map, sym, reloc);
if (dont_expect ((value + 0x8000) >= 0x10000)) 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); *(Elf64_Half *) reloc_addr = PPC_LO (value);
break; break;
@ -692,12 +689,11 @@ elf_machine_rela (struct link_map *map,
value = elf_machine_tprel (map, sym_map, sym, reloc); value = elf_machine_tprel (map, sym_map, sym, reloc);
*(Elf64_Half *) reloc_addr = PPC_HIGHESTA (value); *(Elf64_Half *) reloc_addr = PPC_HIGHESTA (value);
break; break;
#endif
#ifndef RTLD_BOOTSTRAP /* None of the following appear in ld.so */ #ifndef RTLD_BOOTSTRAP /* None of the following appear in ld.so */
case R_PPC64_ADDR16_LO_DS: case R_PPC64_ADDR16_LO_DS:
if (dont_expect ((value & 3) != 0)) 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); BIT_INSERT (*(Elf64_Half *) reloc_addr, value, 0xfffc);
break; break;
@ -715,29 +711,29 @@ elf_machine_rela (struct link_map *map,
case R_PPC64_ADDR30: case R_PPC64_ADDR30:
{ {
Elf64_Addr delta = value - (Elf64_Xword) reloc_addr; Elf64_Addr delta = value - (Elf64_Xword) reloc_addr;
if (dont_expect ((delta + 0x80000000) >= 0x10000000 if (dont_expect ((delta + 0x80000000) >= 0x10000000
|| (delta & 3) != 0)) || (delta & 3) != 0))
_dl_reloc_overflow (map, "R_PPC64_ADDR30", reloc_addr, refsym); _dl_reloc_overflow (map, "R_PPC64_ADDR30", reloc_addr, refsym);
BIT_INSERT (*(Elf64_Word *) reloc_addr, delta, 0xfffffffc); BIT_INSERT (*(Elf64_Word *) reloc_addr, delta, 0xfffffffc);
} }
break; break;
case R_PPC64_COPY: case R_PPC64_COPY:
if (dont_expect (sym == NULL)) if (dont_expect (sym == NULL))
/* This can happen in trace mode when an object could not be found. */ /* This can happen in trace mode when an object could not be found. */
return; return;
if (dont_expect (sym->st_size > refsym->st_size if (dont_expect (sym->st_size > refsym->st_size
|| (GLRO(dl_verbose) || (GLRO(dl_verbose)
&& sym->st_size < refsym->st_size))) && sym->st_size < refsym->st_size)))
{ {
const char *strtab; const char *strtab;
strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]); strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
_dl_error_printf ("%s: Symbol `%s' has different size" \ _dl_error_printf ("%s: Symbol `%s' has different size" \
" in shared object," \ " in shared object," \
" consider re-linking\n", " consider re-linking\n",
_dl_argv[0] ?: "<program name unknown>", _dl_argv[0] ?: "<program name unknown>",
strtab + refsym->st_name); strtab + refsym->st_name);
} }
memcpy (reloc_addr_arg, (char *) value, memcpy (reloc_addr_arg, (char *) value,
@ -766,25 +762,25 @@ elf_machine_rela (struct link_map *map,
case R_PPC64_ADDR32: case R_PPC64_ADDR32:
if (dont_expect ((value + 0x80000000) >= 0x10000000)) 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; *(Elf64_Word *) reloc_addr = value;
return; return;
case R_PPC64_ADDR24: case R_PPC64_ADDR24:
if (dont_expect ((value + 0x2000000) >= 0x4000000 || (value & 3) != 0)) 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); BIT_INSERT (*(Elf64_Word *) reloc_addr, value, 0x3fffffc);
break; break;
case R_PPC64_ADDR16: case R_PPC64_ADDR16:
if (dont_expect ((value + 0x8000) >= 0x10000)) 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; *(Elf64_Half *) reloc_addr = value;
break; break;
case R_PPC64_UADDR16: case R_PPC64_UADDR16:
if (dont_expect ((value + 0x8000) >= 0x10000)) 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. */ /* We are big-endian. */
((char *) reloc_addr_arg)[0] = (value >> 8) & 0xff; ((char *) reloc_addr_arg)[0] = (value >> 8) & 0xff;
((char *) reloc_addr_arg)[1] = (value >> 0) & 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: case R_PPC64_ADDR16_DS:
if (dont_expect ((value + 0x8000) >= 0x10000 || (value & 3) != 0)) 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); BIT_INSERT (*(Elf64_Half *) reloc_addr, value, 0xfffc);
break; break;
@ -816,11 +812,11 @@ elf_machine_rela (struct link_map *map,
case R_PPC64_ADDR14_BRTAKEN: case R_PPC64_ADDR14_BRTAKEN:
case R_PPC64_ADDR14_BRNTAKEN: 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); _dl_reloc_overflow (map, "R_PPC64_ADDR14", reloc_addr, refsym);
Elf64_Word insn = *(Elf64_Word *) reloc_addr; Elf64_Word insn = *(Elf64_Word *) reloc_addr;
BIT_INSERT (insn, value, 0xfffc); BIT_INSERT (insn, value, 0xfffc);
if (r_type != R_PPC64_ADDR14) if (r_type != R_PPC64_ADDR14)
{ {
insn &= ~(1 << 21); insn &= ~(1 << 21);
if (r_type == R_PPC64_ADDR14_BRTAKEN) 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)) else if ((insn & (0x14 << 21)) == (0x10 << 21))
insn |= 0x08 << 21; insn |= 0x08 << 21;
} }
*(Elf64_Word *) reloc_addr = insn; *(Elf64_Word *) reloc_addr = insn;
} }
break; break;

View File

@ -1,5 +1,5 @@
/* Machine-dependent ELF dynamic relocation inline functions. S390 Version. /* 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. Free Software Foundation, Inc.
Contributed by Carl Pederson & Martin Schwidefsky. Contributed by Carl Pederson & Martin Schwidefsky.
This file is part of the GNU C Library. This file is part of the GNU C Library.
@ -43,7 +43,7 @@ elf_machine_matches_host (const Elf32_Ehdr *ehdr)
return 0; return 0;
return (ehdr->e_machine == EM_S390 || ehdr->e_machine == EM_S390_OLD) 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; *reloc_addr = value + reloc->r_addend;
break; break;
#if (!defined RTLD_BOOTSTRAP || USE___THREAD) \ #ifndef RESOLVE_CONFLICT_FIND_MAP
&& !defined RESOLVE_CONFLICT_FIND_MAP
case R_390_TLS_DTPMOD: case R_390_TLS_DTPMOD:
# ifdef RTLD_BOOTSTRAP # ifdef RTLD_BOOTSTRAP
/* During startup the dynamic linker is always the module /* During startup the dynamic linker is always the module

View File

@ -1,6 +1,6 @@
/* Machine-dependent ELF dynamic relocation inline functions. /* Machine-dependent ELF dynamic relocation inline functions.
64 bit S/390 Version. 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). Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
This file is part of the GNU C Library. 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; *reloc_addr = value + reloc->r_addend;
break; break;
#if (!defined RTLD_BOOTSTRAP || USE___THREAD) \ #ifndef RESOLVE_CONFLICT_FIND_MAP
&& !defined RESOLVE_CONFLICT_FIND_MAP
case R_390_TLS_DTPMOD: case R_390_TLS_DTPMOD:
# ifdef RTLD_BOOTSTRAP # ifdef RTLD_BOOTSTRAP
/* During startup the dynamic linker is always the module /* During startup the dynamic linker is always the module

View File

@ -1,5 +1,5 @@
/* Machine-dependent ELF dynamic relocation inline functions. SH version. /* 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. Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
@ -208,17 +208,11 @@ __fpscr_values:\n\
define the value. define the value.
ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one 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. */ 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_JMP_SLOT || (type) == R_SH_TLS_DTPMOD32 \
|| (type) == R_SH_TLS_DTPOFF32 || (type) == R_SH_TLS_TPOFF32) \ || (type) == R_SH_TLS_DTPOFF32 || (type) == R_SH_TLS_TPOFF32) \
* ELF_RTYPE_CLASS_PLT) \ * ELF_RTYPE_CLASS_PLT) \
| (((type) == R_SH_COPY) * ELF_RTYPE_CLASS_COPY)) | (((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. */ /* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */
#define ELF_MACHINE_JMP_SLOT R_SH_JMP_SLOT #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. */ /* These addresses are always aligned. */
*reloc_addr = value; *reloc_addr = value;
break; break;
#if !defined RTLD_BOOTSTRAP || USE___THREAD
/* XXX Remove TLS relocations which are not needed. */ /* XXX Remove TLS relocations which are not needed. */
case R_SH_TLS_DTPMOD32: case R_SH_TLS_DTPMOD32:
# ifdef RTLD_BOOTSTRAP #ifdef RTLD_BOOTSTRAP
/* During startup the dynamic linker is always the module /* During startup the dynamic linker is always the module
with index 1. with index 1.
XXX If this relocation is necessary move before RESOLVE XXX If this relocation is necessary move before RESOLVE
call. */ call. */
*reloc_addr = 1; *reloc_addr = 1;
# else #else
/* Get the information from the link map returned by the /* Get the information from the link map returned by the
resolv function. */ resolv function. */
if (sym_map != NULL) if (sym_map != NULL)
*reloc_addr = sym_map->l_tls_modid; *reloc_addr = sym_map->l_tls_modid;
# endif #endif
break; break;
case R_SH_TLS_DTPOFF32: case R_SH_TLS_DTPOFF32:
# ifndef RTLD_BOOTSTRAP #ifndef RTLD_BOOTSTRAP
/* During relocation all TLS symbols are defined and used. /* During relocation all TLS symbols are defined and used.
Therefore the offset is already correct. */ Therefore the offset is already correct. */
if (sym != NULL) if (sym != NULL)
*reloc_addr = sym->st_value; *reloc_addr = sym->st_value;
# endif #endif
break; break;
case R_SH_TLS_TPOFF32: case R_SH_TLS_TPOFF32:
/* The offset is positive, afterward from the thread pointer. */ /* 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; *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. /* We know the offset of object the symbol is contained in.
It is a positive value which will be added to the thread It is a positive value which will be added to the thread
pointer. To get the variable position in the TLS block 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_addr = sym_map->l_tls_offset + sym->st_value
+ reloc->r_addend; + reloc->r_addend;
} }
# endif #endif
break; break;
#endif /* use TLS */
case R_SH_DIR32: case R_SH_DIR32:
{ {
#ifndef RTLD_BOOTSTRAP #ifndef RTLD_BOOTSTRAP

View File

@ -139,7 +139,7 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
nop nop
.word MAP .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. */ location where we store the link_map pointer for this object. */
plt[0] = 0x05000000 | ((rfunc >> 10) & 0x003fffff); 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. PLT entries should not be allowed to define the value.
ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one 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. */ 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_JMP_SLOT \
|| ((type) >= R_SPARC_TLS_GD_HI22 && (type) <= R_SPARC_TLS_TPOFF64)) \ || ((type) >= R_SPARC_TLS_GD_HI22 && (type) <= R_SPARC_TLS_TPOFF64)) \
* ELF_RTYPE_CLASS_PLT) \ * ELF_RTYPE_CLASS_PLT) \
| (((type) == R_SPARC_COPY) * ELF_RTYPE_CLASS_COPY)) | (((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. */ /* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */
#define ELF_MACHINE_JMP_SLOT R_SPARC_JMP_SLOT #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); sparc_fixup_plt (reloc, reloc_addr, value, 0, do_flush);
} }
break; break;
#if (!defined RTLD_BOOTSTRAP || USE___THREAD) \ #ifndef RESOLVE_CONFLICT_FIND_MAP
&& !defined RESOLVE_CONFLICT_FIND_MAP
case R_SPARC_TLS_DTPMOD32: case R_SPARC_TLS_DTPMOD32:
/* Get the information from the link map returned by the /* Get the information from the link map returned by the
resolv function. */ resolv function. */

View File

@ -1,6 +1,5 @@
/* Machine-dependent ELF dynamic relocation inline functions. Sparc64 version. /* Machine-dependent ELF dynamic relocation inline functions. Sparc64 version.
Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, Copyright (C) 1997-2006, 2009, 2010, 2011 Free Software Foundation, Inc.
2009, 2010 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or 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"); register Elf64_Addr *got __asm ("%l7");
__asm ("sethi %%hi(_GLOBAL_OFFSET_TABLE_-4), %1\n\t" __asm ("sethi %%hi(_GLOBAL_OFFSET_TABLE_-4), %1\n\t"
"call 1f\n\t" "call 1f\n\t"
" add %1, %%lo(_GLOBAL_OFFSET_TABLE_+4), %1\n\t" " add %1, %%lo(_GLOBAL_OFFSET_TABLE_+4), %1\n\t"
"call _DYNAMIC\n\t" "call _DYNAMIC\n\t"
"call _GLOBAL_OFFSET_TABLE_\n" "call _GLOBAL_OFFSET_TABLE_\n"
"1:\tadd %1, %0, %1\n\t" : "=r" (pc), "=r" (got)); "1:\tadd %1, %0, %1\n\t" : "=r" (pc), "=r" (got));
/* got is now l_addr + _GLOBAL_OFFSET_TABLE_ /* got is now l_addr + _GLOBAL_OFFSET_TABLE_
*got is _DYNAMIC *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. PLT entries should not be allowed to define the value.
ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one 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. */ 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_JMP_SLOT \
|| ((type) >= R_SPARC_TLS_GD_HI22 && (type) <= R_SPARC_TLS_TPOFF64)) \ || ((type) >= R_SPARC_TLS_GD_HI22 && (type) <= R_SPARC_TLS_TPOFF64)) \
* ELF_RTYPE_CLASS_PLT) \ * ELF_RTYPE_CLASS_PLT) \
| (((type) == R_SPARC_COPY) * ELF_RTYPE_CLASS_COPY)) | (((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. */ /* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */
#define ELF_MACHINE_JMP_SLOT R_SPARC_JMP_SLOT #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: /* 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 sethi %hi(_dl_runtime_{resolve,profile}_0), %g5
or %g4, %ulo(_dl_runtime_{resolve,profile}_0), %g4 or %g4, %ulo(_dl_runtime_{resolve,profile}_0), %g4
or %g5, %lo(_dl_runtime_{resolve,profile}_0), %g5 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: /* 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 sethi %hi(_dl_runtime_{resolve,profile}_1), %g5
or %g4, %ulo(_dl_runtime_{resolve,profile}_1), %g4 or %g4, %ulo(_dl_runtime_{resolve,profile}_1), %g4
or %g5, %lo(_dl_runtime_{resolve,profile}_1), %g5 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); sparc64_fixup_plt (map, reloc, reloc_addr, value, reloc->r_addend, 0);
#endif #endif
break; break;
#if (!defined RTLD_BOOTSTRAP || USE___THREAD) \ #ifndef RESOLVE_CONFLICT_FIND_MAP
&& !defined RESOLVE_CONFLICT_FIND_MAP
case R_SPARC_TLS_DTPMOD64: case R_SPARC_TLS_DTPMOD64:
/* Get the information from the link map returned by the /* Get the information from the link map returned by the
resolv function. */ resolv function. */

View File

@ -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. Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
@ -46,57 +46,24 @@ syscall_error:
notb: notb:
#endif #endif
#ifndef PIC #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) movl %eax, %gs:C_SYMBOL_NAME(errno@NTPOFF)
# else # else
movl %gs:0, %ecx movl %gs:0, %ecx
movl %eax, C_SYMBOL_NAME(errno@NTPOFF)(%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 # endif
#else #else
/* The caller has pushed %ebx and then set it up to /* The caller has pushed %ebx and then set it up to
point to the GOT before calling us through the PLT. */ point to the GOT before calling us through the PLT. */
# if USE___THREAD
movl C_SYMBOL_NAME(errno@GOTNTPOFF)(%ebx), %ecx movl C_SYMBOL_NAME(errno@GOTNTPOFF)(%ebx), %ecx
/* Pop %ebx value saved before jumping here. */ /* Pop %ebx value saved before jumping here. */
popl %ebx popl %ebx
# ifndef NO_TLS_DIRECT_SEG_REFS # ifndef NO_TLS_DIRECT_SEG_REFS
addl %gs:0, %ecx addl %gs:0, %ecx
movl %eax, (%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 # else
pushl %eax movl %eax, %gs:0(%ecx)
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)
# endif # endif
#endif #endif
movl $-1, %eax movl $-1, %eax

View File

@ -1,5 +1,5 @@
/* Copyright (C) 1992,1993,1995-2000,2002-2006,2007 /* Copyright (C) 1992,1993,1995-2000,2002-2006,2007,2011
Free Software Foundation, Inc. Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Ulrich Drepper, <drepper@gnu.org>, August 1995. Contributed by Ulrich Drepper, <drepper@gnu.org>, August 1995.
@ -121,13 +121,12 @@
# elif defined _LIBC_REENTRANT # elif defined _LIBC_REENTRANT
# if USE___THREAD # ifndef NOT_IN_libc
# ifndef NOT_IN_libc # define SYSCALL_ERROR_ERRNO __libc_errno
# define SYSCALL_ERROR_ERRNO __libc_errno # else
# else # define SYSCALL_ERROR_ERRNO errno
# define SYSCALL_ERROR_ERRNO errno # endif
# endif # define SYSCALL_ERROR_HANDLER \
# define SYSCALL_ERROR_HANDLER \
0:SETUP_PIC_REG (cx); \ 0:SETUP_PIC_REG (cx); \
addl $_GLOBAL_OFFSET_TABLE_, %ecx; \ addl $_GLOBAL_OFFSET_TABLE_, %ecx; \
movl SYSCALL_ERROR_ERRNO@GOTNTPOFF(%ecx), %ecx; \ movl SYSCALL_ERROR_ERRNO@GOTNTPOFF(%ecx), %ecx; \
@ -136,38 +135,13 @@
SYSCALL_ERROR_HANDLER_TLS_STORE (%edx, %ecx); \ SYSCALL_ERROR_HANDLER_TLS_STORE (%edx, %ecx); \
orl $-1, %eax; \ orl $-1, %eax; \
jmp L(pseudo_end); jmp L(pseudo_end);
# ifndef NO_TLS_DIRECT_SEG_REFS # ifndef NO_TLS_DIRECT_SEG_REFS
# define SYSCALL_ERROR_HANDLER_TLS_STORE(src, destoff) \ # define SYSCALL_ERROR_HANDLER_TLS_STORE(src, destoff) \
movl src, %gs:(destoff) movl src, %gs:(destoff)
# else # else
# define SYSCALL_ERROR_HANDLER_TLS_STORE(src, destoff) \ # define SYSCALL_ERROR_HANDLER_TLS_STORE(src, destoff) \
addl %gs:0, destoff; \ addl %gs:0, destoff; \
movl src, (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 # endif
# else # else
/* Store (- %eax) into errno through the GOT. */ /* Store (- %eax) into errno through the GOT. */

View File

@ -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. This file is part of the GNU C Library.
Contributed by David Mosberger-Tang <davidm@hpl.hp.com>. Contributed by David Mosberger-Tang <davidm@hpl.hp.com>.
@ -34,7 +34,7 @@ ENTRY(__syscall_error)
;; ;;
st4 [r2]=r8 st4 [r2]=r8
mov r8=-1 mov r8=-1
#elif USE___THREAD #else
# ifndef NOT_IN_libc # ifndef NOT_IN_libc
# define SYSCALL_ERROR_ERRNO __libc_errno # define SYSCALL_ERROR_ERRNO __libc_errno
# else # else
@ -46,37 +46,7 @@ ENTRY(__syscall_error)
mov r8=-1 mov r8=-1
add r2=r2,r13;; add r2=r2,r13;;
st4 [r2]=r3 st4 [r2]=r3
#elif defined _LIBC_REENTRANT #endif
.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 */
ret // ret is #define'd in syscall.h! ret // ret is #define'd in syscall.h!
END(__syscall_error) END(__syscall_error)

View File

@ -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). Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
This file is part of the GNU C Library. This file is part of the GNU C Library.
@ -32,12 +32,11 @@
.text .text
ENTRY(__syscall_error) ENTRY(__syscall_error)
#ifndef PIC #ifndef PIC
# if USE___THREAD # ifndef NOT_IN_libc
# ifndef NOT_IN_libc # define SYSCALL_ERROR_ERRNO __libc_errno
# define SYSCALL_ERROR_ERRNO __libc_errno # else
# else # define SYSCALL_ERROR_ERRNO errno
# define SYSCALL_ERROR_ERRNO errno # endif
# endif
basr %r1,0 basr %r1,0
0: l %r1,1f-0b(%r1) 0: l %r1,1f-0b(%r1)
ear %r3,%a0 ear %r3,%a0
@ -46,34 +45,6 @@ ENTRY(__syscall_error)
lhi %r2,-1 lhi %r2,-1
br %r14 br %r14
1: .long SYSCALL_ERROR_ERRNO@ntpoff 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 #else
# if RTLD_PRIVATE_ERRNO # if RTLD_PRIVATE_ERRNO
basr %r1,0 basr %r1,0
@ -83,7 +54,7 @@ ENTRY(__syscall_error)
lhi %r2,-1 lhi %r2,-1
br %r14 br %r14
1: .long rtld_errno - 0b 1: .long rtld_errno - 0b
# elif USE___THREAD # else
# ifndef NOT_IN_libc # ifndef NOT_IN_libc
# define SYSCALL_ERROR_ERRNO __libc_errno # define SYSCALL_ERROR_ERRNO __libc_errno
# else # else
@ -98,39 +69,6 @@ ENTRY(__syscall_error)
lhi %r2,-1 lhi %r2,-1
br %r14 br %r14
1: .long _GLOBAL_OFFSET_TABLE_-0b 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
#endif #endif

View File

@ -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. Free Software Foundation, Inc.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
This file is part of the GNU C Library. This file is part of the GNU C Library.
@ -56,10 +56,10 @@
#undef PSEUDO #undef PSEUDO
#define PSEUDO(name, syscall_name, args) \ #define PSEUDO(name, syscall_name, args) \
.text; \ .text; \
ENTRY (name) \ ENTRY (name) \
DO_CALL (syscall_name, args); \ DO_CALL (syscall_name, args); \
lhi %r4,-4095 ; \ lhi %r4,-4095 ; \
clr %r2,%r4 ; \ clr %r2,%r4 ; \
jnl SYSCALL_ERROR_LABEL jnl SYSCALL_ERROR_LABEL
#undef PSEUDO_END #undef PSEUDO_END
@ -70,7 +70,7 @@
#undef PSEUDO_NOERRNO #undef PSEUDO_NOERRNO
#define PSEUDO_NOERRNO(name, syscall_name, args) \ #define PSEUDO_NOERRNO(name, syscall_name, args) \
.text; \ .text; \
ENTRY (name) \ ENTRY (name) \
DO_CALL (syscall_name, args) DO_CALL (syscall_name, args)
#undef PSEUDO_END_NOERRNO #undef PSEUDO_END_NOERRNO
@ -80,7 +80,7 @@
#undef PSEUDO_ERRVAL #undef PSEUDO_ERRVAL
#define PSEUDO_ERRVAL(name, syscall_name, args) \ #define PSEUDO_ERRVAL(name, syscall_name, args) \
.text; \ .text; \
ENTRY (name) \ ENTRY (name) \
DO_CALL (syscall_name, args); \ DO_CALL (syscall_name, args); \
lcr %r2,%r2 lcr %r2,%r2
@ -107,14 +107,13 @@
br %r14; \ br %r14; \
2: .long rtld_errno-1b 2: .long rtld_errno-1b
# elif defined _LIBC_REENTRANT # elif defined _LIBC_REENTRANT
# if USE___THREAD # ifndef NOT_IN_libc
# ifndef NOT_IN_libc # define SYSCALL_ERROR_ERRNO __libc_errno
# define SYSCALL_ERROR_ERRNO __libc_errno # else
# else # define SYSCALL_ERROR_ERRNO errno
# define SYSCALL_ERROR_ERRNO errno # endif
# endif # define SYSCALL_ERROR_LABEL 0f
# define SYSCALL_ERROR_LABEL 0f # define SYSCALL_ERROR_HANDLER \
# define SYSCALL_ERROR_HANDLER \
0: lcr %r0,%r2; \ 0: lcr %r0,%r2; \
basr %r1,0; \ basr %r1,0; \
1: al %r1,2f-1b(%r1); \ 1: al %r1,2f-1b(%r1); \
@ -124,14 +123,6 @@
lhi %r2,-1; \ lhi %r2,-1; \
br %r14; \ br %r14; \
2: .long _GLOBAL_OFFSET_TABLE_-1b 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 # else
# define SYSCALL_ERROR_LABEL 0f # define SYSCALL_ERROR_LABEL 0f
# define SYSCALL_ERROR_HANDLER \ # define SYSCALL_ERROR_HANDLER \
@ -317,8 +308,8 @@
if (INTERNAL_SYSCALL_ERROR_P (_ret, )) \ if (INTERNAL_SYSCALL_ERROR_P (_ret, )) \
{ \ { \
iserr: \ iserr: \
__set_errno (INTERNAL_SYSCALL_ERRNO (_ret, )); \ __set_errno (INTERNAL_SYSCALL_ERRNO (_ret, )); \
_ret = -1L; \ _ret = -1L; \
} \ } \
out: \ out: \
(int) _ret; \ (int) _ret; \

View File

@ -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). Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
This file is part of the GNU C Library. This file is part of the GNU C Library.
@ -33,12 +33,11 @@
.text .text
ENTRY(__syscall_error) ENTRY(__syscall_error)
#ifndef PIC #ifndef PIC
# if USE___THREAD # ifndef NOT_IN_libc
# ifndef NOT_IN_libc # define SYSCALL_ERROR_ERRNO __libc_errno
# define SYSCALL_ERROR_ERRNO __libc_errno # else
# else # define SYSCALL_ERROR_ERRNO errno
# define SYSCALL_ERROR_ERRNO errno # endif
# endif
basr %r1,0 basr %r1,0
0: lg %r1,1f-0b(%r1) 0: lg %r1,1f-0b(%r1)
ear %r3,%a0 ear %r3,%a0
@ -49,29 +48,6 @@ ENTRY(__syscall_error)
lghi %r2,-1 lghi %r2,-1
br %r14 br %r14
1: .quad SYSCALL_ERROR_ERRNO@ntpoff 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 #else
# if RTLD_PRIVATE_ERRNO # if RTLD_PRIVATE_ERRNO
larl %r1,rtld_errno larl %r1,rtld_errno
@ -79,7 +55,7 @@ ENTRY(__syscall_error)
st %r2,0(%r1) st %r2,0(%r1)
lghi %r2,-1 lghi %r2,-1
br %r14 br %r14
# elif USE___THREAD # else
# ifndef NOT_IN_libc # ifndef NOT_IN_libc
# define SYSCALL_ERROR_ERRNO __libc_errno # define SYSCALL_ERROR_ERRNO __libc_errno
# else # else
@ -94,29 +70,6 @@ ENTRY(__syscall_error)
st %r2,0(%r1,%r3) st %r2,0(%r1,%r3)
lghi %r2,-1 lghi %r2,-1
br %r14 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
#endif #endif

View File

@ -1,5 +1,5 @@
/* Assembler macros for 64 bit S/390. /* 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. Free Software Foundation, Inc.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
This file is part of the GNU C Library. This file is part of the GNU C Library.
@ -115,14 +115,13 @@
lghi %r2,-1; \ lghi %r2,-1; \
br %r14 br %r14
# elif defined _LIBC_REENTRANT # elif defined _LIBC_REENTRANT
# if USE___THREAD # ifndef NOT_IN_libc
# ifndef NOT_IN_libc # define SYSCALL_ERROR_ERRNO __libc_errno
# define SYSCALL_ERROR_ERRNO __libc_errno # else
# else # define SYSCALL_ERROR_ERRNO errno
# define SYSCALL_ERROR_ERRNO errno # endif
# endif # define SYSCALL_ERROR_LABEL 0f
# define SYSCALL_ERROR_LABEL 0f # define SYSCALL_ERROR_HANDLER \
# define SYSCALL_ERROR_HANDLER \
0: lcr %r0,%r2; \ 0: lcr %r0,%r2; \
larl %r1,SYSCALL_ERROR_ERRNO@indntpoff; \ larl %r1,SYSCALL_ERROR_ERRNO@indntpoff; \
lg %r1,0(%r1); \ lg %r1,0(%r1); \
@ -132,10 +131,6 @@
st %r0,0(%r1,%r2); \ st %r0,0(%r1,%r2); \
lghi %r2,-1; \ lghi %r2,-1; \
br %r14 br %r14
# else
# define SYSCALL_ERROR_LABEL syscall_error@plt
# define SYSCALL_ERROR_HANDLER
# endif
# else # else
# define SYSCALL_ERROR_LABEL 0f # define SYSCALL_ERROR_LABEL 0f
# define SYSCALL_ERROR_HANDLER \ # define SYSCALL_ERROR_HANDLER \
@ -319,8 +314,8 @@
if (INTERNAL_SYSCALL_ERROR_P (_ret, )) \ if (INTERNAL_SYSCALL_ERROR_P (_ret, )) \
{ \ { \
iserr: \ iserr: \
__set_errno (INTERNAL_SYSCALL_ERRNO (_ret, )); \ __set_errno (INTERNAL_SYSCALL_ERRNO (_ret, )); \
_ret = -1L; \ _ret = -1L; \
} \ } \
out: \ out: \
(int) _ret; \ (int) _ret; \

View File

@ -1,5 +1,5 @@
/* Copyright (C) 1992,1993,1995,1996,1997,1998,1999,2000,2002,2003,2004, /* Copyright (C) 1992,1993,1995-2000,2002-2006,2009,2011
2005,2006,2009 Free Software Foundation, Inc. Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>, August 1995. Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>, August 1995.
Changed by Kaz Kojima, <kkojima@rr.iij4u.or.jp>. Changed by Kaz Kojima, <kkojima@rr.iij4u.or.jp>.
@ -114,13 +114,12 @@
# elif defined _LIBC_REENTRANT # elif defined _LIBC_REENTRANT
# if USE___THREAD # ifndef NOT_IN_libc
# ifndef NOT_IN_libc # define SYSCALL_ERROR_ERRNO __libc_errno
# define SYSCALL_ERROR_ERRNO __libc_errno # else
# else # define SYSCALL_ERROR_ERRNO errno
# define SYSCALL_ERROR_ERRNO errno # endif
# endif # define SYSCALL_ERROR_HANDLER \
# define SYSCALL_ERROR_HANDLER \
neg r0,r1; \ neg r0,r1; \
mov r12,r2; \ mov r12,r2; \
mov.l 0f,r12; \ mov.l 0f,r12; \
@ -137,43 +136,6 @@
.align 2; \ .align 2; \
0: .long _GLOBAL_OFFSET_TABLE_; \ 0: .long _GLOBAL_OFFSET_TABLE_; \
1: .long SYSCALL_ERROR_ERRNO@GOTTPOFF 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 # else
/* Store (-r0) into errno through the GOT. */ /* Store (-r0) into errno through the GOT. */
# define SYSCALL_ERROR_HANDLER \ # define SYSCALL_ERROR_HANDLER \
@ -324,8 +286,8 @@
unsigned int resultvar = INTERNAL_SYSCALL (name, , nr, args); \ unsigned int resultvar = INTERNAL_SYSCALL (name, , nr, args); \
if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (resultvar, ), 0)) \ if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (resultvar, ), 0)) \
{ \ { \
__set_errno (INTERNAL_SYSCALL_ERRNO (resultvar, )); \ __set_errno (INTERNAL_SYSCALL_ERRNO (resultvar, )); \
resultvar = 0xffffffff; \ resultvar = 0xffffffff; \
} \ } \
(int) resultvar; }) (int) resultvar; })
@ -347,7 +309,7 @@
#define INTERNAL_SYSCALL_NCS(name, err, nr, args...) \ #define INTERNAL_SYSCALL_NCS(name, err, nr, args...) \
({ \ ({ \
unsigned long int resultvar; \ unsigned long int resultvar; \
register long int r3 asm ("%r3") = (name); \ register long int r3 asm ("%r3") = (name); \
SUBSTITUTE_ARGS_##nr(args); \ SUBSTITUTE_ARGS_##nr(args); \
\ \
asm volatile (SYSCALL_INST_STR##nr SYSCALL_INST_PAD \ asm volatile (SYSCALL_INST_STR##nr SYSCALL_INST_PAD \

View File

@ -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. Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Miguel de Icaza <miguel@gnu.ai.mit.edu>, January 1997. Contributed by Miguel de Icaza <miguel@gnu.ai.mit.edu>, January 1997.
@ -99,32 +99,19 @@ ENTRY(name); \
mov -1, %o0; mov -1, %o0;
# elif defined _LIBC_REENTRANT # elif defined _LIBC_REENTRANT
# if USE___THREAD # ifndef NOT_IN_libc
# ifndef NOT_IN_libc # define SYSCALL_ERROR_ERRNO __libc_errno
# define SYSCALL_ERROR_ERRNO __libc_errno # else
# else # define SYSCALL_ERROR_ERRNO errno
# define SYSCALL_ERROR_ERRNO errno # endif
# endif # define SYSCALL_ERROR_HANDLER \
# define SYSCALL_ERROR_HANDLER \
0: SETUP_PIC_REG(o2,g1) \ 0: SETUP_PIC_REG(o2,g1) \
sethi %tie_hi22(SYSCALL_ERROR_ERRNO), %g1; \ sethi %tie_hi22(SYSCALL_ERROR_ERRNO), %g1; \
add %g1, %tie_lo10(SYSCALL_ERROR_ERRNO), %g1; \ add %g1, %tie_lo10(SYSCALL_ERROR_ERRNO), %g1; \
ld [%o2 + %g1], %g1, %tie_ld(SYSCALL_ERROR_ERRNO); \ ld [%o2 + %g1], %g1, %tie_ld(SYSCALL_ERROR_ERRNO); \
st %o0, [%g7 + %g1]; \ st %o0, [%g7 + %g1]; \
jmp %o7 + 8; \ jmp %o7 + 8; \
mov -1, %o0; 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 # else
# define SYSCALL_ERROR_HANDLER \ # define SYSCALL_ERROR_HANDLER \
0: SETUP_PIC_REG(o2,g1) \ 0: SETUP_PIC_REG(o2,g1) \

View File

@ -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. Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Richard Henderson <richard@gnu.ai.mit.edu>, 1997. Contributed by Richard Henderson <richard@gnu.ai.mit.edu>, 1997.
@ -106,32 +106,19 @@ ENTRY(name); \
mov -1, %o0; mov -1, %o0;
# elif defined _LIBC_REENTRANT # elif defined _LIBC_REENTRANT
# if USE___THREAD # ifndef NOT_IN_libc
# ifndef NOT_IN_libc # define SYSCALL_ERROR_ERRNO __libc_errno
# define SYSCALL_ERROR_ERRNO __libc_errno # else
# else # define SYSCALL_ERROR_ERRNO errno
# define SYSCALL_ERROR_ERRNO errno # endif
# endif # define SYSCALL_ERROR_HANDLER \
# define SYSCALL_ERROR_HANDLER \
0: SETUP_PIC_REG(o2,g1) \ 0: SETUP_PIC_REG(o2,g1) \
sethi %tie_hi22(SYSCALL_ERROR_ERRNO), %g1; \ sethi %tie_hi22(SYSCALL_ERROR_ERRNO), %g1; \
add %g1, %tie_lo10(SYSCALL_ERROR_ERRNO), %g1; \ add %g1, %tie_lo10(SYSCALL_ERROR_ERRNO), %g1; \
ldx [%o2 + %g1], %g1, %tie_ldx(SYSCALL_ERROR_ERRNO);\ ldx [%o2 + %g1], %g1, %tie_ldx(SYSCALL_ERROR_ERRNO);\
st %o0, [%g7 + %g1]; \ st %o0, [%g7 + %g1]; \
jmp %o7 + 8; \ jmp %o7 + 8; \
mov -1, %o0; 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 # else
# define SYSCALL_ERROR_HANDLER \ # define SYSCALL_ERROR_HANDLER \
0: SETUP_PIC_REG(o2,g1) \ 0: SETUP_PIC_REG(o2,g1) \

View File

@ -124,7 +124,7 @@
movl %edx, (%rcx); \ movl %edx, (%rcx); \
orq $-1, %rax; \ orq $-1, %rax; \
jmp L(pseudo_end); jmp L(pseudo_end);
# elif USE___THREAD # else
# ifndef NOT_IN_libc # ifndef NOT_IN_libc
# define SYSCALL_ERROR_ERRNO __libc_errno # define SYSCALL_ERROR_ERRNO __libc_errno
# else # else
@ -138,34 +138,6 @@
movl %edx, %fs:(%rcx); \ movl %edx, %fs:(%rcx); \
orq $-1, %rax; \ orq $-1, %rax; \
jmp L(pseudo_end); 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 */ # endif /* PIC */
/* The Linux/x86-64 kernel expects the system call parameters in /* The Linux/x86-64 kernel expects the system call parameters in

View File

@ -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. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or 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. */ movl $EAGAIN, %eax /* Yes; translate it to EAGAIN. */
notb: notb:
#endif #endif
#if USE___THREAD #ifdef PIC
# ifdef PIC
movq C_SYMBOL_NAME(errno@GOTTPOFF)(%rip), %rcx movq C_SYMBOL_NAME(errno@GOTTPOFF)(%rip), %rcx
movl %eax, %fs:0(%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 #else
# if RTLD_PRIVATE_ERRNO movl %eax, %fs:C_SYMBOL_NAME(errno@TPOFF)
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
#endif #endif
movq $-1, %rax movq $-1, %rax
ret ret

View File

@ -1,5 +1,5 @@
/* Machine-dependent ELF dynamic relocation inline functions. x86-64 version. /* 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. This file is part of the GNU C Library.
Contributed by Andreas Jaeger <aj@suse.de>. Contributed by Andreas Jaeger <aj@suse.de>.
@ -195,8 +195,7 @@ _dl_start_user:\n\
define the value. define the value.
ELF_RTYPE_CLASS_NOCOPY iff TYPE should not be allowed to resolve to one 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. */ 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_JUMP_SLOT \
|| (type) == R_X86_64_DTPMOD64 \ || (type) == R_X86_64_DTPMOD64 \
|| (type) == R_X86_64_DTPOFF64 \ || (type) == R_X86_64_DTPOFF64 \
@ -204,11 +203,6 @@ _dl_start_user:\n\
|| (type) == R_X86_64_TLSDESC) \ || (type) == R_X86_64_TLSDESC) \
* ELF_RTYPE_CLASS_PLT) \ * ELF_RTYPE_CLASS_PLT) \
| (((type) == R_X86_64_COPY) * ELF_RTYPE_CLASS_COPY)) | (((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. */ /* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */
#define ELF_MACHINE_JMP_SLOT R_X86_64_JUMP_SLOT #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)) && __builtin_expect (sym->st_shndx != SHN_UNDEF, 1))
value = ((Elf64_Addr (*) (void)) value) (); 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) switch (r_type)
{ {
case R_X86_64_GLOB_DAT: case R_X86_64_GLOB_DAT:
@ -453,7 +443,6 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc,
break; break;
# endif # endif
} }
#endif
} }
} }

View File

@ -2,8 +2,4 @@
#include <tls.h> #include <tls.h>
#if USE___THREAD
@@@ use-thread = yes @@@ @@@ use-thread = yes @@@
#else
@@@ use-thread = no @@@
#endif