mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-25 06:20:06 +00:00
2002-10-16 Jakub Jelinek <jakub@redhat.com>
* include/libc-symbols.h (attribute_tls_model_ie): Define. * include/errno.h (errno): Define to __libc_errno in libc.so. Add attribute_tls_model_ie. * include/netdb.h (h_errno): Define to __libc_h_errno in libc.so. Add attribute_tls_model_ie. * include/resolv.h (_res): Define to __libc_res in libc.so. Add attribute_tls_model_ie. * inet/herrno.c (__libc_h_errno): Add hidden alias to h_errno. (h_errno): Define. * resolv/res_libc.c (__libc_res): Add hidden alias to _res. (_res): Define. * sysdeps/generic/bits/libc-tsd.h (__libc_tsd_define): Add attribute_tls_model_ie. * sysdeps/generic/errno-loc.c (errno): Only undefine if not using __thread. * sysdeps/generic/errno.c (__libc_errno): Add hidden alias to errno. * sysdeps/unix/sysv/linux/i386/sysdep.h (SYSCALL_ERROR_HANDLER): Use __libc_errno in USE___THREAD case. * sysdeps/unix/sysv/linux/x86_64/sysdep.h (SYSCALL_ERROR_HANDLER): Likewise. * configure.in (HAVE_TLS_MODEL_ATTRIBUTE): Check for __attribute__((tls_model (""))). * configure: Rebuilt. * config.h.in (HAVE_TLS_MODEL_ATTRIBUTE): Add.
This commit is contained in:
parent
146a03db89
commit
9b21e6bcf8
@ -52,7 +52,8 @@
|
||||
translate directly into variables by macro magic. */
|
||||
|
||||
#if USE___THREAD
|
||||
# define __libc_tsd_define(CLASS, KEY) CLASS __thread void *__libc_tsd_##KEY;
|
||||
# define __libc_tsd_define(CLASS, KEY) \
|
||||
CLASS __thread void *__libc_tsd_##KEY attribute_tls_model_ie;
|
||||
|
||||
# define __libc_tsd_address(KEY) (&__libc_tsd_##KEY)
|
||||
# define __libc_tsd_get(KEY) (__libc_tsd_##KEY)
|
||||
|
@ -101,6 +101,9 @@
|
||||
/* Define if the __thread keyword is supported. */
|
||||
#undef HAVE___THREAD
|
||||
|
||||
/* Define if the compiler supports __attribute__((tls_model(""))). */
|
||||
#undef HAVE_TLS_MODEL_ATTRIBUTE
|
||||
|
||||
/* Define if the regparm attribute shall be used for local functions
|
||||
(gcc on ix86 only). */
|
||||
#undef USE_REGPARMS
|
||||
|
25
configure
vendored
25
configure
vendored
@ -3772,6 +3772,31 @@ EOF
|
||||
|
||||
fi
|
||||
|
||||
if test "$libc_cv_gcc___thread" = yes; then
|
||||
echo $ac_n "checking for tls_model attribute""... $ac_c" 1>&6
|
||||
echo "configure:3778: checking for tls_model attribute" >&5
|
||||
if eval "test \"`echo '$''{'libc_cv_gcc_tls_model_attr'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
cat > conftest.c <<\EOF
|
||||
extern __thread int a __attribute__((tls_model ("initial-exec")));
|
||||
EOF
|
||||
if { ac_try='${CC-cc} $CFLAGS -S -Werror conftest.c >&5'; { (eval echo configure:3785: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
|
||||
libc_cv_gcc_tls_model_attr=yes
|
||||
else
|
||||
libc_cv_gcc_tls_model_attr=no
|
||||
fi
|
||||
rm -f conftest*
|
||||
fi
|
||||
|
||||
echo "$ac_t""$libc_cv_gcc_tls_model_attr" 1>&6
|
||||
if test "$libc_cv_gcc_tls_model_attr" = yes; then
|
||||
cat >> confdefs.h <<\EOF
|
||||
#define HAVE_TLS_MODEL_ATTRIBUTE 1
|
||||
EOF
|
||||
|
||||
fi
|
||||
fi
|
||||
|
||||
echo $ac_n "checking for libgd""... $ac_c" 1>&6
|
||||
echo "configure:3778: checking for libgd" >&5
|
||||
|
16
configure.in
16
configure.in
@ -1624,6 +1624,22 @@ if test "$libc_cv_gcc___thread" = yes; then
|
||||
AC_DEFINE(HAVE___THREAD)
|
||||
fi
|
||||
|
||||
if test "$libc_cv_gcc___thread" = yes; then
|
||||
dnl Check whether the compiler supports the tls_model attribute.
|
||||
AC_CACHE_CHECK([for tls_model attribute], libc_cv_gcc_tls_model_attr, [dnl
|
||||
cat > conftest.c <<\EOF
|
||||
extern __thread int a __attribute__((tls_model ("initial-exec")));
|
||||
EOF
|
||||
if AC_TRY_COMMAND([${CC-cc} $CFLAGS -S -Werror conftest.c >&AC_FD_CC]); then
|
||||
libc_cv_gcc_tls_model_attr=yes
|
||||
else
|
||||
libc_cv_gcc_tls_model_attr=no
|
||||
fi
|
||||
rm -f conftest*])
|
||||
if test "$libc_cv_gcc_tls_model_attr" = yes; then
|
||||
AC_DEFINE(HAVE_TLS_MODEL_ATTRIBUTE)
|
||||
fi
|
||||
fi
|
||||
|
||||
dnl Check whether we have the gd library available.
|
||||
AC_MSG_CHECKING(for libgd)
|
||||
|
@ -24,8 +24,12 @@ extern int errno attribute_hidden;
|
||||
|
||||
# if USE___THREAD
|
||||
# undef errno
|
||||
# ifndef NOT_IN_libc
|
||||
# define errno __libc_errno
|
||||
# else
|
||||
# define errno errno /* For #ifndef errno tests. */
|
||||
extern __thread int errno;
|
||||
# endif
|
||||
extern __thread int errno attribute_tls_model_ie;
|
||||
# define __set_errno(val) (errno = (val))
|
||||
# else
|
||||
# define __set_errno(val) (*__errno_location ()) = (val)
|
||||
|
@ -445,6 +445,12 @@
|
||||
# define attribute_hidden
|
||||
#endif
|
||||
|
||||
#if defined HAVE_TLS_MODEL_ATTRIBUTE
|
||||
# define attribute_tls_model_ie __attribute__ ((tls_model ("initial-exec")))
|
||||
#else
|
||||
# define attribute_tls_model_ie
|
||||
#endif
|
||||
|
||||
/* Handling on non-exported internal names. We have to do this only
|
||||
for shared code. */
|
||||
#ifdef SHARED
|
||||
|
@ -6,8 +6,12 @@
|
||||
# include <tls.h>
|
||||
# if USE___THREAD
|
||||
# undef h_errno
|
||||
# ifndef NOT_IN_libc
|
||||
# define h_errno __libc_h_errno
|
||||
# else
|
||||
# define h_errno h_errno /* For #ifndef h_errno tests. */
|
||||
extern __thread int h_errno;
|
||||
# endif
|
||||
extern __thread int h_errno attribute_tls_model_ie;
|
||||
# define __set_h_errno(x) (h_errno = (x))
|
||||
# else
|
||||
static inline int
|
||||
|
@ -16,7 +16,10 @@
|
||||
# include <tls.h>
|
||||
# if USE___THREAD
|
||||
# undef _res
|
||||
extern __thread struct __res_state _res;
|
||||
# ifndef NOT_IN_libc
|
||||
# define _res __libc_res
|
||||
# endif
|
||||
extern __thread struct __res_state _res attribute_tls_model_ie;
|
||||
# endif
|
||||
# else
|
||||
# ifndef __BIND_NOSTATIC
|
||||
|
@ -27,6 +27,9 @@
|
||||
|
||||
#if USE_TLS && HAVE___THREAD
|
||||
__thread int h_errno;
|
||||
extern __thread int __libc_h_errno __attribute__ ((alias ("h_errno")))
|
||||
attribute_hidden;
|
||||
# define h_errno __libc_h_errno
|
||||
#else
|
||||
int h_errno = 0;
|
||||
weak_alias (h_errno, _h_errno)
|
||||
|
@ -27,6 +27,9 @@
|
||||
#if USE_TLS && HAVE___THREAD
|
||||
/* With __thread support, this per-thread variable is used in all cases. */
|
||||
__thread struct __res_state _res;
|
||||
extern __thread struct __res_state __libc_res __attribute__ ((alias ("_res")))
|
||||
attribute_hidden;
|
||||
# define _res __libc_res
|
||||
#else
|
||||
/* The resolver state for use by single-threaded programs. */
|
||||
struct __res_state _res;
|
||||
|
@ -52,7 +52,8 @@
|
||||
translate directly into variables by macro magic. */
|
||||
|
||||
#if USE___THREAD
|
||||
# define __libc_tsd_define(CLASS, KEY) CLASS __thread void *__libc_tsd_##KEY;
|
||||
# define __libc_tsd_define(CLASS, KEY) \
|
||||
CLASS __thread void *__libc_tsd_##KEY attribute_tls_model_ie;
|
||||
|
||||
# define __libc_tsd_address(KEY) (&__libc_tsd_##KEY)
|
||||
# define __libc_tsd_get(KEY) (__libc_tsd_##KEY)
|
||||
|
@ -20,11 +20,9 @@
|
||||
|
||||
#include <errno.h>
|
||||
#include <tls.h>
|
||||
#undef errno
|
||||
|
||||
#if USE_TLS && HAVE___THREAD
|
||||
extern __thread int errno;
|
||||
#else
|
||||
#if !(USE_TLS && HAVE___THREAD)
|
||||
#undef errno
|
||||
extern int errno;
|
||||
#endif
|
||||
|
||||
|
@ -23,6 +23,8 @@
|
||||
|
||||
#if USE___THREAD
|
||||
__thread int errno;
|
||||
extern __thread int __libc_errno __attribute__ ((alias ("errno")))
|
||||
attribute_hidden;
|
||||
#else
|
||||
/* This differs from plain `int errno;' in that it doesn't create
|
||||
a common definition, but a plain symbol that resides in .bss,
|
||||
|
@ -114,7 +114,7 @@ __i686.get_pc_thunk.reg: \
|
||||
# define SYSCALL_ERROR_HANDLER \
|
||||
0:SETUP_PIC_REG (cx); \
|
||||
addl $_GLOBAL_OFFSET_TABLE_, %ecx; \
|
||||
movl errno@gotntpoff(%ecx), %ecx; \
|
||||
movl __libc_errno@GOTNTPOFF(%ecx), %ecx; \
|
||||
xorl %edx, %edx; \
|
||||
subl %eax, %edx; \
|
||||
movl %edx, %gs:0(%ecx); \
|
||||
|
@ -95,7 +95,7 @@
|
||||
#elif USE___THREAD
|
||||
# define SYSCALL_ERROR_HANDLER \
|
||||
0: \
|
||||
movq errno@GOTTPOFF(%rip), %rcx; \
|
||||
movq __libc_errno@GOTTPOFF(%rip), %rcx; \
|
||||
xorq %rdx, %rdx; \
|
||||
subq %rax, %rdx; \
|
||||
movl %edx, %fs:(%rcx); \
|
||||
|
Loading…
Reference in New Issue
Block a user