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