xref: /aosp_15_r20/external/igt-gpu-tools/m4/ax_gcc_func_attribute.m4 (revision d83cc019efdc2edc6c4b16e9034a3ceb8d35d77c)
1*d83cc019SAndroid Build Coastguard Worker# ===========================================================================
2*d83cc019SAndroid Build Coastguard Worker#   http://www.gnu.org/software/autoconf-archive/ax_gcc_func_attribute.html
3*d83cc019SAndroid Build Coastguard Worker# ===========================================================================
4*d83cc019SAndroid Build Coastguard Worker#
5*d83cc019SAndroid Build Coastguard Worker# SYNOPSIS
6*d83cc019SAndroid Build Coastguard Worker#
7*d83cc019SAndroid Build Coastguard Worker#   AX_GCC_FUNC_ATTRIBUTE(ATTRIBUTE)
8*d83cc019SAndroid Build Coastguard Worker#
9*d83cc019SAndroid Build Coastguard Worker# DESCRIPTION
10*d83cc019SAndroid Build Coastguard Worker#
11*d83cc019SAndroid Build Coastguard Worker#   This macro checks if the compiler supports one of GCC's function
12*d83cc019SAndroid Build Coastguard Worker#   attributes; many other compilers also provide function attributes with
13*d83cc019SAndroid Build Coastguard Worker#   the same syntax. Compiler warnings are used to detect supported
14*d83cc019SAndroid Build Coastguard Worker#   attributes as unsupported ones are ignored by default so quieting
15*d83cc019SAndroid Build Coastguard Worker#   warnings when using this macro will yield false positives.
16*d83cc019SAndroid Build Coastguard Worker#
17*d83cc019SAndroid Build Coastguard Worker#   The ATTRIBUTE parameter holds the name of the attribute to be checked.
18*d83cc019SAndroid Build Coastguard Worker#
19*d83cc019SAndroid Build Coastguard Worker#   If ATTRIBUTE is supported define HAVE_FUNC_ATTRIBUTE_<ATTRIBUTE>.
20*d83cc019SAndroid Build Coastguard Worker#
21*d83cc019SAndroid Build Coastguard Worker#   The macro caches its result in the ax_cv_have_func_attribute_<attribute>
22*d83cc019SAndroid Build Coastguard Worker#   variable.
23*d83cc019SAndroid Build Coastguard Worker#
24*d83cc019SAndroid Build Coastguard Worker#   The macro currently supports the following function attributes:
25*d83cc019SAndroid Build Coastguard Worker#
26*d83cc019SAndroid Build Coastguard Worker#    alias
27*d83cc019SAndroid Build Coastguard Worker#    aligned
28*d83cc019SAndroid Build Coastguard Worker#    alloc_size
29*d83cc019SAndroid Build Coastguard Worker#    always_inline
30*d83cc019SAndroid Build Coastguard Worker#    artificial
31*d83cc019SAndroid Build Coastguard Worker#    cold
32*d83cc019SAndroid Build Coastguard Worker#    const
33*d83cc019SAndroid Build Coastguard Worker#    constructor
34*d83cc019SAndroid Build Coastguard Worker#    constructor_priority for constructor attribute with priority
35*d83cc019SAndroid Build Coastguard Worker#    deprecated
36*d83cc019SAndroid Build Coastguard Worker#    destructor
37*d83cc019SAndroid Build Coastguard Worker#    dllexport
38*d83cc019SAndroid Build Coastguard Worker#    dllimport
39*d83cc019SAndroid Build Coastguard Worker#    error
40*d83cc019SAndroid Build Coastguard Worker#    externally_visible
41*d83cc019SAndroid Build Coastguard Worker#    flatten
42*d83cc019SAndroid Build Coastguard Worker#    format
43*d83cc019SAndroid Build Coastguard Worker#    format_arg
44*d83cc019SAndroid Build Coastguard Worker#    gnu_inline
45*d83cc019SAndroid Build Coastguard Worker#    hot
46*d83cc019SAndroid Build Coastguard Worker#    ifunc
47*d83cc019SAndroid Build Coastguard Worker#    leaf
48*d83cc019SAndroid Build Coastguard Worker#    malloc
49*d83cc019SAndroid Build Coastguard Worker#    noclone
50*d83cc019SAndroid Build Coastguard Worker#    noinline
51*d83cc019SAndroid Build Coastguard Worker#    nonnull
52*d83cc019SAndroid Build Coastguard Worker#    noreturn
53*d83cc019SAndroid Build Coastguard Worker#    nothrow
54*d83cc019SAndroid Build Coastguard Worker#    optimize
55*d83cc019SAndroid Build Coastguard Worker#    pure
56*d83cc019SAndroid Build Coastguard Worker#    unused
57*d83cc019SAndroid Build Coastguard Worker#    used
58*d83cc019SAndroid Build Coastguard Worker#    visibility
59*d83cc019SAndroid Build Coastguard Worker#    warning
60*d83cc019SAndroid Build Coastguard Worker#    warn_unused_result
61*d83cc019SAndroid Build Coastguard Worker#    weak
62*d83cc019SAndroid Build Coastguard Worker#    weakref
63*d83cc019SAndroid Build Coastguard Worker#
64*d83cc019SAndroid Build Coastguard Worker#   Unsuppored function attributes will be tested with a prototype returning
65*d83cc019SAndroid Build Coastguard Worker#   an int and not accepting any arguments and the result of the check might
66*d83cc019SAndroid Build Coastguard Worker#   be wrong or meaningless so use with care.
67*d83cc019SAndroid Build Coastguard Worker#
68*d83cc019SAndroid Build Coastguard Worker# LICENSE
69*d83cc019SAndroid Build Coastguard Worker#
70*d83cc019SAndroid Build Coastguard Worker#   Copyright (c) 2013 Gabriele Svelto <[email protected]>
71*d83cc019SAndroid Build Coastguard Worker#
72*d83cc019SAndroid Build Coastguard Worker#   Copying and distribution of this file, with or without modification, are
73*d83cc019SAndroid Build Coastguard Worker#   permitted in any medium without royalty provided the copyright notice
74*d83cc019SAndroid Build Coastguard Worker#   and this notice are preserved.  This file is offered as-is, without any
75*d83cc019SAndroid Build Coastguard Worker#   warranty.
76*d83cc019SAndroid Build Coastguard Worker
77*d83cc019SAndroid Build Coastguard Worker#serial 4
78*d83cc019SAndroid Build Coastguard Worker
79*d83cc019SAndroid Build Coastguard WorkerAC_DEFUN([AX_GCC_FUNC_ATTRIBUTE], [
80*d83cc019SAndroid Build Coastguard Worker    AS_VAR_PUSHDEF([ac_var], [ax_cv_have_func_attribute_$1])
81*d83cc019SAndroid Build Coastguard Worker
82*d83cc019SAndroid Build Coastguard Worker    AC_CACHE_CHECK([for __attribute__(($1))], [ac_var], [
83*d83cc019SAndroid Build Coastguard Worker        AC_LINK_IFELSE([AC_LANG_PROGRAM([
84*d83cc019SAndroid Build Coastguard Worker            m4_case([$1],
85*d83cc019SAndroid Build Coastguard Worker                [alias], [
86*d83cc019SAndroid Build Coastguard Worker                    int foo( void ) { return 0; }
87*d83cc019SAndroid Build Coastguard Worker                    int bar( void ) __attribute__(($1("foo")));
88*d83cc019SAndroid Build Coastguard Worker                ],
89*d83cc019SAndroid Build Coastguard Worker                [aligned], [
90*d83cc019SAndroid Build Coastguard Worker                    int foo( void ) __attribute__(($1(32)));
91*d83cc019SAndroid Build Coastguard Worker                ],
92*d83cc019SAndroid Build Coastguard Worker                [alloc_size], [
93*d83cc019SAndroid Build Coastguard Worker                    void *foo(int a) __attribute__(($1(1)));
94*d83cc019SAndroid Build Coastguard Worker                ],
95*d83cc019SAndroid Build Coastguard Worker                [always_inline], [
96*d83cc019SAndroid Build Coastguard Worker                    inline __attribute__(($1)) int foo( void ) { return 0; }
97*d83cc019SAndroid Build Coastguard Worker                ],
98*d83cc019SAndroid Build Coastguard Worker                [artificial], [
99*d83cc019SAndroid Build Coastguard Worker                    inline __attribute__(($1)) int foo( void ) { return 0; }
100*d83cc019SAndroid Build Coastguard Worker                ],
101*d83cc019SAndroid Build Coastguard Worker                [cold], [
102*d83cc019SAndroid Build Coastguard Worker                    int foo( void ) __attribute__(($1));
103*d83cc019SAndroid Build Coastguard Worker                ],
104*d83cc019SAndroid Build Coastguard Worker                [const], [
105*d83cc019SAndroid Build Coastguard Worker                    int foo( void ) __attribute__(($1));
106*d83cc019SAndroid Build Coastguard Worker                ],
107*d83cc019SAndroid Build Coastguard Worker                [constructor_priority], [
108*d83cc019SAndroid Build Coastguard Worker                    int foo( void ) __attribute__((__constructor__(65535/2)));
109*d83cc019SAndroid Build Coastguard Worker                ],
110*d83cc019SAndroid Build Coastguard Worker                [constructor], [
111*d83cc019SAndroid Build Coastguard Worker                    int foo( void ) __attribute__(($1));
112*d83cc019SAndroid Build Coastguard Worker                ],
113*d83cc019SAndroid Build Coastguard Worker                [deprecated], [
114*d83cc019SAndroid Build Coastguard Worker                    int foo( void ) __attribute__(($1("")));
115*d83cc019SAndroid Build Coastguard Worker                ],
116*d83cc019SAndroid Build Coastguard Worker                [destructor], [
117*d83cc019SAndroid Build Coastguard Worker                    int foo( void ) __attribute__(($1));
118*d83cc019SAndroid Build Coastguard Worker                ],
119*d83cc019SAndroid Build Coastguard Worker                [dllexport], [
120*d83cc019SAndroid Build Coastguard Worker                    __attribute__(($1)) int foo( void ) { return 0; }
121*d83cc019SAndroid Build Coastguard Worker                ],
122*d83cc019SAndroid Build Coastguard Worker                [dllimport], [
123*d83cc019SAndroid Build Coastguard Worker                    int foo( void ) __attribute__(($1));
124*d83cc019SAndroid Build Coastguard Worker                ],
125*d83cc019SAndroid Build Coastguard Worker                [error], [
126*d83cc019SAndroid Build Coastguard Worker                    int foo( void ) __attribute__(($1("")));
127*d83cc019SAndroid Build Coastguard Worker                ],
128*d83cc019SAndroid Build Coastguard Worker                [externally_visible], [
129*d83cc019SAndroid Build Coastguard Worker                    int foo( void ) __attribute__(($1));
130*d83cc019SAndroid Build Coastguard Worker                ],
131*d83cc019SAndroid Build Coastguard Worker                [flatten], [
132*d83cc019SAndroid Build Coastguard Worker                    int foo( void ) __attribute__(($1));
133*d83cc019SAndroid Build Coastguard Worker                ],
134*d83cc019SAndroid Build Coastguard Worker                [format], [
135*d83cc019SAndroid Build Coastguard Worker                    int foo(const char *p, ...) __attribute__(($1(printf, 1, 2)));
136*d83cc019SAndroid Build Coastguard Worker                ],
137*d83cc019SAndroid Build Coastguard Worker                [format_arg], [
138*d83cc019SAndroid Build Coastguard Worker                    char *foo(const char *p) __attribute__(($1(1)));
139*d83cc019SAndroid Build Coastguard Worker                ],
140*d83cc019SAndroid Build Coastguard Worker                [gnu_inline], [
141*d83cc019SAndroid Build Coastguard Worker                    inline __attribute__(($1)) int foo( void ) { return 0; }
142*d83cc019SAndroid Build Coastguard Worker                ],
143*d83cc019SAndroid Build Coastguard Worker                [hot], [
144*d83cc019SAndroid Build Coastguard Worker                    int foo( void ) __attribute__(($1));
145*d83cc019SAndroid Build Coastguard Worker                ],
146*d83cc019SAndroid Build Coastguard Worker                [ifunc], [
147*d83cc019SAndroid Build Coastguard Worker                    int my_foo( void ) { return 0; }
148*d83cc019SAndroid Build Coastguard Worker                    static int (*resolve_foo(void))(void) { return my_foo; }
149*d83cc019SAndroid Build Coastguard Worker                    int foo( void ) __attribute__(($1("resolve_foo")));
150*d83cc019SAndroid Build Coastguard Worker                ],
151*d83cc019SAndroid Build Coastguard Worker                [leaf], [
152*d83cc019SAndroid Build Coastguard Worker                    __attribute__(($1)) int foo( void ) { return 0; }
153*d83cc019SAndroid Build Coastguard Worker                ],
154*d83cc019SAndroid Build Coastguard Worker                [malloc], [
155*d83cc019SAndroid Build Coastguard Worker                    void *foo( void ) __attribute__(($1));
156*d83cc019SAndroid Build Coastguard Worker                ],
157*d83cc019SAndroid Build Coastguard Worker                [noclone], [
158*d83cc019SAndroid Build Coastguard Worker                    int foo( void ) __attribute__(($1));
159*d83cc019SAndroid Build Coastguard Worker                ],
160*d83cc019SAndroid Build Coastguard Worker                [noinline], [
161*d83cc019SAndroid Build Coastguard Worker                    __attribute__(($1)) int foo( void ) { return 0; }
162*d83cc019SAndroid Build Coastguard Worker                ],
163*d83cc019SAndroid Build Coastguard Worker                [nonnull], [
164*d83cc019SAndroid Build Coastguard Worker                    int foo(char *p) __attribute__(($1(1)));
165*d83cc019SAndroid Build Coastguard Worker                ],
166*d83cc019SAndroid Build Coastguard Worker                [noreturn], [
167*d83cc019SAndroid Build Coastguard Worker                    void foo( void ) __attribute__(($1));
168*d83cc019SAndroid Build Coastguard Worker                ],
169*d83cc019SAndroid Build Coastguard Worker                [nothrow], [
170*d83cc019SAndroid Build Coastguard Worker                    int foo( void ) __attribute__(($1));
171*d83cc019SAndroid Build Coastguard Worker                ],
172*d83cc019SAndroid Build Coastguard Worker                [optimize], [
173*d83cc019SAndroid Build Coastguard Worker                    __attribute__(($1(3))) int foo( void ) { return 0; }
174*d83cc019SAndroid Build Coastguard Worker                ],
175*d83cc019SAndroid Build Coastguard Worker                [pure], [
176*d83cc019SAndroid Build Coastguard Worker                    int foo( void ) __attribute__(($1));
177*d83cc019SAndroid Build Coastguard Worker                ],
178*d83cc019SAndroid Build Coastguard Worker                [returns_nonnull], [
179*d83cc019SAndroid Build Coastguard Worker                    void *foo( void ) __attribute__(($1));
180*d83cc019SAndroid Build Coastguard Worker                ],
181*d83cc019SAndroid Build Coastguard Worker                [unused], [
182*d83cc019SAndroid Build Coastguard Worker                    int foo( void ) __attribute__(($1));
183*d83cc019SAndroid Build Coastguard Worker                ],
184*d83cc019SAndroid Build Coastguard Worker                [used], [
185*d83cc019SAndroid Build Coastguard Worker                    int foo( void ) __attribute__(($1));
186*d83cc019SAndroid Build Coastguard Worker                ],
187*d83cc019SAndroid Build Coastguard Worker                [visibility], [
188*d83cc019SAndroid Build Coastguard Worker                    int foo_def( void ) __attribute__(($1("default")));
189*d83cc019SAndroid Build Coastguard Worker                    int foo_hid( void ) __attribute__(($1("hidden")));
190*d83cc019SAndroid Build Coastguard Worker                    int foo_int( void ) __attribute__(($1("internal")));
191*d83cc019SAndroid Build Coastguard Worker                    int foo_pro( void ) __attribute__(($1("protected")));
192*d83cc019SAndroid Build Coastguard Worker                ],
193*d83cc019SAndroid Build Coastguard Worker                [warning], [
194*d83cc019SAndroid Build Coastguard Worker                    int foo( void ) __attribute__(($1("")));
195*d83cc019SAndroid Build Coastguard Worker                ],
196*d83cc019SAndroid Build Coastguard Worker                [warn_unused_result], [
197*d83cc019SAndroid Build Coastguard Worker                    int foo( void ) __attribute__(($1));
198*d83cc019SAndroid Build Coastguard Worker                ],
199*d83cc019SAndroid Build Coastguard Worker                [weak], [
200*d83cc019SAndroid Build Coastguard Worker                    int foo( void ) __attribute__(($1));
201*d83cc019SAndroid Build Coastguard Worker                ],
202*d83cc019SAndroid Build Coastguard Worker                [weakref], [
203*d83cc019SAndroid Build Coastguard Worker                    static int foo( void ) { return 0; }
204*d83cc019SAndroid Build Coastguard Worker                    static int bar( void ) __attribute__(($1("foo")));
205*d83cc019SAndroid Build Coastguard Worker                ],
206*d83cc019SAndroid Build Coastguard Worker                [
207*d83cc019SAndroid Build Coastguard Worker                 m4_warn([syntax], [Unsupported attribute $1, the test may fail])
208*d83cc019SAndroid Build Coastguard Worker                 int foo( void ) __attribute__(($1));
209*d83cc019SAndroid Build Coastguard Worker                ]
210*d83cc019SAndroid Build Coastguard Worker            )], [])
211*d83cc019SAndroid Build Coastguard Worker            ],
212*d83cc019SAndroid Build Coastguard Worker            dnl GCC doesn't exit with an error if an unknown attribute is
213*d83cc019SAndroid Build Coastguard Worker            dnl provided but only outputs a warning, so accept the attribute
214*d83cc019SAndroid Build Coastguard Worker            dnl only if no warning were issued.
215*d83cc019SAndroid Build Coastguard Worker            [AS_IF([test -s conftest.err],
216*d83cc019SAndroid Build Coastguard Worker                [AS_VAR_SET([ac_var], [no])],
217*d83cc019SAndroid Build Coastguard Worker                [AS_VAR_SET([ac_var], [yes])])],
218*d83cc019SAndroid Build Coastguard Worker            [AS_VAR_SET([ac_var], [no])])
219*d83cc019SAndroid Build Coastguard Worker    ])
220*d83cc019SAndroid Build Coastguard Worker
221*d83cc019SAndroid Build Coastguard Worker    AS_IF([test yes = AS_VAR_GET([ac_var])],
222*d83cc019SAndroid Build Coastguard Worker        [AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_FUNC_ATTRIBUTE_$1), 1,
223*d83cc019SAndroid Build Coastguard Worker            [Define to 1 if the system has the `$1' function attribute])], [])
224*d83cc019SAndroid Build Coastguard Worker
225*d83cc019SAndroid Build Coastguard Worker    AS_VAR_POPDEF([ac_var])
226*d83cc019SAndroid Build Coastguard Worker])
227