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