xref: /aosp_15_r20/external/kmod/m4/attributes.m4 (revision cc4ad7da8cefe208cb129ac2aa9a357c7c72deb2)
1*cc4ad7daSAndroid Build Coastguard Workerdnl Macros to check the presence of generic (non-typed) symbols.
2*cc4ad7daSAndroid Build Coastguard Workerdnl Copyright (c) 2006-2008 Diego Pettenò <[email protected]>
3*cc4ad7daSAndroid Build Coastguard Workerdnl Copyright (c) 2006-2008 xine project
4*cc4ad7daSAndroid Build Coastguard Workerdnl Copyright (c) 2012 Lucas De Marchi <[email protected]>
5*cc4ad7daSAndroid Build Coastguard Workerdnl
6*cc4ad7daSAndroid Build Coastguard Workerdnl This program is free software; you can redistribute it and/or modify
7*cc4ad7daSAndroid Build Coastguard Workerdnl it under the terms of the GNU General Public License as published by
8*cc4ad7daSAndroid Build Coastguard Workerdnl the Free Software Foundation; either version 2, or (at your option)
9*cc4ad7daSAndroid Build Coastguard Workerdnl any later version.
10*cc4ad7daSAndroid Build Coastguard Workerdnl
11*cc4ad7daSAndroid Build Coastguard Workerdnl This program is distributed in the hope that it will be useful,
12*cc4ad7daSAndroid Build Coastguard Workerdnl but WITHOUT ANY WARRANTY; without even the implied warranty of
13*cc4ad7daSAndroid Build Coastguard Workerdnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14*cc4ad7daSAndroid Build Coastguard Workerdnl GNU General Public License for more details.
15*cc4ad7daSAndroid Build Coastguard Workerdnl
16*cc4ad7daSAndroid Build Coastguard Workerdnl You should have received a copy of the GNU General Public License
17*cc4ad7daSAndroid Build Coastguard Workerdnl along with this program; if not, write to the Free Software
18*cc4ad7daSAndroid Build Coastguard Workerdnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19*cc4ad7daSAndroid Build Coastguard Workerdnl 02110-1301, USA.
20*cc4ad7daSAndroid Build Coastguard Workerdnl
21*cc4ad7daSAndroid Build Coastguard Workerdnl As a special exception, the copyright owners of the
22*cc4ad7daSAndroid Build Coastguard Workerdnl macro gives unlimited permission to copy, distribute and modify the
23*cc4ad7daSAndroid Build Coastguard Workerdnl configure scripts that are the output of Autoconf when processing the
24*cc4ad7daSAndroid Build Coastguard Workerdnl Macro. You need not follow the terms of the GNU General Public
25*cc4ad7daSAndroid Build Coastguard Workerdnl License when using or distributing such scripts, even though portions
26*cc4ad7daSAndroid Build Coastguard Workerdnl of the text of the Macro appear in them. The GNU General Public
27*cc4ad7daSAndroid Build Coastguard Workerdnl License (GPL) does govern all other use of the material that
28*cc4ad7daSAndroid Build Coastguard Workerdnl constitutes the Autoconf Macro.
29*cc4ad7daSAndroid Build Coastguard Workerdnl
30*cc4ad7daSAndroid Build Coastguard Workerdnl This special exception to the GPL applies to versions of the
31*cc4ad7daSAndroid Build Coastguard Workerdnl Autoconf Macro released by this project. When you make and
32*cc4ad7daSAndroid Build Coastguard Workerdnl distribute a modified version of the Autoconf Macro, you may extend
33*cc4ad7daSAndroid Build Coastguard Workerdnl this special exception to the GPL to apply to your modified version as
34*cc4ad7daSAndroid Build Coastguard Workerdnl well.
35*cc4ad7daSAndroid Build Coastguard Worker
36*cc4ad7daSAndroid Build Coastguard Workerdnl Check if FLAG in ENV-VAR is supported by compiler and append it
37*cc4ad7daSAndroid Build Coastguard Workerdnl to WHERE-TO-APPEND variable. Note that we invert -Wno-* checks to
38*cc4ad7daSAndroid Build Coastguard Workerdnl -W* as gcc cannot test for negated warnings.
39*cc4ad7daSAndroid Build Coastguard Workerdnl CC_CHECK_FLAG_APPEND([WHERE-TO-APPEND], [ENV-VAR], [FLAG])
40*cc4ad7daSAndroid Build Coastguard Worker
41*cc4ad7daSAndroid Build Coastguard WorkerAC_DEFUN([CC_CHECK_FLAG_APPEND], [
42*cc4ad7daSAndroid Build Coastguard Worker  AC_CACHE_CHECK([if $CC supports flag $3 in envvar $2],
43*cc4ad7daSAndroid Build Coastguard Worker                 AS_TR_SH([cc_cv_$2_$3]),
44*cc4ad7daSAndroid Build Coastguard Worker                 [eval "AS_TR_SH([cc_save_$2])='${$2}'"
45*cc4ad7daSAndroid Build Coastguard Worker                  eval "AS_TR_SH([$2])='-Werror `echo "$3" | sed 's/^-Wno-/-W/'`'"
46*cc4ad7daSAndroid Build Coastguard Worker                  AC_LINK_IFELSE([AC_LANG_SOURCE([int main(void) { return 0; } ])],
47*cc4ad7daSAndroid Build Coastguard Worker                          [eval "AS_TR_SH([cc_cv_$2_$3])='yes'"],
48*cc4ad7daSAndroid Build Coastguard Worker                          [eval "AS_TR_SH([cc_cv_$2_$3])='no'"])
49*cc4ad7daSAndroid Build Coastguard Worker                  eval "AS_TR_SH([$2])='$cc_save_$2'"])
50*cc4ad7daSAndroid Build Coastguard Worker
51*cc4ad7daSAndroid Build Coastguard Worker  AS_IF([eval test x$]AS_TR_SH([cc_cv_$2_$3])[ = xyes],
52*cc4ad7daSAndroid Build Coastguard Worker        [eval "$1='${$1} $3'"])
53*cc4ad7daSAndroid Build Coastguard Worker])
54*cc4ad7daSAndroid Build Coastguard Worker
55*cc4ad7daSAndroid Build Coastguard Workerdnl CC_CHECK_FLAGS_APPEND([WHERE-TO-APPEND], [ENV-VAR], [FLAG1 FLAG2])
56*cc4ad7daSAndroid Build Coastguard WorkerAC_DEFUN([CC_CHECK_FLAGS_APPEND], [
57*cc4ad7daSAndroid Build Coastguard Worker  for flag in $3; do
58*cc4ad7daSAndroid Build Coastguard Worker    CC_CHECK_FLAG_APPEND($1, $2, $flag)
59*cc4ad7daSAndroid Build Coastguard Worker  done
60*cc4ad7daSAndroid Build Coastguard Worker])
61*cc4ad7daSAndroid Build Coastguard Worker
62*cc4ad7daSAndroid Build Coastguard Workerdnl Check if the flag is supported by linker (cacheable)
63*cc4ad7daSAndroid Build Coastguard Workerdnl CC_CHECK_LDFLAGS([FLAG], [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND])
64*cc4ad7daSAndroid Build Coastguard Worker
65*cc4ad7daSAndroid Build Coastguard Worker
66*cc4ad7daSAndroid Build Coastguard Workerdnl Check if the flag is supported by linker
67*cc4ad7daSAndroid Build Coastguard Workerdnl CC_CHECK_LDFLAGS_SILENT([FLAG], [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND])
68*cc4ad7daSAndroid Build Coastguard WorkerAC_DEFUN([CC_CHECK_LDFLAGS_SILENT], [
69*cc4ad7daSAndroid Build Coastguard Worker  AC_CACHE_VAL(AS_TR_SH([cc_cv_ldflags_$1]),
70*cc4ad7daSAndroid Build Coastguard Worker    [ac_save_LDFLAGS="$LDFLAGS"
71*cc4ad7daSAndroid Build Coastguard Worker     LDFLAGS="$LDFLAGS $1"
72*cc4ad7daSAndroid Build Coastguard Worker     AC_LINK_IFELSE([AC_LANG_SOURCE([int main() { return 1; }])],
73*cc4ad7daSAndroid Build Coastguard Worker       [eval "AS_TR_SH([cc_cv_ldflags_$1])='yes'"],
74*cc4ad7daSAndroid Build Coastguard Worker       [eval "AS_TR_SH([cc_cv_ldflags_$1])="])
75*cc4ad7daSAndroid Build Coastguard Worker     LDFLAGS="$ac_save_LDFLAGS"
76*cc4ad7daSAndroid Build Coastguard Worker    ])
77*cc4ad7daSAndroid Build Coastguard Worker
78*cc4ad7daSAndroid Build Coastguard Worker  AS_IF([eval test x$]AS_TR_SH([cc_cv_ldflags_$1])[ = xyes],
79*cc4ad7daSAndroid Build Coastguard Worker    [$2], [$3])
80*cc4ad7daSAndroid Build Coastguard Worker])
81*cc4ad7daSAndroid Build Coastguard Worker
82*cc4ad7daSAndroid Build Coastguard Workerdnl Check if the flag is supported by linker (cacheable)
83*cc4ad7daSAndroid Build Coastguard Workerdnl CC_CHECK_LDFLAGS([FLAG], [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND])
84*cc4ad7daSAndroid Build Coastguard Worker
85*cc4ad7daSAndroid Build Coastguard WorkerAC_DEFUN([CC_CHECK_LDFLAGS], [
86*cc4ad7daSAndroid Build Coastguard Worker  AC_CACHE_CHECK([if $CC supports $1 flag],
87*cc4ad7daSAndroid Build Coastguard Worker    AS_TR_SH([cc_cv_ldflags_$1]),
88*cc4ad7daSAndroid Build Coastguard Worker    CC_CHECK_LDFLAGS_SILENT([$1]) dnl Don't execute actions here!
89*cc4ad7daSAndroid Build Coastguard Worker  )
90*cc4ad7daSAndroid Build Coastguard Worker
91*cc4ad7daSAndroid Build Coastguard Worker  AS_IF([eval test x$]AS_TR_SH([cc_cv_ldflags_$1])[ = xyes],
92*cc4ad7daSAndroid Build Coastguard Worker    [$2], [$3])
93*cc4ad7daSAndroid Build Coastguard Worker])
94*cc4ad7daSAndroid Build Coastguard Worker
95*cc4ad7daSAndroid Build Coastguard Workerdnl define the LDFLAGS_NOUNDEFINED variable with the correct value for
96*cc4ad7daSAndroid Build Coastguard Workerdnl the current linker to avoid undefined references in a shared object.
97*cc4ad7daSAndroid Build Coastguard WorkerAC_DEFUN([CC_NOUNDEFINED], [
98*cc4ad7daSAndroid Build Coastguard Worker  dnl We check $host for which systems to enable this for.
99*cc4ad7daSAndroid Build Coastguard Worker  AC_REQUIRE([AC_CANONICAL_HOST])
100*cc4ad7daSAndroid Build Coastguard Worker
101*cc4ad7daSAndroid Build Coastguard Worker  case $host in
102*cc4ad7daSAndroid Build Coastguard Worker     dnl FreeBSD (et al.) does not complete linking for shared objects when pthreads
103*cc4ad7daSAndroid Build Coastguard Worker     dnl are requested, as different implementations are present; to avoid problems
104*cc4ad7daSAndroid Build Coastguard Worker     dnl use -Wl,-z,defs only for those platform not behaving this way.
105*cc4ad7daSAndroid Build Coastguard Worker     *-freebsd* | *-openbsd*) ;;
106*cc4ad7daSAndroid Build Coastguard Worker     *)
107*cc4ad7daSAndroid Build Coastguard Worker        dnl First of all check for the --no-undefined variant of GNU ld. This allows
108*cc4ad7daSAndroid Build Coastguard Worker        dnl for a much more readable command line, so that people can understand what
109*cc4ad7daSAndroid Build Coastguard Worker        dnl it does without going to look for what the heck -z defs does.
110*cc4ad7daSAndroid Build Coastguard Worker        for possible_flags in "-Wl,--no-undefined" "-Wl,-z,defs"; do
111*cc4ad7daSAndroid Build Coastguard Worker          CC_CHECK_LDFLAGS([$possible_flags], [LDFLAGS_NOUNDEFINED="$possible_flags"])
112*cc4ad7daSAndroid Build Coastguard Worker          break
113*cc4ad7daSAndroid Build Coastguard Worker        done
114*cc4ad7daSAndroid Build Coastguard Worker        ;;
115*cc4ad7daSAndroid Build Coastguard Worker  esac
116*cc4ad7daSAndroid Build Coastguard Worker
117*cc4ad7daSAndroid Build Coastguard Worker  AC_SUBST([LDFLAGS_NOUNDEFINED])
118*cc4ad7daSAndroid Build Coastguard Worker])
119*cc4ad7daSAndroid Build Coastguard Worker
120*cc4ad7daSAndroid Build Coastguard Workerdnl Check for a -Werror flag or equivalent. -Werror is the GCC
121*cc4ad7daSAndroid Build Coastguard Workerdnl and ICC flag that tells the compiler to treat all the warnings
122*cc4ad7daSAndroid Build Coastguard Workerdnl as fatal. We usually need this option to make sure that some
123*cc4ad7daSAndroid Build Coastguard Workerdnl constructs (like attributes) are not simply ignored.
124*cc4ad7daSAndroid Build Coastguard Workerdnl
125*cc4ad7daSAndroid Build Coastguard Workerdnl Other compilers don't support -Werror per se, but they support
126*cc4ad7daSAndroid Build Coastguard Workerdnl an equivalent flag:
127*cc4ad7daSAndroid Build Coastguard Workerdnl  - Sun Studio compiler supports -errwarn=%all
128*cc4ad7daSAndroid Build Coastguard WorkerAC_DEFUN([CC_CHECK_WERROR], [
129*cc4ad7daSAndroid Build Coastguard Worker  AC_CACHE_CHECK(
130*cc4ad7daSAndroid Build Coastguard Worker    [for $CC way to treat warnings as errors],
131*cc4ad7daSAndroid Build Coastguard Worker    [cc_cv_werror],
132*cc4ad7daSAndroid Build Coastguard Worker    [CC_CHECK_CFLAGS_SILENT([-Werror], [cc_cv_werror=-Werror],
133*cc4ad7daSAndroid Build Coastguard Worker      [CC_CHECK_CFLAGS_SILENT([-errwarn=%all], [cc_cv_werror=-errwarn=%all])])
134*cc4ad7daSAndroid Build Coastguard Worker    ])
135*cc4ad7daSAndroid Build Coastguard Worker])
136*cc4ad7daSAndroid Build Coastguard Worker
137*cc4ad7daSAndroid Build Coastguard WorkerAC_DEFUN([CC_CHECK_ATTRIBUTE], [
138*cc4ad7daSAndroid Build Coastguard Worker  AC_REQUIRE([CC_CHECK_WERROR])
139*cc4ad7daSAndroid Build Coastguard Worker  AC_CACHE_CHECK([if $CC supports __attribute__(( ifelse([$2], , [$1], [$2]) ))],
140*cc4ad7daSAndroid Build Coastguard Worker    AS_TR_SH([cc_cv_attribute_$1]),
141*cc4ad7daSAndroid Build Coastguard Worker    [ac_save_CFLAGS="$CFLAGS"
142*cc4ad7daSAndroid Build Coastguard Worker     CFLAGS="$CFLAGS $cc_cv_werror"
143*cc4ad7daSAndroid Build Coastguard Worker     AC_COMPILE_IFELSE([AC_LANG_SOURCE([$3])],
144*cc4ad7daSAndroid Build Coastguard Worker       [eval "AS_TR_SH([cc_cv_attribute_$1])='yes'"],
145*cc4ad7daSAndroid Build Coastguard Worker       [eval "AS_TR_SH([cc_cv_attribute_$1])='no'"])
146*cc4ad7daSAndroid Build Coastguard Worker     CFLAGS="$ac_save_CFLAGS"
147*cc4ad7daSAndroid Build Coastguard Worker    ])
148*cc4ad7daSAndroid Build Coastguard Worker
149*cc4ad7daSAndroid Build Coastguard Worker  AS_IF([eval test x$]AS_TR_SH([cc_cv_attribute_$1])[ = xyes],
150*cc4ad7daSAndroid Build Coastguard Worker    [AC_DEFINE(
151*cc4ad7daSAndroid Build Coastguard Worker       AS_TR_CPP([SUPPORT_ATTRIBUTE_$1]), 1,
152*cc4ad7daSAndroid Build Coastguard Worker         [Define this if the compiler supports __attribute__(( ifelse([$2], , [$1], [$2]) ))]
153*cc4ad7daSAndroid Build Coastguard Worker         )
154*cc4ad7daSAndroid Build Coastguard Worker     $4],
155*cc4ad7daSAndroid Build Coastguard Worker    [$5])
156*cc4ad7daSAndroid Build Coastguard Worker])
157*cc4ad7daSAndroid Build Coastguard Worker
158*cc4ad7daSAndroid Build Coastguard WorkerAC_DEFUN([CC_ATTRIBUTE_CONSTRUCTOR], [
159*cc4ad7daSAndroid Build Coastguard Worker  CC_CHECK_ATTRIBUTE(
160*cc4ad7daSAndroid Build Coastguard Worker    [constructor],,
161*cc4ad7daSAndroid Build Coastguard Worker    [void __attribute__((constructor)) ctor() { int a; }],
162*cc4ad7daSAndroid Build Coastguard Worker    [$1], [$2])
163*cc4ad7daSAndroid Build Coastguard Worker])
164*cc4ad7daSAndroid Build Coastguard Worker
165*cc4ad7daSAndroid Build Coastguard WorkerAC_DEFUN([CC_ATTRIBUTE_FORMAT], [
166*cc4ad7daSAndroid Build Coastguard Worker  CC_CHECK_ATTRIBUTE(
167*cc4ad7daSAndroid Build Coastguard Worker    [format], [format(printf, n, n)],
168*cc4ad7daSAndroid Build Coastguard Worker    [void __attribute__((format(printf, 1, 2))) printflike(const char *fmt, ...) { fmt = (void *)0; }],
169*cc4ad7daSAndroid Build Coastguard Worker    [$1], [$2])
170*cc4ad7daSAndroid Build Coastguard Worker])
171*cc4ad7daSAndroid Build Coastguard Worker
172*cc4ad7daSAndroid Build Coastguard WorkerAC_DEFUN([CC_ATTRIBUTE_FORMAT_ARG], [
173*cc4ad7daSAndroid Build Coastguard Worker  CC_CHECK_ATTRIBUTE(
174*cc4ad7daSAndroid Build Coastguard Worker    [format_arg], [format_arg(printf)],
175*cc4ad7daSAndroid Build Coastguard Worker    [char *__attribute__((format_arg(1))) gettextlike(const char *fmt) { fmt = (void *)0; }],
176*cc4ad7daSAndroid Build Coastguard Worker    [$1], [$2])
177*cc4ad7daSAndroid Build Coastguard Worker])
178*cc4ad7daSAndroid Build Coastguard Worker
179*cc4ad7daSAndroid Build Coastguard WorkerAC_DEFUN([CC_ATTRIBUTE_VISIBILITY], [
180*cc4ad7daSAndroid Build Coastguard Worker  CC_CHECK_ATTRIBUTE(
181*cc4ad7daSAndroid Build Coastguard Worker    [visibility_$1], [visibility("$1")],
182*cc4ad7daSAndroid Build Coastguard Worker    [void __attribute__((visibility("$1"))) $1_function() { }],
183*cc4ad7daSAndroid Build Coastguard Worker    [$2], [$3])
184*cc4ad7daSAndroid Build Coastguard Worker])
185*cc4ad7daSAndroid Build Coastguard Worker
186*cc4ad7daSAndroid Build Coastguard WorkerAC_DEFUN([CC_ATTRIBUTE_NONNULL], [
187*cc4ad7daSAndroid Build Coastguard Worker  CC_CHECK_ATTRIBUTE(
188*cc4ad7daSAndroid Build Coastguard Worker    [nonnull], [nonnull()],
189*cc4ad7daSAndroid Build Coastguard Worker    [void __attribute__((nonnull())) some_function(void *foo, void *bar) { foo = (void*)0; bar = (void*)0; }],
190*cc4ad7daSAndroid Build Coastguard Worker    [$1], [$2])
191*cc4ad7daSAndroid Build Coastguard Worker])
192*cc4ad7daSAndroid Build Coastguard Worker
193*cc4ad7daSAndroid Build Coastguard WorkerAC_DEFUN([CC_ATTRIBUTE_UNUSED], [
194*cc4ad7daSAndroid Build Coastguard Worker  CC_CHECK_ATTRIBUTE(
195*cc4ad7daSAndroid Build Coastguard Worker    [unused], ,
196*cc4ad7daSAndroid Build Coastguard Worker    [void some_function(void *foo, __attribute__((unused)) void *bar);],
197*cc4ad7daSAndroid Build Coastguard Worker    [$1], [$2])
198*cc4ad7daSAndroid Build Coastguard Worker])
199*cc4ad7daSAndroid Build Coastguard Worker
200*cc4ad7daSAndroid Build Coastguard WorkerAC_DEFUN([CC_ATTRIBUTE_SENTINEL], [
201*cc4ad7daSAndroid Build Coastguard Worker  CC_CHECK_ATTRIBUTE(
202*cc4ad7daSAndroid Build Coastguard Worker    [sentinel], ,
203*cc4ad7daSAndroid Build Coastguard Worker    [void some_function(void *foo, ...) __attribute__((sentinel));],
204*cc4ad7daSAndroid Build Coastguard Worker    [$1], [$2])
205*cc4ad7daSAndroid Build Coastguard Worker])
206*cc4ad7daSAndroid Build Coastguard Worker
207*cc4ad7daSAndroid Build Coastguard WorkerAC_DEFUN([CC_ATTRIBUTE_DEPRECATED], [
208*cc4ad7daSAndroid Build Coastguard Worker  CC_CHECK_ATTRIBUTE(
209*cc4ad7daSAndroid Build Coastguard Worker    [deprecated], ,
210*cc4ad7daSAndroid Build Coastguard Worker    [void some_function(void *foo, ...) __attribute__((deprecated));],
211*cc4ad7daSAndroid Build Coastguard Worker    [$1], [$2])
212*cc4ad7daSAndroid Build Coastguard Worker])
213*cc4ad7daSAndroid Build Coastguard Worker
214*cc4ad7daSAndroid Build Coastguard WorkerAC_DEFUN([CC_ATTRIBUTE_ALIAS], [
215*cc4ad7daSAndroid Build Coastguard Worker  CC_CHECK_ATTRIBUTE(
216*cc4ad7daSAndroid Build Coastguard Worker    [alias], [weak, alias],
217*cc4ad7daSAndroid Build Coastguard Worker    [void other_function(void *foo) { }
218*cc4ad7daSAndroid Build Coastguard Worker     void some_function(void *foo) __attribute__((weak, alias("other_function")));],
219*cc4ad7daSAndroid Build Coastguard Worker    [$1], [$2])
220*cc4ad7daSAndroid Build Coastguard Worker])
221*cc4ad7daSAndroid Build Coastguard Worker
222*cc4ad7daSAndroid Build Coastguard WorkerAC_DEFUN([CC_ATTRIBUTE_MALLOC], [
223*cc4ad7daSAndroid Build Coastguard Worker  CC_CHECK_ATTRIBUTE(
224*cc4ad7daSAndroid Build Coastguard Worker    [malloc], ,
225*cc4ad7daSAndroid Build Coastguard Worker    [void * __attribute__((malloc)) my_alloc(int n);],
226*cc4ad7daSAndroid Build Coastguard Worker    [$1], [$2])
227*cc4ad7daSAndroid Build Coastguard Worker])
228*cc4ad7daSAndroid Build Coastguard Worker
229*cc4ad7daSAndroid Build Coastguard WorkerAC_DEFUN([CC_ATTRIBUTE_PACKED], [
230*cc4ad7daSAndroid Build Coastguard Worker  CC_CHECK_ATTRIBUTE(
231*cc4ad7daSAndroid Build Coastguard Worker    [packed], ,
232*cc4ad7daSAndroid Build Coastguard Worker    [struct astructure { char a; int b; long c; void *d; } __attribute__((packed));],
233*cc4ad7daSAndroid Build Coastguard Worker    [$1], [$2])
234*cc4ad7daSAndroid Build Coastguard Worker])
235*cc4ad7daSAndroid Build Coastguard Worker
236*cc4ad7daSAndroid Build Coastguard WorkerAC_DEFUN([CC_ATTRIBUTE_CONST], [
237*cc4ad7daSAndroid Build Coastguard Worker  CC_CHECK_ATTRIBUTE(
238*cc4ad7daSAndroid Build Coastguard Worker    [const], ,
239*cc4ad7daSAndroid Build Coastguard Worker    [int __attribute__((const)) twopow(int n) { return 1 << n; } ],
240*cc4ad7daSAndroid Build Coastguard Worker    [$1], [$2])
241*cc4ad7daSAndroid Build Coastguard Worker])
242*cc4ad7daSAndroid Build Coastguard Worker
243*cc4ad7daSAndroid Build Coastguard WorkerAC_DEFUN([CC_FLAG_VISIBILITY], [
244*cc4ad7daSAndroid Build Coastguard Worker  AC_REQUIRE([CC_CHECK_WERROR])
245*cc4ad7daSAndroid Build Coastguard Worker  AC_CACHE_CHECK([if $CC supports -fvisibility=hidden],
246*cc4ad7daSAndroid Build Coastguard Worker    [cc_cv_flag_visibility],
247*cc4ad7daSAndroid Build Coastguard Worker    [cc_flag_visibility_save_CFLAGS="$CFLAGS"
248*cc4ad7daSAndroid Build Coastguard Worker     CFLAGS="$CFLAGS $cc_cv_werror"
249*cc4ad7daSAndroid Build Coastguard Worker     CC_CHECK_CFLAGS_SILENT([-fvisibility=hidden],
250*cc4ad7daSAndroid Build Coastguard Worker        cc_cv_flag_visibility='yes',
251*cc4ad7daSAndroid Build Coastguard Worker        cc_cv_flag_visibility='no')
252*cc4ad7daSAndroid Build Coastguard Worker     CFLAGS="$cc_flag_visibility_save_CFLAGS"])
253*cc4ad7daSAndroid Build Coastguard Worker
254*cc4ad7daSAndroid Build Coastguard Worker  AS_IF([test "x$cc_cv_flag_visibility" = "xyes"],
255*cc4ad7daSAndroid Build Coastguard Worker    [AC_DEFINE([SUPPORT_FLAG_VISIBILITY], 1,
256*cc4ad7daSAndroid Build Coastguard Worker       [Define this if the compiler supports the -fvisibility flag])
257*cc4ad7daSAndroid Build Coastguard Worker     $1],
258*cc4ad7daSAndroid Build Coastguard Worker    [$2])
259*cc4ad7daSAndroid Build Coastguard Worker])
260*cc4ad7daSAndroid Build Coastguard Worker
261*cc4ad7daSAndroid Build Coastguard WorkerAC_DEFUN([CC_CHECK_FUNC_BUILTIN], [
262*cc4ad7daSAndroid Build Coastguard Worker  m4_pushdef([UPNAME], m4_translit([$1], [-a-z], [_A-Z]))
263*cc4ad7daSAndroid Build Coastguard Worker  AC_CACHE_CHECK([if compiler has $1 builtin function],
264*cc4ad7daSAndroid Build Coastguard Worker    [cc_cv_have_$1],
265*cc4ad7daSAndroid Build Coastguard Worker    [AC_LINK_IFELSE([AC_LANG_PROGRAM([], [
266*cc4ad7daSAndroid Build Coastguard Worker       m4_case([$1],
267*cc4ad7daSAndroid Build Coastguard Worker         [__builtin_clz], [$1(0)],
268*cc4ad7daSAndroid Build Coastguard Worker         [__builtin_types_compatible_p], [$1(int, int)],
269*cc4ad7daSAndroid Build Coastguard Worker         [__builtin_uaddl_overflow], [$1(0UL, 0UL, (void*)0)],
270*cc4ad7daSAndroid Build Coastguard Worker         [__builtin_uaddll_overflow], [$1(0ULL, 0ULL, (void*)0)],
271*cc4ad7daSAndroid Build Coastguard Worker         [__builtin_expect], [$1(0, 0)]
272*cc4ad7daSAndroid Build Coastguard Worker       )])],
273*cc4ad7daSAndroid Build Coastguard Worker       [cc_cv_have_$1=yes],
274*cc4ad7daSAndroid Build Coastguard Worker       [cc_cv_have_$1=no])])
275*cc4ad7daSAndroid Build Coastguard Worker
276*cc4ad7daSAndroid Build Coastguard Worker  AS_IF([test "x$cc_cv_have_$1" = "xyes"],
277*cc4ad7daSAndroid Build Coastguard Worker    [AC_DEFINE([HAVE_]m4_defn([UPNAME]), 1, [Define to 1 if compiler has $1() builtin function])
278*cc4ad7daSAndroid Build Coastguard Worker     $2],
279*cc4ad7daSAndroid Build Coastguard Worker    [AS_IF([test "x$3" = "x"], [AC_MSG_ERROR([*** builtin function not found: $1()])],
280*cc4ad7daSAndroid Build Coastguard Worker           [AC_DEFINE([HAVE_]m4_defn([UPNAME]), 0)
281*cc4ad7daSAndroid Build Coastguard Worker            $3])]
282*cc4ad7daSAndroid Build Coastguard Worker  )
283*cc4ad7daSAndroid Build Coastguard Worker  m4_popdef([UPNAME])
284*cc4ad7daSAndroid Build Coastguard Worker])
285*cc4ad7daSAndroid Build Coastguard Worker
286*cc4ad7daSAndroid Build Coastguard WorkerAC_DEFUN([CC_ATTRIBUTE_ALIGNED], [
287*cc4ad7daSAndroid Build Coastguard Worker  AC_REQUIRE([CC_CHECK_WERROR])
288*cc4ad7daSAndroid Build Coastguard Worker  AC_CACHE_CHECK([highest __attribute__ ((aligned ())) supported],
289*cc4ad7daSAndroid Build Coastguard Worker    [cc_cv_attribute_aligned],
290*cc4ad7daSAndroid Build Coastguard Worker    [ac_save_CFLAGS="$CFLAGS"
291*cc4ad7daSAndroid Build Coastguard Worker     CFLAGS="$CFLAGS $cc_cv_werror"
292*cc4ad7daSAndroid Build Coastguard Worker     for cc_attribute_align_try in 64 32 16 8 4 2; do
293*cc4ad7daSAndroid Build Coastguard Worker        AC_COMPILE_IFELSE([AC_LANG_SOURCE([
294*cc4ad7daSAndroid Build Coastguard Worker          int main() {
295*cc4ad7daSAndroid Build Coastguard Worker            static char c __attribute__ ((aligned($cc_attribute_align_try))) = 0;
296*cc4ad7daSAndroid Build Coastguard Worker            return c;
297*cc4ad7daSAndroid Build Coastguard Worker          }])], [cc_cv_attribute_aligned=$cc_attribute_align_try; break])
298*cc4ad7daSAndroid Build Coastguard Worker     done
299*cc4ad7daSAndroid Build Coastguard Worker     CFLAGS="$ac_save_CFLAGS"
300*cc4ad7daSAndroid Build Coastguard Worker  ])
301*cc4ad7daSAndroid Build Coastguard Worker
302*cc4ad7daSAndroid Build Coastguard Worker  if test "x$cc_cv_attribute_aligned" != "x"; then
303*cc4ad7daSAndroid Build Coastguard Worker     AC_DEFINE_UNQUOTED([ATTRIBUTE_ALIGNED_MAX], [$cc_cv_attribute_aligned],
304*cc4ad7daSAndroid Build Coastguard Worker       [Define the highest alignment supported])
305*cc4ad7daSAndroid Build Coastguard Worker  fi
306*cc4ad7daSAndroid Build Coastguard Worker])
307