mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-22 04:50:07 +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. */
|
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)
|
||||||
|
@ -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
25
configure
vendored
@ -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
|
||||||
|
16
configure.in
16
configure.in
@ -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)
|
||||||
|
@ -24,8 +24,12 @@ extern int errno attribute_hidden;
|
|||||||
|
|
||||||
# if USE___THREAD
|
# if USE___THREAD
|
||||||
# undef errno
|
# undef errno
|
||||||
|
# ifndef NOT_IN_libc
|
||||||
|
# define errno __libc_errno
|
||||||
|
# else
|
||||||
# define errno errno /* For #ifndef errno tests. */
|
# 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))
|
# define __set_errno(val) (errno = (val))
|
||||||
# else
|
# else
|
||||||
# define __set_errno(val) (*__errno_location ()) = (val)
|
# define __set_errno(val) (*__errno_location ()) = (val)
|
||||||
|
@ -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
|
||||||
|
@ -6,8 +6,12 @@
|
|||||||
# include <tls.h>
|
# include <tls.h>
|
||||||
# if USE___THREAD
|
# if USE___THREAD
|
||||||
# undef h_errno
|
# undef h_errno
|
||||||
|
# ifndef NOT_IN_libc
|
||||||
|
# define h_errno __libc_h_errno
|
||||||
|
# else
|
||||||
# define h_errno h_errno /* For #ifndef h_errno tests. */
|
# 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))
|
# define __set_h_errno(x) (h_errno = (x))
|
||||||
# else
|
# else
|
||||||
static inline int
|
static inline int
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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;
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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,
|
||||||
|
@ -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); \
|
||||||
|
@ -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); \
|
||||||
|
Loading…
Reference in New Issue
Block a user