]> arthur.barton.de Git - netdata.git/blob - m4/ax_gcc_func_attribute.m4
dns_query_time plugin: added
[netdata.git] / m4 / ax_gcc_func_attribute.m4
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 <gabriele.svelto@gmail.com>
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
79 AC_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 ])