2002-10-16 Jakub Jelinek <jakub@redhat.com>
authorRoland McGrath <roland@gnu.org>
Tue, 15 Oct 2002 22:50:43 +0000 (22:50 +0000)
committerRoland McGrath <roland@gnu.org>
Tue, 15 Oct 2002 22:50:43 +0000 (22:50 +0000)
* 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.

15 files changed:
bits/libc-tsd.h
config.h.in
configure
configure.in
include/errno.h
include/libc-symbols.h
include/netdb.h
include/resolv.h
inet/herrno.c
resolv/res_libc.c
sysdeps/generic/bits/libc-tsd.h
sysdeps/generic/errno-loc.c
sysdeps/generic/errno.c
sysdeps/unix/sysv/linux/i386/sysdep.h
sysdeps/unix/sysv/linux/x86_64/sysdep.h

index cc2c2c1..d393829 100644 (file)
@@ -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)
index 86ebe1b..bfcac4b 100644 (file)
 /* 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
index 66b2662..71c12d8 100755 (executable)
--- a/configure
+++ b/configure
@@ -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
index c115be5..8983031 100644 (file)
@@ -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)
index eed947f..1663538 100644 (file)
@@ -24,8 +24,12 @@ extern int errno attribute_hidden;
 
 #  if USE___THREAD
 #   undef  errno
-#   define errno errno         /* For #ifndef errno tests.  */
-extern __thread int errno;
+#   ifndef NOT_IN_libc
+#    define errno __libc_errno
+#   else
+#    define errno errno                /* For #ifndef errno tests.  */
+#   endif
+extern __thread int errno attribute_tls_model_ie;
 #   define __set_errno(val) (errno = (val))
 #  else
 #   define __set_errno(val) (*__errno_location ()) = (val)
index eb7b0dc..69fe729 100644 (file)
 # 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
index 423d5b4..54cdda1 100644 (file)
@@ -6,8 +6,12 @@
 #  include <tls.h>
 #  if USE___THREAD
 #   undef  h_errno
-#   define h_errno h_errno     /* For #ifndef h_errno tests.  */
-extern __thread int 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
 static inline int
index 2a4037c..12b4f74 100644 (file)
 #  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
index 165762b..406e91e 100644 (file)
@@ -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)
index 9f9af1d..60f7feb 100644 (file)
@@ -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;
index cc2c2c1..d393829 100644 (file)
@@ -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)
index bda9fa4..032b483 100644 (file)
 
 #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
 
index cba5ab9..e33c6b8 100644 (file)
@@ -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,
index f6763b1..4c907f2 100644 (file)
@@ -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);                                                    \
index de6bb44..adccc50 100644 (file)
@@ -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);                       \