1*d83cc019SAndroid Build Coastguard Worker# =========================================================================== 2*d83cc019SAndroid Build Coastguard Worker# http://www.gnu.org/software/autoconf-archive/ax_gcc_func_attribute.html 3*d83cc019SAndroid Build Coastguard Worker# =========================================================================== 4*d83cc019SAndroid Build Coastguard Worker# 5*d83cc019SAndroid Build Coastguard Worker# SYNOPSIS 6*d83cc019SAndroid Build Coastguard Worker# 7*d83cc019SAndroid Build Coastguard Worker# AX_GCC_FUNC_ATTRIBUTE(ATTRIBUTE) 8*d83cc019SAndroid Build Coastguard Worker# 9*d83cc019SAndroid Build Coastguard Worker# DESCRIPTION 10*d83cc019SAndroid Build Coastguard Worker# 11*d83cc019SAndroid Build Coastguard Worker# This macro checks if the compiler supports one of GCC's function 12*d83cc019SAndroid Build Coastguard Worker# attributes; many other compilers also provide function attributes with 13*d83cc019SAndroid Build Coastguard Worker# the same syntax. Compiler warnings are used to detect supported 14*d83cc019SAndroid Build Coastguard Worker# attributes as unsupported ones are ignored by default so quieting 15*d83cc019SAndroid Build Coastguard Worker# warnings when using this macro will yield false positives. 16*d83cc019SAndroid Build Coastguard Worker# 17*d83cc019SAndroid Build Coastguard Worker# The ATTRIBUTE parameter holds the name of the attribute to be checked. 18*d83cc019SAndroid Build Coastguard Worker# 19*d83cc019SAndroid Build Coastguard Worker# If ATTRIBUTE is supported define HAVE_FUNC_ATTRIBUTE_<ATTRIBUTE>. 20*d83cc019SAndroid Build Coastguard Worker# 21*d83cc019SAndroid Build Coastguard Worker# The macro caches its result in the ax_cv_have_func_attribute_<attribute> 22*d83cc019SAndroid Build Coastguard Worker# variable. 23*d83cc019SAndroid Build Coastguard Worker# 24*d83cc019SAndroid Build Coastguard Worker# The macro currently supports the following function attributes: 25*d83cc019SAndroid Build Coastguard Worker# 26*d83cc019SAndroid Build Coastguard Worker# alias 27*d83cc019SAndroid Build Coastguard Worker# aligned 28*d83cc019SAndroid Build Coastguard Worker# alloc_size 29*d83cc019SAndroid Build Coastguard Worker# always_inline 30*d83cc019SAndroid Build Coastguard Worker# artificial 31*d83cc019SAndroid Build Coastguard Worker# cold 32*d83cc019SAndroid Build Coastguard Worker# const 33*d83cc019SAndroid Build Coastguard Worker# constructor 34*d83cc019SAndroid Build Coastguard Worker# constructor_priority for constructor attribute with priority 35*d83cc019SAndroid Build Coastguard Worker# deprecated 36*d83cc019SAndroid Build Coastguard Worker# destructor 37*d83cc019SAndroid Build Coastguard Worker# dllexport 38*d83cc019SAndroid Build Coastguard Worker# dllimport 39*d83cc019SAndroid Build Coastguard Worker# error 40*d83cc019SAndroid Build Coastguard Worker# externally_visible 41*d83cc019SAndroid Build Coastguard Worker# flatten 42*d83cc019SAndroid Build Coastguard Worker# format 43*d83cc019SAndroid Build Coastguard Worker# format_arg 44*d83cc019SAndroid Build Coastguard Worker# gnu_inline 45*d83cc019SAndroid Build Coastguard Worker# hot 46*d83cc019SAndroid Build Coastguard Worker# ifunc 47*d83cc019SAndroid Build Coastguard Worker# leaf 48*d83cc019SAndroid Build Coastguard Worker# malloc 49*d83cc019SAndroid Build Coastguard Worker# noclone 50*d83cc019SAndroid Build Coastguard Worker# noinline 51*d83cc019SAndroid Build Coastguard Worker# nonnull 52*d83cc019SAndroid Build Coastguard Worker# noreturn 53*d83cc019SAndroid Build Coastguard Worker# nothrow 54*d83cc019SAndroid Build Coastguard Worker# optimize 55*d83cc019SAndroid Build Coastguard Worker# pure 56*d83cc019SAndroid Build Coastguard Worker# unused 57*d83cc019SAndroid Build Coastguard Worker# used 58*d83cc019SAndroid Build Coastguard Worker# visibility 59*d83cc019SAndroid Build Coastguard Worker# warning 60*d83cc019SAndroid Build Coastguard Worker# warn_unused_result 61*d83cc019SAndroid Build Coastguard Worker# weak 62*d83cc019SAndroid Build Coastguard Worker# weakref 63*d83cc019SAndroid Build Coastguard Worker# 64*d83cc019SAndroid Build Coastguard Worker# Unsuppored function attributes will be tested with a prototype returning 65*d83cc019SAndroid Build Coastguard Worker# an int and not accepting any arguments and the result of the check might 66*d83cc019SAndroid Build Coastguard Worker# be wrong or meaningless so use with care. 67*d83cc019SAndroid Build Coastguard Worker# 68*d83cc019SAndroid Build Coastguard Worker# LICENSE 69*d83cc019SAndroid Build Coastguard Worker# 70*d83cc019SAndroid Build Coastguard Worker# Copyright (c) 2013 Gabriele Svelto <[email protected]> 71*d83cc019SAndroid Build Coastguard Worker# 72*d83cc019SAndroid Build Coastguard Worker# Copying and distribution of this file, with or without modification, are 73*d83cc019SAndroid Build Coastguard Worker# permitted in any medium without royalty provided the copyright notice 74*d83cc019SAndroid Build Coastguard Worker# and this notice are preserved. This file is offered as-is, without any 75*d83cc019SAndroid Build Coastguard Worker# warranty. 76*d83cc019SAndroid Build Coastguard Worker 77*d83cc019SAndroid Build Coastguard Worker#serial 4 78*d83cc019SAndroid Build Coastguard Worker 79*d83cc019SAndroid Build Coastguard WorkerAC_DEFUN([AX_GCC_FUNC_ATTRIBUTE], [ 80*d83cc019SAndroid Build Coastguard Worker AS_VAR_PUSHDEF([ac_var], [ax_cv_have_func_attribute_$1]) 81*d83cc019SAndroid Build Coastguard Worker 82*d83cc019SAndroid Build Coastguard Worker AC_CACHE_CHECK([for __attribute__(($1))], [ac_var], [ 83*d83cc019SAndroid Build Coastguard Worker AC_LINK_IFELSE([AC_LANG_PROGRAM([ 84*d83cc019SAndroid Build Coastguard Worker m4_case([$1], 85*d83cc019SAndroid Build Coastguard Worker [alias], [ 86*d83cc019SAndroid Build Coastguard Worker int foo( void ) { return 0; } 87*d83cc019SAndroid Build Coastguard Worker int bar( void ) __attribute__(($1("foo"))); 88*d83cc019SAndroid Build Coastguard Worker ], 89*d83cc019SAndroid Build Coastguard Worker [aligned], [ 90*d83cc019SAndroid Build Coastguard Worker int foo( void ) __attribute__(($1(32))); 91*d83cc019SAndroid Build Coastguard Worker ], 92*d83cc019SAndroid Build Coastguard Worker [alloc_size], [ 93*d83cc019SAndroid Build Coastguard Worker void *foo(int a) __attribute__(($1(1))); 94*d83cc019SAndroid Build Coastguard Worker ], 95*d83cc019SAndroid Build Coastguard Worker [always_inline], [ 96*d83cc019SAndroid Build Coastguard Worker inline __attribute__(($1)) int foo( void ) { return 0; } 97*d83cc019SAndroid Build Coastguard Worker ], 98*d83cc019SAndroid Build Coastguard Worker [artificial], [ 99*d83cc019SAndroid Build Coastguard Worker inline __attribute__(($1)) int foo( void ) { return 0; } 100*d83cc019SAndroid Build Coastguard Worker ], 101*d83cc019SAndroid Build Coastguard Worker [cold], [ 102*d83cc019SAndroid Build Coastguard Worker int foo( void ) __attribute__(($1)); 103*d83cc019SAndroid Build Coastguard Worker ], 104*d83cc019SAndroid Build Coastguard Worker [const], [ 105*d83cc019SAndroid Build Coastguard Worker int foo( void ) __attribute__(($1)); 106*d83cc019SAndroid Build Coastguard Worker ], 107*d83cc019SAndroid Build Coastguard Worker [constructor_priority], [ 108*d83cc019SAndroid Build Coastguard Worker int foo( void ) __attribute__((__constructor__(65535/2))); 109*d83cc019SAndroid Build Coastguard Worker ], 110*d83cc019SAndroid Build Coastguard Worker [constructor], [ 111*d83cc019SAndroid Build Coastguard Worker int foo( void ) __attribute__(($1)); 112*d83cc019SAndroid Build Coastguard Worker ], 113*d83cc019SAndroid Build Coastguard Worker [deprecated], [ 114*d83cc019SAndroid Build Coastguard Worker int foo( void ) __attribute__(($1(""))); 115*d83cc019SAndroid Build Coastguard Worker ], 116*d83cc019SAndroid Build Coastguard Worker [destructor], [ 117*d83cc019SAndroid Build Coastguard Worker int foo( void ) __attribute__(($1)); 118*d83cc019SAndroid Build Coastguard Worker ], 119*d83cc019SAndroid Build Coastguard Worker [dllexport], [ 120*d83cc019SAndroid Build Coastguard Worker __attribute__(($1)) int foo( void ) { return 0; } 121*d83cc019SAndroid Build Coastguard Worker ], 122*d83cc019SAndroid Build Coastguard Worker [dllimport], [ 123*d83cc019SAndroid Build Coastguard Worker int foo( void ) __attribute__(($1)); 124*d83cc019SAndroid Build Coastguard Worker ], 125*d83cc019SAndroid Build Coastguard Worker [error], [ 126*d83cc019SAndroid Build Coastguard Worker int foo( void ) __attribute__(($1(""))); 127*d83cc019SAndroid Build Coastguard Worker ], 128*d83cc019SAndroid Build Coastguard Worker [externally_visible], [ 129*d83cc019SAndroid Build Coastguard Worker int foo( void ) __attribute__(($1)); 130*d83cc019SAndroid Build Coastguard Worker ], 131*d83cc019SAndroid Build Coastguard Worker [flatten], [ 132*d83cc019SAndroid Build Coastguard Worker int foo( void ) __attribute__(($1)); 133*d83cc019SAndroid Build Coastguard Worker ], 134*d83cc019SAndroid Build Coastguard Worker [format], [ 135*d83cc019SAndroid Build Coastguard Worker int foo(const char *p, ...) __attribute__(($1(printf, 1, 2))); 136*d83cc019SAndroid Build Coastguard Worker ], 137*d83cc019SAndroid Build Coastguard Worker [format_arg], [ 138*d83cc019SAndroid Build Coastguard Worker char *foo(const char *p) __attribute__(($1(1))); 139*d83cc019SAndroid Build Coastguard Worker ], 140*d83cc019SAndroid Build Coastguard Worker [gnu_inline], [ 141*d83cc019SAndroid Build Coastguard Worker inline __attribute__(($1)) int foo( void ) { return 0; } 142*d83cc019SAndroid Build Coastguard Worker ], 143*d83cc019SAndroid Build Coastguard Worker [hot], [ 144*d83cc019SAndroid Build Coastguard Worker int foo( void ) __attribute__(($1)); 145*d83cc019SAndroid Build Coastguard Worker ], 146*d83cc019SAndroid Build Coastguard Worker [ifunc], [ 147*d83cc019SAndroid Build Coastguard Worker int my_foo( void ) { return 0; } 148*d83cc019SAndroid Build Coastguard Worker static int (*resolve_foo(void))(void) { return my_foo; } 149*d83cc019SAndroid Build Coastguard Worker int foo( void ) __attribute__(($1("resolve_foo"))); 150*d83cc019SAndroid Build Coastguard Worker ], 151*d83cc019SAndroid Build Coastguard Worker [leaf], [ 152*d83cc019SAndroid Build Coastguard Worker __attribute__(($1)) int foo( void ) { return 0; } 153*d83cc019SAndroid Build Coastguard Worker ], 154*d83cc019SAndroid Build Coastguard Worker [malloc], [ 155*d83cc019SAndroid Build Coastguard Worker void *foo( void ) __attribute__(($1)); 156*d83cc019SAndroid Build Coastguard Worker ], 157*d83cc019SAndroid Build Coastguard Worker [noclone], [ 158*d83cc019SAndroid Build Coastguard Worker int foo( void ) __attribute__(($1)); 159*d83cc019SAndroid Build Coastguard Worker ], 160*d83cc019SAndroid Build Coastguard Worker [noinline], [ 161*d83cc019SAndroid Build Coastguard Worker __attribute__(($1)) int foo( void ) { return 0; } 162*d83cc019SAndroid Build Coastguard Worker ], 163*d83cc019SAndroid Build Coastguard Worker [nonnull], [ 164*d83cc019SAndroid Build Coastguard Worker int foo(char *p) __attribute__(($1(1))); 165*d83cc019SAndroid Build Coastguard Worker ], 166*d83cc019SAndroid Build Coastguard Worker [noreturn], [ 167*d83cc019SAndroid Build Coastguard Worker void foo( void ) __attribute__(($1)); 168*d83cc019SAndroid Build Coastguard Worker ], 169*d83cc019SAndroid Build Coastguard Worker [nothrow], [ 170*d83cc019SAndroid Build Coastguard Worker int foo( void ) __attribute__(($1)); 171*d83cc019SAndroid Build Coastguard Worker ], 172*d83cc019SAndroid Build Coastguard Worker [optimize], [ 173*d83cc019SAndroid Build Coastguard Worker __attribute__(($1(3))) int foo( void ) { return 0; } 174*d83cc019SAndroid Build Coastguard Worker ], 175*d83cc019SAndroid Build Coastguard Worker [pure], [ 176*d83cc019SAndroid Build Coastguard Worker int foo( void ) __attribute__(($1)); 177*d83cc019SAndroid Build Coastguard Worker ], 178*d83cc019SAndroid Build Coastguard Worker [returns_nonnull], [ 179*d83cc019SAndroid Build Coastguard Worker void *foo( void ) __attribute__(($1)); 180*d83cc019SAndroid Build Coastguard Worker ], 181*d83cc019SAndroid Build Coastguard Worker [unused], [ 182*d83cc019SAndroid Build Coastguard Worker int foo( void ) __attribute__(($1)); 183*d83cc019SAndroid Build Coastguard Worker ], 184*d83cc019SAndroid Build Coastguard Worker [used], [ 185*d83cc019SAndroid Build Coastguard Worker int foo( void ) __attribute__(($1)); 186*d83cc019SAndroid Build Coastguard Worker ], 187*d83cc019SAndroid Build Coastguard Worker [visibility], [ 188*d83cc019SAndroid Build Coastguard Worker int foo_def( void ) __attribute__(($1("default"))); 189*d83cc019SAndroid Build Coastguard Worker int foo_hid( void ) __attribute__(($1("hidden"))); 190*d83cc019SAndroid Build Coastguard Worker int foo_int( void ) __attribute__(($1("internal"))); 191*d83cc019SAndroid Build Coastguard Worker int foo_pro( void ) __attribute__(($1("protected"))); 192*d83cc019SAndroid Build Coastguard Worker ], 193*d83cc019SAndroid Build Coastguard Worker [warning], [ 194*d83cc019SAndroid Build Coastguard Worker int foo( void ) __attribute__(($1(""))); 195*d83cc019SAndroid Build Coastguard Worker ], 196*d83cc019SAndroid Build Coastguard Worker [warn_unused_result], [ 197*d83cc019SAndroid Build Coastguard Worker int foo( void ) __attribute__(($1)); 198*d83cc019SAndroid Build Coastguard Worker ], 199*d83cc019SAndroid Build Coastguard Worker [weak], [ 200*d83cc019SAndroid Build Coastguard Worker int foo( void ) __attribute__(($1)); 201*d83cc019SAndroid Build Coastguard Worker ], 202*d83cc019SAndroid Build Coastguard Worker [weakref], [ 203*d83cc019SAndroid Build Coastguard Worker static int foo( void ) { return 0; } 204*d83cc019SAndroid Build Coastguard Worker static int bar( void ) __attribute__(($1("foo"))); 205*d83cc019SAndroid Build Coastguard Worker ], 206*d83cc019SAndroid Build Coastguard Worker [ 207*d83cc019SAndroid Build Coastguard Worker m4_warn([syntax], [Unsupported attribute $1, the test may fail]) 208*d83cc019SAndroid Build Coastguard Worker int foo( void ) __attribute__(($1)); 209*d83cc019SAndroid Build Coastguard Worker ] 210*d83cc019SAndroid Build Coastguard Worker )], []) 211*d83cc019SAndroid Build Coastguard Worker ], 212*d83cc019SAndroid Build Coastguard Worker dnl GCC doesn't exit with an error if an unknown attribute is 213*d83cc019SAndroid Build Coastguard Worker dnl provided but only outputs a warning, so accept the attribute 214*d83cc019SAndroid Build Coastguard Worker dnl only if no warning were issued. 215*d83cc019SAndroid Build Coastguard Worker [AS_IF([test -s conftest.err], 216*d83cc019SAndroid Build Coastguard Worker [AS_VAR_SET([ac_var], [no])], 217*d83cc019SAndroid Build Coastguard Worker [AS_VAR_SET([ac_var], [yes])])], 218*d83cc019SAndroid Build Coastguard Worker [AS_VAR_SET([ac_var], [no])]) 219*d83cc019SAndroid Build Coastguard Worker ]) 220*d83cc019SAndroid Build Coastguard Worker 221*d83cc019SAndroid Build Coastguard Worker AS_IF([test yes = AS_VAR_GET([ac_var])], 222*d83cc019SAndroid Build Coastguard Worker [AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_FUNC_ATTRIBUTE_$1), 1, 223*d83cc019SAndroid Build Coastguard Worker [Define to 1 if the system has the `$1' function attribute])], []) 224*d83cc019SAndroid Build Coastguard Worker 225*d83cc019SAndroid Build Coastguard Worker AS_VAR_POPDEF([ac_var]) 226*d83cc019SAndroid Build Coastguard Worker]) 227