Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5564 | serge | 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_ |
||
20 | # |
||
21 | # The macro caches its result in the ax_cv_have_func_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 | # deprecated |
||
35 | # destructor |
||
36 | # dllexport |
||
37 | # dllimport |
||
38 | # error |
||
39 | # externally_visible |
||
40 | # flatten |
||
41 | # format |
||
42 | # format_arg |
||
43 | # gnu_inline |
||
44 | # hot |
||
45 | # ifunc |
||
46 | # leaf |
||
47 | # malloc |
||
48 | # noclone |
||
49 | # noinline |
||
50 | # nonnull |
||
51 | # noreturn |
||
52 | # nothrow |
||
53 | # optimize |
||
54 | # packed |
||
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 |
||
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 2 |
||
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], [ |
||
108 | int foo( void ) __attribute__(($1)); |
||
109 | ], |
||
110 | [deprecated], [ |
||
111 | int foo( void ) __attribute__(($1(""))); |
||
112 | ], |
||
113 | [destructor], [ |
||
114 | int foo( void ) __attribute__(($1)); |
||
115 | ], |
||
116 | [dllexport], [ |
||
117 | __attribute__(($1)) int foo( void ) { return 0; } |
||
118 | ], |
||
119 | [dllimport], [ |
||
120 | int foo( void ) __attribute__(($1)); |
||
121 | ], |
||
122 | [error], [ |
||
123 | int foo( void ) __attribute__(($1(""))); |
||
124 | ], |
||
125 | [externally_visible], [ |
||
126 | int foo( void ) __attribute__(($1)); |
||
127 | ], |
||
128 | [flatten], [ |
||
129 | int foo( void ) __attribute__(($1)); |
||
130 | ], |
||
131 | [format], [ |
||
132 | int foo(const char *p, ...) __attribute__(($1(printf, 1, 2))); |
||
133 | ], |
||
134 | [format_arg], [ |
||
135 | char *foo(const char *p) __attribute__(($1(1))); |
||
136 | ], |
||
137 | [gnu_inline], [ |
||
138 | inline __attribute__(($1)) int foo( void ) { return 0; } |
||
139 | ], |
||
140 | [hot], [ |
||
141 | int foo( void ) __attribute__(($1)); |
||
142 | ], |
||
143 | [ifunc], [ |
||
144 | int my_foo( void ) { return 0; } |
||
145 | static int (*resolve_foo(void))(void) { return my_foo; } |
||
146 | int foo( void ) __attribute__(($1("resolve_foo"))); |
||
147 | ], |
||
148 | [leaf], [ |
||
149 | __attribute__(($1)) int foo( void ) { return 0; } |
||
150 | ], |
||
151 | [malloc], [ |
||
152 | void *foo( void ) __attribute__(($1)); |
||
153 | ], |
||
154 | [noclone], [ |
||
155 | int foo( void ) __attribute__(($1)); |
||
156 | ], |
||
157 | [noinline], [ |
||
158 | __attribute__(($1)) int foo( void ) { return 0; } |
||
159 | ], |
||
160 | [nonnull], [ |
||
161 | int foo(char *p) __attribute__(($1(1))); |
||
162 | ], |
||
163 | [noreturn], [ |
||
164 | void foo( void ) __attribute__(($1)); |
||
165 | ], |
||
166 | [nothrow], [ |
||
167 | int foo( void ) __attribute__(($1)); |
||
168 | ], |
||
169 | [optimize], [ |
||
170 | __attribute__(($1(3))) int foo( void ) { return 0; } |
||
171 | ], |
||
172 | [packed], [ |
||
173 | struct __attribute__(($1)) foo { int bar; }; |
||
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 | ]) |