[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:42:54 PDT 2014


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
>



More information about the mesa-dev mailing list