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:
Roland McGrath 2002-10-15 22:50:43 +00:00
parent 146a03db89
commit 9b21e6bcf8
15 changed files with 82 additions and 13 deletions

View File

@ -52,7 +52,8 @@
translate directly into variables by macro magic. */ translate directly into variables by macro magic. */
#if USE___THREAD #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_address(KEY) (&__libc_tsd_##KEY)
# define __libc_tsd_get(KEY) (__libc_tsd_##KEY) # define __libc_tsd_get(KEY) (__libc_tsd_##KEY)

View File

@ -101,6 +101,9 @@
/* Define if the __thread keyword is supported. */ /* Define if the __thread keyword is supported. */
#undef HAVE___THREAD #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 /* Define if the regparm attribute shall be used for local functions
(gcc on ix86 only). */ (gcc on ix86 only). */
#undef USE_REGPARMS #undef USE_REGPARMS

25
configure vendored
View File

@ -3772,6 +3772,31 @@ EOF
fi 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 $ac_n "checking for libgd""... $ac_c" 1>&6
echo "configure:3778: checking for libgd" >&5 echo "configure:3778: checking for libgd" >&5

View File

@ -1624,6 +1624,22 @@ if test "$libc_cv_gcc___thread" = yes; then
AC_DEFINE(HAVE___THREAD) AC_DEFINE(HAVE___THREAD)
fi 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. dnl Check whether we have the gd library available.
AC_MSG_CHECKING(for libgd) AC_MSG_CHECKING(for libgd)

View File

@ -24,8 +24,12 @@ extern int errno attribute_hidden;
# if USE___THREAD # if USE___THREAD
# undef errno # undef errno
# define errno errno /* For #ifndef errno tests. */ # ifndef NOT_IN_libc
extern __thread int errno; # define errno __libc_errno
# else
# define errno errno /* For #ifndef errno tests. */
# endif
extern __thread int errno attribute_tls_model_ie;
# define __set_errno(val) (errno = (val)) # define __set_errno(val) (errno = (val))
# else # else
# define __set_errno(val) (*__errno_location ()) = (val) # define __set_errno(val) (*__errno_location ()) = (val)

View File

@ -445,6 +445,12 @@
# define attribute_hidden # define attribute_hidden
#endif #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 /* Handling on non-exported internal names. We have to do this only
for shared code. */ for shared code. */
#ifdef SHARED #ifdef SHARED

View File

@ -6,8 +6,12 @@
# include <tls.h> # include <tls.h>
# if USE___THREAD # if USE___THREAD
# undef h_errno # undef h_errno
# define h_errno h_errno /* For #ifndef h_errno tests. */ # ifndef NOT_IN_libc
extern __thread int h_errno; # 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)) # define __set_h_errno(x) (h_errno = (x))
# else # else
static inline int static inline int

View File

@ -16,7 +16,10 @@
# include <tls.h> # include <tls.h>
# if USE___THREAD # if USE___THREAD
# undef _res # 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 # endif
# else # else
# ifndef __BIND_NOSTATIC # ifndef __BIND_NOSTATIC

View File

@ -27,6 +27,9 @@
#if USE_TLS && HAVE___THREAD #if USE_TLS && HAVE___THREAD
__thread int h_errno; __thread int h_errno;
extern __thread int __libc_h_errno __attribute__ ((alias ("h_errno")))
attribute_hidden;
# define h_errno __libc_h_errno
#else #else
int h_errno = 0; int h_errno = 0;
weak_alias (h_errno, _h_errno) weak_alias (h_errno, _h_errno)

View File

@ -27,6 +27,9 @@
#if USE_TLS && HAVE___THREAD #if USE_TLS && HAVE___THREAD
/* With __thread support, this per-thread variable is used in all cases. */ /* With __thread support, this per-thread variable is used in all cases. */
__thread struct __res_state _res; __thread struct __res_state _res;
extern __thread struct __res_state __libc_res __attribute__ ((alias ("_res")))
attribute_hidden;
# define _res __libc_res
#else #else
/* The resolver state for use by single-threaded programs. */ /* The resolver state for use by single-threaded programs. */
struct __res_state _res; struct __res_state _res;

View File

@ -52,7 +52,8 @@
translate directly into variables by macro magic. */ translate directly into variables by macro magic. */
#if USE___THREAD #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_address(KEY) (&__libc_tsd_##KEY)
# define __libc_tsd_get(KEY) (__libc_tsd_##KEY) # define __libc_tsd_get(KEY) (__libc_tsd_##KEY)

View File

@ -20,11 +20,9 @@
#include <errno.h> #include <errno.h>
#include <tls.h> #include <tls.h>
#undef errno
#if USE_TLS && HAVE___THREAD #if !(USE_TLS && HAVE___THREAD)
extern __thread int errno; #undef errno
#else
extern int errno; extern int errno;
#endif #endif

View File

@ -23,6 +23,8 @@
#if USE___THREAD #if USE___THREAD
__thread int errno; __thread int errno;
extern __thread int __libc_errno __attribute__ ((alias ("errno")))
attribute_hidden;
#else #else
/* This differs from plain `int errno;' in that it doesn't create /* This differs from plain `int errno;' in that it doesn't create
a common definition, but a plain symbol that resides in .bss, a common definition, but a plain symbol that resides in .bss,

View File

@ -114,7 +114,7 @@ __i686.get_pc_thunk.reg: \
# 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 errno@gotntpoff(%ecx), %ecx; \ movl __libc_errno@GOTNTPOFF(%ecx), %ecx; \
xorl %edx, %edx; \ xorl %edx, %edx; \
subl %eax, %edx; \ subl %eax, %edx; \
movl %edx, %gs:0(%ecx); \ movl %edx, %gs:0(%ecx); \

View File

@ -95,7 +95,7 @@
#elif USE___THREAD #elif USE___THREAD
# define SYSCALL_ERROR_HANDLER \ # define SYSCALL_ERROR_HANDLER \
0: \ 0: \
movq errno@GOTTPOFF(%rip), %rcx; \ movq __libc_errno@GOTTPOFF(%rip), %rcx; \
xorq %rdx, %rdx; \ xorq %rdx, %rdx; \
subq %rax, %rdx; \ subq %rax, %rdx; \
movl %edx, %fs:(%rcx); \ movl %edx, %fs:(%rcx); \