[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