diff options
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | glx/glapi.c | 6 | ||||
-rw-r--r-- | glx/glapi.h | 3 | ||||
-rw-r--r-- | glx/glthread.h | 3 | ||||
-rw-r--r-- | include/dix-config.h.in | 2 | ||||
-rw-r--r-- | m4/ax_tls.m4 | 74 | ||||
-rw-r--r-- | m4/xorg-tls.m4 | 57 |
7 files changed, 63 insertions, 84 deletions
diff --git a/configure.ac b/configure.ac index 56e51a407..73bfbaf1c 100644 --- a/configure.ac +++ b/configure.ac @@ -587,7 +587,7 @@ dnl GLX build options AC_ARG_ENABLE(aiglx, AS_HELP_STRING([--enable-aiglx], [Build accelerated indirect GLX (default: enabled)]), [AIGLX=$enableval], [AIGLX=yes]) -AX_TLS +XORG_TLS AC_ARG_ENABLE(glx-tls, AS_HELP_STRING([--enable-glx-tls], [Build GLX with TLS support (default: auto)]), [GLX_USE_TLS=$enableval if test "x$GLX_USE_TLS" = "xyes" && test "${ac_cv_tls}" = "none" ; then diff --git a/glx/glapi.c b/glx/glapi.c index 7cb849535..9e219f680 100644 --- a/glx/glapi.c +++ b/glx/glapi.c @@ -78,11 +78,9 @@ static void init_glapi_relocs(void); /*@{*/ #if defined(GLX_USE_TLS) -PUBLIC TLS struct _glapi_table * _glapi_tls_Dispatch - __attribute__((tls_model("initial-exec"))) = NULL; +PUBLIC TLS struct _glapi_table * _glapi_tls_Dispatch = NULL; -PUBLIC TLS void * _glapi_tls_Context - __attribute__((tls_model("initial-exec"))); +PUBLIC TLS void * _glapi_tls_Context; PUBLIC const struct _glapi_table *_glapi_Dispatch = NULL; PUBLIC const void *_glapi_Context = NULL; diff --git a/glx/glapi.h b/glx/glapi.h index 6521f3142..7051c1e3c 100644 --- a/glx/glapi.h +++ b/glx/glapi.h @@ -83,8 +83,7 @@ typedef void (*_glapi_warning_func)(void *ctx, const char *str, ...); const extern void *_glapi_Context; const extern struct _glapi_table *_glapi_Dispatch; -extern TLS void * _glapi_tls_Context - __attribute__((tls_model("initial-exec"))); +extern TLS void * _glapi_tls_Context; # define GET_CURRENT_CONTEXT(C) GLcontext *C = (GLcontext *) _glapi_tls_Context diff --git a/glx/glthread.h b/glx/glthread.h index 140e2aa8e..532401a73 100644 --- a/glx/glthread.h +++ b/glx/glthread.h @@ -233,8 +233,7 @@ _glthread_SetTSD(_glthread_TSD *, void *); #if defined(GLX_USE_TLS) -extern TLS struct _glapi_table * _glapi_tls_Dispatch - __attribute__((tls_model("initial-exec"))); +extern TLS struct _glapi_table * _glapi_tls_Dispatch; #define GET_DISPATCH() _glapi_tls_Dispatch diff --git a/include/dix-config.h.in b/include/dix-config.h.in index 14229b435..e473bb750 100644 --- a/include/dix-config.h.in +++ b/include/dix-config.h.in @@ -447,7 +447,7 @@ /* Define to 1 if you have the `ffs' function. */ #undef HAVE_FFS -/* If the compiler supports a TLS storage class define it to that here */ +/* The compiler supported TLS storage class, prefering initial-exec if tls_model is supported */ #undef TLS /* Correctly set _XSERVER64 for OSX fat binaries */ diff --git a/m4/ax_tls.m4 b/m4/ax_tls.m4 deleted file mode 100644 index 481c3d0c8..000000000 --- a/m4/ax_tls.m4 +++ /dev/null @@ -1,74 +0,0 @@ -# =========================================================================== -# http://www.nongnu.org/autoconf-archive/ax_tls.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_TLS -# -# DESCRIPTION -# -# Provides a test for the compiler support of thread local storage (TLS) -# extensions. Defines TLS if it is found. Currently only knows about GCC -# and MSVC. I think SunPro uses the same as GCC, and Borland apparently -# supports either. -# -# LICENSE -# -# Copyright (c) 2008 Alan Woodland <ajw05@aber.ac.uk> -# -# This program is free software: you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the -# Free Software Foundation, either version 3 of the License, or (at your -# option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General -# Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program. If not, see <http://www.gnu.org/licenses/>. -# -# As a special exception, the respective Autoconf Macro's copyright owner -# gives unlimited permission to copy, distribute and modify the configure -# scripts that are the output of Autoconf when processing the Macro. You -# need not follow the terms of the GNU General Public License when using -# or distributing such scripts, even though portions of the text of the -# Macro appear in them. The GNU General Public License (GPL) does govern -# all other use of the material that constitutes the Autoconf Macro. -# -# This special exception to the GPL applies to versions of the Autoconf -# Macro released by the Autoconf Archive. When you make and distribute a -# modified version of the Autoconf Macro, you may extend this special -# exception to the GPL to apply to your modified version as well. - -AC_DEFUN([AX_TLS], [ - AC_MSG_CHECKING(for thread local storage (TLS) class) - AC_CACHE_VAL(ac_cv_tls, [ - ax_tls_keywords="__thread __declspec(thread) none" - for ax_tls_keyword in $ax_tls_keywords; do - case $ax_tls_keyword in - none) ac_cv_tls=none ; break ;; - *) - AC_TRY_COMPILE( - [#include <stdlib.h> - static void - foo(void) { - static ] $ax_tls_keyword [ int bar; - exit(1); - }], - [], - [ac_cv_tls=$ax_tls_keyword ; break], - ac_cv_tls=none - ) - esac - done -]) - - if test "$ac_cv_tls" != "none"; then - dnl AC_DEFINE([TLS], [], [If the compiler supports a TLS storage class define it to that here]) - AC_DEFINE_UNQUOTED([TLS], $ac_cv_tls, [If the compiler supports a TLS storage class define it to that here]) - fi - AC_MSG_RESULT($ac_cv_tls) -]) diff --git a/m4/xorg-tls.m4 b/m4/xorg-tls.m4 new file mode 100644 index 000000000..563850420 --- /dev/null +++ b/m4/xorg-tls.m4 @@ -0,0 +1,57 @@ +dnl Copyright © 2011 Apple Inc. +dnl +dnl Permission is hereby granted, free of charge, to any person obtaining a +dnl copy of this software and associated documentation files (the "Software"), +dnl to deal in the Software without restriction, including without limitation +dnl the rights to use, copy, modify, merge, publish, distribute, sublicense, +dnl and/or sell copies of the Software, and to permit persons to whom the +dnl Software is furnished to do so, subject to the following conditions: +dnl +dnl The above copyright notice and this permission notice (including the next +dnl paragraph) shall be included in all copies or substantial portions of the +dnl Software. +dnl +dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +dnl IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +dnl FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +dnl THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +dnl LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +dnl FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +dnl DEALINGS IN THE SOFTWARE. +dnl +dnl Authors: Jeremy Huddleston <jeremyhu@apple.com> + +AC_DEFUN([XORG_TLS], [ + AC_MSG_CHECKING(for thread local storage (TLS) support) + AC_CACHE_VAL(ac_cv_tls, [ + ac_cv_tls=none + keywords="__thread __declspec(thread)" + for kw in $keywords ; do + AC_TRY_COMPILE([int $kw test;], [], ac_cv_tls=$kw) + done + ]) + AC_MSG_RESULT($ac_cv_tls) + + if test "$ac_cv_tls" != "none"; then + AC_MSG_CHECKING(for tls_model attribute support) + AC_CACHE_VAL(ac_cv_tls_model, [ + save_CFLAGS="$CFLAGS" + dnl -Werror causes clang's default -Wunknown-attributes to become an error + dnl We can't use -Werror=unknown-attributes because gcc doesn't understand it + dnl -Werror=attributes is for gcc, clang seems to ignore it + CFLAGS="$CFLAGS -Werror -Werror=attributes" + AC_TRY_COMPILE([int $ac_cv_tls __attribute__((tls_model("initial-exec"))) test;], [], + ac_cv_tls_model=yes, ac_cv_tls_model=no) + CFLAGS="$save_CFLAGS" + ]) + AC_MSG_RESULT($ac_cv_tls_model) + + if test "x$ac_cv_tls_model" = "xyes" ; then + xorg_tls=$ac_cv_tls' __attribute__((tls_model("initial-exec")))' + else + xorg_tls=$ac_cv_tls + fi + + AC_DEFINE_UNQUOTED([TLS], $xorg_tls, [The compiler supported TLS storage class, prefering initial-exec if tls_model is supported]) + fi +]) |