[Mesa-dev] [PATCH 03/12] mesa: Replace a priori knowledge of gcc attributes with configure tests.

Brian Paul brianp at vmware.com
Mon Sep 22 12:50:10 PDT 2014


Yeah, the scons build is broken on Linux even:

   Compiling src/gallium/state_trackers/egl/common/egl_g3d_image.c ...
In file included from src/gallium/include/pipe/p_compiler.h:33:0,
                  from src/gallium/include/pipe/p_screen.h:41,
                  from src/gallium/state_trackers/egl/common/egl_g3d.c:29:
src/gallium/include/pipe/../../../util/macros.h:148:0: warning: "PUBLIC" 
redefined [enabled by default]
In file included from src/egl/main/egltypedefs.h:39:0,
                  from src/egl/main/egldriver.h:35,
                  from src/gallium/state_trackers/egl/common/egl_g3d.c:25:
src/egl/main/eglcompiler.h:80:0: note: this is the location of the 
previous definition

[...]

   Compiling src/gallium/state_trackers/glx/xlib/xm_st.c ...
src/gallium/state_trackers/glx/xlib/glx_getproc.c:198:1: error: unknown 
type name ‘PUBLIC’
src/gallium/state_trackers/glx/xlib/glx_getproc.c:199:1: error: expected 
‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘glXGetProcAddressARB’
src/gallium/state_trackers/glx/xlib/glx_getproc.c:215:1: error: expected 
‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘void’
src/gallium/state_trackers/glx/xlib/glx_getproc.c:187:1: warning: 
‘_glxapi_get_proc_address’ defined but not used [-Wunused-function]
   Compiling src/gallium/state_trackers/vega/api.c ...
scons: *** 
[build/linux-x86_64-debug/gallium/state_trackers/glx/xlib/glx_getproc.os] Error 
1
In file included from src/gallium/state_trackers/vega/api.c:28:0:
src/mapi/mapi.h:47:13: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or 
‘__attribute__’ before ‘void’
src/mapi/mapi.h:50:1: error: unknown type name ‘PUBLIC’


Just type 'scons' to try it yourself.

-Brian

