]>
Commit | Line | Data |
---|---|---|
19a5c9b6 VB |
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 3 | |
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 | [unused], [ | |
179 | int foo( void ) __attribute__(($1)); | |
180 | ], | |
181 | [used], [ | |
182 | int foo( void ) __attribute__(($1)); | |
183 | ], | |
184 | [visibility], [ | |
185 | int foo_def( void ) __attribute__(($1("default"))); | |
186 | int foo_hid( void ) __attribute__(($1("hidden"))); | |
187 | int foo_int( void ) __attribute__(($1("internal"))); | |
188 | int foo_pro( void ) __attribute__(($1("protected"))); | |
189 | ], | |
190 | [warning], [ | |
191 | int foo( void ) __attribute__(($1(""))); | |
192 | ], | |
193 | [warn_unused_result], [ | |
194 | int foo( void ) __attribute__(($1)); | |
195 | ], | |
196 | [weak], [ | |
197 | int foo( void ) __attribute__(($1)); | |
198 | ], | |
199 | [weakref], [ | |
200 | static int foo( void ) { return 0; } | |
201 | static int bar( void ) __attribute__(($1("foo"))); | |
202 | ], | |
203 | [ | |
204 | m4_warn([syntax], [Unsupported attribute $1, the test may fail]) | |
205 | int foo( void ) __attribute__(($1)); | |
206 | ] | |
207 | )], []) | |
208 | ], | |
209 | dnl GCC doesn't exit with an error if an unknown attribute is | |
210 | dnl provided but only outputs a warning, so accept the attribute | |
211 | dnl only if no warning were issued. | |
212 | [AS_IF([test -s conftest.err], | |
213 | [AS_VAR_SET([ac_var], [no])], | |
214 | [AS_VAR_SET([ac_var], [yes])])], | |
215 | [AS_VAR_SET([ac_var], [no])]) | |
216 | ]) | |
217 | ||
218 | AS_IF([test yes = AS_VAR_GET([ac_var])], | |
219 | [AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_FUNC_ATTRIBUTE_$1), 1, | |
220 | [Define to 1 if the system has the `$1' function attribute])], []) | |
221 | ||
222 | AS_VAR_POPDEF([ac_var]) | |
223 | ]) |