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