[PATCH v3] glx: Silence warnings when building with clang
Jeremy Huddleston
jeremyhu at apple.com
Mon Apr 25 15:37:07 PDT 2011
Ok, -Werror -Werror=attributes seems to work for both clang and llvm-gcc-4.2. For some reason, -Werror still results in just a warning with gcc, and -Wunknown-attributes is default on clang, so -Werror works for it.
~/src/freedesktop/src/xserver-1.11 (master) $ gcc test.c -Werror=attributes
test.c:1: error: ‘tls_model’ attribute ignored
~/src/freedesktop/src/xserver-1.11 (master) $ clang test.c -Werror=attributes
test.c:1:20: warning: unknown attribute 'tls_model' ignored [-Wunknown-attributes]
int __attribute__((tls_model("initial-exec"))) bar;
^
1 warning generated.
On Apr 25, 2011, at 13:38, Jamey Sharp wrote:
> I approve of this patch in principle, so I tested it. GCC, at least in
> version 4.5.2, reports "error: -Werror=unknown-attributes: No option
> -Wunknown-attributes", so it doesn't detect support for tls_model.
>
> If I change xorg_tls.m4 to use "-Werror=attributes" instead, I can
> confirm that it detects tls_model, and that the code in glx/ compiles
> without error using the new definition of the TLS macro.
>
> I like the implementation, aside from the detail that it doesn't quite
> work :-) so I'll happily give a reviewed-by for a patch that I can
> confirm works with my version of GCC.
>
> It probably needs review on at least Solaris as well, so CC'ing Alan,
> and ideally whichever OS is still building on GCC 2.95 would test too.
>
> Jamey
>
> On Mon, Apr 25, 2011 at 12:20:16PM -0700, Jeremy Huddleston wrote:
>> This replaces AX_TLS (GPL3) with XORG_TLS (MIT)
>>
>> In file included from glapi.c:46:
>> In file included from ./glapi.h:51:
>> ./glthread.h:237:20: error: unknown attribute 'tls_model' ignored [-Werror,-Wunknown-attributes]
>> __attribute__((tls_model("initial-exec")));
>> ^
>> In file included from glapi.c:46:
>> ./glapi.h:92:20: error: unknown attribute 'tls_model' ignored [-Werror,-Wunknown-attributes]
>> __attribute__((tls_model("initial-exec")));
>> ^
>> glapi.c:82:20: error: unknown attribute 'tls_model' ignored [-Werror,-Wunknown-attributes]
>> __attribute__((tls_model("initial-exec"))) = NULL;
>> ^
>> glapi.c:85:20: error: unknown attribute 'tls_model' ignored [-Werror,-Wunknown-attributes]
>> __attribute__((tls_model("initial-exec")));
>> ^
>> 4 errors generated.
>>
>> Signed-off-by: Jeremy Huddleston <jeremyhu at apple.com>
>> ---
>> configure.ac | 3 +-
>> glx/glapi.c | 6 +--
>> glx/glapi.h | 3 +-
>> glx/glthread.h | 3 +-
>> include/dix-config.h.in | 2 +-
>> m4/ax_tls.m4 | 74 -----------------------------------------------
>> m4/xorg-tls.m4 | 54 ++++++++++++++++++++++++++++++++++
>> 7 files changed, 61 insertions(+), 84 deletions(-)
>> delete mode 100644 m4/ax_tls.m4
>> create mode 100644 m4/xorg-tls.m4
>>
>> diff --git a/configure.ac b/configure.ac
>> index 86e67f0..80f4d0d 100644
>> --- a/configure.ac
>> +++ b/configure.ac
>> @@ -590,7 +590,8 @@ 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 7cb8495..9e219f6 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 6521f31..7051c1e 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 140e2aa..532401a 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 f00c767..4710ef8 100644
>> --- a/include/dix-config.h.in
>> +++ b/include/dix-config.h.in
>> @@ -444,7 +444,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 481c3d0..0000000
>> --- 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 at 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 0000000..ec2f0fd
>> --- /dev/null
>> +++ b/m4/xorg-tls.m4
>> @@ -0,0 +1,54 @@
>> +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 at 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"
>> + CFLAGS="$CFLAGS -Werror=unknown-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
>> +])
>> --
>> 1.7.4.1
>>
>>
More information about the xorg-devel
mailing list