On 09/22/2014 01:42 PM, Brian Paul wrote:
> How do these kinds of changes interact with the SCons build?
>
> I think I'll have to test the whole series with SCons/Windows.
>
> -Brian
>
> On 09/22/2014 12:51 PM, Matt Turner wrote:
>> Note that I had to add support for testing the packed attribute to
>> m4/ax_gcc_func_attribute.m4.
>> ---
>>   configure.ac                                   |   4 +
>>   m4/ax_gcc_func_attribute.m4                    | 223
>> +++++++++++++++++++++++++
>>   src/mesa/drivers/dri/i965/intel_tex_subimage.c |   6 -
>>   src/util/macros.h                              |  11 +-
>>   4 files changed, 234 insertions(+), 10 deletions(-)
>>   create mode 100644 m4/ax_gcc_func_attribute.m4
>>
>> diff --git a/configure.ac b/configure.ac
>> index 6b0adbc..0aec6eb 100644
>> --- a/configure.ac
>> +++ b/configure.ac
>> @@ -141,6 +141,10 @@ AX_GCC_BUILTIN([__builtin_popcount])
>>   AX_GCC_BUILTIN([__builtin_popcountll])
>>   AX_GCC_BUILTIN([__builtin_unreachable])
>>
>> +AX_GCC_FUNC_ATTRIBUTE([flatten])
>> +AX_GCC_FUNC_ATTRIBUTE([format])
>> +AX_GCC_FUNC_ATTRIBUTE([packed])
>> +
>>   AM_CONDITIONAL([GEN_ASM_OFFSETS], test "x$GEN_ASM_OFFSETS" = xyes)
>>
>>   dnl Make sure the pkg-config macros are defined
>> diff --git a/m4/ax_gcc_func_attribute.m4 b/m4/ax_gcc_func_attribute.m4
>> new file mode 100644
>> index 0000000..4e0ecbb
>> --- /dev/null
>> +++ b/m4/ax_gcc_func_attribute.m4
>> @@ -0,0 +1,223 @@
>> +#
>> ===========================================================================
>>
>> +#
>> https://urldefense.proofpoint.com/v1/url?u=http://www.gnu.org/software/autoconf-archive/ax_gcc_func_attribute.html&k=oIvRg1%2BdGAgOoM1BIlLLqw%3D%3D%0A&r=lGQMzzTgII0I7jefp2FHq7WtZ%2BTLs8wadB%2BiIj9xpBY%3D%0A&m=EbcOJARBmo%2BpImITFDv2TXqTppIV1qQYEjJYEoXT%2FWE%3D%0A&s=be29659dc30308d1673a073cb3b7315d38295513f7b58048483a6b77fd3b2994
>>
>> +#
>> ===========================================================================
>>
>> +#
>> +# SYNOPSIS
>> +#
>> +#   AX_GCC_FUNC_ATTRIBUTE(ATTRIBUTE)
>> +#
>> +# DESCRIPTION
>> +#
>> +#   This macro checks if the compiler supports one of GCC's function
>> +#   attributes; many other compilers also provide function attributes
>> with
>> +#   the same syntax. Compiler warnings are used to detect supported
>> +#   attributes as unsupported ones are ignored by default so quieting
>> +#   warnings when using this macro will yield false positives.
>> +#
>> +#   The ATTRIBUTE parameter holds the name of the attribute to be
>> checked.
>> +#
>> +#   If ATTRIBUTE is supported define HAVE_FUNC_ATTRIBUTE_<ATTRIBUTE>.
>> +#
>> +#   The macro caches its result in the
>> ax_cv_have_func_attribute_<attribute>
>> +#   variable.
>> +#
>> +#   The macro currently supports the following function attributes:
>> +#
>> +#    alias
>> +#    aligned
>> +#    alloc_size
>> +#    always_inline
>> +#    artificial
>> +#    cold
>> +#    const
>> +#    constructor
>> +#    deprecated
>> +#    destructor
>> +#    dllexport
>> +#    dllimport
>> +#    error
>> +#    externally_visible
>> +#    flatten
>> +#    format
>> +#    format_arg
>> +#    gnu_inline
>> +#    hot
>> +#    ifunc
>> +#    leaf
>> +#    malloc
>> +#    noclone
>> +#    noinline
>> +#    nonnull
>> +#    noreturn
>> +#    nothrow
>> +#    optimize
>> +#    packed
>> +#    pure
>> +#    unused
>> +#    used
>> +#    visibility
>> +#    warning
>> +#    warn_unused_result
>> +#    weak
>> +#    weakref
>> +#
>> +#   Unsuppored function attributes will be tested with a prototype
>> returning
>> +#   an int and not accepting any arguments and the result of the
>> check might
>> +#   be wrong or meaningless so use with care.
>> +#
>> +# LICENSE
>> +#
>> +#   Copyright (c) 2013 Gabriele Svelto <gabriele.svelto at gmail.com>
>> +#
>> +#   Copying and distribution of this file, with or without
>> modification, are
>> +#   permitted in any medium without royalty provided the copyright
>> notice
>> +#   and this notice are preserved.  This file is offered as-is,
>> without any
>> +#   warranty.
>> +
>> +#serial 2
>> +
>> +AC_DEFUN([AX_GCC_FUNC_ATTRIBUTE], [
>> +    AS_VAR_PUSHDEF([ac_var], [ax_cv_have_func_attribute_$1])
>> +
>> +    AC_CACHE_CHECK([for __attribute__(($1))], [ac_var], [
>> +        AC_LINK_IFELSE([AC_LANG_PROGRAM([
>> +            m4_case([$1],
>> +                [alias], [
>> +                    int foo( void ) { return 0; }
>> +                    int bar( void ) __attribute__(($1("foo")));
>> +                ],
>> +                [aligned], [
>> +                    int foo( void ) __attribute__(($1(32)));
>> +                ],
>> +                [alloc_size], [
>> +                    void *foo(int a) __attribute__(($1(1)));
>> +                ],
>> +                [always_inline], [
>> +                    inline __attribute__(($1)) int foo( void ) {
>> return 0; }
>> +                ],
>> +                [artificial], [
>> +                    inline __attribute__(($1)) int foo( void ) {
>> return 0; }
>> +                ],
>> +                [cold], [
>> +                    int foo( void ) __attribute__(($1));
>> +                ],
>> +                [const], [
>> +                    int foo( void ) __attribute__(($1));
>> +                ],
>> +                [constructor], [
>> +                    int foo( void ) __attribute__(($1));
>> +                ],
>> +                [deprecated], [
>> +                    int foo( void ) __attribute__(($1("")));
>> +                ],
>> +                [destructor], [
>> +                    int foo( void ) __attribute__(($1));
>> +                ],
>> +                [dllexport], [
>> +                    __attribute__(($1)) int foo( void ) { return 0; }
>> +                ],
>> +                [dllimport], [
>> +                    int foo( void ) __attribute__(($1));
>> +                ],
>> +                [error], [
>> +                    int foo( void ) __attribute__(($1("")));
>> +                ],
>> +                [externally_visible], [
>> +                    int foo( void ) __attribute__(($1));
>> +                ],
>> +                [flatten], [
>> +                    int foo( void ) __attribute__(($1));
>> +                ],
>> +                [format], [
>> +                    int foo(const char *p, ...)
>> __attribute__(($1(printf, 1, 2)));
>> +                ],
>> +                [format_arg], [
>> +                    char *foo(const char *p) __attribute__(($1(1)));
>> +                ],
>> +                [gnu_inline], [
>> +                    inline __attribute__(($1)) int foo( void ) {
>> return 0; }
>> +                ],
>> +                [hot], [
>> +                    int foo( void ) __attribute__(($1));
>> +                ],
>> +                [ifunc], [
>> +                    int my_foo( void ) { return 0; }
>> +                    static int (*resolve_foo(void))(void) { return
>> my_foo; }
>> +                    int foo( void ) __attribute__(($1("resolve_foo")));
>> +                ],
>> +                [leaf], [
>> +                    __attribute__(($1)) int foo( void ) { return 0; }
>> +                ],
>> +                [malloc], [
>> +                    void *foo( void ) __attribute__(($1));
>> +                ],
>> +                [noclone], [
>> +                    int foo( void ) __attribute__(($1));
>> +                ],
>> +                [noinline], [
>> +                    __attribute__(($1)) int foo( void ) { return 0; }
>> +                ],
>> +                [nonnull], [
>> +                    int foo(char *p) __attribute__(($1(1)));
>> +                ],
>> +                [noreturn], [
>> +                    void foo( void ) __attribute__(($1));
>> +                ],
>> +                [nothrow], [
>> +                    int foo( void ) __attribute__(($1));
>> +                ],
>> +                [optimize], [
>> +                    __attribute__(($1(3))) int foo( void ) { return 0; }
>> +                ],
>> +                [packed], [
>> +                    struct __attribute__(($1)) foo { int bar; };
>> +                ],
>> +                [pure], [
>> +                    int foo( void ) __attribute__(($1));
>> +                ],
>> +                [unused], [
>> +                    int foo( void ) __attribute__(($1));
>> +                ],
>> +                [used], [
>> +                    int foo( void ) __attribute__(($1));
>> +                ],
>> +                [visibility], [
>> +                    int foo_def( void ) __attribute__(($1("default")));
>> +                    int foo_hid( void ) __attribute__(($1("hidden")));
>> +                    int foo_int( void ) __attribute__(($1("internal")));
>> +                    int foo_pro( void )
>> __attribute__(($1("protected")));
>> +                ],
>> +                [warning], [
>> +                    int foo( void ) __attribute__(($1("")));
>> +                ],
>> +                [warn_unused_result], [
>> +                    int foo( void ) __attribute__(($1));
>> +                ],
>> +                [weak], [
>> +                    int foo( void ) __attribute__(($1));
>> +                ],
>> +                [weakref], [
>> +                    static int foo( void ) { return 0; }
>> +                    static int bar( void ) __attribute__(($1("foo")));
>> +                ],
>> +                [
>> +                 m4_warn([syntax], [Unsupported attribute $1, the
>> test may fail])
>> +                 int foo( void ) __attribute__(($1));
>> +                ]
>> +            )], [])
>> +            ],
>> +            dnl GCC doesn't exit with an error if an unknown
>> attribute is
>> +            dnl provided but only outputs a warning, so accept the
>> attribute
>> +            dnl only if no warning were issued.
>> +            [AS_IF([test -s conftest.err],
>> +                [AS_VAR_SET([ac_var], [no])],
>> +                [AS_VAR_SET([ac_var], [yes])])],
>> +            [AS_VAR_SET([ac_var], [no])])
>> +    ])
>> +
>> +    AS_IF([test yes = AS_VAR_GET([ac_var])],
>> +        [AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_FUNC_ATTRIBUTE_$1), 1,
>> +            [Define to 1 if the system has the `$1' function
>> attribute])], [])
>> +
>> +    AS_VAR_POPDEF([ac_var])
>> +])
>> diff --git a/src/mesa/drivers/dri/i965/intel_tex_subimage.c
>> b/src/mesa/drivers/dri/i965/intel_tex_subimage.c
>> index a121816..cb5738a 100644
>> --- a/src/mesa/drivers/dri/i965/intel_tex_subimage.c
>> +++ b/src/mesa/drivers/dri/i965/intel_tex_subimage.c
>> @@ -334,12 +334,6 @@ ytile_copy(
>>      }
>>   }
>>
>> -#ifdef __GNUC__
>> -#define FLATTEN __attribute__((flatten))
>> -#else
>> -#define FLATTEN
>> -#endif
>> -
>>   /**
>>    * Copy texture data from linear to X tile layout, faster.
>>    *
>> diff --git a/src/util/macros.h b/src/util/macros.h
>> index 2e2f90f..a9867b4 100644
>> --- a/src/util/macros.h
>> +++ b/src/util/macros.h
>> @@ -75,24 +75,27 @@ do {                        \
>>   #define unreachable(str)
>>   #endif
>>
>> +#ifdef HAVE_FUNC_ATTRIBUTE_FLATTEN
>> +#define FLATTEN __attribute__((__flatten__))
>> +#else
>> +#define FLATTEN
>> +#endif
>>
>> -#if (__GNUC__ >= 3)
>> +#ifdef HAVE_FUNC_ATTRIBUTE_FORMAT
>>   #define PRINTFLIKE(f, a) __attribute__ ((format(__printf__, f, a)))
>>   #else
>>   #define PRINTFLIKE(f, a)
>>   #endif
>>
>> -
>>   /* Used to optionally mark structures with misaligned elements or
>> size as
>>    * packed, to trade off performance for space.
>>    */
>> -#if (__GNUC__ >= 3)
>> +#ifdef HAVE_FUNC_ATTRIBUTE_PACKED
>>   #define PACKED __attribute__((__packed__))
>>   #else
>>   #define PACKED
>>   #endif
>>
>> -
>>   #ifdef __cplusplus
>>   /**
>>    * Macro function that evaluates to true if T is a trivially
>>
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://urldefense.proofpoint.com/v1/url?u=http://lists.freedesktop.org/mailman/listinfo/mesa-dev&k=oIvRg1%2BdGAgOoM1BIlLLqw%3D%3D%0A&r=lGQMzzTgII0I7jefp2FHq7WtZ%2BTLs8wadB%2BiIj9xpBY%3D%0A&m=fr52pykyxPuiCSoQDrsxfKpOueNpoPMTC2DrS%2FP23%2BU%3D%0A&s=2e57036c93a8756f431b11379304ddc4aed295ea6d176b3ee26c1ab7a859f24f
>



More information about the mesa-dev mailing list